[Win] Add WebKit message loop interface.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 25 Jan 2015 18:01:07 +0000 (18:01 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 25 Jan 2015 18:01:07 +0000 (18:01 +0000)
https://bugs.webkit.org/show_bug.cgi?id=140857

Patch by peavo@outlook.com <peavo@outlook.com> on 2015-01-25
Reviewed by Brent Fulgham.

Added message loop interface which will run the message loop,
and perform required tasks (like calling CFRunLoopRunInMode)
on each iteration of the loop.

Source/WebKit:

* WebKit.vcxproj/WebKit/WebKit.vcxproj: Added new files to project.
* WebKit.vcxproj/WebKit/WebKit.vcxproj.filters: Ditto.

Source/WebKit/win:

* ForEachCoClass.h:
* Interfaces/WebKit.idl:
* Interfaces/WebKitMessageLoop.idl: Added.
* WebKitClassFactory.cpp:
* WebKitMessageLoop.cpp: Added.
(WebKitMessageLoop::WebKitMessageLoop):
(WebKitMessageLoop::~WebKitMessageLoop):
(WebKitMessageLoop::createInstance):
(WebKitMessageLoop::QueryInterface):
(WebKitMessageLoop::AddRef):
(WebKitMessageLoop::Release):
(WebKitMessageLoop::run):
(WebKitMessageLoop::performMessageLoopTasks):
* WebKitMessageLoop.h: Added.

Tools:

* WinLauncher/WinMain.cpp:
(wWinMain): Use new message loop interface.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@179088 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
Source/WebKit/ChangeLog
Source/WebKit/WebKit.vcxproj/WebKit/WebKit.vcxproj
Source/WebKit/WebKit.vcxproj/WebKit/WebKit.vcxproj.filters
Source/WebKit/win/ChangeLog
Source/WebKit/win/ForEachCoClass.h
Source/WebKit/win/Interfaces/WebKit.idl
Source/WebKit/win/Interfaces/WebKitMessageLoop.idl [new file with mode: 0644]
Source/WebKit/win/WebKitClassFactory.cpp
Source/WebKit/win/WebKitMessageLoop.cpp [new file with mode: 0644]
Source/WebKit/win/WebKitMessageLoop.h [new file with mode: 0644]
Tools/ChangeLog
Tools/WinLauncher/WinMain.cpp

index 7edfa6ab60787aecf1a552341c77dbd1e8940e92..3b5a7f7aeb13e528cc68ae4be4139eecdced7d22 100644 (file)
@@ -1,3 +1,17 @@
+2015-01-25  peavo@outlook.com  <peavo@outlook.com>
+
+        [Win] Add WebKit message loop interface.
+        https://bugs.webkit.org/show_bug.cgi?id=140857
+
+        Reviewed by Brent Fulgham.
+
+        Added message loop interface which will run the message loop,
+        and perform required tasks (like calling CFRunLoopRunInMode)
+        on each iteration of the loop.
+
+        * WebKit.vcxproj/WebKit/WebKit.vcxproj: Added new files to project.
+        * WebKit.vcxproj/WebKit/WebKit.vcxproj.filters: Ditto.
+
 2015-01-22  Andreas Kling  <akling@apple.com>
 
         Remove unused class EmojiFallbackFontSelector.
index c79f2a4d0941573bb2ee21d976f0b90868611f37..40572ae058d47a3f5216bb2bc3a73466e938e803 100644 (file)
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|x64'">true</ExcludedFromBuild>
     </ClCompile>
     <ClCompile Include="..\..\win\WebKitLogging.cpp" />
+    <ClCompile Include="..\..\win\WebKitMessageLoop.cpp" />
     <ClCompile Include="..\..\win\WebKitPrefix.cpp">
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
     <ClInclude Include="..\..\win\WebKitDLL.h" />
     <ClInclude Include="..\..\win\WebKitGraphics.h" />
     <ClInclude Include="..\..\win\WebKitLogging.h" />
+    <ClInclude Include="..\..\win\WebKitMessageLoop.h" />
     <ClInclude Include="..\..\win\WebKitPrefix.h" />
     <ClInclude Include="..\..\win\WebKitStatistics.h" />
     <ClInclude Include="..\..\win\WebKitStatisticsPrivate.h" />
index d38cb9b9e5302696be7869f6722d264faa8e083c..f5db6a637d23bfee231e17327279df5d65421857 100644 (file)
     <ClCompile Include="..\..\win\Plugins\npapi.cpp">
       <Filter>Sources\Plugins</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\win\WebKitMessageLoop.cpp">
+      <Filter>Sources</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\win\WebCoreSupport\EmbeddedWidget.h">
     <ClInclude Include="..\..\win\Plugins\PluginStrategy.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\win\WebKitMessageLoop.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="WebKitPostBuild.cmd" />
index c50c8be35981074b37e66cc3f9e86c2aed59817a..fc6071ea04df33c225bde040e7be5a93c9664997 100644 (file)
@@ -1,3 +1,29 @@
+2015-01-25  peavo@outlook.com  <peavo@outlook.com>
+
+        [Win] Add WebKit message loop interface.
+        https://bugs.webkit.org/show_bug.cgi?id=140857
+
+        Reviewed by Brent Fulgham.
+
+        Added message loop interface which will run the message loop,
+        and perform required tasks (like calling CFRunLoopRunInMode)
+        on each iteration of the loop.
+
+        * ForEachCoClass.h:
+        * Interfaces/WebKit.idl:
+        * Interfaces/WebKitMessageLoop.idl: Added.
+        * WebKitClassFactory.cpp:
+        * WebKitMessageLoop.cpp: Added.
+        (WebKitMessageLoop::WebKitMessageLoop):
+        (WebKitMessageLoop::~WebKitMessageLoop):
+        (WebKitMessageLoop::createInstance):
+        (WebKitMessageLoop::QueryInterface):
+        (WebKitMessageLoop::AddRef):
+        (WebKitMessageLoop::Release):
+        (WebKitMessageLoop::run):
+        (WebKitMessageLoop::performMessageLoopTasks):
+        * WebKitMessageLoop.h: Added.
+
 2015-01-23  Brent Fulgham  <bfulgham@apple.com>
 
         [Win] Teach WebKit to provide IAccessible2 'get_language'
index dd4fa869135c097c71611c8c6977148480da2311..3f948d84d8c00b9fb9a98ab1ef048be2e2684673 100644 (file)
@@ -61,6 +61,7 @@
     macro(WebGeolocationPosition) \
     macro(WebSerializedJSValue) \
     macro(WebUserContentURLPattern) \
+    macro(WebKitMessageLoop) \
     // end of macro
 
 // Everything below this point is deprecated. Please do not use.
index 8aa14c7a338aa2fe07a52532cded001a9ad79d2b..3adfe79bdefedf0350782e81c287f4108ea4be19 100644 (file)
@@ -139,6 +139,7 @@ import "AccessibleApplication.idl";
 #include "IWebView.idl"
 #include "IWebViewPrivate.idl"
 #include "IWebWorkersPrivate.idl"
+#include "WebKitMessageLoop.idl"
 
 #define __TYPELIB_VERSION__ __BUILD_NUMBER_MAJOR__##.##__BUILD_NUMBER_MINOR__
 
@@ -300,4 +301,9 @@ library WebKit
     coclass WebSecurityOrigin {
         [default] interface IWebSecurityOrigin;
     };
+
+    [uuid(21799291-0067-4593-993E-467877FDA58B)]
+    coclass WebKitMessageLoop {
+        [default] interface IWebKitMessageLoop;
+    };
 }
diff --git a/Source/WebKit/win/Interfaces/WebKitMessageLoop.idl b/Source/WebKit/win/Interfaces/WebKitMessageLoop.idl
new file mode 100644 (file)
index 0000000..df3b2a4
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 Apple Inc.  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 DO_NO_IMPORTS
+import "oaidl.idl";
+import "ocidl.idl";
+#endif
+
+[
+    object,
+    oleautomation,
+    uuid(72457E23-F464-4308-931D-539E844DF9C5),
+    pointer_default(unique)
+]
+
+interface IWebKitMessageLoop : IUnknown
+{
+    /*!
+    @method run
+    @abstract Runs the WebKit message loop, and performs required WebKit tasks in the message loop.
+    The host can implement its own message loop, but then it needs to call the performMessageLoopTasks() method
+    for each iteration in its message loop.
+    @param hAccelTable A handle to the keyboard accelerator table for the application.
+    */
+
+    HRESULT run(HACCEL hAccelTable);
+
+    /*!
+    @method performMessageLoopTasks
+    @abstract Performs required message loop WebKit tasks.
+    This method needs to be called from the host message loop, if the host does not use the run() method.
+    */
+
+    HRESULT performMessageLoopTasks();
+}
index afdd0cdbb5d97942bd17628c3b746af4f2d46330..30bc82336bbd6bc03167d227b4da3e68c5b6082e 100644 (file)
@@ -42,6 +42,7 @@
 #include "WebIconDatabase.h"
 #include "WebJavaScriptCollector.h"
 #include "WebKit.h"
+#include "WebKitMessageLoop.h"
 #include "WebKitStatistics.h"
 #include "WebMutableURLRequest.h"
 #include "WebNotificationCenter.h"
diff --git a/Source/WebKit/win/WebKitMessageLoop.cpp b/Source/WebKit/win/WebKitMessageLoop.cpp
new file mode 100644 (file)
index 0000000..e4b8bc5
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+* Copyright (C) 2015 Apple Inc.  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.
+*/
+
+#include "config.h"
+#include "WebKitMessageLoop.h"
+
+#include "WebKitDLL.h"
+
+#if USE(GLIB)
+#include <glib.h>
+#endif
+
+WebKitMessageLoop::WebKitMessageLoop()
+    : m_refCount(0)
+{
+    gClassCount++;
+    gClassNameCount().add("WebKitMessageLoop");
+}
+
+WebKitMessageLoop::~WebKitMessageLoop()
+{
+    gClassCount--;
+    gClassNameCount().remove("WebKitMessageLoop");
+}
+
+WebKitMessageLoop* WebKitMessageLoop::createInstance()
+{
+    WebKitMessageLoop* instance = new WebKitMessageLoop();
+    instance->AddRef();
+    return instance;
+}
+
+HRESULT WebKitMessageLoop::QueryInterface(REFIID riid, void** ppvObject)
+{
+    *ppvObject = 0;
+    if (IsEqualGUID(riid, IID_IUnknown))
+        *ppvObject = static_cast<IWebKitMessageLoop*>(this);
+    else if (IsEqualGUID(riid, CLSID_WebKitMessageLoop))
+        *ppvObject = static_cast<WebKitMessageLoop*>(this);
+    else if (IsEqualGUID(riid, IID_IWebKitMessageLoop))
+        *ppvObject = static_cast<IWebKitMessageLoop*>(this);
+    else
+        return E_NOINTERFACE;
+
+    AddRef();
+    return S_OK;
+}
+
+ULONG WebKitMessageLoop::AddRef()
+{
+    return ++m_refCount;
+}
+
+ULONG WebKitMessageLoop::Release()
+{
+    ULONG newRef = --m_refCount;
+    if (!newRef)
+        delete(this);
+
+    return newRef;
+}
+
+HRESULT WebKitMessageLoop::run(HACCEL hAccelTable)
+{
+    MSG msg = { 0 };
+
+    while (GetMessage(&msg, 0, 0, 0)) {
+        performMessageLoopTasks();
+
+        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
+            TranslateMessage(&msg);
+            DispatchMessage(&msg);
+        }
+    }
+    return S_OK;
+}
+
+HRESULT WebKitMessageLoop::performMessageLoopTasks()
+{
+#if USE(CF)
+    CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true);
+#endif
+#if USE(GLIB)
+    g_main_context_iteration(0, false);
+#endif
+    return S_OK;
+}
+
diff --git a/Source/WebKit/win/WebKitMessageLoop.h b/Source/WebKit/win/WebKitMessageLoop.h
new file mode 100644 (file)
index 0000000..848e6af
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2015 Apple Inc.  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 WebKitMessageLoop_h
+#define WebKitMessageLoop_h
+
+#include "WebKit.h"
+
+class WebKitMessageLoop : public IWebKitMessageLoop {
+public:
+    WebKitMessageLoop();
+    ~WebKitMessageLoop();
+
+    static WebKitMessageLoop* createInstance();
+
+    // IUnknown
+    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) override;
+    virtual ULONG STDMETHODCALLTYPE AddRef() override;
+    virtual ULONG STDMETHODCALLTYPE Release() override;
+
+    // IWebKitMessageLoop
+    virtual HRESULT STDMETHODCALLTYPE run(HACCEL hAccelTable) override;
+    virtual HRESULT STDMETHODCALLTYPE performMessageLoopTasks() override;
+
+private:
+    ULONG m_refCount;
+};
+
+#endif
index 78f3f3703f9ccc4d6c92b5af91c4f5a33c1de9a8..d4c5b991059190aa13c518423b26717396f08c47 100644 (file)
@@ -1,3 +1,17 @@
+2015-01-25  peavo@outlook.com  <peavo@outlook.com>
+
+        [Win] Add WebKit message loop interface.
+        https://bugs.webkit.org/show_bug.cgi?id=140857
+
+        Reviewed by Brent Fulgham.
+
+        Added message loop interface which will run the message loop,
+        and perform required tasks (like calling CFRunLoopRunInMode)
+        on each iteration of the loop.
+
+        * WinLauncher/WinMain.cpp:
+        (wWinMain): Use new message loop interface.
+
 2015-01-24  Dan Bernstein  <mitz@apple.com>
 
         update-webkit’s --internal option is unused
index 4b56c5181e567459e928cbd9ec601ffa7f7c0809..fe2d6b38a24842bf55c2381f9c56bbcb220332fa 100644 (file)
 #include "WinLauncherWebHost.h"
 #include "Common.cpp"
 
-#if USE(GLIB)
-#include <glib.h>
-#endif
-
 int WINAPI wWinMain(HINSTANCE, HINSTANCE, PWSTR, int nCmdShow)
 {
 #ifdef _CRTDBG_MAP_ALLOC
@@ -161,18 +157,14 @@ int WINAPI wWinMain(HINSTANCE, HINSTANCE, PWSTR, int nCmdShow)
 
     // Main message loop:
     __try {
-        while (GetMessage(&msg, 0, 0, 0)) {
-#if USE(CF)
-            CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true);
-#endif
-            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
-                TranslateMessage(&msg);
-                DispatchMessage(&msg);
-            }
-#if USE(GLIB)
-            g_main_context_iteration(0, false);
-#endif
-        }
+        _com_ptr_t<_com_IIID<IWebKitMessageLoop, &__uuidof(IWebKitMessageLoop)>> messageLoop;
+
+        hr = WebKitCreateInstance(CLSID_WebKitMessageLoop, 0, IID_IWebKitMessageLoop, reinterpret_cast<void**>(&messageLoop.GetInterfacePtr()));
+        if (FAILED(hr))
+            goto exit;
+
+        messageLoop->run(hAccelTable);
+
     } __except(createCrashReport(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) { }
 
 exit: