зеркало из https://github.com/mozilla/gecko-dev.git
Bug 608669: Make chrome-document-global-created be properly dispatched on newly opened windows. r=jst a=blocker
This commit is contained in:
Родитель
9b12959cc9
Коммит
9db8689cdf
|
@ -100,6 +100,8 @@ _TEST_FILES = \
|
|||
test_bug582176.xul \
|
||||
bug582176_window.xul \
|
||||
test_bug428288.html \
|
||||
test_bug608669.xul \
|
||||
bug608669.xul \
|
||||
test_bug449778.xul \
|
||||
bug449778_window.xul \
|
||||
test_bug449780.xul \
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0"?>
|
||||
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
|
||||
<window title="Mozilla Bug 608669 - Blank page"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
<description flex="1" value="This window is intentionally left blank"/>
|
||||
</window>
|
|
@ -0,0 +1,120 @@
|
|||
<?xml version="1.0"?>
|
||||
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=608669
|
||||
-->
|
||||
<window title="Mozilla Bug 608669"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
<script type="application/javascript"
|
||||
src="chrome://mochikit/content/MochiKit/packed.js"></script>
|
||||
<script type="application/javascript"
|
||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||
|
||||
<!-- test results are displayed in the html:body -->
|
||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=608669"
|
||||
target="_blank">Mozilla Bug 608669</a>
|
||||
</body>
|
||||
|
||||
<!-- test code goes here -->
|
||||
<script type="application/javascript"><![CDATA[
|
||||
|
||||
var gOrigMaxTotalViewers = undefined;
|
||||
function setCachePref(enabled) {
|
||||
var prefBranch = Components.classes["@mozilla.org/preferences-service;1"]
|
||||
.getService(Components.interfaces.nsIPrefBranch);
|
||||
if (enabled) {
|
||||
is(typeof gOrigMaxTotalViewers, "undefined", "don't double-enable bfcache");
|
||||
prefBranch.setBoolPref("browser.sessionhistory.cache_subframes", true);
|
||||
gOrigMaxTotalViewers = prefBranch.getIntPref("browser.sessionhistory.max_total_viewers");
|
||||
prefBranch.setIntPref("browser.sessionhistory.max_total_viewers", 10);
|
||||
}
|
||||
else {
|
||||
is(typeof gOrigMaxTotalViewers, "number", "don't double-disable bfcache");
|
||||
prefBranch.setIntPref("browser.sessionhistory.max_total_viewers", gOrigMaxTotalViewers);
|
||||
gOrigMaxTotalViewers = undefined;
|
||||
try {
|
||||
prefBranch.clearUserPref("browser.sessionhistory.cache_subframes");
|
||||
} catch (e) { /* Pref didn't exist, meh */ }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Test for Bug 608669 **/
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
addLoadEvent(nextTest);
|
||||
|
||||
gen = doTest();
|
||||
|
||||
function nextTest() {
|
||||
gen.next();
|
||||
}
|
||||
|
||||
function doTest() {
|
||||
var container = document.getElementById('container');
|
||||
|
||||
setCachePref(true);
|
||||
|
||||
var notificationCount = 0;
|
||||
var observer = {
|
||||
observe: function(aSubject, aTopic, aData) {
|
||||
is(aTopic, "chrome-document-global-created",
|
||||
"correct topic");
|
||||
is(aData, "null",
|
||||
"correct data");
|
||||
notificationCount++;
|
||||
}
|
||||
};
|
||||
|
||||
var os = Components.classes["@mozilla.org/observer-service;1"].
|
||||
getService(Components.interfaces.nsIObserverService);
|
||||
os.addObserver(observer, "chrome-document-global-created", false);
|
||||
os.addObserver(observer, "content-document-global-created", false);
|
||||
|
||||
is(notificationCount, 0, "initial count");
|
||||
|
||||
// create a new iframe
|
||||
var iframe = document.createElement("iframe");
|
||||
container.appendChild(iframe);
|
||||
iframe.contentWindow.x = "y";
|
||||
is(notificationCount, 1, "after created iframe");
|
||||
|
||||
// Try loading in an iframe
|
||||
iframe.setAttribute("src", "bug608669.xul");
|
||||
iframe.onload = nextTest;
|
||||
yield;
|
||||
is(notificationCount, 1, "after first load");
|
||||
is(iframe.contentWindow.x, "y", "reused window");
|
||||
|
||||
// Try loading again in an iframe
|
||||
iframe.setAttribute("src", "bug608669.xul?x");
|
||||
iframe.onload = nextTest;
|
||||
yield;
|
||||
is(notificationCount, 2, "after second load");
|
||||
is("x" in iframe.contentWindow, false, "didn't reuse window");
|
||||
|
||||
// Open a new window using window.open
|
||||
popup = window.open("bug608669.xul", "bug 608669",
|
||||
"chrome,width=600,height=600");
|
||||
popup.onload = nextTest;
|
||||
yield;
|
||||
is(notificationCount, 3, "after window.open load");
|
||||
popup.close();
|
||||
|
||||
setCachePref(false);
|
||||
os.removeObserver(observer, "chrome-document-global-created");
|
||||
os.removeObserver(observer, "content-document-global-created");
|
||||
SimpleTest.finish();
|
||||
yield;
|
||||
}
|
||||
|
||||
|
||||
|
||||
]]></script>
|
||||
<vbox id="container" flex="1">
|
||||
<description>Below will an iframe be added</description>
|
||||
</vbox>
|
||||
</window>
|
|
@ -737,7 +737,7 @@ nsPIDOMWindow::nsPIDOMWindow(nsPIDOMWindow *aOuterWindow)
|
|||
mMayHaveAudioAvailableEventListener(PR_FALSE), mIsModalContentWindow(PR_FALSE),
|
||||
mIsActive(PR_FALSE), mInnerWindow(nsnull), mOuterWindow(aOuterWindow),
|
||||
// Make sure no actual window ends up with mWindowID == 0
|
||||
mWindowID(++gNextWindowID)
|
||||
mWindowID(++gNextWindowID), mHasNotifiedGlobalCreated(PR_FALSE)
|
||||
{}
|
||||
|
||||
nsPIDOMWindow::~nsPIDOMWindow() {}
|
||||
|
@ -2205,9 +2205,23 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
|
|||
mContext->GC();
|
||||
mContext->DidInitializeContext();
|
||||
|
||||
if (!aState && !reUseInnerWindow) {
|
||||
nsContentUtils::AddScriptRunner(
|
||||
NS_NewRunnableMethod(this, &nsGlobalWindow::DispatchDOMWindowCreated));
|
||||
if (newInnerWindow && !newInnerWindow->mHasNotifiedGlobalCreated && mDoc) {
|
||||
// We should probably notify. However if this is the, arguably bad,
|
||||
// situation when we're creating a temporary non-chrome-about-blank
|
||||
// document in a chrome docshell, don't notify just yet. Instead wait
|
||||
// until we have a real chrome doc.
|
||||
nsCOMPtr<nsIDocShellTreeItem> treeItem(do_QueryInterface(mDocShell));
|
||||
PRInt32 itemType = nsIDocShellTreeItem::typeContent;
|
||||
if (treeItem) {
|
||||
treeItem->GetItemType(&itemType);
|
||||
}
|
||||
|
||||
if (itemType != nsIDocShellTreeItem::typeChrome ||
|
||||
nsContentUtils::IsSystemPrincipal(mDoc->NodePrincipal())) {
|
||||
newInnerWindow->mHasNotifiedGlobalCreated = PR_TRUE;
|
||||
nsContentUtils::AddScriptRunner(
|
||||
NS_NewRunnableMethod(this, &nsGlobalWindow::DispatchDOMWindowCreated));
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
|
|
@ -620,6 +620,10 @@ protected:
|
|||
// A unique (as long as our 64-bit counter doesn't roll over) id for
|
||||
// this window.
|
||||
PRUint64 mWindowID;
|
||||
|
||||
// This is only used by the inner window. Set to true once we've sent
|
||||
// the (chrome|content)-document-global-created notification.
|
||||
PRPackedBool mHasNotifiedGlobalCreated;
|
||||
};
|
||||
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче