Merging with backout.
Merging with backout.
--- a/content/xbl/src/nsXBLDocumentInfo.cpp
+++ b/content/xbl/src/nsXBLDocumentInfo.cpp
@@ -71,16 +71,17 @@ public:
// nsIScriptGlobalObject methods
virtual nsresult EnsureScriptEnvironment(PRUint32 aLangID);
virtual nsresult SetScriptContext(PRUint32 lang_id, nsIScriptContext *aContext);
virtual nsIScriptContext *GetContext();
virtual JSObject *GetGlobalJSObject();
virtual void OnFinalize(PRUint32 aLangID, void *aScriptGlobal);
virtual void SetScriptsEnabled(PRBool aEnabled, PRBool aFireTimeouts);
+ virtual nsresult SetNewArguments(nsIArray *aArguments);
// nsIScriptObjectPrincipal methods
virtual nsIPrincipal* GetPrincipal();
static JSBool doCheckAccess(JSContext *cx, JSObject *obj, jsval id,
PRUint32 accessType);
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsXBLDocGlobalObject,
@@ -387,16 +388,23 @@ nsXBLDocGlobalObject::OnFinalize(PRUint3
}
void
nsXBLDocGlobalObject::SetScriptsEnabled(PRBool aEnabled, PRBool aFireTimeouts)
{
// We don't care...
}
+nsresult
+nsXBLDocGlobalObject::SetNewArguments(nsIArray *aArguments)
+{
+ NS_NOTREACHED("waaah!");
+ return NS_ERROR_UNEXPECTED;
+}
+
//----------------------------------------------------------------------
//
// nsIScriptObjectPrincipal methods
//
nsIPrincipal*
nsXBLDocGlobalObject::GetPrincipal()
{
--- a/content/xul/document/src/nsXULPrototypeDocument.cpp
+++ b/content/xul/document/src/nsXULPrototypeDocument.cpp
@@ -76,16 +76,17 @@ public:
nsXULPDGlobalObject(nsXULPrototypeDocument* owner);
// nsISupports interface
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
// nsIScriptGlobalObject methods
virtual void OnFinalize(PRUint32 aLangID, void *aGlobal);
virtual void SetScriptsEnabled(PRBool aEnabled, PRBool aFireTimeouts);
+ virtual nsresult SetNewArguments(nsIArray *aArguments);
virtual void *GetScriptGlobal(PRUint32 lang);
virtual nsresult EnsureScriptEnvironment(PRUint32 aLangID);
virtual nsIScriptContext *GetScriptContext(PRUint32 lang);
virtual nsresult SetScriptContext(PRUint32 language, nsIScriptContext *ctx);
// nsIScriptObjectPrincipal methods
@@ -803,16 +804,23 @@ nsXULPDGlobalObject::OnFinalize(PRUint32
}
void
nsXULPDGlobalObject::SetScriptsEnabled(PRBool aEnabled, PRBool aFireTimeouts)
{
// We don't care...
}
+nsresult
+nsXULPDGlobalObject::SetNewArguments(nsIArray *aArguments)
+{
+ NS_NOTREACHED("waaah!");
+ return NS_ERROR_UNEXPECTED;
+}
+
//----------------------------------------------------------------------
//
// nsIScriptObjectPrincipal methods
//
nsIPrincipal*
nsXULPDGlobalObject::GetPrincipal()
{
--- a/dom/base/nsDOMClassInfo.cpp
+++ b/dom/base/nsDOMClassInfo.cpp
@@ -1371,17 +1371,16 @@ jsval nsDOMClassInfo::sLocation_id
jsval nsDOMClassInfo::sConstructor_id = JSVAL_VOID;
jsval nsDOMClassInfo::s_content_id = JSVAL_VOID;
jsval nsDOMClassInfo::sContent_id = JSVAL_VOID;
jsval nsDOMClassInfo::sMenubar_id = JSVAL_VOID;
jsval nsDOMClassInfo::sToolbar_id = JSVAL_VOID;
jsval nsDOMClassInfo::sLocationbar_id = JSVAL_VOID;
jsval nsDOMClassInfo::sPersonalbar_id = JSVAL_VOID;
jsval nsDOMClassInfo::sStatusbar_id = JSVAL_VOID;
-jsval nsDOMClassInfo::sDialogArguments_id = JSVAL_VOID;
jsval nsDOMClassInfo::sDirectories_id = JSVAL_VOID;
jsval nsDOMClassInfo::sControllers_id = JSVAL_VOID;
jsval nsDOMClassInfo::sLength_id = JSVAL_VOID;
jsval nsDOMClassInfo::sInnerHeight_id = JSVAL_VOID;
jsval nsDOMClassInfo::sInnerWidth_id = JSVAL_VOID;
jsval nsDOMClassInfo::sOuterHeight_id = JSVAL_VOID;
jsval nsDOMClassInfo::sOuterWidth_id = JSVAL_VOID;
jsval nsDOMClassInfo::sScreenX_id = JSVAL_VOID;
@@ -1567,17 +1566,16 @@ nsDOMClassInfo::DefineStaticJSVals(JSCon
SET_JSVAL_TO_STRING(sConstructor_id, cx, "constructor");
SET_JSVAL_TO_STRING(s_content_id, cx, "_content");
SET_JSVAL_TO_STRING(sContent_id, cx, "content");
SET_JSVAL_TO_STRING(sMenubar_id, cx, "menubar");
SET_JSVAL_TO_STRING(sToolbar_id, cx, "toolbar");
SET_JSVAL_TO_STRING(sLocationbar_id, cx, "locationbar");
SET_JSVAL_TO_STRING(sPersonalbar_id, cx, "personalbar");
SET_JSVAL_TO_STRING(sStatusbar_id, cx, "statusbar");
- SET_JSVAL_TO_STRING(sDialogArguments_id, cx, "dialogArguments");
SET_JSVAL_TO_STRING(sDirectories_id, cx, "directories");
SET_JSVAL_TO_STRING(sControllers_id, cx, "controllers");
SET_JSVAL_TO_STRING(sLength_id, cx, "length");
SET_JSVAL_TO_STRING(sInnerHeight_id, cx, "innerHeight");
SET_JSVAL_TO_STRING(sInnerWidth_id, cx, "innerWidth");
SET_JSVAL_TO_STRING(sOuterHeight_id, cx, "outerHeight");
SET_JSVAL_TO_STRING(sOuterWidth_id, cx, "outerWidth");
SET_JSVAL_TO_STRING(sScreenX_id, cx, "screenX");
@@ -4319,17 +4317,16 @@ nsDOMClassInfo::ShutDown()
sConstructor_id = JSVAL_VOID;
s_content_id = JSVAL_VOID;
sContent_id = JSVAL_VOID;
sMenubar_id = JSVAL_VOID;
sToolbar_id = JSVAL_VOID;
sLocationbar_id = JSVAL_VOID;
sPersonalbar_id = JSVAL_VOID;
sStatusbar_id = JSVAL_VOID;
- sDialogArguments_id = JSVAL_VOID;
sDirectories_id = JSVAL_VOID;
sControllers_id = JSVAL_VOID;
sLength_id = JSVAL_VOID;
sInnerHeight_id = JSVAL_VOID;
sInnerWidth_id = JSVAL_VOID;
sOuterHeight_id = JSVAL_VOID;
sOuterWidth_id = JSVAL_VOID;
sScreenX_id = JSVAL_VOID;
@@ -6553,51 +6550,34 @@ nsWindowSH::NewResolve(nsIXPConnectWrapp
}
if (hasProp) {
*objp = obj;
return NS_OK;
}
}
- } else if (id == sDialogArguments_id &&
- mData == &sClassInfoData[eDOMClassInfo_ModalContentWindow_id]) {
- nsCOMPtr<nsIArray> args;
- ((nsGlobalModalWindow *)win)->GetDialogArguments(getter_AddRefs(args));
-
- nsIScriptContext *script_cx = win->GetContext();
- if (script_cx) {
- JSAutoSuspendRequest asr(cx);
-
- // Make nsJSContext::SetProperty()'s magic argument array
- // handling happen.
- rv = script_cx->SetProperty(obj, "dialogArguments", args);
- NS_ENSURE_SUCCESS(rv, rv);
-
- *objp = obj;
- }
-
- return NS_OK;
}
}
JSObject *oldobj = *objp;
rv = nsEventReceiverSH::NewResolve(wrapper, cx, obj, id, flags, objp,
_retval);
if (NS_FAILED(rv) || *objp != oldobj) {
// Something went wrong, or the property got resolved. Return.
return rv;
}
// Make a fast expando if we're assigning to (not declaring or
// binding a name) a new undefined property that's not already
// defined on our prototype chain. This way we can access this
// expando w/o ever getting back into XPConnect.
- if ((flags & JSRESOLVE_ASSIGNING) && !(flags & JSRESOLVE_WITH) &&
+ if ((flags & JSRESOLVE_ASSIGNING) &&
+ !(flags & JSRESOLVE_WITH) &&
win->IsInnerWindow()) {
JSObject *realObj;
wrapper->GetJSObject(&realObj);
if (obj == realObj) {
JSObject *proto = STOBJ_GET_PROTO(obj);
if (proto) {
jsid interned_id;
@@ -9489,20 +9469,17 @@ nsHTMLPluginObjElementSH::PreCreate(nsIS
return rv == NS_SUCCESS_ALLOW_SLIM_WRAPPERS ? NS_OK : rv;
}
NS_IMETHODIMP
nsHTMLPluginObjElementSH::PostCreate(nsIXPConnectWrappedNative *wrapper,
JSContext *cx, JSObject *obj)
{
if (nsContentUtils::IsSafeToRunScript()) {
-#ifdef DEBUG
- nsresult rv =
-#endif
- SetupProtoChain(wrapper, cx, obj);
+ nsresult rv = SetupProtoChain(wrapper, cx, obj);
// If SetupProtoChain failed then we're in real trouble. We're about to fail
// PostCreate but it's more than likely that we handed our (now invalid)
// wrapper to someone already. Bug 429442 is an example of the kind of crash
// that can result from such a situation. We'll return NS_OK for the time
// being and hope for the best.
NS_WARN_IF_FALSE(NS_SUCCEEDED(rv), "SetupProtoChain failed!");
return NS_OK;
--- a/dom/base/nsDOMClassInfo.h
+++ b/dom/base/nsDOMClassInfo.h
@@ -279,17 +279,16 @@ protected:
static jsval sConstructor_id;
static jsval s_content_id;
static jsval sContent_id;
static jsval sMenubar_id;
static jsval sToolbar_id;
static jsval sLocationbar_id;
static jsval sPersonalbar_id;
static jsval sStatusbar_id;
- static jsval sDialogArguments_id;
static jsval sDirectories_id;
static jsval sControllers_id;
static jsval sLength_id;
static jsval sInnerHeight_id;
static jsval sInnerWidth_id;
static jsval sOuterHeight_id;
static jsval sOuterWidth_id;
static jsval sScreenX_id;
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -890,17 +890,16 @@ nsGlobalWindow::CleanUp()
}
PRUint32 scriptIndex;
NS_STID_FOR_INDEX(scriptIndex) {
mInnerWindowHolders[scriptIndex] = nsnull;
}
mArguments = nsnull;
mArgumentsLast = nsnull;
- mArgumentsOrigin = nsnull;
CleanupCachedXBLHandlers(this);
#ifdef DEBUG
nsCycleCollector_DEBUG_shouldBeFreed(static_cast<nsIScriptGlobalObject*>(this));
#endif
}
@@ -1190,17 +1189,17 @@ nsGlobalWindow::SetScriptContext(PRUint3
aScriptContext->SetGCOnDestruction(PR_FALSE);
}
aScriptContext->DidInitializeContext();
script_glob = aScriptContext->GetNativeGlobal();
NS_ASSERTION(script_glob, "GetNativeGlobal returned NULL!");
}
// for now, keep mContext real.
- if (lang_id == nsIProgrammingLanguage::JAVASCRIPT) {
+ if (lang_id==nsIProgrammingLanguage::JAVASCRIPT) {
mContext = aScriptContext;
mJSObject = (JSObject *)script_glob;
}
mScriptContexts[lang_ndx] = aScriptContext;
mScriptGlobals[lang_ndx] = script_glob;
return NS_OK;
}
@@ -2020,22 +2019,18 @@ nsGlobalWindow::SetNewDocument(nsIDocume
navigator,
getter_AddRefs(navigatorHolder));
}
}
}
}
if (mArguments) {
- newInnerWindow->DefineArgumentsProperty(mArguments);
- newInnerWindow->mArguments = mArguments;
- newInnerWindow->mArgumentsOrigin = mArgumentsOrigin;
-
+ newInnerWindow->SetNewArguments(mArguments);
mArguments = nsnull;
- mArgumentsOrigin = nsnull;
}
// Give the new inner window our chrome event handler (since it
// doesn't have one).
newInnerWindow->mChromeEventHandler = mChromeEventHandler;
}
NS_STID_FOR_ID(st_id) {
@@ -2109,20 +2104,19 @@ nsGlobalWindow::SetDocShell(nsIDocShell*
}
ClearControllers();
mChromeEventHandler = nsnull; // force release now
if (mArguments) {
// We got no new document after someone called
- // SetArguments(), drop our reference to the arguments.
+ // SetNewArguments(), drop our reference to the arguments.
mArguments = nsnull;
- mArgumentsLast = nsnull;
- mArgumentsOrigin = nsnull;
+ // xxxmarkh - should we also drop mArgumentsLast?
}
PRUint32 st_ndx;
// Drop holders and tell each context to cleanup and release them now.
NS_ASSERTION(mContext == mScriptContexts[NS_STID_INDEX(nsIProgrammingLanguage::JAVASCRIPT)],
"Contexts confused");
NS_STID_FOR_INDEX(st_ndx) {
@@ -2365,62 +2359,51 @@ nsGlobalWindow::SetScriptsEnabled(PRBool
// Scripts are enabled (again?) on this context, run timeouts that
// fired on this context while scripts were disabled.
RunTimeout(nsnull);
}
}
nsresult
-nsGlobalWindow::SetArguments(nsIArray *aArguments, nsIPrincipal *aOrigin)
-{
- FORWARD_TO_OUTER(SetArguments, (aArguments, aOrigin),
- NS_ERROR_NOT_INITIALIZED);
+nsGlobalWindow::SetNewArguments(nsIArray *aArguments)
+{
+ FORWARD_TO_OUTER(SetNewArguments, (aArguments), NS_ERROR_NOT_INITIALIZED);
+
+ JSContext *cx;
+ NS_ENSURE_TRUE(aArguments && mContext &&
+ (cx = (JSContext *)mContext->GetNativeContext()),
+ NS_ERROR_NOT_INITIALIZED);
+
+ // Note that currentInner may be non-null if someone's doing a
+ // window.open with an existing window name.
+ nsGlobalWindow *currentInner = GetCurrentInnerWindowInternal();
+
+ nsresult rv;
+
+ if (currentInner) {
+ PRUint32 langID;
+ NS_STID_FOR_ID(langID) {
+ void *glob = currentInner->GetScriptGlobal(langID);
+ nsIScriptContext *ctx = GetScriptContext(langID);
+ if (glob && ctx) {
+ if (mIsModalContentWindow) {
+ rv = ctx->SetProperty(glob, "dialogArguments", aArguments);
+ } else {
+ rv = ctx->SetProperty(glob, "arguments", aArguments);
+ }
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+ }
+ }
// Hold on to the arguments so that we can re-set them once the next
// document is loaded.
mArguments = aArguments;
- mArgumentsOrigin = aOrigin;
-
- if (!mIsModalContentWindow) {
- mArgumentsLast = aArguments;
- }
-
- nsGlobalWindow *currentInner = GetCurrentInnerWindowInternal();
-
- return currentInner ?
- currentInner->DefineArgumentsProperty(aArguments) : NS_OK;
-}
-
-nsresult
-nsGlobalWindow::DefineArgumentsProperty(nsIArray *aArguments)
-{
- JSContext *cx;
- nsIScriptContext *ctx = GetOuterWindowInternal()->mContext;
- NS_ENSURE_TRUE(aArguments && ctx &&
- (cx = (JSContext *)ctx->GetNativeContext()),
- NS_ERROR_NOT_INITIALIZED);
-
- if (mIsModalContentWindow) {
- // Modal content windows don't have an "arguments" property, they
- // have a "dialogArguments" property which is handled
- // separately. See nsWindowSH::NewResolve().
-
- return NS_OK;
- }
-
- PRUint32 langID;
- NS_STID_FOR_ID(langID) {
- void *glob = GetScriptGlobal(langID);
- ctx = GetScriptContext(langID);
- if (glob && ctx) {
- nsresult rv = ctx->SetProperty(glob, "arguments", aArguments);
- NS_ENSURE_SUCCESS(rv, rv);
- }
- }
+ mArgumentsLast = aArguments;
return NS_OK;
}
//*****************************************************************************
// nsGlobalWindow::nsIScriptObjectPrincipal
//*****************************************************************************
@@ -6099,52 +6082,24 @@ nsGlobalWindow::ShowModalDialog(const ns
nsnull, aArgs, // args
GetPrincipal(), // aCalleePrincipal
nsnull, // aJSCallerContext
getter_AddRefs(dlgWin));
NS_ENSURE_SUCCESS(rv, rv);
if (dlgWin) {
- nsCOMPtr<nsIPrincipal> subjectPrincipal;
- rv = nsContentUtils::GetSecurityManager()->
- GetSubjectPrincipal(getter_AddRefs(subjectPrincipal));
- if (NS_FAILED(rv)) {
- return rv;
- }
-
- PRBool canAccess = PR_TRUE;
-
- if (subjectPrincipal) {
- nsCOMPtr<nsIScriptObjectPrincipal> objPrincipal =
- do_QueryInterface(dlgWin);
- nsCOMPtr<nsIPrincipal> dialogPrincipal;
-
- if (objPrincipal) {
- dialogPrincipal = objPrincipal->GetPrincipal();
-
- rv = subjectPrincipal->Subsumes(dialogPrincipal, &canAccess);
- NS_ENSURE_SUCCESS(rv, rv);
- } else {
- // Uh, not sure what kind of dialog this is. Prevent access to
- // be on the safe side...
-
- canAccess = PR_FALSE;
- }
- }
-
- if (canAccess) {
- nsCOMPtr<nsPIDOMWindow> win(do_QueryInterface(dlgWin));
- nsPIDOMWindow *inner = win->GetCurrentInnerWindow();
-
- nsCOMPtr<nsIDOMModalContentWindow> dlgInner(do_QueryInterface(inner));
-
- if (dlgInner) {
- dlgInner->GetReturnValue(aRetVal);
- }
+ nsCOMPtr<nsPIDOMWindow> win(do_QueryInterface(dlgWin));
+
+ nsPIDOMWindow *inner = win->GetCurrentInnerWindow();
+
+ nsCOMPtr<nsIDOMModalContentWindow> dlgInner(do_QueryInterface(inner));
+
+ if (dlgInner) {
+ dlgInner->GetReturnValue(aRetVal);
}
}
return NS_OK;
}
NS_IMETHODIMP
nsGlobalWindow::UpdateCommands(const nsAString& anAction)
@@ -7428,17 +7383,17 @@ nsGlobalWindow::OpenInternal(const nsASt
NS_PRECONDITION(!aExtraArgument || (!argv && argc == 0),
"Can't pass in arguments both ways");
NS_PRECONDITION(!aCalledNoScript || (!argv && argc == 0),
"Can't pass JS args when called via the noscript methods");
NS_PRECONDITION(!aJSCallerContext || !aCalledNoScript,
"Shouldn't have caller context when called noscript");
*aReturn = nsnull;
-
+
nsCOMPtr<nsIWebBrowserChrome> chrome;
GetWebBrowserChrome(getter_AddRefs(chrome));
if (!chrome) {
// No chrome means we don't want to go through with this open call
// -- see nsIWindowWatcher.idl
return NS_ERROR_NOT_AVAILABLE;
}
@@ -9063,24 +9018,17 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMETHODIMP
nsGlobalModalWindow::GetDialogArguments(nsIArray **aArguments)
{
FORWARD_TO_INNER_MODAL_CONTENT_WINDOW(GetDialogArguments, (aArguments),
NS_ERROR_NOT_INITIALIZED);
- PRBool subsumes = PR_FALSE;
- nsIPrincipal *self = GetPrincipal();
- if (self && NS_SUCCEEDED(self->Subsumes(mArgumentsOrigin, &subsumes)) &&
- subsumes) {
- NS_IF_ADDREF(*aArguments = mArguments);
- } else {
- *aArguments = nsnull;
- }
+ *aArguments = mArguments;
return NS_OK;
}
NS_IMETHODIMP
nsGlobalModalWindow::GetReturnValue(nsIVariant **aRetVal)
{
FORWARD_TO_OUTER_MODAL_CONTENT_WINDOW(GetReturnValue, (aRetVal), NS_OK);
@@ -9095,30 +9043,16 @@ nsGlobalModalWindow::SetReturnValue(nsIV
{
FORWARD_TO_OUTER_MODAL_CONTENT_WINDOW(SetReturnValue, (aRetVal), NS_OK);
mReturnValue = aRetVal;
return NS_OK;
}
-nsresult
-nsGlobalModalWindow::SetNewDocument(nsIDocument *aDocument,
- nsISupports *aState,
- PRBool aClearScopeHint)
-{
- // If we're loading a new document into a modal dialog, clear the
- // return value that was set, if any, by the current document.
- if (aDocument) {
- mReturnValue = nsnull;
- }
-
- return nsGlobalWindow::SetNewDocument(aDocument, aState, aClearScopeHint);
-}
-
//*****************************************************************************
// nsGlobalWindow: Creator Function (This should go away)
//*****************************************************************************
nsresult
NS_NewScriptGlobalObject(PRBool aIsChrome, PRBool aIsModalContentWindow,
nsIScriptGlobalObject **aResult)
{
--- a/dom/base/nsGlobalWindow.h
+++ b/dom/base/nsGlobalWindow.h
@@ -256,16 +256,17 @@ public:
virtual void *GetScriptGlobal(PRUint32 lang);
// Set a new script language context for this global. The native global
// for the context is created by the context's GetNativeGlobal() method.
virtual nsresult SetScriptContext(PRUint32 lang, nsIScriptContext *aContext);
virtual void OnFinalize(PRUint32 aLangID, void *aScriptGlobal);
virtual void SetScriptsEnabled(PRBool aEnabled, PRBool aFireTimeouts);
+ virtual nsresult SetNewArguments(nsIArray *aArguments);
// nsIScriptObjectPrincipal
virtual nsIPrincipal* GetPrincipal();
// nsIDOMWindow
NS_DECL_NSIDOMWINDOW
// nsIDOMWindow2
@@ -332,18 +333,18 @@ public:
const nsIID& aIID);
virtual NS_HIDDEN_(nsresult) RemoveEventListenerByIID(nsIDOMEventListener *aListener,
const nsIID& aIID);
virtual NS_HIDDEN_(nsresult) GetSystemEventGroup(nsIDOMEventGroup** aGroup);
virtual NS_HIDDEN_(nsIScriptContext*) GetContextForEventHandlers(nsresult* aRv);
virtual NS_HIDDEN_(void) SetDocShell(nsIDocShell* aDocShell);
virtual NS_HIDDEN_(nsresult) SetNewDocument(nsIDocument *aDocument,
- nsISupports *aState,
- PRBool aClearScopeHint);
+ nsISupports *aState,
+ PRBool aClearScopeHint);
virtual NS_HIDDEN_(void) SetOpenerWindow(nsIDOMWindowInternal *aOpener,
PRBool aOriginalOpener);
virtual NS_HIDDEN_(void) EnsureSizeUpToDate();
virtual NS_HIDDEN_(void) EnterModalState();
virtual NS_HIDDEN_(void) LeaveModalState();
virtual NS_HIDDEN_(void) SetHasOrientationEventListener();
@@ -441,34 +442,32 @@ public:
virtual NS_HIDDEN_(void)
CacheXBLPrototypeHandler(nsXBLPrototypeHandler* aKey,
nsScriptObjectHolder& aHandler);
virtual PRBool TakeFocus(PRBool aFocus, PRUint32 aFocusMethod);
virtual void SetReadyForFocus();
virtual void PageHidden();
virtual nsresult DispatchAsyncHashchange();
- virtual nsresult SetArguments(nsIArray *aArguments, nsIPrincipal *aOrigin);
static PRBool DOMWindowDumpEnabled();
protected:
// Object Management
virtual ~nsGlobalWindow();
void CleanUp();
void ClearControllers();
void FreeInnerObjects(PRBool aClearScope);
nsGlobalWindow *CallerInnerWindow();
nsresult SetNewDocument(nsIDocument *aDocument,
nsISupports *aState,
PRBool aClearScopeHint,
PRBool aIsInternalCall);
- nsresult DefineArgumentsProperty(nsIArray *aArguments);
// Get the parent, returns null if this is a toplevel window
nsIDOMWindowInternal *GetParentInternal();
// popup tracking
PRBool IsPopupSpamWindow()
{
if (IsInnerWindow() && !mOuterWindow) {
@@ -713,17 +712,16 @@ protected:
// Indicates whether this window is getting acceleration change events
PRPackedBool mHasAcceleration : 1;
nsCOMPtr<nsIScriptContext> mContext;
nsWeakPtr mOpener;
nsCOMPtr<nsIControllers> mControllers;
nsCOMPtr<nsIArray> mArguments;
nsCOMPtr<nsIArray> mArgumentsLast;
- nsCOMPtr<nsIPrincipal> mArgumentsOrigin;
nsRefPtr<nsNavigator> mNavigator;
nsRefPtr<nsScreen> mScreen;
nsRefPtr<nsHistory> mHistory;
nsRefPtr<nsDOMWindowList> mFrames;
nsRefPtr<nsBarProp> mMenubar;
nsRefPtr<nsBarProp> mToolbar;
nsRefPtr<nsBarProp> mLocationbar;
nsRefPtr<nsBarProp> mPersonalbar;
@@ -835,20 +833,16 @@ public:
mIsModalContentWindow = PR_TRUE;
}
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIDOMMODALCONTENTWINDOW
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsGlobalModalWindow, nsGlobalWindow)
- virtual NS_HIDDEN_(nsresult) SetNewDocument(nsIDocument *aDocument,
- nsISupports *aState,
- PRBool aClearScopeHint);
-
protected:
nsCOMPtr<nsIVariant> mReturnValue;
};
//*****************************************************************************
// nsNavigator: Script "navigator" object
//*****************************************************************************
--- a/dom/base/nsIScriptGlobalObject.h
+++ b/dom/base/nsIScriptGlobalObject.h
@@ -96,22 +96,23 @@ struct JSObject; // until we finally rem
// aStatus will be filled in with the status.
PRBool
NS_HandleScriptError(nsIScriptGlobalObject *aScriptGlobal,
nsScriptErrorEvent *aErrorEvent,
nsEventStatus *aStatus);
#define NS_ISCRIPTGLOBALOBJECT_IID \
-{ 0xe9f3f2c1, 0x2d94, 0x4722, \
- { 0xbb, 0xd4, 0x2b, 0xf6, 0xfd, 0xf4, 0x2f, 0x48 } }
+{ /* {6afecd40-0b9a-4cfd-8c42-0f645cd91829} */ \
+ 0x6afecd40, 0x0b9a, 0x4cfd, \
+ { 0x8c, 0x42, 0x0f, 0x64, 0x5c, 0xd9, 0x18, 0x29 } }
/**
- * The global object which keeps a script context for each supported script
- * language. This often used to store per-window global state.
++ * The global object which keeps a script context for each supported script
++ * language. This often used to store per-window global state.
*/
class nsIScriptGlobalObject : public nsISupports
{
public:
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ISCRIPTGLOBALOBJECT_IID)
/**
@@ -160,18 +161,25 @@ public:
virtual void OnFinalize(PRUint32 aLangID, void *aScriptGlobal) = 0;
/**
* Called to enable/disable scripts.
*/
virtual void SetScriptsEnabled(PRBool aEnabled, PRBool aFireTimeouts) = 0;
- /**
- * Handle a script error. Generally called by a script context.
+ /** Set a new arguments object for this window. This will be set on
+ * the window right away (if there's an existing document) and it
+ * will also be installed on the window when the next document is
+ * loaded. Each language impl is responsible for converting to
+ * an array of args as appropriate for that language.
+ */
+ virtual nsresult SetNewArguments(nsIArray *aArguments) = 0;
+
+ /** Handle a script error. Generally called by a script context.
*/
virtual nsresult HandleScriptError(nsScriptErrorEvent *aErrorEvent,
nsEventStatus *aEventStatus) {
return NS_HandleScriptError(this, aErrorEvent, aEventStatus);
}
};
NS_DEFINE_STATIC_IID_ACCESSOR(nsIScriptGlobalObject,
--- a/dom/base/nsPIDOMWindow.h
+++ b/dom/base/nsPIDOMWindow.h
@@ -70,21 +70,20 @@ class nsIDocShell;
class nsIFocusController;
class nsIContent;
class nsIDocument;
class nsIScriptTimeoutHandler;
class nsPresContext;
struct nsTimeout;
class nsScriptObjectHolder;
class nsXBLPrototypeHandler;
-class nsIArray;
#define NS_PIDOMWINDOW_IID \
-{ 0x70c9f57f, 0xf7b3, 0x4a37, \
- { 0xbe, 0x36, 0xbb, 0xb2, 0xd7, 0xe9, 0x40, 0x13 } }
+{ 0x249423c9, 0x42a6, 0x8243, \
+ { 0x49, 0x45, 0x71, 0x7f, 0x8d, 0x28, 0x84, 0x43 } }
class nsPIDOMWindow : public nsIDOMWindowInternal
{
public:
NS_DECLARE_STATIC_IID_ACCESSOR(NS_PIDOMWINDOW_IID)
virtual nsPIDOMWindow* GetPrivateRoot() = 0;
@@ -460,25 +459,16 @@ public:
virtual nsresult DispatchAsyncHashchange() = 0;
/**
* Tell this window that there is an observer for orientation changes
*/
virtual void SetHasOrientationEventListener() = 0;
- /**
- * Set a arguments for this window. This will be set on the window
- * right away (if there's an existing document) and it will also be
- * installed on the window when the next document is loaded. Each
- * language impl is responsible for converting to an array of args
- * as appropriate for that language.
- */
- virtual nsresult SetArguments(nsIArray *aArguments, nsIPrincipal *aOrigin) = 0;
-
protected:
// The nsPIDOMWindow constructor. The aOuterWindow argument should
// be null if and only if the created window itself is an outer
// window. In all other cases aOuterWindow should be the outer
// window for the inner window that is being created.
nsPIDOMWindow(nsPIDOMWindow *aOuterWindow)
: mFrameElement(nsnull), mDocShell(nsnull), mModalStateDepth(0),
mRunningTimeout(nsnull), mMutationBits(0), mIsDocumentLoaded(PR_FALSE),
--- a/dom/tests/mochitest/bugs/Makefile.in
+++ b/dom/tests/mochitest/bugs/Makefile.in
@@ -95,14 +95,12 @@ include $(topsrcdir)/config/rules.mk
test_bug459848.html \
test_bug463000.html \
iframe_bug463000.html \
test_bug465263.html \
test_bug479143.html \
test_bug484775.html \
test_bug427744.html \
test_bug495219.html \
- test_bug504862.html \
- file_bug504862.html \
$(NULL)
libs:: $(_TEST_FILES)
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
deleted file mode 100644
--- a/dom/tests/mochitest/bugs/file_bug504862.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<html>
-<body>
-<script>
-window.returnValue = 3;
-
-if (location.toString().match(/^http:\/\/localhost:8888/)) {
- // Test that we got the right arguments.
- opener.is(window.dialogArguments, "my args",
- "dialog did not get the right arguments.");
-
- // Load a different url, and test that it doesn't see the arguments.
- window.location="data:text/html,<html><body onload=\"opener.is(window.dialogArguments, null, 'subsequent dialog document did not get the right arguments.'); close();\">';";
-} else {
- // Post a message containing our arguments to the opener to test
- // that this cross origing dialog does *not* see the passed in
- // arguments.
- opener.postMessage("args: " + window.dialogArguments,
- "http://localhost:8888");
-
- close();
-}
-</script>
deleted file mode 100644
--- a/dom/tests/mochitest/bugs/test_bug504862.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=504862
--->
-<head>
- <title>Test for Bug 504862</title>
- <script type="text/javascript" src="/MochiKit/packed.js"></script>
- <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
- <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=504862">Mozilla Bug 504862</a>
-<script class="testbody" type="text/javascript">
-
-/** Test for Bug 504862 **/
-
-function onMsgRcv(event)
-{
- is(event.data, "args: undefined", "Unexpected cross origin dialog arguments.");
-}
-
-window.addEventListener("message", onMsgRcv, false);
-
-var subsequentDlg = "data:text/html,<html><body onload='opener.is(window.dialogArguments, \'my args\', \'subsequent dialog document did not get the right arguments.\'); close();'>";
-
-var result = window.showModalDialog("file_bug504862.html", "my args");
-is(result, null, "window sees previous dialog documents return value.");
-
-result = window.showModalDialog("http://test1.example.com/tests/dom/tests/mochitest/bugs/file_bug504862.html", "my args");
-
-is(result, null, "Able to see return value from cross origin dialog.");
-
-</script>
-</pre>
-</body>
-</html>
--- a/embedding/components/windowwatcher/src/nsWindowWatcher.cpp
+++ b/embedding/components/windowwatcher/src/nsWindowWatcher.cpp
@@ -55,17 +55,16 @@
#include "nsIDocShellTreeItem.h"
#include "nsIDocShellTreeOwner.h"
#include "nsIDocumentLoader.h"
#include "nsIDocument.h"
#include "nsIDOMDocument.h"
#include "nsIDOMWindow.h"
#include "nsIDOMChromeWindow.h"
#include "nsIDOMWindowInternal.h"
-#include "nsIDOMModalContentWindow.h"
#include "nsIScriptObjectPrincipal.h"
#include "nsIScreen.h"
#include "nsIScreenManager.h"
#include "nsIScriptContext.h"
#include "nsIGenericFactory.h"
#include "nsIJSContextStack.h"
#include "nsIObserverService.h"
#include "nsIScriptGlobalObject.h"
@@ -569,31 +568,21 @@ nsWindowWatcher::OpenWindowJSInternal(ns
windowIsModalContentDialog = PR_TRUE;
chromeFlags |= nsIWebBrowserChrome::CHROME_MODAL;
}
SizeSpec sizeSpec;
CalcSizeSpec(features.get(), sizeSpec);
+ PRBool isCallerChrome = PR_FALSE;
nsCOMPtr<nsIScriptSecurityManager>
sm(do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID));
-
- // Remember who's calling us. This code used to assume a null
- // subject principal if it failed to get the principal, but that's
- // just not safe, so bail on errors here.
- nsCOMPtr<nsIPrincipal> callerPrincipal;
- rv = sm->GetSubjectPrincipal(getter_AddRefs(callerPrincipal));
- NS_ENSURE_SUCCESS(rv, rv);
-
- PRBool isCallerChrome = PR_TRUE;
- if (callerPrincipal) {
- rv = sm->IsSystemPrincipal(callerPrincipal, &isCallerChrome);
- NS_ENSURE_SUCCESS(rv, rv);
- }
+ if (sm)
+ sm->SubjectPrincipalIsSystem(&isCallerChrome);
JSContext *cx = GetJSContextFromWindow(aParent);
if (isCallerChrome && !chromeParent && cx) {
// open() is called from chrome on a non-chrome window, push
// the context of the callee onto the context stack to
// prevent the caller's priveleges from leaking into code
// that runs while opening the new window.
@@ -762,20 +751,19 @@ nsWindowWatcher::OpenWindowJSInternal(ns
newDocShellItem->GetTreeOwner(getter_AddRefs(newTreeOwner));
if (newTreeOwner)
newTreeOwner->SetPersistence(PR_FALSE, PR_FALSE, PR_FALSE);
}
}
if ((aDialog || windowIsModalContentDialog) && argv) {
// Set the args on the new window.
- nsCOMPtr<nsPIDOMWindow> piwin(do_QueryInterface(*_retval));
- NS_ENSURE_TRUE(piwin, NS_ERROR_UNEXPECTED);
-
- rv = piwin->SetArguments(argv, callerPrincipal);
+ nsCOMPtr<nsIScriptGlobalObject> scriptGlobal(do_QueryInterface(*_retval));
+ NS_ENSURE_TRUE(scriptGlobal, NS_ERROR_UNEXPECTED);
+ rv = scriptGlobal->SetNewArguments(argv);
NS_ENSURE_SUCCESS(rv, rv);
}
/* allow a window that we found by name to keep its name (important for cases
like _self where the given name is different (and invalid)). Also, _blank
is not a window name. */
if (windowNeedsName)
newDocShellItem->SetName(nameSpecified &&