From b30217fe4a3246470a48ad27623615a09b7d368a Mon Sep 17 00:00:00 2001 From: "kipp%netscape.com" Date: Tue, 21 Jul 1998 04:46:55 +0000 Subject: [PATCH] Implement IScriptContextOwner API git-svn-id: svn://10.0.0.236/trunk@6057 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/docshell/base/nsWebShell.cpp | 57 +++++++++++++++++++++++++++- mozilla/webshell/src/nsWebShell.cpp | 57 +++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 2 deletions(-) diff --git a/mozilla/docshell/base/nsWebShell.cpp b/mozilla/docshell/base/nsWebShell.cpp index 2031e796e19..e30665804fa 100644 --- a/mozilla/docshell/base/nsWebShell.cpp +++ b/mozilla/docshell/base/nsWebShell.cpp @@ -22,6 +22,8 @@ #include "nsIDeviceContext.h" #include "nsILinkHandler.h" #include "nsIStreamListener.h" +#include "nsIScriptGlobalObject.h" +#include "nsIScriptContextOwner.h" #include "nsRepository.h" #include "nsCRT.h" #include "nsVoidArray.h" @@ -61,7 +63,8 @@ static PRLogModuleInfo* gLogModule = PR_NewLogModule("webwidget"); class nsWebShell : public nsIWebShell, public nsIWebShellContainer, - public nsILinkHandler + public nsILinkHandler, + public nsIScriptContextOwner { public: nsWebShell(); @@ -129,6 +132,10 @@ public: const nsString& aTargetSpec); NS_IMETHOD GetLinkState(const nsString& aURLSpec, nsLinkState& aState); + // nsIScriptContextOwner + NS_IMETHOD GetScriptContext(nsIScriptContext **aContext); + NS_IMETHOD ReleaseScriptContext(nsIScriptContext *aContext); + // nsWebShell void HandleLinkClickEvent(const nsString& aURLSpec, const nsString& aTargetSpec, @@ -141,6 +148,9 @@ public: static nsEventStatus PR_CALLBACK HandleEvent(nsGUIEvent *aEvent); protected: + nsIScriptGlobalObject *mScriptGlobal; + nsIScriptContext* mScriptContext; + nsIWebShellContainer* mContainer; nsIContentViewer* mContentViewer; nsIDeviceContext* mDeviceContext; @@ -176,6 +186,7 @@ static NS_DEFINE_IID(kIContentViewerContainerIID, static NS_DEFINE_IID(kIDeviceContextIID, NS_IDEVICE_CONTEXT_IID); static NS_DEFINE_IID(kIDocumentLoaderIID, NS_IDOCUMENTLOADER_IID); static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); +static NS_DEFINE_IID(kIScriptContextOwnerIID, NS_ISCRIPTCONTEXTOWNER_IID); static NS_DEFINE_IID(kIStreamObserverIID, NS_ISTREAMOBSERVER_IID); static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kIWebShellIID, NS_IWEB_SHELL_IID); @@ -241,6 +252,11 @@ nsWebShell::QueryInterface(REFNSIID aIID, void** aInstancePtr) AddRef(); return NS_OK; } + if (aIID.Equals(kIScriptContextOwnerIID)) { + *aInstancePtr = (void*)(nsIScriptContextOwner*)this; + AddRef(); + return NS_OK; + } if (aIID.Equals(kISupportsIID)) { *aInstancePtr = (void*)(nsISupports*)(nsIWebShell*)this; AddRef(); @@ -261,6 +277,11 @@ nsWebShell::QueryCapability(const nsIID &aIID, void** aInstancePtr) AddRef(); return NS_OK; } + if (aIID.Equals(kIScriptContextOwnerIID)) { + *aInstancePtr = (void*) ((nsIScriptContextOwner*)this); + AddRef(); + return NS_OK; + } return NS_NOINTERFACE; } @@ -911,6 +932,40 @@ nsWebShell:: GetLinkState(const nsString& aURLSpec, nsLinkState& aState) //---------------------------------------------------------------------- +nsresult +nsWebShell::GetScriptContext(nsIScriptContext** aContext) +{ + NS_PRECONDITION(nsnull != aContext, "null arg"); + nsresult res = NS_OK; + + if (nsnull == mScriptGlobal) { + res = NS_NewScriptGlobalObject(&mScriptGlobal); + if (NS_OK != res) { + return res; + } + + res = NS_CreateContext(mScriptGlobal, &mScriptContext); + if (NS_OK != res) { + return res; + } + } + + *aContext = mScriptContext; + NS_ADDREF(mScriptContext); + + return res; +} + +nsresult +nsWebShell::ReleaseScriptContext(nsIScriptContext *aContext) +{ + // XXX Is this right? Why are we passing in a context? + NS_IF_RELEASE(aContext); + return NS_OK; +} + +//---------------------------------------------------------------------- + // Factory code for creating nsWebShell's class nsWebShellFactory : public nsIFactory diff --git a/mozilla/webshell/src/nsWebShell.cpp b/mozilla/webshell/src/nsWebShell.cpp index 2031e796e19..e30665804fa 100644 --- a/mozilla/webshell/src/nsWebShell.cpp +++ b/mozilla/webshell/src/nsWebShell.cpp @@ -22,6 +22,8 @@ #include "nsIDeviceContext.h" #include "nsILinkHandler.h" #include "nsIStreamListener.h" +#include "nsIScriptGlobalObject.h" +#include "nsIScriptContextOwner.h" #include "nsRepository.h" #include "nsCRT.h" #include "nsVoidArray.h" @@ -61,7 +63,8 @@ static PRLogModuleInfo* gLogModule = PR_NewLogModule("webwidget"); class nsWebShell : public nsIWebShell, public nsIWebShellContainer, - public nsILinkHandler + public nsILinkHandler, + public nsIScriptContextOwner { public: nsWebShell(); @@ -129,6 +132,10 @@ public: const nsString& aTargetSpec); NS_IMETHOD GetLinkState(const nsString& aURLSpec, nsLinkState& aState); + // nsIScriptContextOwner + NS_IMETHOD GetScriptContext(nsIScriptContext **aContext); + NS_IMETHOD ReleaseScriptContext(nsIScriptContext *aContext); + // nsWebShell void HandleLinkClickEvent(const nsString& aURLSpec, const nsString& aTargetSpec, @@ -141,6 +148,9 @@ public: static nsEventStatus PR_CALLBACK HandleEvent(nsGUIEvent *aEvent); protected: + nsIScriptGlobalObject *mScriptGlobal; + nsIScriptContext* mScriptContext; + nsIWebShellContainer* mContainer; nsIContentViewer* mContentViewer; nsIDeviceContext* mDeviceContext; @@ -176,6 +186,7 @@ static NS_DEFINE_IID(kIContentViewerContainerIID, static NS_DEFINE_IID(kIDeviceContextIID, NS_IDEVICE_CONTEXT_IID); static NS_DEFINE_IID(kIDocumentLoaderIID, NS_IDOCUMENTLOADER_IID); static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); +static NS_DEFINE_IID(kIScriptContextOwnerIID, NS_ISCRIPTCONTEXTOWNER_IID); static NS_DEFINE_IID(kIStreamObserverIID, NS_ISTREAMOBSERVER_IID); static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kIWebShellIID, NS_IWEB_SHELL_IID); @@ -241,6 +252,11 @@ nsWebShell::QueryInterface(REFNSIID aIID, void** aInstancePtr) AddRef(); return NS_OK; } + if (aIID.Equals(kIScriptContextOwnerIID)) { + *aInstancePtr = (void*)(nsIScriptContextOwner*)this; + AddRef(); + return NS_OK; + } if (aIID.Equals(kISupportsIID)) { *aInstancePtr = (void*)(nsISupports*)(nsIWebShell*)this; AddRef(); @@ -261,6 +277,11 @@ nsWebShell::QueryCapability(const nsIID &aIID, void** aInstancePtr) AddRef(); return NS_OK; } + if (aIID.Equals(kIScriptContextOwnerIID)) { + *aInstancePtr = (void*) ((nsIScriptContextOwner*)this); + AddRef(); + return NS_OK; + } return NS_NOINTERFACE; } @@ -911,6 +932,40 @@ nsWebShell:: GetLinkState(const nsString& aURLSpec, nsLinkState& aState) //---------------------------------------------------------------------- +nsresult +nsWebShell::GetScriptContext(nsIScriptContext** aContext) +{ + NS_PRECONDITION(nsnull != aContext, "null arg"); + nsresult res = NS_OK; + + if (nsnull == mScriptGlobal) { + res = NS_NewScriptGlobalObject(&mScriptGlobal); + if (NS_OK != res) { + return res; + } + + res = NS_CreateContext(mScriptGlobal, &mScriptContext); + if (NS_OK != res) { + return res; + } + } + + *aContext = mScriptContext; + NS_ADDREF(mScriptContext); + + return res; +} + +nsresult +nsWebShell::ReleaseScriptContext(nsIScriptContext *aContext) +{ + // XXX Is this right? Why are we passing in a context? + NS_IF_RELEASE(aContext); + return NS_OK; +} + +//---------------------------------------------------------------------- + // Factory code for creating nsWebShell's class nsWebShellFactory : public nsIFactory