DOM fixes for bug 20721, r=vidur

This commit is contained in:
rginda%netscape.com 2000-02-16 07:13:59 +00:00
parent 7e740cf4c6
commit 37085fc3fd
7 changed files with 88 additions and 25 deletions

View File

@ -36,6 +36,7 @@ class nsIDOMScreen;
class nsIDOMHistory;
class nsIDOMWindowCollection;
class nsIDOMEvent;
class nsISidebar;
class nsIDOMWindow;
class nsIControllers;
@ -65,6 +66,8 @@ public:
NS_IMETHOD GetContent(nsIDOMWindow** aContent)=0;
NS_IMETHOD GetSidebar(nsISidebar** aSidebar)=0;
NS_IMETHOD GetMenubar(nsIDOMBarProp** aMenubar)=0;
NS_IMETHOD GetToolbar(nsIDOMBarProp** aToolbar)=0;
@ -209,6 +212,7 @@ public:
NS_IMETHOD GetParent(nsIDOMWindow** aParent); \
NS_IMETHOD GetTop(nsIDOMWindow** aTop); \
NS_IMETHOD GetContent(nsIDOMWindow** aContent); \
NS_IMETHOD GetSidebar(nsISidebar** aSidebar); \
NS_IMETHOD GetMenubar(nsIDOMBarProp** aMenubar); \
NS_IMETHOD GetToolbar(nsIDOMBarProp** aToolbar); \
NS_IMETHOD GetLocationbar(nsIDOMBarProp** aLocationbar); \
@ -294,6 +298,7 @@ public:
NS_IMETHOD GetParent(nsIDOMWindow** aParent) { return _to GetParent(aParent); } \
NS_IMETHOD GetTop(nsIDOMWindow** aTop) { return _to GetTop(aTop); } \
NS_IMETHOD GetContent(nsIDOMWindow** aContent) { return _to GetContent(aContent); } \
NS_IMETHOD GetSidebar(nsISidebar** aSidebar) { return _to GetSidebar(aSidebar); } \
NS_IMETHOD GetMenubar(nsIDOMBarProp** aMenubar) { return _to GetMenubar(aMenubar); } \
NS_IMETHOD GetToolbar(nsIDOMBarProp** aToolbar) { return _to GetToolbar(aToolbar); } \
NS_IMETHOD GetLocationbar(nsIDOMBarProp** aLocationbar) { return _to GetLocationbar(aLocationbar); } \

View File

@ -10,6 +10,7 @@
readonly attribute Window parent;
readonly attribute Window top;
readonly attribute Window content;
readonly attribute xpidl nsISidebar sidebar;
readonly attribute BarProp menubar;
readonly attribute BarProp toolbar;
readonly attribute BarProp locationbar;

View File

@ -819,6 +819,7 @@ enum nsDOMProp {
NS_DOM_PROP_WINDOW_CLOSED,
NS_DOM_PROP_WINDOW_CONFIRM,
NS_DOM_PROP_WINDOW_CONTENT,
NS_DOM_PROP_WINDOW_SIDEBAR,
NS_DOM_PROP_WINDOW_CONTROLLERS,
NS_DOM_PROP_WINDOW_DEFAULTSTATUS,
NS_DOM_PROP_WINDOW_DIRECTORIES,

View File

@ -818,6 +818,7 @@
"window.closed", \
"window.confirm", \
"window.content", \
"window.sidebar", \
"window.controllers", \
"window.defaultstatus", \
"window.directories", \

View File

@ -75,6 +75,7 @@
#include "nsIScriptGlobalObjectOwner.h"
#include "nsIScriptSecurityManager.h"
#include "nsISelectionController.h"
#include "nsISidebar.h" // XXX for sidebar HACK, see bug 20721
#include "nsIWebNavigation.h"
#include "nsIWebBrowser.h"
#include "nsIWebBrowserChrome.h"
@ -105,7 +106,8 @@ GlobalWindowImpl::GlobalWindowImpl() : mScriptObject(nsnull),
mGlobalObjectOwner(nsnull), mTimeouts(nsnull),
mTimeoutInsertionPoint(nsnull), mRunningTimeout(nsnull),
mTimeoutPublicIdCounter(1), mTimeoutFiringDepth(0),
mFirstDocumentLoad(PR_TRUE), mChromeEventHandler(nsnull), mDocShell(nsnull)
mFirstDocumentLoad(PR_TRUE), mChromeEventHandler(nsnull), mDocShell(nsnull),
mSidebar(nsnull)
{
NS_INIT_REFCNT();
}
@ -228,6 +230,12 @@ NS_IMETHODIMP GlobalWindowImpl::SetNewDocument(nsIDOMDocument *aDocument)
{
ClearAllTimeouts();
if (mSidebar)
{
mSidebar->SetWindow(nsnull);
mSidebar = nsnull;
}
if(mListenerManager)
mListenerManager->RemoveAllListeners(PR_FALSE);
@ -551,6 +559,30 @@ NS_IMETHODIMP GlobalWindowImpl::GetContent(nsIDOMWindow** aContent)
return NS_OK;
}
// XXX for sidebar HACK, see bug 20721
NS_IMETHODIMP GlobalWindowImpl::GetSidebar(nsISidebar** aSidebar)
{
nsresult rv = NS_OK;
if (!mSidebar)
{
mSidebar = do_CreateInstance(NS_SIDEBAR_PROGID, &rv);
if (mSidebar)
{
nsIDOMWindow *win = NS_STATIC_CAST(nsIDOMWindow *, this);
/* no addref */
mSidebar->SetWindow(win);
}
}
*aSidebar = mSidebar;
NS_IF_ADDREF(*aSidebar);
return rv;
}
NS_IMETHODIMP GlobalWindowImpl::GetMenubar(nsIDOMBarProp** aMenubar)
{
if(!mMenubar)

View File

@ -195,6 +195,7 @@ protected:
nsCOMPtr<nsIDOMWindow> mOpener;
nsCOMPtr<nsIControllers> mControllers;
nsCOMPtr<nsIEventListenerManager> mListenerManager;
nsCOMPtr<nsISidebar> mSidebar;
void* mScriptObject;
NavigatorImpl* mNavigator;
ScreenImpl* mScreen;

View File

@ -44,6 +44,7 @@
#include "nsIDOMWindowCollection.h"
#include "nsIDOMEvent.h"
#include "nsIDOMEventTarget.h"
#include "nsISidebar.h"
#include "nsIDOMWindow.h"
#include "nsIControllers.h"
@ -61,6 +62,7 @@ static NS_DEFINE_IID(kIEventListenerIID, NS_IDOMEVENTLISTENER_IID);
static NS_DEFINE_IID(kIWindowCollectionIID, NS_IDOMWINDOWCOLLECTION_IID);
static NS_DEFINE_IID(kIEventIID, NS_IDOMEVENT_IID);
static NS_DEFINE_IID(kIEventTargetIID, NS_IDOMEVENTTARGET_IID);
static NS_DEFINE_IID(kISidebarIID, NS_ISIDEBAR_IID);
static NS_DEFINE_IID(kIWindowIID, NS_IDOMWINDOW_IID);
static NS_DEFINE_IID(kIControllersIID, NS_ICONTROLLERS_IID);
@ -77,30 +79,31 @@ enum Window_slots {
WINDOW_PARENT = -7,
WINDOW_TOP = -8,
WINDOW_CONTENT = -9,
WINDOW_MENUBAR = -10,
WINDOW_TOOLBAR = -11,
WINDOW_LOCATIONBAR = -12,
WINDOW_PERSONALBAR = -13,
WINDOW_STATUSBAR = -14,
WINDOW_SCROLLBARS = -15,
WINDOW_DIRECTORIES = -16,
WINDOW_CLOSED = -17,
WINDOW_FRAMES = -18,
WINDOW_CONTROLLERS = -19,
WINDOW_OPENER = -20,
WINDOW_STATUS = -21,
WINDOW_DEFAULTSTATUS = -22,
WINDOW_NAME = -23,
WINDOW_INNERWIDTH = -24,
WINDOW_INNERHEIGHT = -25,
WINDOW_OUTERWIDTH = -26,
WINDOW_OUTERHEIGHT = -27,
WINDOW_SCREENX = -28,
WINDOW_SCREENY = -29,
WINDOW_PAGEXOFFSET = -30,
WINDOW_PAGEYOFFSET = -31,
WINDOW_SCROLLX = -32,
WINDOW_SCROLLY = -33
WINDOW_SIDEBAR = -10,
WINDOW_MENUBAR = -11,
WINDOW_TOOLBAR = -12,
WINDOW_LOCATIONBAR = -13,
WINDOW_PERSONALBAR = -14,
WINDOW_STATUSBAR = -15,
WINDOW_SCROLLBARS = -16,
WINDOW_DIRECTORIES = -17,
WINDOW_CLOSED = -18,
WINDOW_FRAMES = -19,
WINDOW_CONTROLLERS = -20,
WINDOW_OPENER = -21,
WINDOW_STATUS = -22,
WINDOW_DEFAULTSTATUS = -23,
WINDOW_NAME = -24,
WINDOW_INNERWIDTH = -25,
WINDOW_INNERHEIGHT = -26,
WINDOW_OUTERWIDTH = -27,
WINDOW_OUTERHEIGHT = -28,
WINDOW_SCREENX = -29,
WINDOW_SCREENY = -30,
WINDOW_PAGEXOFFSET = -31,
WINDOW_PAGEYOFFSET = -32,
WINDOW_SCROLLX = -33,
WINDOW_SCROLLY = -34
};
/***********************************************************************/
@ -287,6 +290,24 @@ GetWindowProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
}
break;
}
case WINDOW_SIDEBAR:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_SIDEBAR, PR_FALSE);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, rv);
}
nsISidebar* prop;
nsresult result = NS_OK;
result = a->GetSidebar(&prop);
if (NS_SUCCEEDED(result)) {
// get the js object; n.b., this will do a release on 'prop'
nsJSUtils::nsConvertXPCObjectToJSVal(prop, NS_GET_IID(nsISidebar), cx, obj, vp);
}
else {
return nsJSUtils::nsReportError(cx, obj, result);
}
break;
}
case WINDOW_MENUBAR:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_MENUBAR, PR_FALSE);
@ -2780,6 +2801,7 @@ static JSPropertySpec WindowProperties[] =
{"parent", WINDOW_PARENT, JSPROP_ENUMERATE | JSPROP_READONLY},
{"top", WINDOW_TOP, JSPROP_ENUMERATE | JSPROP_READONLY},
{"content", WINDOW_CONTENT, JSPROP_ENUMERATE | JSPROP_READONLY},
{"sidebar", WINDOW_SIDEBAR, JSPROP_ENUMERATE | JSPROP_READONLY},
{"menubar", WINDOW_MENUBAR, JSPROP_ENUMERATE | JSPROP_READONLY},
{"toolbar", WINDOW_TOOLBAR, JSPROP_ENUMERATE | JSPROP_READONLY},
{"locationbar", WINDOW_LOCATIONBAR, JSPROP_ENUMERATE | JSPROP_READONLY},