diff --git a/mozilla/dom/public/base/nsIDOMWindow.h b/mozilla/dom/public/base/nsIDOMWindow.h index c98d6a84616..0f7b1fe9125 100644 --- a/mozilla/dom/public/base/nsIDOMWindow.h +++ b/mozilla/dom/public/base/nsIDOMWindow.h @@ -191,6 +191,8 @@ public: NS_IMETHOD Close(JSContext* cx, jsval* argv, PRUint32 argc)=0; + NS_IMETHOD UpdateCommands(const nsString& aAction)=0; + NS_IMETHOD Escape(const nsString& aStr, nsString& aReturn)=0; NS_IMETHOD Unescape(const nsString& aStr, nsString& aReturn)=0; @@ -276,6 +278,7 @@ public: NS_IMETHOD OpenDialog(JSContext* cx, jsval* argv, PRUint32 argc, nsIDOMWindow** aReturn); \ NS_IMETHOD Close(); \ NS_IMETHOD Close(JSContext* cx, jsval* argv, PRUint32 argc); \ + NS_IMETHOD UpdateCommands(const nsString& aAction); \ NS_IMETHOD Escape(const nsString& aStr, nsString& aReturn); \ NS_IMETHOD Unescape(const nsString& aStr, nsString& aReturn); \ @@ -360,6 +363,7 @@ public: NS_IMETHOD OpenDialog(JSContext* cx, jsval* argv, PRUint32 argc, nsIDOMWindow** aReturn) { return _to OpenDialog(cx, argv, argc, aReturn); } \ NS_IMETHOD Close() { return _to Close(); } \ NS_IMETHOD Close(JSContext* cx, jsval* argv, PRUint32 argc) { return _to Close(cx, argv, argc); } \ + NS_IMETHOD UpdateCommands(const nsString& aAction) { return _to UpdateCommands(aAction); } \ NS_IMETHOD Escape(const nsString& aStr, nsString& aReturn) { return _to Escape(aStr, aReturn); } \ NS_IMETHOD Unescape(const nsString& aStr, nsString& aReturn) { return _to Unescape(aStr, aReturn); } \ diff --git a/mozilla/dom/public/base/nsPIDOMWindow.h b/mozilla/dom/public/base/nsPIDOMWindow.h index d7c1a2546be..92a763a8bb9 100644 --- a/mozilla/dom/public/base/nsPIDOMWindow.h +++ b/mozilla/dom/public/base/nsPIDOMWindow.h @@ -30,6 +30,7 @@ #include "nsIDOMLocation.h" class nsIDocShell; +class nsIDOMWindow; #define NS_PIDOMWINDOW_IID \ { 0x3aa80781, 0x7e6a, 0x11d3, { 0xbf, 0x87, 0x0, 0x10, 0x5a, 0x1b, 0x6, 0x27 } } @@ -40,6 +41,7 @@ public: static const nsIID& GetIID() { static nsIID iid = NS_PIDOMWINDOW_IID; return iid; } NS_IMETHOD GetPrivateParent(nsPIDOMWindow** aResult)=0; + NS_IMETHOD GetPrivateRoot(nsIDOMWindow** aResult)=0; NS_IMETHOD GetLocation(nsIDOMLocation** aLocation) = 0; NS_IMETHOD GetDocShell(nsIDocShell **aDocShell) =0;// XXX This may be temporary - rods diff --git a/mozilla/dom/public/idl/base/Window.idl b/mozilla/dom/public/idl/base/Window.idl index dbcd3b6c59e..2b031699835 100644 --- a/mozilla/dom/public/idl/base/Window.idl +++ b/mozilla/dom/public/idl/base/Window.idl @@ -53,7 +53,7 @@ void resizeBy(in long widthDif, in long heightDif); void sizeToContent(); void GetAttention(); - void scroll(in long xScroll, in long yScroll); + void scroll(in long xScroll, in long yScroll); void scrollTo(in long xScroll, in long yScroll); void scrollBy(in long xScrollDif, in long yScrollDif); @@ -73,7 +73,9 @@ noscript void close(); void close(/* ... */); - DOMString escape(in DOMString str); + void updateCommands(in DOMString action); + + DOMString escape(in DOMString str); DOMString unescape(in DOMString str); }; diff --git a/mozilla/dom/public/nsDOMPropEnums.h b/mozilla/dom/public/nsDOMPropEnums.h index ce888288451..34c0dbd4db0 100644 --- a/mozilla/dom/public/nsDOMPropEnums.h +++ b/mozilla/dom/public/nsDOMPropEnums.h @@ -867,7 +867,8 @@ enum nsDOMProp { NS_DOM_PROP_WINDOW_STOP, NS_DOM_PROP_WINDOW_TOOLBAR, NS_DOM_PROP_WINDOW_TOP, - NS_DOM_PROP_WINDOW_UNESCAPE, + NS_DOM_PROP_WINDOW_UNESCAPE, + NS_DOM_PROP_WINDOW_UPDATECOMMANDS, NS_DOM_PROP_WINDOW_WINDOW, NS_DOM_PROP_WINDOWCOLLECTION_ITEM, NS_DOM_PROP_WINDOWCOLLECTION_LENGTH, @@ -878,6 +879,7 @@ enum nsDOMProp { NS_DOM_PROP_XULCOMMANDDISPATCHER_GETCONTROLLERFORCOMMAND, NS_DOM_PROP_XULCOMMANDDISPATCHER_GETCONTROLLERS, NS_DOM_PROP_XULCOMMANDDISPATCHER_REMOVECOMMANDUPDATER, + NS_DOM_PROP_XULCOMMANDDISPATCHER_SUPPRESSFOCUS, NS_DOM_PROP_XULCOMMANDDISPATCHER_UPDATECOMMANDS, NS_DOM_PROP_XULDOCUMENT_COMMANDDISPATCHER, NS_DOM_PROP_XULDOCUMENT_CONTROLS, diff --git a/mozilla/dom/public/nsDOMPropNames.h b/mozilla/dom/public/nsDOMPropNames.h index a7dcbd1a765..e7edcd2dbdd 100644 --- a/mozilla/dom/public/nsDOMPropNames.h +++ b/mozilla/dom/public/nsDOMPropNames.h @@ -867,6 +867,7 @@ "window.toolbar", \ "window.top", \ "window.unescape", \ + "window.updatecommands", \ "window.window", \ "windowcollection.item", \ "windowcollection.length", \ @@ -877,6 +878,7 @@ "xulcommanddispatcher.getcontrollerforcommand", \ "xulcommanddispatcher.getcontrollers", \ "xulcommanddispatcher.removecommandupdater", \ + "xulcommanddispatcher.suppressfocus", \ "xulcommanddispatcher.updatecommands", \ "xuldocument.commanddispatcher", \ "xuldocument.controls", \ diff --git a/mozilla/dom/src/base/nsGlobalWindow.cpp b/mozilla/dom/src/base/nsGlobalWindow.cpp index 4a260298629..3d0dfee02e6 100644 --- a/mozilla/dom/src/base/nsGlobalWindow.cpp +++ b/mozilla/dom/src/base/nsGlobalWindow.cpp @@ -80,6 +80,11 @@ #include "nsIWebBrowserChrome.h" #include "nsIWebShell.h" +// XXX An unfortunate dependency exists here. +#include "nsIDOMXULDocument.h" +#include "nsIDOMXULCommandDispatcher.h" + + // CIDs static NS_DEFINE_IID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID); static NS_DEFINE_CID(kPrefServiceCID, NS_PREF_CID); @@ -1508,6 +1513,51 @@ NS_IMETHODIMP GlobalWindowImpl::Close(JSContext* cx, jsval* argv, PRUint32 argc) return result; } +NS_IMETHODIMP +GlobalWindowImpl::UpdateCommands(const nsString& anAction) +{ + if (mChromeEventHandler) { + // Just jump out to the chrome event handler. + nsCOMPtr content = do_QueryInterface(mChromeEventHandler); + if (content) { + // Cross the chrome/content boundary and get the nearest enclosing + // chrome window. + nsCOMPtr doc; + content->GetDocument(*getter_AddRefs(doc)); + nsCOMPtr global; + doc->GetScriptGlobalObject(getter_AddRefs(global)); + nsCOMPtr domWindow = do_QueryInterface(global); + return domWindow->UpdateCommands(anAction); + } + else { + // XXX Handle the embedding case. The chrome handler could be told + // to poke menu items/update commands etc. This can be used by + // embedders if we set it up right and lets them know all sorts of + // interesting things about Ender text fields. + } + + } + else { + // See if we contain a XUL document. + nsCOMPtr domDoc; + GetDocument(getter_AddRefs(domDoc)); + nsCOMPtr xulDoc = do_QueryInterface(domDoc); + if (xulDoc) { + // Retrieve the command dispatcher and call updateCommands on it. + nsCOMPtr xulCommandDispatcher; + xulDoc->GetCommandDispatcher(getter_AddRefs(xulCommandDispatcher)); + xulCommandDispatcher->UpdateCommands(anAction); + } + + // Now call UpdateCommands on our parent window. + nsCOMPtr parent; + GetParent(getter_AddRefs(parent)); + return parent->UpdateCommands(anAction); + } + + return NS_OK; +} + NS_IMETHODIMP GlobalWindowImpl::Escape(const nsString& aStr, nsString& aReturn) { nsresult result; @@ -1992,6 +2042,42 @@ NS_IMETHODIMP GlobalWindowImpl::GetPrivateParent(nsPIDOMWindow** aParent) return NS_OK; } +NS_IMETHODIMP GlobalWindowImpl::GetPrivateRoot(nsIDOMWindow** aParent) +{ + *aParent = nsnull; // Set to null so we can bail out later + + nsCOMPtr parent; + GetTop(getter_AddRefs(parent)); + + nsCOMPtr parentTop = do_QueryInterface(parent); + nsCOMPtr docShell; + parentTop->GetDocShell(getter_AddRefs(docShell)); + nsCOMPtr chromeEventHandler; + docShell->GetChromeEventHandler(getter_AddRefs(chromeEventHandler)); + + nsCOMPtr chromeElement(do_QueryInterface(mChromeEventHandler)); + if(chromeElement) { + nsCOMPtr doc; + chromeElement->GetDocument(*getter_AddRefs(doc)); + if (doc) { + nsCOMPtr globalObject; + doc->GetScriptGlobalObject(getter_AddRefs(globalObject)); + + parent = do_QueryInterface(globalObject); + parent->GetTop(aParent); // Addref done here. + return NS_OK; + } + } + + if (parent) { + *aParent = parent.get(); + NS_ADDREF(*aParent); + } + + return NS_OK; +} + + NS_IMETHODIMP GlobalWindowImpl::GetLocation(nsIDOMLocation** aLocation) { if(!mLocation && mDocShell) diff --git a/mozilla/dom/src/base/nsGlobalWindow.h b/mozilla/dom/src/base/nsGlobalWindow.h index b25da39c78b..b61fd246535 100644 --- a/mozilla/dom/src/base/nsGlobalWindow.h +++ b/mozilla/dom/src/base/nsGlobalWindow.h @@ -135,6 +135,8 @@ public: // nsPIDOMWindow NS_IMETHOD GetPrivateParent(nsPIDOMWindow** aResult); + NS_IMETHOD GetPrivateRoot(nsIDOMWindow** aResult); + NS_IMETHOD GetLocation(nsIDOMLocation** aLocation); //NS_IMETHOD GetDocShell(nsIDocShell** aDocShell); NS_IMETHOD Activate(); diff --git a/mozilla/dom/src/base/nsJSWindow.cpp b/mozilla/dom/src/base/nsJSWindow.cpp index 30ddc14c823..d11cd856dcc 100644 --- a/mozilla/dom/src/base/nsJSWindow.cpp +++ b/mozilla/dom/src/base/nsJSWindow.cpp @@ -2472,6 +2472,54 @@ WindowClose(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) } +// +// Native method UpdateCommands +// +PR_STATIC_CALLBACK(JSBool) +WindowUpdateCommands(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + nsIDOMWindow *nativeThis = (nsIDOMWindow*)nsJSUtils::nsGetNativeThis(cx, obj); + nsresult result = NS_OK; + nsAutoString b0; + // If there's no private data, this must be the prototype, so ignore + if (nsnull == nativeThis) { + return JS_TRUE; + } + + { + + *rval = JSVAL_NULL; + + { + nsresult rv; + NS_WITH_SERVICE(nsIScriptSecurityManager, secMan, + NS_SCRIPTSECURITYMANAGER_PROGID, &rv); + if (NS_SUCCEEDED(rv)) { + rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_UPDATECOMMANDS, PR_FALSE); + } + if (NS_FAILED(rv)) { + return nsJSUtils::nsReportError(cx, obj, rv); + } + } + + if (argc < 1) { + return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR); + } + + nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]); + + result = nativeThis->UpdateCommands(b0); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + *rval = JSVAL_VOID; + } + + return JS_TRUE; +} + + // // Native method Escape // @@ -2797,6 +2845,7 @@ static JSFunctionSpec WindowMethods[] = {"open", WindowOpen, 0}, {"openDialog", WindowOpenDialog, 0}, {"close", WindowClose, 0}, + {"updateCommands", WindowUpdateCommands, 1}, {"escape", WindowEscape, 1}, {"unescape", WindowUnescape, 1}, {"addEventListener", EventTargetAddEventListener, 3},