mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 11:25:00 +00:00
Separated scripting global object responsibilities from the WebWidget. Added better masking of JS-specific structures in generic interfaces. Creation of a scripting global object interface.
This commit is contained in:
parent
b5f413930d
commit
c0e592da07
@ -38,6 +38,7 @@
|
||||
#include "nsString.h"
|
||||
#include "nsIScriptContext.h"
|
||||
#include "nsIScriptObjectOwner.h"
|
||||
#include "nsIScriptGlobalObject.h"
|
||||
#include "nsICSSParser.h"
|
||||
#include "nsIDOMDocument.h"
|
||||
#include "prprf.h"
|
||||
@ -53,7 +54,7 @@
|
||||
((nsWebWidget*) ((char*)this - nsWebWidget::GetOuterOffset()))
|
||||
|
||||
// Machine independent implementation portion of the web widget
|
||||
class WebWidgetImpl : public nsIWebWidget, public nsIScriptObjectOwner {
|
||||
class WebWidgetImpl : public nsIWebWidget {
|
||||
public:
|
||||
WebWidgetImpl();
|
||||
~WebWidgetImpl();
|
||||
@ -108,9 +109,6 @@ public:
|
||||
NS_IMETHOD GetDOMDocument(nsIDOMDocument** aDocument);
|
||||
NS_IMETHOD ReleaseScriptContext();
|
||||
|
||||
NS_IMETHOD GetScriptObject(JSContext *aContext, void** aScriptObject);
|
||||
NS_IMETHOD ResetScriptObject();
|
||||
|
||||
private:
|
||||
nsresult ProvideDefaultHandlers();
|
||||
void ForceRefresh();
|
||||
@ -126,8 +124,8 @@ private:
|
||||
nsIStyleSheet* mUAStyleSheet;
|
||||
nsILinkHandler* mLinkHandler;
|
||||
nsISupports* mContainer;
|
||||
nsIScriptGlobalObject *mScriptGlobal;
|
||||
nsIScriptContext* mScriptContext;
|
||||
void* mScriptObject;
|
||||
|
||||
static nsIWebWidget* gRootWebWidget;
|
||||
};
|
||||
@ -155,11 +153,6 @@ nsresult WebWidgetImpl::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(kIScriptObjectOwnerIID)) {
|
||||
*aInstancePtr = (void*)(nsIScriptObjectOwner*)this;
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
*aInstancePtr = (void*)(nsISupports*)(nsIWebWidget*)this;
|
||||
AddRef();
|
||||
@ -193,6 +186,7 @@ WebWidgetImpl::~WebWidgetImpl()
|
||||
NS_IF_RELEASE(mUAStyleSheet);
|
||||
|
||||
NS_IF_RELEASE(mScriptContext);
|
||||
NS_IF_RELEASE(mScriptGlobal);
|
||||
}
|
||||
|
||||
nsresult WebWidgetImpl::MakeWindow(nsNativeWindow aNativeParent,
|
||||
@ -447,6 +441,10 @@ WebWidgetImpl::LoadURL(const nsString& aURLSpec,
|
||||
// Break circular reference first
|
||||
mPresShell->EndObservingDocument();
|
||||
|
||||
if (nsnull != mScriptGlobal) {
|
||||
mScriptGlobal->SetNewDocument(nsnull);
|
||||
}
|
||||
|
||||
// Then release the shell
|
||||
NS_RELEASE(mPresShell);
|
||||
mPresShell = nsnull;
|
||||
@ -498,6 +496,15 @@ WebWidgetImpl::LoadURL(const nsString& aURLSpec,
|
||||
|
||||
PRTime start = PR_Now();
|
||||
|
||||
if (nsnull != mScriptGlobal) {
|
||||
nsIDOMDocument *domdoc;
|
||||
GetDOMDocument(&domdoc);
|
||||
if (nsnull != domdoc) {
|
||||
mScriptGlobal->SetNewDocument(domdoc);
|
||||
NS_RELEASE(domdoc);
|
||||
}
|
||||
}
|
||||
|
||||
// Now load the document
|
||||
mPresShell->EnterReflowLock();
|
||||
doc->LoadURL(url, aListener, aPostData);
|
||||
@ -748,12 +755,26 @@ nsresult WebWidgetImpl::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;
|
||||
}
|
||||
|
||||
nsIDOMDocument *document;
|
||||
res = GetDOMDocument(&document);
|
||||
if (NS_OK != res) {
|
||||
return res;
|
||||
}
|
||||
mScriptGlobal->SetNewDocument(document);
|
||||
NS_RELEASE(document);
|
||||
}
|
||||
|
||||
if (nsnull == mScriptContext) {
|
||||
res = NS_CreateContext(this, &mScriptContext);
|
||||
res = NS_CreateContext(mScriptGlobal, &mScriptContext);
|
||||
}
|
||||
|
||||
if (NS_OK == res) {
|
||||
NS_ADDREF(mScriptContext);
|
||||
*aContext = mScriptContext;
|
||||
}
|
||||
|
||||
@ -762,23 +783,18 @@ nsresult WebWidgetImpl::GetScriptContext(nsIScriptContext **aContext)
|
||||
|
||||
nsresult WebWidgetImpl::GetDOMDocument(nsIDOMDocument** aDocument)
|
||||
{
|
||||
nsresult res = NS_OK;
|
||||
nsIDocument *doc = GetDocument();
|
||||
*aDocument = nsnull;
|
||||
|
||||
static NS_DEFINE_IID(kIDOMDocumentIID, NS_IDOMDOCUMENT_IID);
|
||||
|
||||
if (doc != nsnull) {
|
||||
return doc->QueryInterface(kIDOMDocumentIID, (void**)aDocument);
|
||||
res = doc->QueryInterface(kIDOMDocumentIID, (void**)aDocument);
|
||||
NS_RELEASE(doc);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult WebWidgetImpl::ResetScriptObject()
|
||||
{
|
||||
mScriptObject = nsnull;
|
||||
return NS_OK;
|
||||
return res;
|
||||
}
|
||||
|
||||
nsresult WebWidgetImpl::ReleaseScriptContext()
|
||||
@ -789,21 +805,6 @@ nsresult WebWidgetImpl::ReleaseScriptContext()
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult WebWidgetImpl::GetScriptObject(JSContext *aContext, void** aScriptObject)
|
||||
{
|
||||
NS_PRECONDITION(nsnull != aScriptObject, "null arg");
|
||||
nsresult res = NS_OK;
|
||||
if (nsnull == mScriptObject) {
|
||||
mScriptObject = mScriptContext->GetGlobalObject();
|
||||
if (nsnull == mScriptObject) {
|
||||
res = NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
*aScriptObject = (void*)mScriptObject;
|
||||
return res;
|
||||
}
|
||||
|
||||
/*******************************************
|
||||
/* nsWebWidgetFactory
|
||||
/*******************************************/
|
||||
|
@ -929,7 +929,7 @@ void JSConsole::EvaluateText(UINT aStartSel, UINT aEndSel)
|
||||
}
|
||||
|
||||
// clean up a bit
|
||||
JS_GC(mContext->GetContext());
|
||||
JS_GC((JSContext *)mContext->GetNativeContext());
|
||||
}
|
||||
else {
|
||||
::MessageBox(mMainWindow,
|
||||
|
Loading…
Reference in New Issue
Block a user