Title: [89144] trunk/Tools
Revision
89144
Author
bfulg...@webkit.org
Date
2011-06-17 11:00:59 -0700 (Fri, 17 Jun 2011)

Log Message

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

Reviewed by Brian Weinstein.

* 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.

Modified Paths

Added Paths

Diff

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>
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to