Bug 608669: Make chrome-document-global-created be properly dispatched on newly opened windows. r=jst a=blocker

This commit is contained in:
Jonas Sicking 2010-11-23 00:50:56 -08:00
Родитель 9b12959cc9
Коммит 9db8689cdf
5 изменённых файлов: 150 добавлений и 4 удалений

Просмотреть файл

@ -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;
};