зеркало из https://github.com/mozilla/gecko-dev.git
Fix for bug 669096 (Injecting function from chrome extends the lifetime of navigated-away inner window). r=mrbkap.
--HG-- extra : rebase_source : 3375132c3e507e09dd79e63d277769090040f6bf
This commit is contained in:
Родитель
15e72bfded
Коммит
591866c51a
|
@ -1817,6 +1817,34 @@ WindowStateHolder::~WindowStateHolder()
|
|||
|
||||
NS_IMPL_ISUPPORTS1(WindowStateHolder, WindowStateHolder)
|
||||
|
||||
|
||||
struct ReparentWaiverClosure
|
||||
{
|
||||
JSContext *mCx;
|
||||
JSObject *mNewInner;
|
||||
};
|
||||
|
||||
static JSDHashOperator
|
||||
ReparentWaiverWrappers(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
||||
uint32 number, void *arg)
|
||||
{
|
||||
ReparentWaiverClosure *closure = static_cast<ReparentWaiverClosure*>(arg);
|
||||
JSObject *value = static_cast<JSObject2JSObjectMap::Entry *>(hdr)->value;
|
||||
|
||||
// We reparent wrappers that have as their parent an inner window whose
|
||||
// outer has the new inner window as its current inner.
|
||||
JSObject *parent = JS_GetParent(closure->mCx, value);
|
||||
JSObject *outer = JS_ObjectToOuterObject(closure->mCx, parent);
|
||||
if (outer) {
|
||||
JSObject *inner = JS_ObjectToInnerObject(closure->mCx, outer);
|
||||
if (inner == closure->mNewInner && inner != parent)
|
||||
JS_SetParent(closure->mCx, value, closure->mNewInner);
|
||||
} else {
|
||||
JS_ClearPendingException(closure->mCx);
|
||||
}
|
||||
return JS_DHASH_NEXT;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
|
||||
nsISupports* aState,
|
||||
|
@ -2163,6 +2191,19 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
|
|||
JS_SetParent(cx, mJSObject, newInnerWindow->mJSObject);
|
||||
|
||||
mContext->SetOuterObject(mJSObject);
|
||||
|
||||
JSCompartment *compartment = js::GetObjectCompartment(mJSObject);
|
||||
xpc::CompartmentPrivate *priv =
|
||||
static_cast<xpc::CompartmentPrivate*>(JS_GetCompartmentPrivate(cx, compartment));
|
||||
if (priv && priv->waiverWrapperMap) {
|
||||
NS_ASSERTION(!JS_IsExceptionPending(cx),
|
||||
"We might overwrite a pending exception!");
|
||||
ReparentWaiverClosure closure = {
|
||||
cx,
|
||||
newInnerWindow->mJSObject
|
||||
};
|
||||
priv->waiverWrapperMap->Enumerate(ReparentWaiverWrappers, &closure);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче