mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
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:
parent
eb5cc9711c
commit
e4b0beec4c
@ -360,7 +360,7 @@ nsChromeRegistry::GetChromeResource(nsString& aResult,
|
||||
}
|
||||
|
||||
if (chromeBase == nsnull)
|
||||
return NS_OK;
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
nsCOMPtr<nsIRDFResource> resource;
|
||||
nsCOMPtr<nsIRDFLiteral> literal;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -360,7 +360,7 @@ nsChromeRegistry::GetChromeResource(nsString& aResult,
|
||||
}
|
||||
|
||||
if (chromeBase == nsnull)
|
||||
return NS_OK;
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
nsCOMPtr<nsIRDFResource> resource;
|
||||
nsCOMPtr<nsIRDFLiteral> literal;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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.)
|
||||
|
@ -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.)
|
||||
|
@ -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.)
|
||||
|
Loading…
Reference in New Issue
Block a user