Diff
Modified: trunk/Source/WebKit/win/ChangeLog (86999 => 87000)
--- trunk/Source/WebKit/win/ChangeLog 2011-05-20 23:20:48 UTC (rev 86999)
+++ trunk/Source/WebKit/win/ChangeLog 2011-05-20 23:38:11 UTC (rev 87000)
@@ -1,3 +1,56 @@
+2011-05-18 Anthony Johnson <[email protected]>
+
+ Reviewed by Brent Fulgham.
+
+ Implement the ability to add C++ event listeners to html dom
+ elements and dom window.
+ https://bugs.webkit.org/show_bug.cgi?id=60269
+
+ * DOMCoreClasses.cpp: Add new DOMWindow class and implementations.
+ (DOMNode::QueryInterface): Report that the DOMNode implements
+ the IDomEventTarget interface.
+ (DOMNode::addEventListener): Add implementation of a COM-based
+ event listener.
+ (DOMNode::removeEventListener):
+ (DOMNode::dispatchEvent):
+ (DOMDocument::createInstance):
+ (DOMWindow::QueryInterface): New implementation.
+ (DOMWindow::document): New implementation.
+ (DOMWindow::getComputedStyle): Stub.
+ (DOMWindow::getMatchedCSSRules): Stub.
+ (DOMWindow::devicePixelRatio): Stub.
+ (DOMWindow::addEventListener): New implementation.
+ (DOMWindow::removeEventListener): New implementation.
+ (DOMWindow::dispatchEvent): New implementation.
+ (DOMWindow::DOMWindow): New implementation.
+ (DOMWindow::~DOMWindow): New implementation.
+ (DOMWindow::createInstance): New implementation.
+ * DOMCoreClasses.h: Add new DOMWindow class and declarations.
+ (DOMWindow::AddRef): New declaration.
+ (DOMWindow::Release): New declaration.
+ (DOMWindow::throwException): New declaration.
+ (DOMWindow::callWebScriptMethod): New declaration.
+ (DOMWindow::evaluateWebScript): New declaration.
+ (DOMWindow::removeWebScriptKey): New declaration.
+ (DOMWindow::stringRepresentation): New declaration.
+ (DOMWindow::webScriptValueAtIndex): New declaration.
+ (DOMWindow::setWebScriptValueAtIndex): New declaration.
+ (DOMWindow::setException): New declaration.
+ (DOMWindow::window): New declaration.
+ * DOMEventsClasses.cpp: Add new WebEventListener and implementation.
+ (DOMEventListener::handleEvent): New implementation.
+ (WebEventListener::WebEventListener): New implementation.
+ (WebEventListener::~WebEventListener): New implementation.
+ (WebEventListener::operator==): New implementation.
+ (WebEventListener::handleEvent): New implementation.
+ (WebEventListener::create): New implementation.
+ * DOMEventsClasses.h: Add new WebEventListener class declaration.
+ * Interfaces/IWebFrame.idl: Add new DOMWindow accessor to the
+ main Web Frame interface.
+ * WebFrame.cpp: Add implementation of new DOMWindow creation method.
+ (WebFrame::DOMWindow):
+ * WebFrame.h: Add DOMWindow declaration.
+
2011-05-20 Simon Fraser <[email protected]>
Reviewed by Sam Weinig.
Modified: trunk/Source/WebKit/win/DOMCoreClasses.cpp (86999 => 87000)
--- trunk/Source/WebKit/win/DOMCoreClasses.cpp 2011-05-20 23:20:48 UTC (rev 86999)
+++ trunk/Source/WebKit/win/DOMCoreClasses.cpp 2011-05-20 23:38:11 UTC (rev 87000)
@@ -90,6 +90,8 @@
*ppvObject = static_cast<IDOMNode*>(this);
else if (IsEqualGUID(riid, __uuidof(DOMNode)))
*ppvObject = static_cast<DOMNode*>(this);
+ else if (IsEqualGUID(riid, __uuidof(IDOMEventTarget)))
+ *ppvObject = static_cast<IDOMEventTarget*>(this);
else
return DOMObject::QueryInterface(riid, ppvObject);
@@ -399,34 +401,40 @@
// DOMNode - IDOMEventTarget --------------------------------------------------
-HRESULT STDMETHODCALLTYPE DOMNode::addEventListener(
- /* [in] */ BSTR /*type*/,
- /* [in] */ IDOMEventListener* /*listener*/,
- /* [in] */ BOOL /*useCapture*/)
+HRESULT DOMNode::addEventListener(
+ /* [in] */ BSTR type,
+ /* [in] */ IDOMEventListener* listener,
+ /* [in] */ BOOL useCapture)
{
- return E_NOTIMPL;
+ RefPtr<WebEventListener> webListener = WebEventListener::create(listener);
+ m_node->addEventListener(type, webListener, useCapture);
+
+ return S_OK;
}
-HRESULT STDMETHODCALLTYPE DOMNode::removeEventListener(
- /* [in] */ BSTR /*type*/,
- /* [in] */ IDOMEventListener* /*listener*/,
- /* [in] */ BOOL /*useCapture*/)
+HRESULT DOMNode::removeEventListener(
+ /* [in] */ BSTR type,
+ /* [in] */ IDOMEventListener* listener,
+ /* [in] */ BOOL useCapture)
{
- return E_NOTIMPL;
+ if (!listener || !type)
+ return E_POINTER;
+ if (!m_node)
+ return E_FAIL;
+ RefPtr<WebEventListener> webListener = WebEventListener::create(listener);
+ m_node->removeEventListener(type, webListener.get(), useCapture);
+ return S_OK;
}
-HRESULT STDMETHODCALLTYPE DOMNode::dispatchEvent(
+HRESULT DOMNode::dispatchEvent(
/* [in] */ IDOMEvent* evt,
/* [retval][out] */ BOOL* result)
{
- if (!m_node || !evt)
+ if (!evt || !result)
+ return E_POINTER;
+ if (!m_node)
return E_FAIL;
-#if 0 // FIXME - raise dom exceptions
- if (![self _node]->isEventTargetNode())
- WebCore::raiseDOMException(DOM_NOT_SUPPORTED_ERR);
-#endif
-
COMPtr<DOMEvent> domEvent;
HRESULT hr = evt->QueryInterface(IID_DOMEvent, (void**) &domEvent);
if (FAILED(hr))
@@ -434,10 +442,7 @@
WebCore::ExceptionCode ec = 0;
*result = m_node->dispatchEvent(domEvent->coreEvent(), ec) ? TRUE : FALSE;
-#if 0 // FIXME - raise dom exceptions
- WebCore::raiseOnDOMError(ec);
-#endif
- return S_OK;
+ return ec ? E_FAIL : S_OK;
}
// DOMNode - DOMNode ----------------------------------------------------------
@@ -818,6 +823,138 @@
return domDocument;
}
+// DOMWindow - IUnknown ------------------------------------------------------
+
+HRESULT DOMWindow::QueryInterface(REFIID riid, void** ppvObject)
+{
+ *ppvObject = 0;
+ if (IsEqualGUID(riid, IID_IDOMWindow))
+ *ppvObject = static_cast<IDOMWindow*>(this);
+ else if (IsEqualGUID(riid, IID_IDOMEventTarget))
+ *ppvObject = static_cast<IDOMEventTarget*>(this);
+ else
+ return DOMObject::QueryInterface(riid, ppvObject);
+
+ AddRef();
+ return S_OK;
+}
+
+// DOMWindow - IDOMWindow ------------------------------------------------------
+
+HRESULT DOMWindow::document(
+ /* [out, retval] */ IDOMDocument** result)
+{
+ if (!result) {
+ ASSERT_NOT_REACHED();
+ return E_POINTER;
+ }
+
+ *result = DOMDocument::createInstance(m_window->document());
+ return *result ? S_OK : E_FAIL;
+}
+
+HRESULT DOMWindow::getComputedStyle(
+ /* [in] */ IDOMElement* element,
+ /* [in] */ BSTR pseudoElement)
+{
+ ASSERT_NOT_REACHED();
+ return E_NOTIMPL;
+}
+
+HRESULT DOMWindow::getMatchedCSSRules(
+ /* [in] */ IDOMElement* element,
+ /* [in] */ BSTR pseudoElement,
+ /* [in] */ BOOL authorOnly,
+ /* [out, retval] */ IDOMCSSRuleList** result)
+{
+ ASSERT_NOT_REACHED();
+ return E_NOTIMPL;
+}
+
+HRESULT DOMWindow::devicePixelRatio(
+ /* [out, retval] */ double* result)
+{
+ ASSERT_NOT_REACHED();
+ return E_NOTIMPL;
+}
+
+// DOMWindow - IDOMEventTarget ------------------------------------------------------
+
+HRESULT DOMWindow::addEventListener(
+ /* [in] */ BSTR type,
+ /* [in] */ IDOMEventListener* listener,
+ /* [in] */ BOOL useCapture)
+{
+ if (!type || !listener)
+ return E_POINTER;
+ if (!m_window)
+ return E_FAIL;
+ RefPtr<WebEventListener> webListener = WebEventListener::create(listener);
+ m_window->addEventListener(type, webListener, useCapture);
+ return S_OK;
+}
+
+HRESULT DOMWindow::removeEventListener(
+ /* [in] */ BSTR type,
+ /* [in] */ IDOMEventListener* listener,
+ /* [in] */ BOOL useCapture)
+{
+ if (!type || !listener)
+ return E_POINTER;
+ if (!m_window)
+ return E_FAIL;
+ RefPtr<WebEventListener> webListener = WebEventListener::create(listener);
+ m_window->removeEventListener(type, webListener.get(), useCapture);
+ return S_OK;
+}
+
+HRESULT DOMWindow::dispatchEvent(
+ /* [in] */ IDOMEvent* evt,
+ /* [retval][out] */ BOOL* result)
+{
+ if (!result || !evt)
+ return E_POINTER;
+ if (!m_window)
+ return E_FAIL;
+
+ COMPtr<DOMEvent> domEvent;
+ HRESULT hr = evt->QueryInterface(IID_DOMEvent, (void**) &domEvent);
+ if (FAILED(hr))
+ return hr;
+
+ WebCore::ExceptionCode ec = 0;
+ *result = m_window->dispatchEvent(domEvent->coreEvent(), ec) ? TRUE : FALSE;
+ return ec ? E_FAIL : S_OK;
+}
+
+
+// DOMWindow - DOMWindow --------------------------------------------------
+
+DOMWindow::DOMWindow(WebCore::DOMWindow* w)
+: m_window(w)
+{
+}
+
+DOMWindow::~DOMWindow()
+{
+}
+
+IDOMWindow* DOMWindow::createInstance(WebCore::DOMWindow* w)
+{
+ if (!w)
+ return 0;
+
+ DOMWindow* newWindow = new DOMWindow(w);
+
+ IDOMWindow* domWindow = 0;
+ HRESULT hr = newWindow->QueryInterface(IID_IDOMWindow, reinterpret_cast<void**>(&domWindow));
+
+ if (FAILED(hr))
+ return 0;
+
+ return domWindow;
+}
+
// DOMElement - IUnknown ------------------------------------------------------
HRESULT STDMETHODCALLTYPE DOMElement::QueryInterface(REFIID riid, void** ppvObject)
Modified: trunk/Source/WebKit/win/DOMCoreClasses.h (86999 => 87000)
--- trunk/Source/WebKit/win/DOMCoreClasses.h 2011-05-20 23:20:48 UTC (rev 86999)
+++ trunk/Source/WebKit/win/DOMCoreClasses.h 2011-05-20 23:38:11 UTC (rev 87000)
@@ -32,6 +32,7 @@
namespace WebCore {
class Element;
class Document;
+class DOMWindow;
class Node;
class NodeList;
}
@@ -533,6 +534,91 @@
WebCore::Document* m_document;
};
+class DOMWindow : public DOMObject, public IDOMWindow, public IDOMEventTarget {
+protected:
+ DOMWindow(WebCore::DOMWindow*);
+ ~DOMWindow();
+
+public:
+ static IDOMWindow* createInstance(WebCore::DOMWindow*);
+
+public:
+ // IUnknown
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
+ virtual ULONG STDMETHODCALLTYPE AddRef(void) { return DOMObject::AddRef(); }
+ virtual ULONG STDMETHODCALLTYPE Release(void) { return DOMObject::Release(); }
+
+ // IWebScriptObject
+ virtual HRESULT STDMETHODCALLTYPE throwException(
+ /* [in] */ BSTR exceptionMessage,
+ /* [retval][out] */ BOOL* result) { return DOMObject::throwException(exceptionMessage, result); }
+
+ virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(
+ /* [in] */ BSTR name,
+ /* [size_is][in] */ const VARIANT args[ ],
+ /* [in] */ int cArgs,
+ /* [retval][out] */ VARIANT* result) { return DOMObject::callWebScriptMethod(name, args, cArgs, result); }
+
+ virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(
+ /* [in] */ BSTR script,
+ /* [retval][out] */ VARIANT* result) { return DOMObject::evaluateWebScript(script, result); }
+
+ virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(
+ /* [in] */ BSTR name) { return DOMObject::removeWebScriptKey(name); }
+
+ virtual HRESULT STDMETHODCALLTYPE stringRepresentation(
+ /* [retval][out] */ BSTR* stringRepresentation) { return DOMObject::stringRepresentation(stringRepresentation); }
+
+ virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(
+ /* [in] */ unsigned int index,
+ /* [retval][out] */ VARIANT* result) { return DOMObject::webScriptValueAtIndex(index, result); }
+
+ virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(
+ /* [in] */ unsigned int index,
+ /* [in] */ VARIANT val) { return DOMObject::setWebScriptValueAtIndex(index, val); }
+
+ virtual HRESULT STDMETHODCALLTYPE setException(
+ /* [in] */ BSTR description) { return DOMObject::setException(description); }
+
+ virtual HRESULT STDMETHODCALLTYPE document(
+ /* [out, retval] */ IDOMDocument**);
+
+ virtual HRESULT STDMETHODCALLTYPE getComputedStyle(
+ /* [in] */ IDOMElement*,
+ /* [in] */ BSTR);
+
+ virtual HRESULT STDMETHODCALLTYPE getMatchedCSSRules(
+ /* [in] */ IDOMElement*,
+ /* [in] */ BSTR,
+ /* [in] */ BOOL,
+ /* [out, retval] */ IDOMCSSRuleList**);
+
+ virtual HRESULT STDMETHODCALLTYPE devicePixelRatio(
+ /* [out, retval] */ double*);
+
+ virtual HRESULT STDMETHODCALLTYPE addEventListener(
+ /* [in] */ BSTR,
+ /* [in] */ IDOMEventListener *,
+ /* [in] */ BOOL);
+
+ virtual HRESULT STDMETHODCALLTYPE removeEventListener(
+ /* [in] */ BSTR,
+ /* [in] */ IDOMEventListener *,
+ /* [in] */ BOOL);
+
+ virtual HRESULT STDMETHODCALLTYPE dispatchEvent(
+ /* [in] */ IDOMEvent *,
+ /* [retval][out] */ BOOL *);
+
+ // DOMWindow
+ WebCore::DOMWindow* window() { return m_window; }
+
+protected:
+ WebCore::DOMWindow* m_window;
+};
+
+
+
class DOMElement : public DOMNode, public IDOMElement, public IDOMElementPrivate, public IDOMNodeExtensions, public IDOMElementCSSInlineStyle, public IDOMElementExtensions {
protected:
DOMElement(WebCore::Element* e);
Modified: trunk/Source/WebKit/win/DOMEventsClasses.cpp (86999 => 87000)
--- trunk/Source/WebKit/win/DOMEventsClasses.cpp 2011-05-20 23:20:48 UTC (rev 86999)
+++ trunk/Source/WebKit/win/DOMEventsClasses.cpp 2011-05-20 23:38:11 UTC (rev 87000)
@@ -28,10 +28,12 @@
#include <initguid.h>
#include "DOMEventsClasses.h"
+#include <WebCore/COMPtr.h>
#include <WebCore/DOMWindow.h>
#include <WebCore/Event.h>
#include <WebCore/KeyboardEvent.h>
#include <WebCore/MouseEvent.h>
+#include <WebCore/ScriptExecutionContext.h>
// DOMEventListener -----------------------------------------------------------
@@ -53,6 +55,36 @@
return E_NOTIMPL;
}
+WebEventListener::WebEventListener(IDOMEventListener* i)
+ : EventListener(CPPEventListenerType)
+ , m_iDOMEventListener(i)
+{
+ m_iDOMEventListener->AddRef();
+}
+
+WebEventListener::~WebEventListener()
+{
+ m_iDOMEventListener->Release();
+}
+
+bool WebEventListener::operator==(const WebCore::EventListener& other)
+{
+ return (other.type() == CPPEventListenerType
+ && reinterpret_cast<const WebEventListener*>(&other)->m_iDOMEventListener == m_iDOMEventListener);
+}
+
+void WebEventListener::handleEvent(WebCore::ScriptExecutionContext* s, WebCore::Event* e)
+{
+ RefPtr<WebCore::Event> ePtr(e);
+ COMPtr<IDOMEvent> domEvent = DOMEvent::createInstance(ePtr);
+ m_iDOMEventListener->handleEvent(domEvent.get());
+}
+
+PassRefPtr<WebEventListener> WebEventListener::create(IDOMEventListener* d)
+{
+ return adoptRef(new WebEventListener(d));
+}
+
// DOMEvent -------------------------------------------------------------------
DOMEvent::DOMEvent(PassRefPtr<WebCore::Event> e)
@@ -561,7 +593,7 @@
return E_NOTIMPL;
}
-HRESULT STDMETHODCALLTYPE DOMMutationEvent::initMutationEvent(
+HRESULT STDMETHODCALLTYPE DOMMutationEvent::initMutationEvent(
/* [in] */ BSTR /*type*/,
/* [in] */ BOOL /*canBubble*/,
/* [in] */ BOOL /*cancelable*/,
Modified: trunk/Source/WebKit/win/DOMEventsClasses.h (86999 => 87000)
--- trunk/Source/WebKit/win/DOMEventsClasses.h 2011-05-20 23:20:48 UTC (rev 86999)
+++ trunk/Source/WebKit/win/DOMEventsClasses.h 2011-05-20 23:38:11 UTC (rev 87000)
@@ -28,6 +28,7 @@
#include "WebKit.h"
#include "DOMCoreClasses.h"
+#include <WebCore/EventListener.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefPtr.h>
@@ -41,6 +42,17 @@
class DOMUIEvent;
+class WebEventListener : public WebCore::EventListener {
+public:
+ WebEventListener(IDOMEventListener*);
+ ~WebEventListener();
+ virtual bool operator==(const EventListener&);
+ virtual void handleEvent(WebCore::ScriptExecutionContext*, WebCore::Event*);
+ static PassRefPtr<WebEventListener> create(IDOMEventListener*);
+private:
+ IDOMEventListener* m_iDOMEventListener;
+};
+
class DOMEventListener : public DOMObject, public IDOMEventListener
{
public:
Modified: trunk/Source/WebKit/win/Interfaces/IWebFrame.idl (86999 => 87000)
--- trunk/Source/WebKit/win/Interfaces/IWebFrame.idl 2011-05-20 23:20:48 UTC (rev 86999)
+++ trunk/Source/WebKit/win/Interfaces/IWebFrame.idl 2011-05-20 23:38:11 UTC (rev 87000)
@@ -260,4 +260,12 @@
@discussion Performs HTTP/1.1 end-to-end reload.
*/
HRESULT reloadFromOrigin();
+
+ /*!
+ @method DOMWindow
+ @abstract Returns the DOM window of the frame.
+ @description Returns nil if the frame does not contain a DOM window such as a standalone image.
+ - (DOMWindow *)DOMWindow;
+ */
+ HRESULT DOMWindow([out, retval] IDOMWindow** window);
}
Modified: trunk/Source/WebKit/win/WebFrame.cpp (86999 => 87000)
--- trunk/Source/WebKit/win/WebFrame.cpp 2011-05-20 23:20:48 UTC (rev 86999)
+++ trunk/Source/WebKit/win/WebFrame.cpp 2011-05-20 23:38:11 UTC (rev 87000)
@@ -480,6 +480,24 @@
return *result ? S_OK : E_FAIL;
}
+
+HRESULT WebFrame::DOMWindow(/* [retval][out] */ IDOMWindow** window)
+{
+ if (!window) {
+ ASSERT_NOT_REACHED();
+ return E_POINTER;
+ }
+
+ *window = 0;
+
+ if (Frame* coreFrame = core(this)) {
+ if (WebCore::DOMWindow* coreWindow = coreFrame->domWindow())
+ *window = ::DOMWindow::createInstance(coreWindow);
+ }
+
+ return *window ? S_OK : E_FAIL;
+}
+
HRESULT STDMETHODCALLTYPE WebFrame::frameElement(
/* [retval][out] */ IDOMHTMLElement** frameElement)
{
Modified: trunk/Source/WebKit/win/WebFrame.h (86999 => 87000)
--- trunk/Source/WebKit/win/WebFrame.h 2011-05-20 23:20:48 UTC (rev 86999)
+++ trunk/Source/WebKit/win/WebFrame.h 2011-05-20 23:38:11 UTC (rev 87000)
@@ -105,6 +105,8 @@
virtual HRESULT STDMETHODCALLTYPE DOMDocument(
/* [retval][out] */ IDOMDocument** document);
+
+ virtual HRESULT STDMETHODCALLTYPE DOMWindow(/* [retval][out] */ IDOMWindow**);
virtual HRESULT STDMETHODCALLTYPE frameElement(
/* [retval][out] */ IDOMHTMLElement **frameElement);