[GTK] Add support for GTK3 plugins
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 31 Mar 2014 10:39:09 +0000 (10:39 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 31 Mar 2014 10:39:09 +0000 (10:39 +0000)
https://bugs.webkit.org/show_bug.cgi?id=130599

Reviewed by Martin Robinson.

.:

* Source/cmake/OptionsGTK.cmake:

Source/WebKit2:

We currently have a gtk2 based plugin process mainly for flash
and a few other plugins that use GTK2, but many other plugins
don't even use gtk at all. This patch builds a lighter plugin
process based on GTK3, used by default for all the plugins expect
the ones requiring GTK2. And of course the default plugin process
supports GTK3 plugins.

* CMakeLists.txt: Add common rules to build the default plugin process.
* PlatformEfl.cmake: Remove common cmake code that is now in CMakeLists.txt.
* PlatformGTK.cmake: Rename WebKitPluginProcess to
WebKitPluginProcess2 and add the platform specific rules to build
the default plugin process.
* Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp:
(WebKit::NetscapePluginModule::getPluginInfoForLoadedPlugin):
Check if the loaded plugin module uses GTK2.
(WebKit::NetscapePluginModule::getPluginInfo): Set requiresGtk2 accordingly.
(WebKit::NetscapePluginModule::scanPlugin): Write "requires-gtk2"
line to stdout if the plugin requires GTK2.
* Shared/Plugins/PluginModuleInfo.h: Add requiresGtk2 boolean member.
* UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp:
(WebKit::ProcessLauncher::launchProcess): Use the
WebKitPluginProcess2 executable when the plugin requires GTK2.
* UIProcess/Plugins/PluginProcessProxy.h: Add requiresGtk2 boolean
member to RawPluginMetaData struct.
* UIProcess/Plugins/gtk/PluginInfoCache.cpp: Bump the cache schema version.
(WebKit::PluginInfoCache::getPluginInfo): Read also requires-gtk2
key from the cache.
(WebKit::PluginInfoCache::updatePluginInfo): Save also
requires-gtk2 key in the cache.
* UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp:
(WebKit::PluginProcessProxy::platformGetLaunchOptions): Add an
extra initialization data parameter if the plugin requires GTK2.
(WebKit::PluginProcessProxy::scanPlugin): Check if "requires-gtk2"
was written to stdout.

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

12 files changed:
ChangeLog
Source/WebKit2/CMakeLists.txt
Source/WebKit2/ChangeLog
Source/WebKit2/PlatformEfl.cmake
Source/WebKit2/PlatformGTK.cmake
Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp
Source/WebKit2/Shared/Plugins/PluginModuleInfo.h
Source/WebKit2/UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp
Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.h
Source/WebKit2/UIProcess/Plugins/gtk/PluginInfoCache.cpp
Source/WebKit2/UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp
Source/cmake/OptionsGTK.cmake

index 38c5351..7605597 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2014-03-31  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Add support for GTK3 plugins
+        https://bugs.webkit.org/show_bug.cgi?id=130599
+
+        Reviewed by Martin Robinson.
+
+        * Source/cmake/OptionsGTK.cmake:
+
 2014-03-28  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
 
         [EFL] Bump glib version from 2.36 to 2.38 
index bed5850..bbbe46b 100644 (file)
@@ -661,6 +661,10 @@ set(WebKit2_LIBRARIES
     WebCore
 )
 
+set(PluginProcess_LIBRARIES
+    WebKit2
+)
+
 # librt is needed for shm_open on Linux.
 find_library(LIBRT_LIBRARIES NAMES rt)
 mark_as_advanced(LIBRT_LIBRARIES)
@@ -718,6 +722,19 @@ if (ENABLE_NETWORK_PROCESS)
     endif ()
 endif ()
 
+if (ENABLE_PLUGIN_PROCESS)
+    add_definitions(-DENABLE_PLUGIN_PROCESS=1)
+    add_executable(PluginProcess ${PluginProcess_SOURCES})
+    add_webkit2_prefix_header(PluginProcess)
+    target_link_libraries(PluginProcess ${PluginProcess_LIBRARIES})
+    set_target_properties(PluginProcess PROPERTIES FOLDER "WebKit")
+    install(TARGETS PluginProcess DESTINATION "${LIBEXEC_INSTALL_DIR}")
+
+    if (WebKit2_PluginProcess_OUTPUT_NAME)
+      set_target_properties(PluginProcess PROPERTIES OUTPUT_NAME ${WebKit2_PluginProcess_OUTPUT_NAME})
+    endif ()
+endif ()
+
 POPULATE_LIBRARY_VERSION(WEBKIT2)
 set_target_properties(WebKit2 PROPERTIES VERSION ${WEBKIT2_VERSION} SOVERSION ${WEBKIT2_VERSION_MAJOR})
 
index c48fde5..a07a9cd 100644 (file)
@@ -1,3 +1,45 @@
+2014-03-31  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Add support for GTK3 plugins
+        https://bugs.webkit.org/show_bug.cgi?id=130599
+
+        Reviewed by Martin Robinson.
+
+        We currently have a gtk2 based plugin process mainly for flash
+        and a few other plugins that use GTK2, but many other plugins
+        don't even use gtk at all. This patch builds a lighter plugin
+        process based on GTK3, used by default for all the plugins expect
+        the ones requiring GTK2. And of course the default plugin process
+        supports GTK3 plugins.
+
+        * CMakeLists.txt: Add common rules to build the default plugin process.
+        * PlatformEfl.cmake: Remove common cmake code that is now in CMakeLists.txt.
+        * PlatformGTK.cmake: Rename WebKitPluginProcess to
+        WebKitPluginProcess2 and add the platform specific rules to build
+        the default plugin process.
+        * Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp:
+        (WebKit::NetscapePluginModule::getPluginInfoForLoadedPlugin):
+        Check if the loaded plugin module uses GTK2.
+        (WebKit::NetscapePluginModule::getPluginInfo): Set requiresGtk2 accordingly.
+        (WebKit::NetscapePluginModule::scanPlugin): Write "requires-gtk2"
+        line to stdout if the plugin requires GTK2.
+        * Shared/Plugins/PluginModuleInfo.h: Add requiresGtk2 boolean member.
+        * UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp:
+        (WebKit::ProcessLauncher::launchProcess): Use the
+        WebKitPluginProcess2 executable when the plugin requires GTK2.
+        * UIProcess/Plugins/PluginProcessProxy.h: Add requiresGtk2 boolean
+        member to RawPluginMetaData struct.
+        * UIProcess/Plugins/gtk/PluginInfoCache.cpp: Bump the cache schema version.
+        (WebKit::PluginInfoCache::getPluginInfo): Read also requires-gtk2
+        key from the cache.
+        (WebKit::PluginInfoCache::updatePluginInfo): Save also
+        requires-gtk2 key in the cache.
+        * UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp:
+        (WebKit::PluginProcessProxy::platformGetLaunchOptions): Add an
+        extra initialization data parameter if the plugin requires GTK2.
+        (WebKit::PluginProcessProxy::scanPlugin): Check if "requires-gtk2"
+        was written to stdout.
+
 2014-03-30  Andy Estes  <aestes@apple.com>
 
         [Cocoa] Add an originatingWebView property to _WKDownload
index 5fcd26f..53e9fda 100644 (file)
@@ -402,8 +402,6 @@ install(FILES
 install(FILES ${EWebKit2_HEADERS} DESTINATION include/${WebKit2_OUTPUT_NAME}-${PROJECT_VERSION_MAJOR})
 
 if (ENABLE_PLUGIN_PROCESS)
-    add_definitions(-DENABLE_PLUGIN_PROCESS=1)
-
     list(APPEND PluginProcess_INCLUDE_DIRECTORIES
         "${WEBKIT2_DIR}/PluginProcess/unix"
     )
@@ -414,19 +412,11 @@ if (ENABLE_PLUGIN_PROCESS)
         ${WEBKIT2_DIR}/unix/PluginMainUnix.cpp
     )
 
-    set(PluginProcess_LIBRARIES
-        WebKit2
-    )
-
     if (ENABLE_ECORE_X)
         list(APPEND PluginProcess_LIBRARIES
             ${ECORE_X_LIBRARIES}
         )
     endif ()
-
-    add_executable(PluginProcess ${PluginProcess_SOURCES})
-    target_link_libraries(PluginProcess ${PluginProcess_LIBRARIES})
-    install(TARGETS PluginProcess DESTINATION "${EXEC_INSTALL_DIR}")
 endif () # ENABLE_PLUGIN_PROCESS
 
 include_directories(${THIRDPARTY_DIR}/gtest/include)
index 6540755..4588271 100644 (file)
@@ -520,16 +520,16 @@ set(WEBKIT2_EXTRA_DEPENDENCIES
 )
 
 if (ENABLE_PLUGIN_PROCESS)
-    set(PluginProcess_EXECUTABLE_NAME WebKitPluginProcess)
-    list(APPEND PluginProcess_INCLUDE_DIRECTORIES
+    set(PluginProcessGTK2_EXECUTABLE_NAME WebKitPluginProcessGTK2)
+    list(APPEND PluginProcessGTK2_INCLUDE_DIRECTORIES
         "${WEBKIT2_DIR}/PluginProcess/unix"
     )
 
-    include_directories(${PluginProcess_INCLUDE_DIRECTORIES})
+    include_directories(${PluginProcessGTK2_INCLUDE_DIRECTORIES})
 
     # FIXME: We should figure out a way to avoid compiling files that are common between the plugin
     # process and WebKit2 only once instead of recompiling them for the plugin process.
-    list(APPEND PluginProcess_SOURCES
+    list(APPEND PluginProcessGTK2_SOURCES
         Platform/Logging.cpp
         Platform/Module.cpp
         Platform/WorkQueue.cpp
@@ -618,30 +618,26 @@ if (ENABLE_PLUGIN_PROCESS)
         WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp
 
         unix/PluginMainUnix.cpp
-    )
 
-    list(APPEND PluginProcess_MESSAGES_IN_FILES
-        PluginProcess/PluginControllerProxy.messages.in
-        PluginProcess/PluginProcess.messages.in
-        PluginProcess/WebProcessConnection.messages.in
+        ${DERIVED_SOURCES_WEBKIT2_DIR}/PluginControllerProxyMessageReceiver.cpp
+        ${DERIVED_SOURCES_WEBKIT2_DIR}/PluginProcessMessageReceiver.cpp
+        ${DERIVED_SOURCES_WEBKIT2_DIR}/WebProcessConnectionMessageReceiver.cpp
 
-        Shared/Plugins/NPObjectMessageReceiver.messages.in
+        ${DERIVED_SOURCES_WEBKIT2_DIR}/NPObjectMessageReceiverMessageReceiver.cpp
     )
-    GENERATE_WEBKIT2_MESSAGE_SOURCES(PluginProcess_SOURCES "${PluginProcess_MESSAGES_IN_FILES}")
 
-    add_executable(WebKitPluginProcess ${PluginProcess_SOURCES})
-    add_webkit2_prefix_header(WebKitPluginProcess)
+    add_executable(WebKitPluginProcessGTK2 ${PluginProcessGTK2_SOURCES})
+    add_webkit2_prefix_header(WebKitPluginProcessGTK2)
 
     # We need ENABLE_PLUGIN_PROCESS for all targets in this directory, but
     # we only want GTK_API_VERSION_2 for the plugin process target.
-    add_definitions(-DENABLE_PLUGIN_PROCESS=1)
     set_property(
-        TARGET WebKitPluginProcess
+        TARGET WebKitPluginProcessGTK2
         APPEND
         PROPERTY COMPILE_DEFINITIONS GTK_API_VERSION_2=1
     )
     set_property(
-        TARGET WebKitPluginProcess
+        TARGET WebKitPluginProcessGTK2
         APPEND
         PROPERTY INCLUDE_DIRECTORIES
             ${WebKit2CommonIncludeDirectories}
@@ -649,16 +645,22 @@ if (ENABLE_PLUGIN_PROCESS)
             ${GDK2_INCLUDE_DIRS}
     )
 
-    set(WebKitPluginProcess_LIBRARIES
+    set(WebKitPluginProcessGTK2_LIBRARIES
         ${SharedWebKit2Libraries}
         WebCorePlatformGTK2
     )
-    ADD_WHOLE_ARCHIVE_TO_LIBRARIES(WebKitPluginProcess_LIBRARIES)
-    target_link_libraries(WebKitPluginProcess ${WebKitPluginProcess_LIBRARIES})
+    ADD_WHOLE_ARCHIVE_TO_LIBRARIES(WebKitPluginProcessGTK2_LIBRARIES)
+    target_link_libraries(WebKitPluginProcessGTK2 ${WebKitPluginProcessGTK2_LIBRARIES})
+
+    add_dependencies(WebKitPluginProcessGTK2 WebKit2)
+
+    install(TARGETS WebKitPluginProcessGTK2 DESTINATION "${LIBEXEC_INSTALL_DIR}")
 
-    add_dependencies(WebKitPluginProcess WebKit2)
+    # GTK3 PluginProcess
+    list(APPEND PluginProcess_SOURCES
+        unix/PluginMainUnix.cpp
+    )
 
-    install(TARGETS WebKitPluginProcess DESTINATION "${LIBEXEC_INSTALL_DIR}")
 endif () # ENABLE_PLUGIN_PROCESS
 
 # Commands for building the built-in injected bundle.
index 6d3405a..1e430ec 100644 (file)
@@ -149,6 +149,10 @@ bool NetscapePluginModule::getPluginInfoForLoadedPlugin(RawPluginMetaData& metaD
 
     metaData.mimeDescription = mimeDescription;
 
+#if PLATFORM(GTK)
+    metaData.requiresGtk2 = module->functionPointer<void (*)()>("gtk_progress_get_type");
+#endif
+
     return true;
 }
 
@@ -163,6 +167,9 @@ bool NetscapePluginModule::getPluginInfo(const String& pluginPath, PluginModuleI
     plugin.info.name = metaData.name;
     plugin.info.desc = metaData.description;
     parseMIMEDescription(metaData.mimeDescription, plugin.info.mimes);
+#if PLATFORM(GTK)
+    plugin.requiresGtk2 = metaData.requiresGtk2;
+#endif
 
     return true;
 }
@@ -235,6 +242,10 @@ bool NetscapePluginModule::scanPlugin(const String& pluginPath)
     writeLine(metaData.name);
     writeLine(metaData.description);
     writeLine(metaData.mimeDescription);
+#if PLATFORM(GTK)
+    if (metaData.requiresGtk2)
+        writeLine("requires-gtk2");
+#endif
 
     fflush(stdout);
 
index 6232b51..2b8bd3b 100644 (file)
@@ -56,6 +56,8 @@ struct PluginModuleInfo {
     String versionString;
     String shortVersionString;
     String preferencePanePath;
+#elif PLATFORM(GTK)
+    bool requiresGtk2;
 #endif
 };
 
index 554ee21..1c9fa05 100644 (file)
@@ -81,6 +81,8 @@ void ProcessLauncher::launchProcess()
         break;
     case PluginProcess:
         executablePath = executablePathOfPluginProcess();
+        if (m_launchOptions.extraInitializationData.contains("requires-gtk2"))
+            executablePath.append('2');
         pluginPath = m_launchOptions.extraInitializationData.get("plugin-path");
         realPluginPath = fileSystemRepresentation(pluginPath);
         break;
index bb6ebfd..4a82ecd 100644 (file)
@@ -60,6 +60,10 @@ struct RawPluginMetaData {
     String name;
     String description;
     String mimeDescription;
+
+#if PLATFORM(GTK)
+    bool requiresGtk2;
+#endif
 };
 #endif
 
index 0b3bed9..7308a3b 100644 (file)
@@ -34,7 +34,7 @@
 
 namespace WebKit {
 
-static const unsigned gSchemaVersion = 1;
+static const unsigned gSchemaVersion = 2;
 
 PluginInfoCache& PluginInfoCache::shared()
 {
@@ -115,6 +115,8 @@ bool PluginInfoCache::getPluginInfo(const String& pluginPath, PluginModuleInfo&
     NetscapePluginModule::parseMIMEDescription(String::fromUTF8(stringValue.get()), plugin.info.mimes);
 #endif
 
+    plugin.requiresGtk2 = g_key_file_get_boolean(m_cacheFile.get(), pluginGroup.data(), "requires-gtk2", nullptr);
+
     return true;
 }
 
@@ -134,6 +136,8 @@ void PluginInfoCache::updatePluginInfo(const String& pluginPath, const PluginMod
     g_key_file_set_string(m_cacheFile.get(), pluginGroup.data(), "mime-description", mimeDescription.utf8().data());
 #endif
 
+    g_key_file_set_boolean(m_cacheFile.get(), pluginGroup.data(), "requires-gtk2", plugin.requiresGtk2);
+
     // Save the cache file in an idle to make sure it happens in the main thread and
     // it's done only once when this is called multiple times in a very short time.
     std::lock_guard<std::mutex> lock(m_mutex);
index 78152e4..91ec00c 100644 (file)
@@ -55,6 +55,10 @@ void PluginProcessProxy::platformGetLaunchOptions(ProcessLauncher::LaunchOptions
 #endif
 
     launchOptions.extraInitializationData.add("plugin-path", pluginProcessAttributes.moduleInfo.path);
+#if PLATFORM(GTK)
+    if (pluginProcessAttributes.moduleInfo.requiresGtk2)
+        launchOptions.extraInitializationData.add("requires-gtk2", emptyString());
+#endif
 }
 
 void PluginProcessProxy::platformInitializePluginProcess(PluginProcessCreationParameters&)
@@ -107,6 +111,10 @@ bool PluginProcessProxy::scanPlugin(const String& pluginPath, RawPluginMetaData&
     result.name.swap(lines[0]);
     result.description.swap(lines[1]);
     result.mimeDescription.swap(lines[2]);
+#if PLATFORM(GTK)
+    if (lines.size() > 3)
+        result.requiresGtk2 = lines[3] == "requires-gtk2";
+#endif
     return !result.mimeDescription.isEmpty();
 #else // PLATFORM(GTK) || PLATFORM(EFL)
     return false;
index fda1d60..7f96b00 100644 (file)
@@ -134,6 +134,7 @@ set(WebKit_OUTPUT_NAME webkitgtk-${WEBKITGTK_API_VERSION})
 set(WebKit2_OUTPUT_NAME webkit2gtk-${WEBKITGTK_API_VERSION})
 set(WebKit2_WebProcess_OUTPUT_NAME WebKitWebProcess)
 set(WebKit2_NetworkProcess_OUTPUT_NAME WebKitNetworkProcess)
+set(WebKit2_PluginProcess_OUTPUT_NAME WebKitPluginProcess)
 
 set(DATA_BUILD_DIR "${CMAKE_BINARY_DIR}/share/${WebKit_OUTPUT_NAME}")
 set(DATA_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/webkitgtk-${WEBKITGTK_API_VERSION}")