Modified: trunk/Tools/ChangeLog (89143 => 89144)
--- trunk/Tools/ChangeLog 2011-06-17 17:48:23 UTC (rev 89143)
+++ trunk/Tools/ChangeLog 2011-06-17 18:00:59 UTC (rev 89144)
@@ -1,3 +1,25 @@
+2011-05-25 Brent Fulgham <bfulg...@webkit.org>
+
+ Reviewed by Brian Weinstein.
+
+ Create a simple example of using the COM-based C++ listeners.
+ A new onclick event is attached (via C++) to the WebKit logo
+ in the default test pattern displayed on startup. Clicking on
+ the logo causes a message box to be displayed.
+ https://bugs.webkit.org/show_bug.cgi?id=61885
+
+ * WinLauncher/DOMDefaultImpl.h: Added. Stub implementation of
+ the WebScriptObject and DOMEventListener.
+ * WinLauncher/WinLauncher.cpp:
+ (SimpleEventListener::SimpleEventListener): Example implementation
+ of a simple DOM event listener.
+ (SimpleEventListener::handleEvent):
+ (WinLauncherWebHost::didFinishLoadForFrame): Added implementation
+ to bind a C++ method to the 'onclick' event for the WebKit logo.
+ (_tWinMain):
+ * WinLauncher/WinLauncher.h:
+ * WinLauncher/WinLauncher.vcproj: Add new DOMDefaultImpl.h file.
+
2011-06-17 Chang Shu <c...@webkit.org>
Reviewed by Andreas Kling.
Added: trunk/Tools/WinLauncher/DOMDefaultImpl.h (0 => 89144)
--- trunk/Tools/WinLauncher/DOMDefaultImpl.h (rev 0)
+++ trunk/Tools/WinLauncher/DOMDefaultImpl.h 2011-06-17 18:00:59 UTC (rev 89144)
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2011 Anthony Johnson. All Rights Reserved.
+ * Copyright (C) 2011 Brent Fulgham. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef DOMDefaultImpl_h
+#define DOMDefaultImpl_h
+
+#include <WebKit/WebKit.h>
+
+class WebScriptObject : public IWebScriptObject {
+public:
+ WebScriptObject() : m_refCount(0)
+ {
+ }
+
+ virtual ~WebScriptObject()
+ {
+ }
+
+ // IUnknown
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
+ virtual ULONG STDMETHODCALLTYPE AddRef(void);
+ virtual ULONG STDMETHODCALLTYPE Release(void);
+
+ // IWebScriptObject
+ virtual HRESULT STDMETHODCALLTYPE throwException(BSTR, BOOL*) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(BSTR, const VARIANT[], int, VARIANT*) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(BSTR, VARIANT*) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(BSTR) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE stringRepresentation(BSTR*) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(unsigned int, VARIANT*) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(unsigned int, VARIANT) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE setException(BSTR) { return E_NOTIMPL; }
+
+protected:
+ ULONG m_refCount;
+};
+
+
+class DOMObject : public WebScriptObject, public IDOMObject {
+public:
+ // IUnknown
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
+};
+
+
+class DOMEventListener : public DOMObject, public IDOMEventListener {
+public:
+ // IUnknown
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
+ virtual ULONG STDMETHODCALLTYPE AddRef(void);
+ virtual ULONG STDMETHODCALLTYPE Release(void);
+
+ // IWebScriptObject
+ virtual HRESULT STDMETHODCALLTYPE throwException(BSTR, BOOL*) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(BSTR, const VARIANT[], int, VARIANT*) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(BSTR, VARIANT*) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(BSTR) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE stringRepresentation(BSTR*) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(unsigned int, VARIANT*) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(unsigned int, VARIANT) { return E_NOTIMPL; }
+ virtual HRESULT STDMETHODCALLTYPE setException(BSTR) { return E_NOTIMPL; }
+
+ // IDOMEventListener
+ virtual HRESULT STDMETHODCALLTYPE handleEvent(IDOMEvent*) { return E_NOTIMPL; }
+};
+
+// IUnknown -------------------------------------------------------------------
+HRESULT WebScriptObject::QueryInterface(REFIID riid, void** ppvObject)
+{
+ *ppvObject = 0;
+ if (IsEqualGUID(riid, IID_IUnknown))
+ *ppvObject = static_cast<IWebScriptObject*>(this);
+ else if (IsEqualGUID(riid, IID_IWebScriptObject))
+ *ppvObject = static_cast<IWebScriptObject*>(this);
+ else
+ return E_NOINTERFACE;
+
+ AddRef();
+ return S_OK;
+}
+
+ULONG WebScriptObject::AddRef(void)
+{
+ return ++m_refCount;
+}
+
+ULONG WebScriptObject::Release(void)
+{
+ ULONG newRef = --m_refCount;
+ if (!newRef)
+ delete(this);
+
+ return newRef;
+}
+
+// DOMObject -------------------------------------------------------------------
+HRESULT DOMObject::QueryInterface(REFIID riid, void** ppvObject)
+{
+ *ppvObject = 0;
+ if (IsEqualGUID(riid, IID_IDOMObject))
+ *ppvObject = static_cast<IDOMObject*>(this);
+ else
+ return WebScriptObject::QueryInterface(riid, ppvObject);
+
+ WebScriptObject::AddRef();
+ return S_OK;
+}
+
+
+// DOMEventListener -------------------------------------------------------------------
+HRESULT DOMEventListener::QueryInterface(const IID &riid, void** ppvObject)
+{
+ *ppvObject = 0;
+ if (IsEqualGUID(riid, IID_IDOMEventListener))
+ *ppvObject = static_cast<IDOMEventListener*>(this);
+ else
+ return DOMObject::QueryInterface(riid, ppvObject);
+
+ AddRef();
+ return S_OK;
+}
+
+ULONG DOMEventListener::AddRef(void)
+{
+ return WebScriptObject::AddRef();
+}
+
+ULONG DOMEventListener::Release(void)
+{
+ return WebScriptObject::Release();
+}
+
+#endif
Modified: trunk/Tools/WinLauncher/WinLauncher.cpp (89143 => 89144)
--- trunk/Tools/WinLauncher/WinLauncher.cpp 2011-06-17 17:48:23 UTC (rev 89143)
+++ trunk/Tools/WinLauncher/WinLauncher.cpp 2011-06-17 18:00:59 UTC (rev 89144)
@@ -27,19 +27,19 @@
#include "stdafx.h"
#include "WinLauncher.h"
+
+#include "DOMDefaultImpl.h"
+#include "PrintWebUIDelegate.h"
#include <WebKit/WebKitCOMAPI.h>
-#include <string>
-
#include <commctrl.h>
#include <commdlg.h>
#include <objbase.h>
#include <shellapi.h>
#include <shlwapi.h>
+#include <string>
#include <wininet.h>
-#include "PrintWebUIDelegate.h"
-
#define MAX_LOADSTRING 100
#define URLBAR_HEIGHT 24
@@ -82,6 +82,27 @@
return s_fullDesktop;
}
+class SimpleEventListener : public DOMEventListener {
+public:
+ SimpleEventListener(LPWSTR type)
+ {
+ wcsncpy_s(m_eventType, 100, type, 100);
+ m_eventType[99] = 0;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE handleEvent(IDOMEvent* evt)
+ {
+ wchar_t message[255];
+ wcscpy_s(message, 255, m_eventType);
+ wcscat_s(message, 255, L" event fired!");
+ ::MessageBox(0, message, L"Event Handler", MB_OK);
+ return S_OK;
+ }
+
+private:
+ wchar_t m_eventType[100];
+};
+
HRESULT WinLauncherWebHost::updateAddressBar(IWebView* webView)
{
IWebFrame* mainFrame = 0;
@@ -150,6 +171,36 @@
return newRef;
}
+HRESULT WinLauncherWebHost::didFinishLoadForFrame(IWebView* webView, IWebFrame* frame)
+{
+ IDOMDocument* doc = 0;
+ frame->DOMDocument(&doc);
+
+ IDOMElement* element = 0;
+ IDOMEventTarget* target = 0;
+ HRESULT hr = doc->getElementById(L"webkit logo", &element);
+ if (!SUCCEEDED(hr))
+ goto exit;
+
+ hr = element->QueryInterface(IID_IDOMEventTarget, reinterpret_cast<void**>(&target));
+ if (!SUCCEEDED(hr))
+ goto exit;
+
+ hr = target->addEventListener(L"click", new SimpleEventListener (L"webkit logo click"), FALSE);
+ if (!SUCCEEDED(hr))
+ goto exit;
+
+exit:
+ if (target)
+ target->Release();
+ if (element)
+ element->Release();
+ if (doc)
+ doc->Release();
+
+ return hr;
+}
+
static void resizeSubViews()
{
if (usesLayeredWebView() || !gViewWindow)
@@ -292,7 +343,7 @@
if (FAILED(hr))
goto exit;
- static BSTR defaultHTML = SysAllocString(TEXT("<p style=\"background-color: #00FF00\">Testing</p><img src="" alt=\"Face\"><div style=\"border: solid blue; background: white;\" contenteditable=\"true\">div with blue border</div><ul><li>foo<li>bar<li>baz</ul>"));
+ static BSTR defaultHTML = SysAllocString(TEXT("<p style=\"background-color: #00FF00\">Testing</p><img id=\"webkit logo\" src="" alt=\"Face\"><div style=\"border: solid blue; background: white;\" contenteditable=\"true\">div with blue border</div><ul><li>foo<li>bar<li>baz</ul>"));
frame->loadHTMLString(defaultHTML, 0);
frame->Release();
Modified: trunk/Tools/WinLauncher/WinLauncher.h (89143 => 89144)
--- trunk/Tools/WinLauncher/WinLauncher.h 2011-06-17 17:48:23 UTC (rev 89143)
+++ trunk/Tools/WinLauncher/WinLauncher.h 2011-06-17 18:00:59 UTC (rev 89144)
@@ -72,7 +72,7 @@
virtual HRESULT STDMETHODCALLTYPE didFinishLoadForFrame(
/* [in] */ IWebView* webView,
- /* [in] */ IWebFrame* /*frame*/) { return S_OK; }
+ /* [in] */ IWebFrame* /*frame*/);
virtual HRESULT STDMETHODCALLTYPE didFailLoadWithError(
/* [in] */ IWebView *webView,
Modified: trunk/Tools/WinLauncher/WinLauncher.vcproj (89143 => 89144)
--- trunk/Tools/WinLauncher/WinLauncher.vcproj 2011-06-17 17:48:23 UTC (rev 89143)
+++ trunk/Tools/WinLauncher/WinLauncher.vcproj 2011-06-17 18:00:59 UTC (rev 89144)
@@ -458,6 +458,10 @@
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
+ RelativePath=".\DOMDefaultImpl.h"
+ >
+ </File>
+ <File
RelativePath=".\PrintWebUIDelegate.h"
>
</File>