mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 03:45:46 +00:00
Adding new event handling mechanism into raptor.
This commit is contained in:
parent
996f4eb78a
commit
10ffd04c8c
@ -21,6 +21,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "nslayout.h"
|
#include "nslayout.h"
|
||||||
#include "nsISupports.h"
|
#include "nsISupports.h"
|
||||||
|
#include "nsGUIEvent.h"
|
||||||
class nsIAtom;
|
class nsIAtom;
|
||||||
class nsIContentDelegate;
|
class nsIContentDelegate;
|
||||||
class nsIDocument;
|
class nsIDocument;
|
||||||
@ -128,6 +129,11 @@ public:
|
|||||||
* any objects that it can reach.
|
* any objects that it can reach.
|
||||||
*/
|
*/
|
||||||
NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const = 0;
|
NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const = 0;
|
||||||
|
|
||||||
|
NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* nsIContent_h___ */
|
#endif /* nsIContent_h___ */
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "nslayout.h"
|
#include "nslayout.h"
|
||||||
#include "nsISupports.h"
|
#include "nsISupports.h"
|
||||||
#include "nsIUnicharInputStream.h"
|
#include "nsIUnicharInputStream.h"
|
||||||
|
#include "nsGUIEvent.h"
|
||||||
class nsIArena;
|
class nsIArena;
|
||||||
class nsIContent;
|
class nsIContent;
|
||||||
class nsIDocumentContainer;
|
class nsIDocumentContainer;
|
||||||
@ -170,8 +171,14 @@ public:
|
|||||||
* Copies all text from the selection
|
* Copies all text from the selection
|
||||||
*/
|
*/
|
||||||
virtual void GetSelectionText(nsString & aText) = 0;
|
virtual void GetSelectionText(nsString & aText) = 0;
|
||||||
|
|
||||||
|
NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// XXX Belongs somewhere else
|
// XXX Belongs somewhere else
|
||||||
extern NS_LAYOUT nsresult
|
extern NS_LAYOUT nsresult
|
||||||
NS_NewHTMLDocument(nsIDocument** aInstancePtrResult);
|
NS_NewHTMLDocument(nsIDocument** aInstancePtrResult);
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "nsIStyleSheet.h"
|
#include "nsIStyleSheet.h"
|
||||||
#include "nsIPresShell.h"
|
#include "nsIPresShell.h"
|
||||||
#include "nsIDocumentObserver.h"
|
#include "nsIDocumentObserver.h"
|
||||||
|
#include "nsEventListenerManager.h"
|
||||||
|
|
||||||
#include "nsSelection.h"
|
#include "nsSelection.h"
|
||||||
#include "nsIDOMText.h"
|
#include "nsIDOMText.h"
|
||||||
@ -38,6 +39,9 @@ static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
|||||||
static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID);
|
static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID);
|
||||||
static NS_DEFINE_IID(kIDOMElementIID, NS_IDOMELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMElementIID, NS_IDOMELEMENT_IID);
|
||||||
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
|
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMEventCapturerIID, NS_IDOMEVENTCAPTURER_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMEventReceiverIID, NS_IDOMEVENTRECEIVER_IID);
|
||||||
|
static NS_DEFINE_IID(kIEventListenerManagerIID, NS_IEVENTLISTENERMANAGER_IID);
|
||||||
|
|
||||||
NS_LAYOUT nsresult
|
NS_LAYOUT nsresult
|
||||||
NS_NewPostData(nsIPostData* aPostData, nsIPostData** aInstancePtrResult)
|
NS_NewPostData(nsIPostData* aPostData, nsIPostData** aInstancePtrResult)
|
||||||
@ -72,6 +76,7 @@ nsDocument::nsDocument()
|
|||||||
mParentDocument = nsnull;
|
mParentDocument = nsnull;
|
||||||
mRootContent = nsnull;
|
mRootContent = nsnull;
|
||||||
mScriptObject = nsnull;
|
mScriptObject = nsnull;
|
||||||
|
mListenerManager = nsnull;
|
||||||
|
|
||||||
if (NS_OK != NS_NewSelection(&mSelection)) {
|
if (NS_OK != NS_NewSelection(&mSelection)) {
|
||||||
printf("*************** Error: nsDocument::nsDocument - Creation of Selection failed!\n");
|
printf("*************** Error: nsDocument::nsDocument - Creation of Selection failed!\n");
|
||||||
@ -129,6 +134,16 @@ nsresult nsDocument::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
|||||||
AddRef();
|
AddRef();
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
if (aIID.Equals(kIDOMEventCapturerIID)) {
|
||||||
|
*aInstancePtr = (void*)(nsIDOMEventCapturer*)this;
|
||||||
|
AddRef();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIDOMEventReceiverIID)) {
|
||||||
|
*aInstancePtr = (void*)(nsIDOMEventReceiver*)this;
|
||||||
|
AddRef();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||||
if (aIID.Equals(kISupportsIID)) {
|
if (aIID.Equals(kISupportsIID)) {
|
||||||
*aInstancePtr = (void*)(nsISupports*)(nsIDocument*)this;
|
*aInstancePtr = (void*)(nsISupports*)(nsIDocument*)this;
|
||||||
@ -658,6 +673,91 @@ nsresult nsDocument::GetElementsByTagName(nsString &aTagname, nsIDOMNodeIterator
|
|||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
return NS_ERROR_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::GetListenerManager(nsIEventListenerManager **aInstancePtrResult)
|
||||||
|
{
|
||||||
|
if (nsnull != mListenerManager) {
|
||||||
|
return mListenerManager->QueryInterface(kIEventListenerManagerIID, (void**) aInstancePtrResult);;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nsIEventListenerManager* l = new nsEventListenerManager();
|
||||||
|
|
||||||
|
if (nsnull == l) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (NS_OK == l->QueryInterface(kIEventListenerManagerIID, (void**) aInstancePtrResult)) {
|
||||||
|
mListenerManager = l;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus)
|
||||||
|
{
|
||||||
|
//Capturing stage
|
||||||
|
|
||||||
|
//Local handling stage
|
||||||
|
if (nsnull != mListenerManager) {
|
||||||
|
mListenerManager->HandleEvent(aPresContext, aEvent, aEventStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Bubbling stage
|
||||||
|
/*Need to go to window here*/
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID)
|
||||||
|
{
|
||||||
|
nsIEventListenerManager *manager;
|
||||||
|
|
||||||
|
if (NS_OK == GetListenerManager(&manager)) {
|
||||||
|
manager->AddEventListener(aListener, aIID);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID)
|
||||||
|
{
|
||||||
|
nsIEventListenerManager *manager;
|
||||||
|
|
||||||
|
if (NS_OK == GetListenerManager(&manager)) {
|
||||||
|
manager->RemoveEventListener(aListener, aIID);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::CaptureEvent(nsIDOMEventListener *aListener)
|
||||||
|
{
|
||||||
|
nsIEventListenerManager *manager;
|
||||||
|
|
||||||
|
if (NS_OK == GetListenerManager(&manager)) {
|
||||||
|
manager->CaptureEvent(aListener);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::ReleaseEvent(nsIDOMEventListener *aListener)
|
||||||
|
{
|
||||||
|
nsIEventListenerManager *manager;
|
||||||
|
|
||||||
|
if (NS_OK == GetListenerManager(&manager)) {
|
||||||
|
manager->ReleaseEvent(aListener);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Selection Object
|
* Returns the Selection Object
|
||||||
*/
|
*/
|
||||||
|
@ -22,8 +22,10 @@
|
|||||||
#include "nsVoidArray.h"
|
#include "nsVoidArray.h"
|
||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
|
#include "nsIDOMEventCapturer.h"
|
||||||
|
|
||||||
class nsISelection;
|
class nsISelection;
|
||||||
|
class nsIEventListenerManager;
|
||||||
|
|
||||||
class nsPostData : public nsIPostData {
|
class nsPostData : public nsIPostData {
|
||||||
public:
|
public:
|
||||||
@ -37,7 +39,7 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Base class for our document implementations
|
// Base class for our document implementations
|
||||||
class nsDocument : public nsIDocument, public nsIDOMDocument, public nsIScriptObjectOwner {
|
class nsDocument : public nsIDocument, public nsIDOMDocument, public nsIScriptObjectOwner, public nsIDOMEventCapturer {
|
||||||
public:
|
public:
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
@ -195,6 +197,18 @@ public:
|
|||||||
NS_IMETHOD CreateTreeIterator(nsIDOMNode **aNode, nsIDOMTreeIterator **aTreeIterator);
|
NS_IMETHOD CreateTreeIterator(nsIDOMNode **aNode, nsIDOMTreeIterator **aTreeIterator);
|
||||||
NS_IMETHOD GetElementsByTagName(nsString &aTagname, nsIDOMNodeIterator **aIterator);
|
NS_IMETHOD GetElementsByTagName(nsString &aTagname, nsIDOMNodeIterator **aIterator);
|
||||||
|
|
||||||
|
// nsIDOMEventCapturer interface
|
||||||
|
NS_IMETHOD CaptureEvent(nsIDOMEventListener *aListener);
|
||||||
|
NS_IMETHOD ReleaseEvent(nsIDOMEventListener *aListener);
|
||||||
|
NS_IMETHOD AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID);
|
||||||
|
NS_IMETHOD RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID);
|
||||||
|
|
||||||
|
NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult);
|
||||||
|
|
||||||
|
NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void AddStyleSheetToSet(nsIStyleSheet* aSheet, nsIStyleSet* aSet); // subclass hook
|
virtual void AddStyleSheetToSet(nsIStyleSheet* aSheet, nsIStyleSet* aSet); // subclass hook
|
||||||
|
|
||||||
@ -215,6 +229,7 @@ protected:
|
|||||||
nsVoidArray mStyleSheets;
|
nsVoidArray mStyleSheets;
|
||||||
nsVoidArray mObservers;
|
nsVoidArray mObservers;
|
||||||
void* mScriptObject;
|
void* mScriptObject;
|
||||||
|
nsIEventListenerManager* mListenerManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* nsDocument_h___ */
|
#endif /* nsDocument_h___ */
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
DEPTH = ..
|
DEPTH = ..
|
||||||
|
|
||||||
DIRS = base html build
|
DIRS = base html events build
|
||||||
|
|
||||||
include $(DEPTH)/config/config.mk
|
include $(DEPTH)/config/config.mk
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "nslayout.h"
|
#include "nslayout.h"
|
||||||
#include "nsISupports.h"
|
#include "nsISupports.h"
|
||||||
|
#include "nsGUIEvent.h"
|
||||||
class nsIAtom;
|
class nsIAtom;
|
||||||
class nsIContentDelegate;
|
class nsIContentDelegate;
|
||||||
class nsIDocument;
|
class nsIDocument;
|
||||||
@ -128,6 +129,11 @@ public:
|
|||||||
* any objects that it can reach.
|
* any objects that it can reach.
|
||||||
*/
|
*/
|
||||||
NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const = 0;
|
NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const = 0;
|
||||||
|
|
||||||
|
NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* nsIContent_h___ */
|
#endif /* nsIContent_h___ */
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "nslayout.h"
|
#include "nslayout.h"
|
||||||
#include "nsISupports.h"
|
#include "nsISupports.h"
|
||||||
#include "nsIUnicharInputStream.h"
|
#include "nsIUnicharInputStream.h"
|
||||||
|
#include "nsGUIEvent.h"
|
||||||
class nsIArena;
|
class nsIArena;
|
||||||
class nsIContent;
|
class nsIContent;
|
||||||
class nsIDocumentContainer;
|
class nsIDocumentContainer;
|
||||||
@ -170,8 +171,14 @@ public:
|
|||||||
* Copies all text from the selection
|
* Copies all text from the selection
|
||||||
*/
|
*/
|
||||||
virtual void GetSelectionText(nsString & aText) = 0;
|
virtual void GetSelectionText(nsString & aText) = 0;
|
||||||
|
|
||||||
|
NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// XXX Belongs somewhere else
|
// XXX Belongs somewhere else
|
||||||
extern NS_LAYOUT nsresult
|
extern NS_LAYOUT nsresult
|
||||||
NS_NewHTMLDocument(nsIDocument** aInstancePtrResult);
|
NS_NewHTMLDocument(nsIDocument** aInstancePtrResult);
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "nsIStyleSheet.h"
|
#include "nsIStyleSheet.h"
|
||||||
#include "nsIPresShell.h"
|
#include "nsIPresShell.h"
|
||||||
#include "nsIDocumentObserver.h"
|
#include "nsIDocumentObserver.h"
|
||||||
|
#include "nsEventListenerManager.h"
|
||||||
|
|
||||||
#include "nsSelection.h"
|
#include "nsSelection.h"
|
||||||
#include "nsIDOMText.h"
|
#include "nsIDOMText.h"
|
||||||
@ -38,6 +39,9 @@ static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
|||||||
static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID);
|
static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID);
|
||||||
static NS_DEFINE_IID(kIDOMElementIID, NS_IDOMELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMElementIID, NS_IDOMELEMENT_IID);
|
||||||
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
|
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMEventCapturerIID, NS_IDOMEVENTCAPTURER_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMEventReceiverIID, NS_IDOMEVENTRECEIVER_IID);
|
||||||
|
static NS_DEFINE_IID(kIEventListenerManagerIID, NS_IEVENTLISTENERMANAGER_IID);
|
||||||
|
|
||||||
NS_LAYOUT nsresult
|
NS_LAYOUT nsresult
|
||||||
NS_NewPostData(nsIPostData* aPostData, nsIPostData** aInstancePtrResult)
|
NS_NewPostData(nsIPostData* aPostData, nsIPostData** aInstancePtrResult)
|
||||||
@ -72,6 +76,7 @@ nsDocument::nsDocument()
|
|||||||
mParentDocument = nsnull;
|
mParentDocument = nsnull;
|
||||||
mRootContent = nsnull;
|
mRootContent = nsnull;
|
||||||
mScriptObject = nsnull;
|
mScriptObject = nsnull;
|
||||||
|
mListenerManager = nsnull;
|
||||||
|
|
||||||
if (NS_OK != NS_NewSelection(&mSelection)) {
|
if (NS_OK != NS_NewSelection(&mSelection)) {
|
||||||
printf("*************** Error: nsDocument::nsDocument - Creation of Selection failed!\n");
|
printf("*************** Error: nsDocument::nsDocument - Creation of Selection failed!\n");
|
||||||
@ -129,6 +134,16 @@ nsresult nsDocument::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
|||||||
AddRef();
|
AddRef();
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
if (aIID.Equals(kIDOMEventCapturerIID)) {
|
||||||
|
*aInstancePtr = (void*)(nsIDOMEventCapturer*)this;
|
||||||
|
AddRef();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIDOMEventReceiverIID)) {
|
||||||
|
*aInstancePtr = (void*)(nsIDOMEventReceiver*)this;
|
||||||
|
AddRef();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||||
if (aIID.Equals(kISupportsIID)) {
|
if (aIID.Equals(kISupportsIID)) {
|
||||||
*aInstancePtr = (void*)(nsISupports*)(nsIDocument*)this;
|
*aInstancePtr = (void*)(nsISupports*)(nsIDocument*)this;
|
||||||
@ -658,6 +673,91 @@ nsresult nsDocument::GetElementsByTagName(nsString &aTagname, nsIDOMNodeIterator
|
|||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
return NS_ERROR_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::GetListenerManager(nsIEventListenerManager **aInstancePtrResult)
|
||||||
|
{
|
||||||
|
if (nsnull != mListenerManager) {
|
||||||
|
return mListenerManager->QueryInterface(kIEventListenerManagerIID, (void**) aInstancePtrResult);;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nsIEventListenerManager* l = new nsEventListenerManager();
|
||||||
|
|
||||||
|
if (nsnull == l) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (NS_OK == l->QueryInterface(kIEventListenerManagerIID, (void**) aInstancePtrResult)) {
|
||||||
|
mListenerManager = l;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus)
|
||||||
|
{
|
||||||
|
//Capturing stage
|
||||||
|
|
||||||
|
//Local handling stage
|
||||||
|
if (nsnull != mListenerManager) {
|
||||||
|
mListenerManager->HandleEvent(aPresContext, aEvent, aEventStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Bubbling stage
|
||||||
|
/*Need to go to window here*/
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID)
|
||||||
|
{
|
||||||
|
nsIEventListenerManager *manager;
|
||||||
|
|
||||||
|
if (NS_OK == GetListenerManager(&manager)) {
|
||||||
|
manager->AddEventListener(aListener, aIID);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID)
|
||||||
|
{
|
||||||
|
nsIEventListenerManager *manager;
|
||||||
|
|
||||||
|
if (NS_OK == GetListenerManager(&manager)) {
|
||||||
|
manager->RemoveEventListener(aListener, aIID);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::CaptureEvent(nsIDOMEventListener *aListener)
|
||||||
|
{
|
||||||
|
nsIEventListenerManager *manager;
|
||||||
|
|
||||||
|
if (NS_OK == GetListenerManager(&manager)) {
|
||||||
|
manager->CaptureEvent(aListener);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsDocument::ReleaseEvent(nsIDOMEventListener *aListener)
|
||||||
|
{
|
||||||
|
nsIEventListenerManager *manager;
|
||||||
|
|
||||||
|
if (NS_OK == GetListenerManager(&manager)) {
|
||||||
|
manager->ReleaseEvent(aListener);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Selection Object
|
* Returns the Selection Object
|
||||||
*/
|
*/
|
||||||
|
@ -22,8 +22,10 @@
|
|||||||
#include "nsVoidArray.h"
|
#include "nsVoidArray.h"
|
||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
|
#include "nsIDOMEventCapturer.h"
|
||||||
|
|
||||||
class nsISelection;
|
class nsISelection;
|
||||||
|
class nsIEventListenerManager;
|
||||||
|
|
||||||
class nsPostData : public nsIPostData {
|
class nsPostData : public nsIPostData {
|
||||||
public:
|
public:
|
||||||
@ -37,7 +39,7 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Base class for our document implementations
|
// Base class for our document implementations
|
||||||
class nsDocument : public nsIDocument, public nsIDOMDocument, public nsIScriptObjectOwner {
|
class nsDocument : public nsIDocument, public nsIDOMDocument, public nsIScriptObjectOwner, public nsIDOMEventCapturer {
|
||||||
public:
|
public:
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
@ -195,6 +197,18 @@ public:
|
|||||||
NS_IMETHOD CreateTreeIterator(nsIDOMNode **aNode, nsIDOMTreeIterator **aTreeIterator);
|
NS_IMETHOD CreateTreeIterator(nsIDOMNode **aNode, nsIDOMTreeIterator **aTreeIterator);
|
||||||
NS_IMETHOD GetElementsByTagName(nsString &aTagname, nsIDOMNodeIterator **aIterator);
|
NS_IMETHOD GetElementsByTagName(nsString &aTagname, nsIDOMNodeIterator **aIterator);
|
||||||
|
|
||||||
|
// nsIDOMEventCapturer interface
|
||||||
|
NS_IMETHOD CaptureEvent(nsIDOMEventListener *aListener);
|
||||||
|
NS_IMETHOD ReleaseEvent(nsIDOMEventListener *aListener);
|
||||||
|
NS_IMETHOD AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID);
|
||||||
|
NS_IMETHOD RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID);
|
||||||
|
|
||||||
|
NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult);
|
||||||
|
|
||||||
|
NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void AddStyleSheetToSet(nsIStyleSheet* aSheet, nsIStyleSet* aSet); // subclass hook
|
virtual void AddStyleSheetToSet(nsIStyleSheet* aSheet, nsIStyleSet* aSet); // subclass hook
|
||||||
|
|
||||||
@ -215,6 +229,7 @@ protected:
|
|||||||
nsVoidArray mStyleSheets;
|
nsVoidArray mStyleSheets;
|
||||||
nsVoidArray mObservers;
|
nsVoidArray mObservers;
|
||||||
void* mScriptObject;
|
void* mScriptObject;
|
||||||
|
nsIEventListenerManager* mListenerManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* nsDocument_h___ */
|
#endif /* nsDocument_h___ */
|
||||||
|
@ -532,42 +532,47 @@ NS_METHOD nsFrame::HandleEvent(nsIPresContext& aPresContext,
|
|||||||
nsGUIEvent* aEvent,
|
nsGUIEvent* aEvent,
|
||||||
nsEventStatus& aEventStatus)
|
nsEventStatus& aEventStatus)
|
||||||
{
|
{
|
||||||
#if DO_SELECTION
|
aEventStatus = nsEventStatus_eIgnore;
|
||||||
|
|
||||||
|
mContent->HandleDOMEvent(aPresContext, aEvent, aEventStatus);
|
||||||
|
|
||||||
if (aEvent->message == NS_MOUSE_MOVE && mDoingSelection ||
|
#if DO_SELECTION
|
||||||
aEvent->message == NS_MOUSE_LEFT_BUTTON_UP ||
|
|
||||||
aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) {
|
|
||||||
} else {
|
|
||||||
aEventStatus = nsEventStatus_eIgnore;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
if (gSelectionDebug) printf("Message: %d-------------------------------------------------------------\n",aEvent->message);
|
|
||||||
|
|
||||||
|
if(nsEventStatus_eIgnore == aEventStatus) {
|
||||||
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) {
|
if (aEvent->message == NS_MOUSE_MOVE && mDoingSelection ||
|
||||||
if (mDoingSelection) {
|
aEvent->message == NS_MOUSE_LEFT_BUTTON_UP ||
|
||||||
//mEndSelect = 0;
|
aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) {
|
||||||
HandleRelease(aPresContext, aEvent, aEventStatus, this);
|
} else {
|
||||||
|
aEventStatus = nsEventStatus_eIgnore;
|
||||||
|
return NS_OK;
|
||||||
}
|
}
|
||||||
} else if (aEvent->message == NS_MOUSE_MOVE) {
|
if (gSelectionDebug) printf("Message: %d-------------------------------------------------------------\n",aEvent->message);
|
||||||
mDidDrag = PR_TRUE;
|
|
||||||
|
|
||||||
//if (gSelectionDebug) printf("HandleEvent(Drag)::mSelectionRange %s\n", mSelectionRange->ToString());
|
|
||||||
HandleDrag(aPresContext, aEvent, aEventStatus, this);
|
|
||||||
if (gSelectionDebug) printf("HandleEvent(Drag)::mSelectionRange %s\n", mSelectionRange->ToString());
|
|
||||||
|
|
||||||
} else if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) {
|
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) {
|
||||||
nsIContent * content;
|
if (mDoingSelection) {
|
||||||
GetContent(content);
|
//mEndSelect = 0;
|
||||||
BuildContentList(content);
|
HandleRelease(aPresContext, aEvent, aEventStatus, this);
|
||||||
|
}
|
||||||
|
} else if (aEvent->message == NS_MOUSE_MOVE) {
|
||||||
|
mDidDrag = PR_TRUE;
|
||||||
|
|
||||||
NS_RELEASE(content);
|
//if (gSelectionDebug) printf("HandleEvent(Drag)::mSelectionRange %s\n", mSelectionRange->ToString());
|
||||||
|
HandleDrag(aPresContext, aEvent, aEventStatus, this);
|
||||||
|
if (gSelectionDebug) printf("HandleEvent(Drag)::mSelectionRange %s\n", mSelectionRange->ToString());
|
||||||
|
|
||||||
HandlePress(aPresContext, aEvent, aEventStatus, this);
|
} else if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) {
|
||||||
|
nsIContent * content;
|
||||||
|
GetContent(content);
|
||||||
|
BuildContentList(content);
|
||||||
|
|
||||||
|
NS_RELEASE(content);
|
||||||
|
|
||||||
|
HandlePress(aPresContext, aEvent, aEventStatus, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
aEventStatus = nsEventStatus_eIgnore;
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,6 +82,8 @@ public:
|
|||||||
|
|
||||||
void List(FILE* out = stdout, PRInt32 aIndent = 0) const {;}
|
void List(FILE* out = stdout, PRInt32 aIndent = 0) const {;}
|
||||||
NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const { return NS_OK; }
|
NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const { return NS_OK; }
|
||||||
|
NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, nsGUIEvent* aEvent, nsEventStatus& aEventStatus)
|
||||||
|
{return NS_OK;}
|
||||||
|
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
@ -36,5 +36,6 @@ LOBJS = \
|
|||||||
$(DIST)/lib/libraptorhtmlforms_s.a \
|
$(DIST)/lib/libraptorhtmlforms_s.a \
|
||||||
$(DIST)/lib/libraptorhtmlstyle_s.a \
|
$(DIST)/lib/libraptorhtmlstyle_s.a \
|
||||||
$(DIST)/lib/libraptorhtmltable_s.a \
|
$(DIST)/lib/libraptorhtmltable_s.a \
|
||||||
|
$(DIST)/lib/libraptorevents_s.a \
|
||||||
|
|
||||||
include $(DEPTH)/config/rules.mk
|
include $(DEPTH)/config/rules.mk
|
||||||
|
@ -39,6 +39,7 @@ MISCDEP = \
|
|||||||
$(DIST)\lib\raptorhtmlforms_s.lib \
|
$(DIST)\lib\raptorhtmlforms_s.lib \
|
||||||
$(DIST)\lib\raptorhtmlstyle_s.lib \
|
$(DIST)\lib\raptorhtmlstyle_s.lib \
|
||||||
$(DIST)\lib\raptorhtmltable_s.lib \
|
$(DIST)\lib\raptorhtmltable_s.lib \
|
||||||
|
$(DIST)\lib\raptorevents_s.lib \
|
||||||
$(DIST)\lib\xpcom32.lib \
|
$(DIST)\lib\xpcom32.lib \
|
||||||
$(DIST)\lib\raptorbase.lib \
|
$(DIST)\lib\raptorbase.lib \
|
||||||
$(DIST)\lib\raptorgfx.lib \
|
$(DIST)\lib\raptorgfx.lib \
|
||||||
@ -62,6 +63,7 @@ LLIBS= \
|
|||||||
$(DIST)\lib\raptorhtmlforms_s.lib \
|
$(DIST)\lib\raptorhtmlforms_s.lib \
|
||||||
$(DIST)\lib\raptorhtmlstyle_s.lib \
|
$(DIST)\lib\raptorhtmlstyle_s.lib \
|
||||||
$(DIST)\lib\raptorhtmltable_s.lib \
|
$(DIST)\lib\raptorhtmltable_s.lib \
|
||||||
|
$(DIST)\lib\raptorevents_s.lib \
|
||||||
$(DIST)\lib\xpcom32.lib \
|
$(DIST)\lib\xpcom32.lib \
|
||||||
$(DIST)\lib\raptorbase.lib \
|
$(DIST)\lib\raptorbase.lib \
|
||||||
$(DIST)\lib\raptorgfx.lib \
|
$(DIST)\lib\raptorgfx.lib \
|
||||||
|
@ -89,100 +89,11 @@ NS_METHOD nsHTMLContainerFrame::Paint(nsIPresContext& aPresContext,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nsHTMLContainerFrame::TriggerLink(nsIPresContext& aPresContext,
|
|
||||||
const nsString& aBase,
|
|
||||||
const nsString& aURLSpec,
|
|
||||||
const nsString& aTargetSpec,
|
|
||||||
PRBool aClick)
|
|
||||||
{
|
|
||||||
nsILinkHandler* handler;
|
|
||||||
if (NS_OK == aPresContext.GetLinkHandler(&handler)) {
|
|
||||||
// Resolve url to an absolute url
|
|
||||||
nsIURL* docURL = nsnull;
|
|
||||||
nsIDocument* doc = nsnull;
|
|
||||||
mContent->GetDocument(doc);
|
|
||||||
if (nsnull != doc) {
|
|
||||||
docURL = doc->GetDocumentURL();
|
|
||||||
NS_RELEASE(doc);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsAutoString absURLSpec;
|
|
||||||
nsresult rv = NS_MakeAbsoluteURL(docURL, aBase, aURLSpec, absURLSpec);
|
|
||||||
if (nsnull != docURL) {
|
|
||||||
NS_RELEASE(docURL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now pass on absolute url to the click handler
|
|
||||||
if (aClick) {
|
|
||||||
handler->OnLinkClick(this, absURLSpec, aTargetSpec);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
handler->OnOverLink(this, absURLSpec, aTargetSpec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_METHOD nsHTMLContainerFrame::HandleEvent(nsIPresContext& aPresContext,
|
NS_METHOD nsHTMLContainerFrame::HandleEvent(nsIPresContext& aPresContext,
|
||||||
nsGUIEvent* aEvent,
|
nsGUIEvent* aEvent,
|
||||||
nsEventStatus& aEventStatus)
|
nsEventStatus& aEventStatus)
|
||||||
{
|
{
|
||||||
aEventStatus = nsEventStatus_eIgnore;
|
return nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
|
||||||
switch (aEvent->message) {
|
|
||||||
case NS_MOUSE_LEFT_BUTTON_UP:
|
|
||||||
if (nsEventStatus_eIgnore ==
|
|
||||||
nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus)) {
|
|
||||||
// If our child didn't take the click then since we are an
|
|
||||||
// anchor, we take the click.
|
|
||||||
nsIAtom* tag = mContent->GetTag();
|
|
||||||
if (tag == nsHTMLAtoms::a) {
|
|
||||||
nsAutoString base, href, target;
|
|
||||||
mContent->GetAttribute("href", href);
|
|
||||||
mContent->GetAttribute("target", target);
|
|
||||||
TriggerLink(aPresContext, base, href, target, PR_TRUE);
|
|
||||||
aEventStatus = nsEventStatus_eConsumeNoDefault;
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(tag);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NS_MOUSE_RIGHT_BUTTON_DOWN:
|
|
||||||
// XXX Bring up a contextual menu provided by the application
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NS_MOUSE_MOVE:
|
|
||||||
if (nsEventStatus_eIgnore ==
|
|
||||||
nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus)) {
|
|
||||||
nsIAtom* tag = mContent->GetTag();
|
|
||||||
if (tag == nsHTMLAtoms::a) {
|
|
||||||
nsAutoString base, href, target;
|
|
||||||
mContent->GetAttribute("href", href);
|
|
||||||
mContent->GetAttribute("target", target);
|
|
||||||
TriggerLink(aPresContext, base, href, target, PR_FALSE);
|
|
||||||
aEventStatus = nsEventStatus_eConsumeNoDefault;
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(tag);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// XXX this doesn't seem to do anything yet
|
|
||||||
case NS_MOUSE_EXIT:
|
|
||||||
if (nsEventStatus_eIgnore ==
|
|
||||||
nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus)) {
|
|
||||||
nsIAtom* tag = mContent->GetTag();
|
|
||||||
if (tag == nsHTMLAtoms::a) {
|
|
||||||
nsAutoString empty;
|
|
||||||
TriggerLink(aPresContext, empty, empty, empty, PR_FALSE);
|
|
||||||
aEventStatus = nsEventStatus_eConsumeNoDefault;
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(tag);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_METHOD nsHTMLContainerFrame::GetCursorAt(nsIPresContext& aPresContext,
|
NS_METHOD nsHTMLContainerFrame::GetCursorAt(nsIPresContext& aPresContext,
|
||||||
|
@ -56,12 +56,6 @@ protected:
|
|||||||
|
|
||||||
virtual PRIntn GetSkipSides() const = 0;
|
virtual PRIntn GetSkipSides() const = 0;
|
||||||
|
|
||||||
void TriggerLink(nsIPresContext& aPresContext,
|
|
||||||
const nsString& aBase,
|
|
||||||
const nsString& aURLSpec,
|
|
||||||
const nsString& aTargetSpec,
|
|
||||||
PRBool aClick);
|
|
||||||
|
|
||||||
nsresult CreateFrameFor(nsIPresContext* aPresContext,
|
nsresult CreateFrameFor(nsIPresContext* aPresContext,
|
||||||
nsIContent* aContent,
|
nsIContent* aContent,
|
||||||
nsIStyleContext* aStyleContext,
|
nsIStyleContext* aStyleContext,
|
||||||
|
@ -89,100 +89,11 @@ NS_METHOD nsHTMLContainerFrame::Paint(nsIPresContext& aPresContext,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nsHTMLContainerFrame::TriggerLink(nsIPresContext& aPresContext,
|
|
||||||
const nsString& aBase,
|
|
||||||
const nsString& aURLSpec,
|
|
||||||
const nsString& aTargetSpec,
|
|
||||||
PRBool aClick)
|
|
||||||
{
|
|
||||||
nsILinkHandler* handler;
|
|
||||||
if (NS_OK == aPresContext.GetLinkHandler(&handler)) {
|
|
||||||
// Resolve url to an absolute url
|
|
||||||
nsIURL* docURL = nsnull;
|
|
||||||
nsIDocument* doc = nsnull;
|
|
||||||
mContent->GetDocument(doc);
|
|
||||||
if (nsnull != doc) {
|
|
||||||
docURL = doc->GetDocumentURL();
|
|
||||||
NS_RELEASE(doc);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsAutoString absURLSpec;
|
|
||||||
nsresult rv = NS_MakeAbsoluteURL(docURL, aBase, aURLSpec, absURLSpec);
|
|
||||||
if (nsnull != docURL) {
|
|
||||||
NS_RELEASE(docURL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now pass on absolute url to the click handler
|
|
||||||
if (aClick) {
|
|
||||||
handler->OnLinkClick(this, absURLSpec, aTargetSpec);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
handler->OnOverLink(this, absURLSpec, aTargetSpec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_METHOD nsHTMLContainerFrame::HandleEvent(nsIPresContext& aPresContext,
|
NS_METHOD nsHTMLContainerFrame::HandleEvent(nsIPresContext& aPresContext,
|
||||||
nsGUIEvent* aEvent,
|
nsGUIEvent* aEvent,
|
||||||
nsEventStatus& aEventStatus)
|
nsEventStatus& aEventStatus)
|
||||||
{
|
{
|
||||||
aEventStatus = nsEventStatus_eIgnore;
|
return nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
|
||||||
switch (aEvent->message) {
|
|
||||||
case NS_MOUSE_LEFT_BUTTON_UP:
|
|
||||||
if (nsEventStatus_eIgnore ==
|
|
||||||
nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus)) {
|
|
||||||
// If our child didn't take the click then since we are an
|
|
||||||
// anchor, we take the click.
|
|
||||||
nsIAtom* tag = mContent->GetTag();
|
|
||||||
if (tag == nsHTMLAtoms::a) {
|
|
||||||
nsAutoString base, href, target;
|
|
||||||
mContent->GetAttribute("href", href);
|
|
||||||
mContent->GetAttribute("target", target);
|
|
||||||
TriggerLink(aPresContext, base, href, target, PR_TRUE);
|
|
||||||
aEventStatus = nsEventStatus_eConsumeNoDefault;
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(tag);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NS_MOUSE_RIGHT_BUTTON_DOWN:
|
|
||||||
// XXX Bring up a contextual menu provided by the application
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NS_MOUSE_MOVE:
|
|
||||||
if (nsEventStatus_eIgnore ==
|
|
||||||
nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus)) {
|
|
||||||
nsIAtom* tag = mContent->GetTag();
|
|
||||||
if (tag == nsHTMLAtoms::a) {
|
|
||||||
nsAutoString base, href, target;
|
|
||||||
mContent->GetAttribute("href", href);
|
|
||||||
mContent->GetAttribute("target", target);
|
|
||||||
TriggerLink(aPresContext, base, href, target, PR_FALSE);
|
|
||||||
aEventStatus = nsEventStatus_eConsumeNoDefault;
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(tag);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// XXX this doesn't seem to do anything yet
|
|
||||||
case NS_MOUSE_EXIT:
|
|
||||||
if (nsEventStatus_eIgnore ==
|
|
||||||
nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus)) {
|
|
||||||
nsIAtom* tag = mContent->GetTag();
|
|
||||||
if (tag == nsHTMLAtoms::a) {
|
|
||||||
nsAutoString empty;
|
|
||||||
TriggerLink(aPresContext, empty, empty, empty, PR_FALSE);
|
|
||||||
aEventStatus = nsEventStatus_eConsumeNoDefault;
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(tag);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_METHOD nsHTMLContainerFrame::GetCursorAt(nsIPresContext& aPresContext,
|
NS_METHOD nsHTMLContainerFrame::GetCursorAt(nsIPresContext& aPresContext,
|
||||||
|
@ -56,12 +56,6 @@ protected:
|
|||||||
|
|
||||||
virtual PRIntn GetSkipSides() const = 0;
|
virtual PRIntn GetSkipSides() const = 0;
|
||||||
|
|
||||||
void TriggerLink(nsIPresContext& aPresContext,
|
|
||||||
const nsString& aBase,
|
|
||||||
const nsString& aURLSpec,
|
|
||||||
const nsString& aTargetSpec,
|
|
||||||
PRBool aClick);
|
|
||||||
|
|
||||||
nsresult CreateFrameFor(nsIPresContext* aPresContext,
|
nsresult CreateFrameFor(nsIPresContext* aPresContext,
|
||||||
nsIContent* aContent,
|
nsIContent* aContent,
|
||||||
nsIStyleContext* aStyleContext,
|
nsIStyleContext* aStyleContext,
|
||||||
|
@ -26,6 +26,8 @@
|
|||||||
#include "nsISupportsArray.h"
|
#include "nsISupportsArray.h"
|
||||||
#include "nsCRT.h"
|
#include "nsCRT.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
|
#include "nsIEventListenerManager.h"
|
||||||
|
#include "nsEventListenerManager.h"
|
||||||
#include "nsISizeOfHandler.h"
|
#include "nsISizeOfHandler.h"
|
||||||
|
|
||||||
static NS_DEFINE_IID(kIContentDelegateIID, NS_ICONTENTDELEGATE_IID);
|
static NS_DEFINE_IID(kIContentDelegateIID, NS_ICONTENTDELEGATE_IID);
|
||||||
@ -33,6 +35,8 @@ static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID);
|
|||||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||||
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
||||||
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
|
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
|
||||||
|
static NS_DEFINE_IID(kIEventListenerManagerIID, NS_IEVENTLISTENERMANAGER_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMEventReceiverIID, NS_IDOMEVENTRECEIVER_IID);
|
||||||
|
|
||||||
static nsIContentDelegate* gContentDelegate;
|
static nsIContentDelegate* gContentDelegate;
|
||||||
|
|
||||||
@ -132,6 +136,8 @@ nsHTMLContent::nsHTMLContent()
|
|||||||
gContentDelegate = new ContentDelegate();
|
gContentDelegate = new ContentDelegate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mListenerManager = nsnull;
|
||||||
|
|
||||||
// Add a reference to the shared content delegate object
|
// Add a reference to the shared content delegate object
|
||||||
NS_ADDREF(gContentDelegate);
|
NS_ADDREF(gContentDelegate);
|
||||||
}
|
}
|
||||||
@ -184,6 +190,11 @@ nsresult nsHTMLContent::QueryInterface(const nsIID& aIID,
|
|||||||
AddRef();
|
AddRef();
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
if (aIID.Equals(kIDOMEventReceiverIID)) {
|
||||||
|
*aInstancePtrResult = (void*)(nsIDOMEventReceiver*)this;
|
||||||
|
AddRef();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
return NS_NOINTERFACE;
|
return NS_NOINTERFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -533,6 +544,69 @@ nsresult nsHTMLContent::RemoveChild(nsIDOMNode *oldChild)
|
|||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult nsHTMLContent::GetListenerManager(nsIEventListenerManager **aInstancePtrResult)
|
||||||
|
{
|
||||||
|
if (nsnull != mListenerManager) {
|
||||||
|
return mListenerManager->QueryInterface(kIEventListenerManagerIID, (void**) aInstancePtrResult);;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nsIEventListenerManager* l = new nsEventListenerManager();
|
||||||
|
|
||||||
|
if (nsnull == l) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (NS_OK == l->QueryInterface(kIEventListenerManagerIID, (void**) aInstancePtrResult)) {
|
||||||
|
mListenerManager = l;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsHTMLContent::AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID)
|
||||||
|
{
|
||||||
|
nsIEventListenerManager *manager;
|
||||||
|
|
||||||
|
if (NS_OK == GetListenerManager(&manager)) {
|
||||||
|
manager->AddEventListener(aListener, aIID);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsHTMLContent::RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID)
|
||||||
|
{
|
||||||
|
nsIEventListenerManager *manager;
|
||||||
|
|
||||||
|
if (NS_OK == GetListenerManager(&manager)) {
|
||||||
|
manager->RemoveEventListener(aListener, aIID);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsHTMLContent::HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus)
|
||||||
|
{
|
||||||
|
//Capturing stage
|
||||||
|
|
||||||
|
//Local handling stage
|
||||||
|
if (nsnull != mListenerManager) {
|
||||||
|
mListenerManager->HandleEvent(aPresContext, aEvent, aEventStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Bubbling stage
|
||||||
|
if (mParent != nsnull) {
|
||||||
|
return mParent->HandleDOMEvent(aPresContext, aEvent, aEventStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
// XXX i18n: this is wrong (?) because we need to know the outgoing
|
// XXX i18n: this is wrong (?) because we need to know the outgoing
|
||||||
// character set (I think)
|
// character set (I think)
|
||||||
void
|
void
|
||||||
|
@ -21,6 +21,9 @@
|
|||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
#include "nsIDOMNode.h"
|
#include "nsIDOMNode.h"
|
||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
|
#include "nsIDOMEventReceiver.h"
|
||||||
|
#include "nsGUIEvent.h"
|
||||||
|
class nsIEventListenerManager;
|
||||||
class nsIArena;
|
class nsIArena;
|
||||||
class nsIAtom;
|
class nsIAtom;
|
||||||
|
|
||||||
@ -29,7 +32,7 @@ class nsIAtom;
|
|||||||
* allocation from the malloc heap as well as from an arena. Note
|
* allocation from the malloc heap as well as from an arena. Note
|
||||||
* that instances of this object are created with zero'd memory.
|
* that instances of this object are created with zero'd memory.
|
||||||
*/
|
*/
|
||||||
class nsHTMLContent : public nsIHTMLContent, public nsIDOMNode, public nsIScriptObjectOwner {
|
class nsHTMLContent : public nsIHTMLContent, public nsIDOMNode, public nsIScriptObjectOwner, public nsIDOMEventReceiver {
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* This new method allocates memory from the standard malloc heap
|
* This new method allocates memory from the standard malloc heap
|
||||||
@ -126,6 +129,14 @@ public:
|
|||||||
NS_IMETHOD ReplaceChild(nsIDOMNode *newChild, nsIDOMNode *oldChild);
|
NS_IMETHOD ReplaceChild(nsIDOMNode *newChild, nsIDOMNode *oldChild);
|
||||||
NS_IMETHOD RemoveChild(nsIDOMNode *oldChild);
|
NS_IMETHOD RemoveChild(nsIDOMNode *oldChild);
|
||||||
|
|
||||||
|
// nsIDOMEventReceiver interface
|
||||||
|
NS_IMETHOD AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID);
|
||||||
|
NS_IMETHOD RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID);
|
||||||
|
|
||||||
|
NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsHTMLContent();
|
nsHTMLContent();
|
||||||
virtual ~nsHTMLContent();
|
virtual ~nsHTMLContent();
|
||||||
@ -137,6 +148,10 @@ protected:
|
|||||||
nsIDocument* mDocument;
|
nsIDocument* mDocument;
|
||||||
nsIContent* mParent;
|
nsIContent* mParent;
|
||||||
void* mScriptObject;
|
void* mScriptObject;
|
||||||
|
|
||||||
|
nsresult GetListenerManager(nsIEventListenerManager** aInstancePtrResult);
|
||||||
|
|
||||||
|
nsIEventListenerManager* mListenerManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* nsHTMLContent_h___ */
|
#endif /* nsHTMLContent_h___ */
|
||||||
|
@ -26,6 +26,9 @@
|
|||||||
#include "nsString.h"
|
#include "nsString.h"
|
||||||
#include "prprf.h"
|
#include "prprf.h"
|
||||||
#include "nsDOMAttributes.h"
|
#include "nsDOMAttributes.h"
|
||||||
|
#include "nsILinkHandler.h"
|
||||||
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsIURL.h"
|
||||||
#include "nsICSSParser.h"
|
#include "nsICSSParser.h"
|
||||||
#include "nsISupportsArray.h"
|
#include "nsISupportsArray.h"
|
||||||
#include "nsISizeOfHandler.h"
|
#include "nsISizeOfHandler.h"
|
||||||
@ -534,6 +537,87 @@ nsresult nsHTMLTagContent::GetElementsByTagName(nsString &aName,nsIDOMNodeIterat
|
|||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
return NS_ERROR_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nsHTMLTagContent::TriggerLink(nsIPresContext& aPresContext,
|
||||||
|
const nsString& aBase,
|
||||||
|
const nsString& aURLSpec,
|
||||||
|
const nsString& aTargetSpec,
|
||||||
|
PRBool aClick)
|
||||||
|
{
|
||||||
|
nsILinkHandler* handler;
|
||||||
|
if (NS_OK == aPresContext.GetLinkHandler(&handler)) {
|
||||||
|
// Resolve url to an absolute url
|
||||||
|
nsIURL* docURL = nsnull;
|
||||||
|
nsIDocument* doc;
|
||||||
|
if (NS_OK == GetDocument(doc)) {
|
||||||
|
docURL = doc->GetDocumentURL();
|
||||||
|
NS_RELEASE(doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsAutoString absURLSpec;
|
||||||
|
nsresult rv = NS_MakeAbsoluteURL(docURL, aBase, aURLSpec, absURLSpec);
|
||||||
|
if (nsnull != docURL) {
|
||||||
|
NS_RELEASE(docURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now pass on absolute url to the click handler
|
||||||
|
if (aClick) {
|
||||||
|
handler->OnLinkClick(nsnull, absURLSpec, aTargetSpec);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
handler->OnOverLink(nsnull, absURLSpec, aTargetSpec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult nsHTMLTagContent::HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus)
|
||||||
|
{
|
||||||
|
nsresult ret = NS_OK;
|
||||||
|
|
||||||
|
ret = nsHTMLContent::HandleDOMEvent(aPresContext, aEvent, aEventStatus);
|
||||||
|
|
||||||
|
if (NS_OK == ret && nsEventStatus_eIgnore == aEventStatus) {
|
||||||
|
switch (aEvent->message) {
|
||||||
|
case NS_MOUSE_LEFT_BUTTON_UP:
|
||||||
|
if (mTag == nsHTMLAtoms::a) {
|
||||||
|
nsAutoString base, href, target;
|
||||||
|
GetAttribute("href", href);
|
||||||
|
GetAttribute("target", target);
|
||||||
|
TriggerLink(aPresContext, base, href, target, PR_TRUE);
|
||||||
|
aEventStatus = nsEventStatus_eConsumeNoDefault;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NS_MOUSE_RIGHT_BUTTON_DOWN:
|
||||||
|
// XXX Bring up a contextual menu provided by the application
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NS_MOUSE_MOVE:
|
||||||
|
if (mTag == nsHTMLAtoms::a) {
|
||||||
|
nsAutoString base, href, target;
|
||||||
|
GetAttribute("href", href);
|
||||||
|
GetAttribute("target", target);
|
||||||
|
TriggerLink(aPresContext, base, href, target, PR_FALSE);
|
||||||
|
aEventStatus = nsEventStatus_eConsumeNoDefault;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// XXX this doesn't seem to do anything yet
|
||||||
|
case NS_MOUSE_EXIT:
|
||||||
|
if (mTag == nsHTMLAtoms::a) {
|
||||||
|
nsAutoString empty;
|
||||||
|
TriggerLink(aPresContext, empty, empty, empty, PR_FALSE);
|
||||||
|
aEventStatus = nsEventStatus_eConsumeNoDefault;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -114,6 +114,10 @@ public:
|
|||||||
NS_IMETHOD GetElementsByTagName(nsString &aName,nsIDOMNodeIterator **aIterator);
|
NS_IMETHOD GetElementsByTagName(nsString &aName,nsIDOMNodeIterator **aIterator);
|
||||||
NS_IMETHOD Normalize();
|
NS_IMETHOD Normalize();
|
||||||
|
|
||||||
|
NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus);
|
||||||
|
|
||||||
// Utility routines for making attribute parsing easier
|
// Utility routines for making attribute parsing easier
|
||||||
|
|
||||||
struct EnumTable {
|
struct EnumTable {
|
||||||
@ -203,6 +207,12 @@ protected:
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const;
|
nsString& aResult) const;
|
||||||
|
|
||||||
|
void TriggerLink(nsIPresContext& aPresContext,
|
||||||
|
const nsString& aBase,
|
||||||
|
const nsString& aURLSpec,
|
||||||
|
const nsString& aTargetSpec,
|
||||||
|
PRBool aClick);
|
||||||
|
|
||||||
nsIAtom* mTag;
|
nsIAtom* mTag;
|
||||||
nsIHTMLAttributes* mAttributes;
|
nsIHTMLAttributes* mAttributes;
|
||||||
};
|
};
|
||||||
|
@ -145,6 +145,8 @@ NS_METHOD RootFrame::HandleEvent(nsIPresContext& aPresContext,
|
|||||||
nsGUIEvent* aEvent,
|
nsGUIEvent* aEvent,
|
||||||
nsEventStatus& aEventStatus)
|
nsEventStatus& aEventStatus)
|
||||||
{
|
{
|
||||||
|
mContent->HandleDOMEvent(aPresContext, aEvent, aEventStatus);
|
||||||
|
|
||||||
switch (aEvent->message) {
|
switch (aEvent->message) {
|
||||||
case NS_MOUSE_MOVE:
|
case NS_MOUSE_MOVE:
|
||||||
case NS_MOUSE_ENTER:
|
case NS_MOUSE_ENTER:
|
||||||
@ -453,6 +455,10 @@ public:
|
|||||||
nsIStyleContext* aStyleContext,
|
nsIStyleContext* aStyleContext,
|
||||||
nsIFrame*& aResult);
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~RootPart();
|
virtual ~RootPart();
|
||||||
};
|
};
|
||||||
@ -483,6 +489,14 @@ RootPart::CreateFrame(nsIPresContext* aPresContext,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
RootPart::HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus& aEventStatus)
|
||||||
|
{
|
||||||
|
return mDocument->HandleDOMEvent(aPresContext, aEvent, aEventStatus);
|
||||||
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewRootPart(nsIHTMLContent** aInstancePtrResult,
|
NS_NewRootPart(nsIHTMLContent** aInstancePtrResult,
|
||||||
nsIDocument* aDocument)
|
nsIDocument* aDocument)
|
||||||
|
@ -37,6 +37,7 @@ EX_LIBS = \
|
|||||||
$(DIST)/lib/libraptorlayout_s.a \
|
$(DIST)/lib/libraptorlayout_s.a \
|
||||||
$(DIST)/lib/libraptorgfx.a \
|
$(DIST)/lib/libraptorgfx.a \
|
||||||
$(DIST)/lib/libraptorbase.a \
|
$(DIST)/lib/libraptorbase.a \
|
||||||
|
$(DIST)/lib/libraptorevents.a \
|
||||||
$(DIST)/lib/libxpcom.a \
|
$(DIST)/lib/libxpcom.a \
|
||||||
$(DIST)/lib/libplc21.a \
|
$(DIST)/lib/libplc21.a \
|
||||||
$(DIST)/lib/libplds21.a \
|
$(DIST)/lib/libplds21.a \
|
||||||
|
@ -43,6 +43,7 @@ LLIBS= \
|
|||||||
$(DIST)\lib\raptorlayout_s.lib \
|
$(DIST)\lib\raptorlayout_s.lib \
|
||||||
$(DIST)\lib\raptorgfx.lib \
|
$(DIST)\lib\raptorgfx.lib \
|
||||||
$(DIST)\lib\raptorbase.lib \
|
$(DIST)\lib\raptorbase.lib \
|
||||||
|
$(DIST)\lib\raptorevents_s.lib \
|
||||||
$(DIST)\lib\img3240.lib \
|
$(DIST)\lib\img3240.lib \
|
||||||
$(DIST)\lib\util.lib \
|
$(DIST)\lib\util.lib \
|
||||||
$(DIST)\lib\xpcom32.lib \
|
$(DIST)\lib\xpcom32.lib \
|
||||||
|
@ -17,6 +17,6 @@
|
|||||||
|
|
||||||
DEPTH=..
|
DEPTH=..
|
||||||
|
|
||||||
DIRS=base html build
|
DIRS=base html events build
|
||||||
|
|
||||||
include <$(DEPTH)\layout\config\rules.mak>
|
include <$(DEPTH)\layout\config\rules.mak>
|
||||||
|
Loading…
Reference in New Issue
Block a user