Switching over to nsIEventQueues. Adding support for onunload, onabort, and

onerror.  Adding support for event capturing through script.  Adding support
for robust error-checking in the chrome registry.
This commit is contained in:
hyatt%netscape.com 1999-05-04 23:32:25 +00:00
parent eb5cc9711c
commit e4b0beec4c
11 changed files with 405 additions and 16 deletions

View File

@ -360,7 +360,7 @@ nsChromeRegistry::GetChromeResource(nsString& aResult,
}
if (chromeBase == nsnull)
return NS_OK;
return NS_ERROR_FAILURE;
nsCOMPtr<nsIRDFResource> resource;
nsCOMPtr<nsIRDFLiteral> literal;

View File

@ -117,6 +117,7 @@ static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIXMLContentIID, NS_IXMLCONTENT_IID);
static NS_DEFINE_CID(kEventListenerManagerCID, NS_EVENTLISTENERMANAGER_CID);
static NS_DEFINE_IID(kIDOMEventTargetIID, NS_IDOMEVENTTARGET_IID);
static NS_DEFINE_CID(kNameSpaceManagerCID, NS_NAMESPACEMANAGER_CID);
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
@ -475,6 +476,9 @@ RDFElementImpl::QueryInterface(REFNSIID iid, void** result)
else if (iid.Equals(kIDOMEventReceiverIID)) {
*result = NS_STATIC_CAST(nsIDOMEventReceiver*, this);
}
else if (iid.Equals(kIDOMEventTargetIID)) {
*result = NS_STATIC_CAST(nsIDOMEventTarget*, this);
}
else if (iid.Equals(kIJSScriptObjectIID)) {
*result = NS_STATIC_CAST(nsIJSScriptObject*, this);
}
@ -1773,8 +1777,9 @@ RDFElementImpl::SetAttribute(PRInt32 aNameSpaceID,
AddScriptEventListener(aName, aValue, kIDOMKeyListenerIID);
else if (attributeName.EqualsIgnoreCase("onmousemove"))
AddScriptEventListener(aName, aValue, kIDOMMouseMotionListenerIID);
else if (attributeName.EqualsIgnoreCase("onload"))
AddScriptEventListener(aName, aValue, kIDOMLoadListenerIID);
// XXX Temporarily commented out to avoid bustage of nsIXULWindowCallbacks in nsWebShellWindow
//else if (attributeName.EqualsIgnoreCase("onload"))
// AddScriptEventListener(aName, aValue, kIDOMLoadListenerIID);
else if (attributeName.EqualsIgnoreCase("onunload") ||
attributeName.EqualsIgnoreCase("onabort") ||
attributeName.EqualsIgnoreCase("onerror"))
@ -1836,7 +1841,30 @@ RDFElementImpl::AddScriptEventListener(nsIAtom* aName, const nsString& aValue, R
nsIScriptContextOwner* owner;
owner = mDocument->GetScriptContextOwner();
nsAutoString tagStr;
mTag->ToString(tagStr);
if (NS_OK == owner->GetScriptContext(&context)) {
if (tagStr == "window") {
nsIDOMEventReceiver *receiver;
nsIScriptGlobalObject *global = context->GetGlobalObject();
if (nsnull != global && NS_OK == global->QueryInterface(kIDOMEventReceiverIID, (void**)&receiver)) {
nsIEventListenerManager *manager;
if (NS_OK == receiver->GetListenerManager(&manager)) {
nsIScriptObjectOwner *mObjectOwner;
if (NS_OK == global->QueryInterface(kIScriptObjectOwnerIID, (void**)&mObjectOwner)) {
ret = manager->AddScriptEventListener(context, mObjectOwner, aName, aValue, aIID);
NS_RELEASE(mObjectOwner);
}
NS_RELEASE(manager);
}
NS_RELEASE(receiver);
}
NS_IF_RELEASE(global);
}
else {
nsIEventListenerManager *manager;
if (NS_OK == GetListenerManager(&manager)) {
nsIScriptObjectOwner* owner;
@ -1849,6 +1877,7 @@ RDFElementImpl::AddScriptEventListener(nsIAtom* aName, const nsString& aValue, R
NS_RELEASE(manager);
}
NS_RELEASE(context);
}
}
NS_RELEASE(owner);

View File

@ -37,6 +37,7 @@
#include "nsICSSStyleSheet.h"
#include "nsIContent.h"
#include "nsIDOMElementObserver.h"
#include "nsIDOMEventCapturer.h"
#include "nsIDOMNodeObserver.h"
#include "nsIDOMScriptObjectFactory.h"
#include "nsIDOMSelection.h"
@ -62,6 +63,7 @@
#include "nsIRDFDocument.h"
#include "nsIRDFNode.h"
#include "nsIRDFService.h"
#include "nsIEventListenerManager.h"
#include "nsIScriptContextOwner.h"
#include "nsIScriptGlobalObject.h"
#include "nsIScriptObjectOwner.h"
@ -93,6 +95,9 @@
#include "rdfutil.h"
#include "rdf.h"
#include "nsIDOMEventCapturer.h"
#include "nsIDOMEventReceiver.h"
#include "nsILineBreakerFactory.h"
#include "nsIWordBreakerFactory.h"
#include "nsLWBrkCIID.h"
@ -122,13 +127,18 @@ static NS_DEFINE_IID(kIRDFResourceIID, NS_IRDFRESOURCE_IID);
static NS_DEFINE_IID(kIRDFServiceIID, NS_IRDFSERVICE_IID);
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
static NS_DEFINE_IID(kIDOMSelectionIID, NS_IDOMSELECTION_IID);
static NS_DEFINE_IID(kIDOMEventCapturerIID, NS_IDOMEVENTCAPTURER_IID);
static NS_DEFINE_IID(kIDOMEventReceiverIID, NS_IDOMEVENTRECEIVER_IID);
static NS_DEFINE_IID(kIDOMEventTargetIID, NS_IDOMEVENTTARGET_IID);
static NS_DEFINE_IID(kIStreamListenerIID, NS_ISTREAMLISTENER_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);
static NS_DEFINE_IID(kIXMLDocumentIID, NS_IXMLDOCUMENT_IID);
static NS_DEFINE_IID(kIXULContentSinkIID, NS_IXULCONTENTSINK_IID);
static NS_DEFINE_IID(kIEventListenerManagerIID, NS_IEVENTLISTENERMANAGER_IID);
static NS_DEFINE_CID(kEventListenerManagerCID, NS_EVENTLISTENERMANAGER_CID);
static NS_DEFINE_CID(kCSSParserCID, NS_CSSPARSER_CID);
static NS_DEFINE_CID(kDOMScriptObjectFactoryCID, NS_DOM_SCRIPT_OBJECT_FACTORY_CID);
static NS_DEFINE_CID(kHTMLStyleSheetCID, NS_HTMLSTYLESHEET_CID);
@ -364,6 +374,7 @@ class XULDocumentImpl : public nsIDocument,
public nsIRDFDocument,
public nsIStreamLoadableDocument,
public nsIDOMXULDocument,
public nsIDOMEventCapturer,
public nsIJSScriptObject,
public nsIScriptObjectOwner,
public nsIHTMLContentContainer,
@ -555,6 +566,22 @@ public:
NS_IMETHOD AddContentModelBuilder(nsIRDFContentModelBuilder* aBuilder);
NS_IMETHOD GetDocumentDataSource(nsIRDFDataSource** aDatasource);
// nsIDOMEventCapturer interface
NS_IMETHOD CaptureEvent(const nsString& aType);
NS_IMETHOD ReleaseEvent(const nsString& aType);
// nsIDOMEventReceiver interface (yuck. inherited from nsIDOMEventCapturer)
NS_IMETHOD AddEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID);
NS_IMETHOD RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID);
NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult);
NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult);
// nsIDOMEventTarget interface
NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener,
PRBool aPostProcess, PRBool aUseCapture);
NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener,
PRBool aPostProcess, PRBool aUseCapture);
// nsIDOMDocument interface
NS_IMETHOD GetDoctype(nsIDOMDocumentType** aDoctype);
NS_IMETHOD GetImplementation(nsIDOMDOMImplementation** aImplementation);
@ -697,6 +724,7 @@ protected:
nsIDOMSelection* mSelection; // [OWNER]
PRBool mDisplaySelection;
nsVoidArray mPresShells;
nsIEventListenerManager* mListenerManager;
nsINameSpaceManager* mNameSpaceManager; // [OWNER]
nsIHTMLStyleSheet* mAttrStyleSheet; // [OWNER]
nsCOMPtr<nsIHTMLCSSStyleSheet> mInlineStyleSheet;
@ -745,7 +773,8 @@ XULDocumentImpl::XULDocumentImpl(void)
mWordBreaker(nsnull),
mContentViewerContainer(nsnull),
mCommand(""),
mFragmentRoot(nsnull)
mFragmentRoot(nsnull),
mListenerManager(nsnull)
{
NS_INIT_REFCNT();
@ -789,6 +818,8 @@ XULDocumentImpl::~XULDocumentImpl()
NS_IF_RELEASE(mDocumentDataSource);
NS_IF_RELEASE(mLocalDataSource);
NS_IF_RELEASE(mListenerManager);
// mParentDocument is never refcounted
// Delete references to sub-documents
PRInt32 index = mSubDocuments.Count();
@ -920,6 +951,15 @@ XULDocumentImpl::QueryInterface(REFNSIID iid, void** result)
else if (iid.Equals(nsIDOMElementObserver::GetIID())) {
*result = NS_STATIC_CAST(nsIDOMElementObserver*, this);
}
else if (iid.Equals(kIDOMEventReceiverIID)) {
*result = NS_STATIC_CAST(nsIDOMEventReceiver*, this);
}
else if (iid.Equals(kIDOMEventTargetIID)) {
*result = NS_STATIC_CAST(nsIDOMEventTarget*, this);
}
else if (iid.Equals(kIDOMEventCapturerIID)) {
*result = NS_STATIC_CAST(nsIDOMEventCapturer*, this);
}
else if (iid.Equals(nsIStreamLoadableDocument::GetIID())) {
*result = NS_STATIC_CAST(nsIStreamLoadableDocument*, this);
}
@ -2821,7 +2861,7 @@ XULDocumentImpl::GetChildNodes(nsIDOMNodeList** aChildNodes)
rv = nsRDFDOMNodeList::Create(&children);
if (NS_SUCCEEDED(rv)) {
nsIDOMNode* domNode;
nsIDOMNode* domNode = nsnull;
rv = mRootContent->QueryInterface(nsIDOMNode::GetIID(), (void**)&domNode);
NS_ASSERTION(NS_SUCCEEDED(rv), "root content is not a DOM node");
@ -3705,3 +3745,110 @@ XULDocumentImpl::MakeProperty(PRInt32 aNameSpaceID, nsIAtom* aTag, nsIRDFResourc
rv = gRDFService->GetUnicodeResource(uri.GetUnicode(), aResult);
return rv;
}
// nsIDOMEventCapturer and nsIDOMEventReceiver Interface Implementations
NS_IMETHODIMP
XULDocumentImpl::AddEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID)
{
nsIEventListenerManager *manager;
if (NS_OK == GetListenerManager(&manager)) {
manager->AddEventListenerByIID(aListener, aIID, NS_EVENT_FLAG_BUBBLE);
NS_RELEASE(manager);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
XULDocumentImpl::RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID)
{
if (nsnull != mListenerManager) {
mListenerManager->RemoveEventListenerByIID(aListener, aIID, NS_EVENT_FLAG_BUBBLE);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
XULDocumentImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener,
PRBool aPostProcess, PRBool aUseCapture)
{
nsIEventListenerManager *manager;
if (NS_OK == GetListenerManager(&manager)) {
PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) |
(aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE);
manager->AddEventListenerByType(aListener, aType, flags);
NS_RELEASE(manager);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
XULDocumentImpl::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener,
PRBool aPostProcess, PRBool aUseCapture)
{
if (nsnull != mListenerManager) {
PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) |
(aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE);
mListenerManager->RemoveEventListenerByType(aListener, aType, flags);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
XULDocumentImpl::GetListenerManager(nsIEventListenerManager** aResult)
{
if (nsnull != mListenerManager) {
NS_ADDREF(mListenerManager);
*aResult = mListenerManager;
return NS_OK;
}
nsresult rv = nsComponentManager::CreateInstance(kEventListenerManagerCID,
nsnull,
kIEventListenerManagerIID,
(void**) aResult);
if (NS_OK == rv) {
mListenerManager = *aResult;
NS_ADDREF(mListenerManager);
}
return rv;
}
NS_IMETHODIMP
XULDocumentImpl::GetNewListenerManager(nsIEventListenerManager **aResult)
{
return nsComponentManager::CreateInstance(kEventListenerManagerCID,
nsnull,
kIEventListenerManagerIID,
(void**) aResult);
}
nsresult
XULDocumentImpl::CaptureEvent(const nsString& aType)
{
nsIEventListenerManager *mManager;
if (NS_OK == GetListenerManager(&mManager)) {
//mManager->CaptureEvent(aListener);
NS_RELEASE(mManager);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
nsresult
XULDocumentImpl::ReleaseEvent(const nsString& aType)
{
if (nsnull != mListenerManager) {
//mListenerManager->ReleaseEvent(aListener);
return NS_OK;
}
return NS_ERROR_FAILURE;
}

View File

@ -483,13 +483,15 @@ int main(int argc, char **argv)
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to create thread event queue");
if (NS_FAILED(rv)) return rv;
PLEventQueue* mainQueue;
nsIEventQueue* mainQueue;
rv = theEventQueueService->GetThreadEventQueue(PR_GetCurrentThread(),
&mainQueue);
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get event queue for current thread");
if (NS_FAILED(rv)) return rv;
NS_IF_RELEASE(mainQueue);
// Create a WAI instance, register, and run.
nsBrowsingProfileReader service(kInstanceName, argc, argv);
rv = service.Init();

View File

@ -360,7 +360,7 @@ nsChromeRegistry::GetChromeResource(nsString& aResult,
}
if (chromeBase == nsnull)
return NS_OK;
return NS_ERROR_FAILURE;
nsCOMPtr<nsIRDFResource> resource;
nsCOMPtr<nsIRDFLiteral> literal;

View File

@ -117,6 +117,7 @@ static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIXMLContentIID, NS_IXMLCONTENT_IID);
static NS_DEFINE_CID(kEventListenerManagerCID, NS_EVENTLISTENERMANAGER_CID);
static NS_DEFINE_IID(kIDOMEventTargetIID, NS_IDOMEVENTTARGET_IID);
static NS_DEFINE_CID(kNameSpaceManagerCID, NS_NAMESPACEMANAGER_CID);
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
@ -475,6 +476,9 @@ RDFElementImpl::QueryInterface(REFNSIID iid, void** result)
else if (iid.Equals(kIDOMEventReceiverIID)) {
*result = NS_STATIC_CAST(nsIDOMEventReceiver*, this);
}
else if (iid.Equals(kIDOMEventTargetIID)) {
*result = NS_STATIC_CAST(nsIDOMEventTarget*, this);
}
else if (iid.Equals(kIJSScriptObjectIID)) {
*result = NS_STATIC_CAST(nsIJSScriptObject*, this);
}
@ -1773,8 +1777,9 @@ RDFElementImpl::SetAttribute(PRInt32 aNameSpaceID,
AddScriptEventListener(aName, aValue, kIDOMKeyListenerIID);
else if (attributeName.EqualsIgnoreCase("onmousemove"))
AddScriptEventListener(aName, aValue, kIDOMMouseMotionListenerIID);
else if (attributeName.EqualsIgnoreCase("onload"))
AddScriptEventListener(aName, aValue, kIDOMLoadListenerIID);
// XXX Temporarily commented out to avoid bustage of nsIXULWindowCallbacks in nsWebShellWindow
//else if (attributeName.EqualsIgnoreCase("onload"))
// AddScriptEventListener(aName, aValue, kIDOMLoadListenerIID);
else if (attributeName.EqualsIgnoreCase("onunload") ||
attributeName.EqualsIgnoreCase("onabort") ||
attributeName.EqualsIgnoreCase("onerror"))
@ -1836,7 +1841,30 @@ RDFElementImpl::AddScriptEventListener(nsIAtom* aName, const nsString& aValue, R
nsIScriptContextOwner* owner;
owner = mDocument->GetScriptContextOwner();
nsAutoString tagStr;
mTag->ToString(tagStr);
if (NS_OK == owner->GetScriptContext(&context)) {
if (tagStr == "window") {
nsIDOMEventReceiver *receiver;
nsIScriptGlobalObject *global = context->GetGlobalObject();
if (nsnull != global && NS_OK == global->QueryInterface(kIDOMEventReceiverIID, (void**)&receiver)) {
nsIEventListenerManager *manager;
if (NS_OK == receiver->GetListenerManager(&manager)) {
nsIScriptObjectOwner *mObjectOwner;
if (NS_OK == global->QueryInterface(kIScriptObjectOwnerIID, (void**)&mObjectOwner)) {
ret = manager->AddScriptEventListener(context, mObjectOwner, aName, aValue, aIID);
NS_RELEASE(mObjectOwner);
}
NS_RELEASE(manager);
}
NS_RELEASE(receiver);
}
NS_IF_RELEASE(global);
}
else {
nsIEventListenerManager *manager;
if (NS_OK == GetListenerManager(&manager)) {
nsIScriptObjectOwner* owner;
@ -1849,6 +1877,7 @@ RDFElementImpl::AddScriptEventListener(nsIAtom* aName, const nsString& aValue, R
NS_RELEASE(manager);
}
NS_RELEASE(context);
}
}
NS_RELEASE(owner);

View File

@ -37,6 +37,7 @@
#include "nsICSSStyleSheet.h"
#include "nsIContent.h"
#include "nsIDOMElementObserver.h"
#include "nsIDOMEventCapturer.h"
#include "nsIDOMNodeObserver.h"
#include "nsIDOMScriptObjectFactory.h"
#include "nsIDOMSelection.h"
@ -62,6 +63,7 @@
#include "nsIRDFDocument.h"
#include "nsIRDFNode.h"
#include "nsIRDFService.h"
#include "nsIEventListenerManager.h"
#include "nsIScriptContextOwner.h"
#include "nsIScriptGlobalObject.h"
#include "nsIScriptObjectOwner.h"
@ -93,6 +95,9 @@
#include "rdfutil.h"
#include "rdf.h"
#include "nsIDOMEventCapturer.h"
#include "nsIDOMEventReceiver.h"
#include "nsILineBreakerFactory.h"
#include "nsIWordBreakerFactory.h"
#include "nsLWBrkCIID.h"
@ -122,13 +127,18 @@ static NS_DEFINE_IID(kIRDFResourceIID, NS_IRDFRESOURCE_IID);
static NS_DEFINE_IID(kIRDFServiceIID, NS_IRDFSERVICE_IID);
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
static NS_DEFINE_IID(kIDOMSelectionIID, NS_IDOMSELECTION_IID);
static NS_DEFINE_IID(kIDOMEventCapturerIID, NS_IDOMEVENTCAPTURER_IID);
static NS_DEFINE_IID(kIDOMEventReceiverIID, NS_IDOMEVENTRECEIVER_IID);
static NS_DEFINE_IID(kIDOMEventTargetIID, NS_IDOMEVENTTARGET_IID);
static NS_DEFINE_IID(kIStreamListenerIID, NS_ISTREAMLISTENER_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);
static NS_DEFINE_IID(kIXMLDocumentIID, NS_IXMLDOCUMENT_IID);
static NS_DEFINE_IID(kIXULContentSinkIID, NS_IXULCONTENTSINK_IID);
static NS_DEFINE_IID(kIEventListenerManagerIID, NS_IEVENTLISTENERMANAGER_IID);
static NS_DEFINE_CID(kEventListenerManagerCID, NS_EVENTLISTENERMANAGER_CID);
static NS_DEFINE_CID(kCSSParserCID, NS_CSSPARSER_CID);
static NS_DEFINE_CID(kDOMScriptObjectFactoryCID, NS_DOM_SCRIPT_OBJECT_FACTORY_CID);
static NS_DEFINE_CID(kHTMLStyleSheetCID, NS_HTMLSTYLESHEET_CID);
@ -364,6 +374,7 @@ class XULDocumentImpl : public nsIDocument,
public nsIRDFDocument,
public nsIStreamLoadableDocument,
public nsIDOMXULDocument,
public nsIDOMEventCapturer,
public nsIJSScriptObject,
public nsIScriptObjectOwner,
public nsIHTMLContentContainer,
@ -555,6 +566,22 @@ public:
NS_IMETHOD AddContentModelBuilder(nsIRDFContentModelBuilder* aBuilder);
NS_IMETHOD GetDocumentDataSource(nsIRDFDataSource** aDatasource);
// nsIDOMEventCapturer interface
NS_IMETHOD CaptureEvent(const nsString& aType);
NS_IMETHOD ReleaseEvent(const nsString& aType);
// nsIDOMEventReceiver interface (yuck. inherited from nsIDOMEventCapturer)
NS_IMETHOD AddEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID);
NS_IMETHOD RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID);
NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult);
NS_IMETHOD GetNewListenerManager(nsIEventListenerManager **aInstancePtrResult);
// nsIDOMEventTarget interface
NS_IMETHOD AddEventListener(const nsString& aType, nsIDOMEventListener* aListener,
PRBool aPostProcess, PRBool aUseCapture);
NS_IMETHOD RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener,
PRBool aPostProcess, PRBool aUseCapture);
// nsIDOMDocument interface
NS_IMETHOD GetDoctype(nsIDOMDocumentType** aDoctype);
NS_IMETHOD GetImplementation(nsIDOMDOMImplementation** aImplementation);
@ -697,6 +724,7 @@ protected:
nsIDOMSelection* mSelection; // [OWNER]
PRBool mDisplaySelection;
nsVoidArray mPresShells;
nsIEventListenerManager* mListenerManager;
nsINameSpaceManager* mNameSpaceManager; // [OWNER]
nsIHTMLStyleSheet* mAttrStyleSheet; // [OWNER]
nsCOMPtr<nsIHTMLCSSStyleSheet> mInlineStyleSheet;
@ -745,7 +773,8 @@ XULDocumentImpl::XULDocumentImpl(void)
mWordBreaker(nsnull),
mContentViewerContainer(nsnull),
mCommand(""),
mFragmentRoot(nsnull)
mFragmentRoot(nsnull),
mListenerManager(nsnull)
{
NS_INIT_REFCNT();
@ -789,6 +818,8 @@ XULDocumentImpl::~XULDocumentImpl()
NS_IF_RELEASE(mDocumentDataSource);
NS_IF_RELEASE(mLocalDataSource);
NS_IF_RELEASE(mListenerManager);
// mParentDocument is never refcounted
// Delete references to sub-documents
PRInt32 index = mSubDocuments.Count();
@ -920,6 +951,15 @@ XULDocumentImpl::QueryInterface(REFNSIID iid, void** result)
else if (iid.Equals(nsIDOMElementObserver::GetIID())) {
*result = NS_STATIC_CAST(nsIDOMElementObserver*, this);
}
else if (iid.Equals(kIDOMEventReceiverIID)) {
*result = NS_STATIC_CAST(nsIDOMEventReceiver*, this);
}
else if (iid.Equals(kIDOMEventTargetIID)) {
*result = NS_STATIC_CAST(nsIDOMEventTarget*, this);
}
else if (iid.Equals(kIDOMEventCapturerIID)) {
*result = NS_STATIC_CAST(nsIDOMEventCapturer*, this);
}
else if (iid.Equals(nsIStreamLoadableDocument::GetIID())) {
*result = NS_STATIC_CAST(nsIStreamLoadableDocument*, this);
}
@ -2821,7 +2861,7 @@ XULDocumentImpl::GetChildNodes(nsIDOMNodeList** aChildNodes)
rv = nsRDFDOMNodeList::Create(&children);
if (NS_SUCCEEDED(rv)) {
nsIDOMNode* domNode;
nsIDOMNode* domNode = nsnull;
rv = mRootContent->QueryInterface(nsIDOMNode::GetIID(), (void**)&domNode);
NS_ASSERTION(NS_SUCCEEDED(rv), "root content is not a DOM node");
@ -3705,3 +3745,110 @@ XULDocumentImpl::MakeProperty(PRInt32 aNameSpaceID, nsIAtom* aTag, nsIRDFResourc
rv = gRDFService->GetUnicodeResource(uri.GetUnicode(), aResult);
return rv;
}
// nsIDOMEventCapturer and nsIDOMEventReceiver Interface Implementations
NS_IMETHODIMP
XULDocumentImpl::AddEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID)
{
nsIEventListenerManager *manager;
if (NS_OK == GetListenerManager(&manager)) {
manager->AddEventListenerByIID(aListener, aIID, NS_EVENT_FLAG_BUBBLE);
NS_RELEASE(manager);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
XULDocumentImpl::RemoveEventListenerByIID(nsIDOMEventListener *aListener, const nsIID& aIID)
{
if (nsnull != mListenerManager) {
mListenerManager->RemoveEventListenerByIID(aListener, aIID, NS_EVENT_FLAG_BUBBLE);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
XULDocumentImpl::AddEventListener(const nsString& aType, nsIDOMEventListener* aListener,
PRBool aPostProcess, PRBool aUseCapture)
{
nsIEventListenerManager *manager;
if (NS_OK == GetListenerManager(&manager)) {
PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) |
(aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE);
manager->AddEventListenerByType(aListener, aType, flags);
NS_RELEASE(manager);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
XULDocumentImpl::RemoveEventListener(const nsString& aType, nsIDOMEventListener* aListener,
PRBool aPostProcess, PRBool aUseCapture)
{
if (nsnull != mListenerManager) {
PRInt32 flags = (aPostProcess ? NS_EVENT_FLAG_POST_PROCESS : NS_EVENT_FLAG_NONE) |
(aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE);
mListenerManager->RemoveEventListenerByType(aListener, aType, flags);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
XULDocumentImpl::GetListenerManager(nsIEventListenerManager** aResult)
{
if (nsnull != mListenerManager) {
NS_ADDREF(mListenerManager);
*aResult = mListenerManager;
return NS_OK;
}
nsresult rv = nsComponentManager::CreateInstance(kEventListenerManagerCID,
nsnull,
kIEventListenerManagerIID,
(void**) aResult);
if (NS_OK == rv) {
mListenerManager = *aResult;
NS_ADDREF(mListenerManager);
}
return rv;
}
NS_IMETHODIMP
XULDocumentImpl::GetNewListenerManager(nsIEventListenerManager **aResult)
{
return nsComponentManager::CreateInstance(kEventListenerManagerCID,
nsnull,
kIEventListenerManagerIID,
(void**) aResult);
}
nsresult
XULDocumentImpl::CaptureEvent(const nsString& aType)
{
nsIEventListenerManager *mManager;
if (NS_OK == GetListenerManager(&mManager)) {
//mManager->CaptureEvent(aListener);
NS_RELEASE(mManager);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
nsresult
XULDocumentImpl::ReleaseEvent(const nsString& aType)
{
if (nsnull != mListenerManager) {
//mListenerManager->ReleaseEvent(aListener);
return NS_OK;
}
return NS_ERROR_FAILURE;
}

View File

@ -117,6 +117,7 @@ static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIXMLContentIID, NS_IXMLCONTENT_IID);
static NS_DEFINE_CID(kEventListenerManagerCID, NS_EVENTLISTENERMANAGER_CID);
static NS_DEFINE_IID(kIDOMEventTargetIID, NS_IDOMEVENTTARGET_IID);
static NS_DEFINE_CID(kNameSpaceManagerCID, NS_NAMESPACEMANAGER_CID);
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
@ -475,6 +476,9 @@ RDFElementImpl::QueryInterface(REFNSIID iid, void** result)
else if (iid.Equals(kIDOMEventReceiverIID)) {
*result = NS_STATIC_CAST(nsIDOMEventReceiver*, this);
}
else if (iid.Equals(kIDOMEventTargetIID)) {
*result = NS_STATIC_CAST(nsIDOMEventTarget*, this);
}
else if (iid.Equals(kIJSScriptObjectIID)) {
*result = NS_STATIC_CAST(nsIJSScriptObject*, this);
}
@ -1773,8 +1777,9 @@ RDFElementImpl::SetAttribute(PRInt32 aNameSpaceID,
AddScriptEventListener(aName, aValue, kIDOMKeyListenerIID);
else if (attributeName.EqualsIgnoreCase("onmousemove"))
AddScriptEventListener(aName, aValue, kIDOMMouseMotionListenerIID);
else if (attributeName.EqualsIgnoreCase("onload"))
AddScriptEventListener(aName, aValue, kIDOMLoadListenerIID);
// XXX Temporarily commented out to avoid bustage of nsIXULWindowCallbacks in nsWebShellWindow
//else if (attributeName.EqualsIgnoreCase("onload"))
// AddScriptEventListener(aName, aValue, kIDOMLoadListenerIID);
else if (attributeName.EqualsIgnoreCase("onunload") ||
attributeName.EqualsIgnoreCase("onabort") ||
attributeName.EqualsIgnoreCase("onerror"))
@ -1836,7 +1841,30 @@ RDFElementImpl::AddScriptEventListener(nsIAtom* aName, const nsString& aValue, R
nsIScriptContextOwner* owner;
owner = mDocument->GetScriptContextOwner();
nsAutoString tagStr;
mTag->ToString(tagStr);
if (NS_OK == owner->GetScriptContext(&context)) {
if (tagStr == "window") {
nsIDOMEventReceiver *receiver;
nsIScriptGlobalObject *global = context->GetGlobalObject();
if (nsnull != global && NS_OK == global->QueryInterface(kIDOMEventReceiverIID, (void**)&receiver)) {
nsIEventListenerManager *manager;
if (NS_OK == receiver->GetListenerManager(&manager)) {
nsIScriptObjectOwner *mObjectOwner;
if (NS_OK == global->QueryInterface(kIScriptObjectOwnerIID, (void**)&mObjectOwner)) {
ret = manager->AddScriptEventListener(context, mObjectOwner, aName, aValue, aIID);
NS_RELEASE(mObjectOwner);
}
NS_RELEASE(manager);
}
NS_RELEASE(receiver);
}
NS_IF_RELEASE(global);
}
else {
nsIEventListenerManager *manager;
if (NS_OK == GetListenerManager(&manager)) {
nsIScriptObjectOwner* owner;
@ -1849,6 +1877,7 @@ RDFElementImpl::AddScriptEventListener(nsIAtom* aName, const nsString& aValue, R
NS_RELEASE(manager);
}
NS_RELEASE(context);
}
}
NS_RELEASE(owner);

View File

@ -160,7 +160,7 @@ main(int argc, char** argv)
SetupRegistry();
nsIEventQueueService* theEventQueueService = nsnull;
PLEventQueue* mainQueue = nsnull;
nsIEventQueue* mainQueue = nsnull;
nsIRDFService* theRDFService = nsnull;
nsIRDFXMLDataSource* ds = nsnull;
nsIRDFResource* theHomePage = nsnull;
@ -180,6 +180,8 @@ main(int argc, char** argv)
&mainQueue)))
goto done;
NS_IF_RELEASE(mainQueue);
// Create a stream data source and initialize it on argv[1], which
// is hopefully a "file:" URL. (Actually, we can do _any_ kind of
// URL, but only a "file:" URL will be written back to disk.)

View File

@ -175,7 +175,7 @@ main(int argc, char** argv)
SetupRegistry();
nsIEventQueueService* theEventQueueService = nsnull;
PLEventQueue* mainQueue = nsnull;
nsIEventQueue* mainQueue = nsnull;
nsIRDFService* theRDFService = nsnull;
nsIRDFXMLDataSource* ds = nsnull;
nsIOutputStream* out = nsnull;
@ -200,6 +200,8 @@ main(int argc, char** argv)
goto done;
}
NS_IF_RELEASE(mainQueue);
// Create a stream data source and initialize it on argv[1], which
// is hopefully a "file:" URL. (Actually, we can do _any_ kind of
// URL, but only a "file:" URL will be written back to disk.)

View File

@ -166,7 +166,7 @@ main(int argc, char** argv)
SetupRegistry();
nsIEventQueueService* theEventQueueService = nsnull;
PLEventQueue* mainQueue = nsnull;
nsIEventQueue* mainQueue = nsnull;
nsIRDFService* theRDFService = nsnull;
nsIRDFXMLDataSource* ds = nsnull;
nsIOutputStream* out = nsnull;
@ -191,6 +191,8 @@ main(int argc, char** argv)
goto done;
}
NS_IF_RELEASE(mainQueue);
// Create a stream data source and initialize it on argv[1], which
// is hopefully a "file:" URL. (Actually, we can do _any_ kind of
// URL, but only a "file:" URL will be written back to disk.)