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:
hyatt%netscape.com
2000-02-11 00:57:54 +00:00
parent b74fe23984
commit e636e32edb
8 changed files with 152 additions and 3 deletions

View File

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

View File

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

View File

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

View File

@@ -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,

View File

@@ -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", \

View File

@@ -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)

View File

@@ -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();

View File

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