Fix for 20471. Basic focus memory framework being checked in as well.
git-svn-id: svn://10.0.0.236/trunk@60357 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -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); } \
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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", \
|
||||
|
||||
@@ -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<nsIContent> content = do_QueryInterface(mChromeEventHandler);
|
||||
if (content) {
|
||||
// Cross the chrome/content boundary and get the nearest enclosing
|
||||
// chrome window.
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
content->GetDocument(*getter_AddRefs(doc));
|
||||
nsCOMPtr<nsIScriptGlobalObject> global;
|
||||
doc->GetScriptGlobalObject(getter_AddRefs(global));
|
||||
nsCOMPtr<nsIDOMWindow> 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<nsIDOMDocument> domDoc;
|
||||
GetDocument(getter_AddRefs(domDoc));
|
||||
nsCOMPtr<nsIDOMXULDocument> xulDoc = do_QueryInterface(domDoc);
|
||||
if (xulDoc) {
|
||||
// Retrieve the command dispatcher and call updateCommands on it.
|
||||
nsCOMPtr<nsIDOMXULCommandDispatcher> xulCommandDispatcher;
|
||||
xulDoc->GetCommandDispatcher(getter_AddRefs(xulCommandDispatcher));
|
||||
xulCommandDispatcher->UpdateCommands(anAction);
|
||||
}
|
||||
|
||||
// Now call UpdateCommands on our parent window.
|
||||
nsCOMPtr<nsIDOMWindow> 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<nsIDOMWindow> parent;
|
||||
GetTop(getter_AddRefs(parent));
|
||||
|
||||
nsCOMPtr<nsIScriptGlobalObject> parentTop = do_QueryInterface(parent);
|
||||
nsCOMPtr<nsIDocShell> docShell;
|
||||
parentTop->GetDocShell(getter_AddRefs(docShell));
|
||||
nsCOMPtr<nsIChromeEventHandler> chromeEventHandler;
|
||||
docShell->GetChromeEventHandler(getter_AddRefs(chromeEventHandler));
|
||||
|
||||
nsCOMPtr<nsIContent> chromeElement(do_QueryInterface(mChromeEventHandler));
|
||||
if(chromeElement) {
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
chromeElement->GetDocument(*getter_AddRefs(doc));
|
||||
if (doc) {
|
||||
nsCOMPtr<nsIScriptGlobalObject> 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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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},
|
||||
|
||||
Reference in New Issue
Block a user