File webkit2gtk3-restore-npapi.patch of Package webkit2gtk3.20995
diff -urpN webkitgtk-2.32.0.orig/Source/cmake/OptionsGTK.cmake webkitgtk-2.32.0/Source/cmake/OptionsGTK.cmake
--- webkitgtk-2.32.0.orig/Source/cmake/OptionsGTK.cmake 2021-03-26 05:46:47.000000000 -0500
+++ webkitgtk-2.32.0/Source/cmake/OptionsGTK.cmake 2021-04-12 12:00:15.993985254 -0500
@@ -155,7 +155,6 @@ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_MEDIA_STREAM PRIVATE ${ENABLE_EXPERIMENTAL_FEATURES})
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_MHTML PRIVATE ON)
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_MOUSE_CURSOR_SCALE PRIVATE ON)
-WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_NETSCAPE_PLUGIN_API PRIVATE OFF)
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION PRIVATE ON)
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE PRIVATE ON)
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_OFFSCREEN_CANVAS PRIVATE ${ENABLE_EXPERIMENTAL_FEATURES})
@@ -168,6 +167,10 @@ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEB_API_STATISTICS PRIVATE ON)
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEB_RTC PRIVATE ${ENABLE_EXPERIMENTAL_FEATURES})
+if (USE_GTK4)
+WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_NETSCAPE_PLUGIN_API PRIVATE OFF)
+endif ()
+
include(GStreamerDependencies)
# Finalize the value for all options. Do not attempt to use an option before
@@ -239,7 +242,16 @@ SET_AND_EXPOSE_TO_BUILD(WTF_PLATFORM_QUA
SET_AND_EXPOSE_TO_BUILD(WTF_PLATFORM_X11 ${ENABLE_X11_TARGET})
SET_AND_EXPOSE_TO_BUILD(WTF_PLATFORM_WAYLAND ${ENABLE_WAYLAND_TARGET})
-SET_AND_EXPOSE_TO_BUILD(ENABLE_PLUGIN_PROCESS FALSE)
+if (ENABLE_NETSCAPE_PLUGIN_API)
+ # MOZ_X11 and XP_UNIX are required by npapi.h. Their value is not checked;
+ # only their definedness is. They should only be defined in the true case.
+ if (ENABLE_X11_TARGET)
+ SET_AND_EXPOSE_TO_BUILD(MOZ_X11 1)
+ endif ()
+ SET_AND_EXPOSE_TO_BUILD(XP_UNIX 1)
+endif ()
+
+SET_AND_EXPOSE_TO_BUILD(ENABLE_PLUGIN_PROCESS ${ENABLE_NETSCAPE_PLUGIN_API})
add_definitions(-DBUILDING_GTK__=1)
add_definitions(-DGETTEXT_PACKAGE="WebKit2GTK-${WEBKITGTK_API_VERSION}")
diff -urpN webkitgtk-2.32.0.orig/Source/WebCore/page/Frame.cpp webkitgtk-2.32.0/Source/WebCore/page/Frame.cpp
--- webkitgtk-2.32.0.orig/Source/WebCore/page/Frame.cpp 2021-02-26 03:57:12.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebCore/page/Frame.cpp 2021-04-16 08:53:07.550058414 -0500
@@ -1149,7 +1149,7 @@ TextStream& operator<<(TextStream& ts, c
return ts;
}
-bool Frame::arePluginsEnabled()
+bool Frame::arePluginsEnabled() const
{
return settings().arePluginsEnabled();
}
diff -urpN webkitgtk-2.32.0.orig/Source/WebCore/page/Frame.h webkitgtk-2.32.0/Source/WebCore/page/Frame.h
--- webkitgtk-2.32.0.orig/Source/WebCore/page/Frame.h 2021-02-26 03:57:12.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebCore/page/Frame.h 2021-04-16 08:52:33.517876451 -0500
@@ -317,7 +317,7 @@ public:
void selfOnlyRef();
void selfOnlyDeref();
- WEBCORE_EXPORT bool arePluginsEnabled();
+ WEBCORE_EXPORT bool arePluginsEnabled() const;
private:
friend class NavigationDisabler;
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/CMakeLists.txt webkitgtk-2.32.0/Source/WebKit/CMakeLists.txt
--- webkitgtk-2.32.0.orig/Source/WebKit/CMakeLists.txt 2021-03-25 08:27:32.000000000 -0500
+++ webkitgtk-2.32.0/Source/WebKit/CMakeLists.txt 2021-06-01 19:58:38.800862389 -0500
@@ -593,7 +593,7 @@ else ()
set_target_properties(WebKit PROPERTIES VERSION ${WEBKIT_VERSION} SOVERSION ${WEBKIT_VERSION_MAJOR})
- install(TARGETS WebKit WebProcess NetworkProcess
+ install(TARGETS WebKit WebProcess NetworkProcess PluginProcess
LIBRARY DESTINATION "${LIB_INSTALL_DIR}"
RUNTIME DESTINATION "${LIBEXEC_INSTALL_DIR}"
)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/Platform/SharedMemory.h webkitgtk-2.32.0/Source/WebKit/Platform/SharedMemory.h
--- webkitgtk-2.32.0.orig/Source/WebKit/Platform/SharedMemory.h 2021-02-26 03:57:15.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/Platform/SharedMemory.h 2021-04-13 16:17:02.076660006 -0500
@@ -56,6 +56,7 @@ class MachSendRight;
namespace WebKit {
+#undef None
enum class MemoryLedger { None, Default, Network, Media, Graphics, Neural };
class SharedMemory : public ThreadSafeRefCounted<SharedMemory> {
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/PlatformGTK.cmake webkitgtk-2.32.0/Source/WebKit/PlatformGTK.cmake
--- webkitgtk-2.32.0.orig/Source/WebKit/PlatformGTK.cmake 2021-03-12 04:23:40.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/PlatformGTK.cmake 2021-04-12 12:04:10.131221436 -0500
@@ -4,6 +4,7 @@ set(WebKit_OUTPUT_NAME webkit2gtk-${WEBK
set(WebProcess_OUTPUT_NAME WebKitWebProcess)
set(NetworkProcess_OUTPUT_NAME WebKitNetworkProcess)
set(GPUProcess_OUTPUT_NAME WebKitGPUProcess)
+set(PluginProcess_OUTPUT_NAME WebKitPluginProcess)
file(MAKE_DIRECTORY ${DERIVED_SOURCES_WEBKIT2GTK_API_DIR})
file(MAKE_DIRECTORY ${FORWARDING_HEADERS_WEBKIT2GTK_DIR})
@@ -420,6 +421,7 @@ list(APPEND WebKit_INCLUDE_DIRECTORIES
"${WEBKIT_DIR}/Shared/API/glib"
"${WEBKIT_DIR}/Shared/CoordinatedGraphics"
"${WEBKIT_DIR}/Shared/CoordinatedGraphics/threadedcompositor"
+ "${WEBKIT_DIR}/Shared/Plugins/unix"
"${WEBKIT_DIR}/Shared/glib"
"${WEBKIT_DIR}/Shared/gtk"
"${WEBKIT_DIR}/Shared/linux"
@@ -432,6 +434,9 @@ list(APPEND WebKit_INCLUDE_DIRECTORIES
"${WEBKIT_DIR}/UIProcess/CoordinatedGraphics"
"${WEBKIT_DIR}/UIProcess/Inspector/glib"
"${WEBKIT_DIR}/UIProcess/Inspector/gtk"
+ "${WEBKIT_DIR}/WebProcess/Plugins/Netscape/unix"
+ "${WEBKIT_DIR}/WebProcess/Plugins/Netscape/x11"
+ "${WEBKIT_DIR}/UIProcess/Plugins/gtk"
"${WEBKIT_DIR}/UIProcess/geoclue"
"${WEBKIT_DIR}/UIProcess/glib"
"${WEBKIT_DIR}/UIProcess/gstreamer"
@@ -617,6 +622,11 @@ if (ENABLE_WAYLAND_TARGET)
)
endif ()
+# GTK3 PluginProcess
+list(APPEND PluginProcess_SOURCES
+ PluginProcess/EntryPoint/unix/PluginProcessMain.cpp
+)
+
# Commands for building the built-in injected bundle.
add_library(webkit2gtkinjectedbundle MODULE "${WEBKIT_DIR}/WebProcess/InjectedBundle/API/glib/WebKitInjectedBundleMain.cpp")
ADD_WEBKIT_PREFIX_HEADER(webkit2gtkinjectedbundle)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/PluginProcess/unix/PluginControllerProxyUnix.cpp webkitgtk-2.32.0/Source/WebKit/PluginProcess/unix/PluginControllerProxyUnix.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/PluginProcess/unix/PluginControllerProxyUnix.cpp 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/PluginProcess/unix/PluginControllerProxyUnix.cpp 2021-04-12 12:00:15.985985211 -0500
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2011 Igalia S.L.
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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 "PluginControllerProxy.h"
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+
+#include <WebCore/NotImplemented.h>
+
+namespace WebKit {
+using namespace WebCore;
+
+void PluginControllerProxy::platformInitialize(const PluginCreationParameters&)
+{
+ notImplemented();
+}
+
+void PluginControllerProxy::platformDestroy()
+{
+ notImplemented();
+}
+
+void PluginControllerProxy::platformGeometryDidChange()
+{
+ notImplemented();
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(NETSCAPE_PLUGIN_API)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/PluginProcess/unix/PluginProcessMainUnix.cpp webkitgtk-2.32.0/Source/WebKit/PluginProcess/unix/PluginProcessMainUnix.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/PluginProcess/unix/PluginProcessMainUnix.cpp 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/PluginProcess/unix/PluginProcessMainUnix.cpp 2021-04-15 15:26:20.109500739 -0500
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2011, 2014 Igalia S.L.
+ * Copyright (C) 2011 Apple Inc.
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``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 THE COPYRIGHT OWNER 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 "PluginProcessMain.h"
+
+#if ENABLE(PLUGIN_PROCESS)
+
+#include "AuxiliaryProcessMain.h"
+#include "Logging.h"
+#include "NetscapePlugin.h"
+#include "PluginProcess.h"
+#include <stdlib.h>
+#include <wtf/FileSystem.h>
+
+#if PLATFORM(GTK)
+#include <gtk/gtk.h>
+#endif
+
+#if PLATFORM(X11)
+#include <WebCore/PlatformDisplayX11.h>
+#include <WebCore/XErrorTrapper.h>
+#include <wtf/NeverDestroyed.h>
+#endif
+
+namespace WebKit {
+
+#if PLATFORM(X11)
+static LazyNeverDestroyed<WebCore::XErrorTrapper> xErrorTrapper;
+#endif
+
+class PluginProcessMainUnix final: public AuxiliaryProcessMainBase<PluginProcess> {
+public:
+ bool platformInitialize() override
+ {
+#if PLATFORM(GTK)
+ gtk_init(nullptr, nullptr);
+#endif
+
+ return true;
+ }
+
+ bool parseCommandLine(int argc, char** argv) override
+ {
+ ASSERT(argc > 2);
+ if (argc < 3)
+ return false;
+
+ if (!strcmp(argv[1], "-scanPlugin")) {
+ ASSERT(argc == 3);
+#if PLUGIN_ARCHITECTURE(UNIX)
+ InitializeWebKit2();
+ exit(NetscapePluginModule::scanPlugin(argv[2]) ? EXIT_SUCCESS : EXIT_FAILURE);
+#else
+ exit(EXIT_FAILURE);
+#endif
+ }
+
+ ASSERT(argc == 4);
+#if PLATFORM(X11)
+ if (WebCore::PlatformDisplay::sharedDisplay().type() == WebCore::PlatformDisplay::Type::X11) {
+ auto* display = downcast<WebCore::PlatformDisplayX11>(WebCore::PlatformDisplay::sharedDisplay()).native();
+ xErrorTrapper.construct(display, WebCore::XErrorTrapper::Policy::Warn);
+ }
+#endif
+
+ m_parameters.extraInitializationData.add("plugin-path", argv[3]);
+ return AuxiliaryProcessMainBase::parseCommandLine(argc, argv);
+ }
+};
+
+int PluginProcessMain(int argc, char** argv)
+{
+ return AuxiliaryProcessMain<PluginProcessMainUnix>(argc, argv);
+}
+
+} // namespace WebKit
+
+#endif
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/PluginProcess/unix/PluginProcessUnix.cpp webkitgtk-2.32.0/Source/WebKit/PluginProcess/unix/PluginProcessUnix.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/PluginProcess/unix/PluginProcessUnix.cpp 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/PluginProcess/unix/PluginProcessUnix.cpp 2021-04-12 12:00:15.985985211 -0500
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2011 Igalia S.L.
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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 "PluginProcess.h"
+
+#if ENABLE(PLUGIN_PROCESS)
+
+#include "PluginProcessCreationParameters.h"
+#include <WebCore/NotImplemented.h>
+
+namespace WebKit {
+
+void PluginProcess::platformInitializeProcess(const AuxiliaryProcessInitializationParameters&)
+{
+}
+
+void PluginProcess::platformInitializePluginProcess(PluginProcessCreationParameters&&)
+{
+ notImplemented();
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(PLUGIN_PROCESS)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/Shared/AuxiliaryProcessMain.h webkitgtk-2.32.0/Source/WebKit/Shared/AuxiliaryProcessMain.h
--- webkitgtk-2.32.0.orig/Source/WebKit/Shared/AuxiliaryProcessMain.h 2021-02-26 03:57:15.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/Shared/AuxiliaryProcessMain.h 2021-04-14 14:22:55.723379965 -0500
@@ -36,7 +36,7 @@ namespace WebKit {
class AuxiliaryProcessMainCommon {
public:
- bool parseCommandLine(int argc, char** argv);
+ virtual bool parseCommandLine(int argc, char** argv);
protected:
AuxiliaryProcessInitializationParameters m_parameters;
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/Shared/Plugins/Netscape/unix/NetscapePluginModuleUnix.cpp webkitgtk-2.32.0/Source/WebKit/Shared/Plugins/Netscape/unix/NetscapePluginModuleUnix.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/Shared/Plugins/Netscape/unix/NetscapePluginModuleUnix.cpp 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/Shared/Plugins/Netscape/unix/NetscapePluginModuleUnix.cpp 2021-04-12 12:00:15.985985211 -0500
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2010 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. AND ITS CONTRIBUTORS ``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 ITS 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 "NetscapePluginModule.h"
+
+#if PLUGIN_ARCHITECTURE(UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
+
+#include "NetscapeBrowserFuncs.h"
+#include "PluginProcessProxy.h"
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <wtf/FileSystem.h>
+#include <wtf/text/StringBuilder.h>
+
+namespace WebKit {
+using namespace WebCore;
+
+class StdoutDevNullRedirector {
+public:
+ StdoutDevNullRedirector();
+ ~StdoutDevNullRedirector();
+
+private:
+ int m_savedStdout;
+};
+
+StdoutDevNullRedirector::StdoutDevNullRedirector()
+ : m_savedStdout(-1)
+{
+ int newStdout = open("/dev/null", O_WRONLY);
+ if (newStdout == -1)
+ return;
+ m_savedStdout = dup(STDOUT_FILENO);
+ dup2(newStdout, STDOUT_FILENO);
+ close(newStdout);
+}
+
+StdoutDevNullRedirector::~StdoutDevNullRedirector()
+{
+ if (m_savedStdout != -1) {
+ dup2(m_savedStdout, STDOUT_FILENO);
+ close(m_savedStdout);
+ }
+}
+
+
+void NetscapePluginModule::parseMIMEDescription(const String& mimeDescription, Vector<MimeClassInfo>& result)
+{
+ ASSERT_ARG(result, result.isEmpty());
+
+ Vector<String> types = mimeDescription.convertToASCIILowercase().split(';');
+ result.reserveInitialCapacity(types.size());
+
+ size_t mimeInfoCount = 0;
+ for (size_t i = 0; i < types.size(); ++i) {
+ Vector<String> mimeTypeParts = types[i].splitAllowingEmptyEntries(':');
+ if (mimeTypeParts.size() <= 0)
+ continue;
+
+ result.uncheckedAppend(MimeClassInfo());
+ MimeClassInfo& mimeInfo = result[mimeInfoCount++];
+ mimeInfo.type = mimeTypeParts[0];
+
+ if (mimeTypeParts.size() > 1)
+ mimeInfo.extensions = mimeTypeParts[1].split(',');
+
+ if (mimeTypeParts.size() > 2)
+ mimeInfo.desc = mimeTypeParts[2];
+ }
+}
+
+String NetscapePluginModule::buildMIMEDescription(const Vector<MimeClassInfo>& mimeDescription)
+{
+ StringBuilder builder;
+
+ size_t mimeInfoCount = mimeDescription.size();
+ for (size_t i = 0; i < mimeInfoCount; ++i) {
+ const MimeClassInfo& mimeInfo = mimeDescription[i];
+ builder.append(mimeInfo.type);
+ builder.append(':');
+
+ size_t extensionsCount = mimeInfo.extensions.size();
+ for (size_t j = 0; j < extensionsCount; ++j) {
+ builder.append(mimeInfo.extensions[j]);
+ if (j != extensionsCount - 1)
+ builder.append(',');
+ }
+ builder.append(':');
+
+ builder.append(mimeInfo.desc);
+ if (i != mimeInfoCount - 1)
+ builder.append(';');
+ }
+
+ return builder.toString();
+}
+
+bool NetscapePluginModule::getPluginInfoForLoadedPlugin(RawPluginMetaData& metaData)
+{
+ ASSERT(m_isInitialized);
+
+ Module* module = m_module.get();
+ NPP_GetValueProcPtr NPP_GetValue = module->functionPointer<NPP_GetValueProcPtr>("NP_GetValue");
+ if (!NPP_GetValue)
+ return false;
+
+ NP_GetMIMEDescriptionFuncPtr NP_GetMIMEDescription = module->functionPointer<NP_GetMIMEDescriptionFuncPtr>("NP_GetMIMEDescription");
+ if (!NP_GetMIMEDescription)
+ return false;
+
+ char* buffer;
+ NPError error = NPP_GetValue(0, NPPVpluginNameString, &buffer);
+ if (error == NPERR_NO_ERROR)
+ metaData.name = String::fromUTF8(buffer);
+
+ error = NPP_GetValue(0, NPPVpluginDescriptionString, &buffer);
+ if (error == NPERR_NO_ERROR)
+ metaData.description = String::fromUTF8(buffer);
+
+ String mimeDescription = String::fromUTF8(NP_GetMIMEDescription());
+ if (mimeDescription.isNull())
+ return false;
+
+ metaData.mimeDescription = mimeDescription;
+
+ return true;
+}
+
+bool NetscapePluginModule::getPluginInfo(const String& pluginPath, PluginModuleInfo& plugin)
+{
+ RawPluginMetaData metaData;
+ if (!PluginProcessProxy::scanPlugin(pluginPath, metaData))
+ return false;
+
+ plugin.path = pluginPath;
+ plugin.info.file = FileSystem::pathGetFileName(pluginPath);
+ plugin.info.name = metaData.name;
+ plugin.info.desc = metaData.description;
+ parseMIMEDescription(metaData.mimeDescription, plugin.info.mimes);
+
+ return true;
+}
+
+void NetscapePluginModule::determineQuirks()
+{
+ RawPluginMetaData metaData;
+ if (!getPluginInfoForLoadedPlugin(metaData))
+ return;
+
+ Vector<MimeClassInfo> mimeTypes;
+ parseMIMEDescription(metaData.mimeDescription, mimeTypes);
+
+#if PLATFORM(X11)
+ for (size_t i = 0; i < mimeTypes.size(); ++i) {
+ if (mimeTypes[i].type == "application/x-shockwave-flash") {
+#if CPU(X86_64)
+ m_pluginQuirks.add(PluginQuirks::IgnoreRightClickInWindowlessMode);
+#endif
+ m_pluginQuirks.add(PluginQuirks::DoNotCancelSrcStreamInWindowedMode);
+ break;
+ }
+ }
+#endif // PLATFORM(X11)
+}
+
+static void writeCharacter(char byte)
+{
+ int result;
+ while ((result = fputc(byte, stdout)) == EOF && errno == EINTR) { }
+ ASSERT(result != EOF);
+}
+
+static void writeLine(const String& line)
+{
+ CString utf8String = line.utf8();
+ const char* utf8Data = utf8String.data();
+
+ for (unsigned i = 0; i < utf8String.length(); i++) {
+ char character = utf8Data[i];
+ if (character != '\n')
+ writeCharacter(character);
+ }
+ writeCharacter('\n');
+}
+
+bool NetscapePluginModule::scanPlugin(const String& pluginPath)
+{
+ RawPluginMetaData metaData;
+
+ {
+ // Don't allow the plugin to pollute the standard output.
+ StdoutDevNullRedirector stdOutRedirector;
+
+ // We are loading the plugin here since it does not seem to be a standardized way to
+ // get the needed informations from a UNIX plugin without loading it.
+ RefPtr<NetscapePluginModule> pluginModule = NetscapePluginModule::getOrCreate(pluginPath);
+ if (!pluginModule)
+ return false;
+
+ pluginModule->incrementLoadCount();
+ bool success = pluginModule->getPluginInfoForLoadedPlugin(metaData);
+ pluginModule->decrementLoadCount();
+
+ if (!success)
+ return false;
+ }
+
+ // Write data to standard output for the UI process.
+ writeLine(metaData.name);
+ writeLine(metaData.description);
+ writeLine(metaData.mimeDescription);
+
+ fflush(stdout);
+
+ return true;
+}
+
+} // namespace WebKit
+
+#endif // PLUGIN_ARCHITECTURE(UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/Shared/Plugins/unix/PluginSearchPath.cpp webkitgtk-2.32.0/Source/WebKit/Shared/Plugins/unix/PluginSearchPath.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/Shared/Plugins/unix/PluginSearchPath.cpp 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/Shared/Plugins/unix/PluginSearchPath.cpp 2021-04-12 12:00:15.989985232 -0500
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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 "PluginSearchPath.h"
+
+#include <wtf/FileSystem.h>
+
+namespace WebKit {
+
+Vector<String> pluginsDirectories()
+{
+ Vector<String> result;
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ String mozillaPaths(getenv("MOZ_PLUGIN_PATH"));
+ if (!mozillaPaths.isEmpty()) {
+ Vector<String> paths = mozillaPaths.split(':');
+ result.appendVector(paths);
+ }
+
+ String mozillaHome(getenv("MOZILLA_HOME"));
+ if (!mozillaHome.isEmpty())
+ result.append(mozillaHome + "/plugins");
+
+ result.append(FileSystem::homeDirectoryPath() + "/.mozilla/plugins");
+ result.append(FileSystem::homeDirectoryPath() + "/.netscape/plugins");
+ result.append("/usr/lib/browser/plugins");
+ result.append("/usr/local/lib/mozilla/plugins");
+ result.append("/usr/lib/firefox/plugins");
+ result.append("/usr/lib64/browser-plugins");
+ result.append("/usr/lib/browser-plugins");
+ result.append("/usr/lib/mozilla/plugins");
+ result.append("/usr/local/netscape/plugins");
+ result.append("/opt/mozilla/plugins");
+ result.append("/opt/mozilla/lib/plugins");
+ result.append("/opt/netscape/plugins");
+ result.append("/opt/netscape/communicator/plugins");
+ result.append("/usr/lib/netscape/plugins");
+ result.append("/usr/lib/netscape/plugins-libc5");
+ result.append("/usr/lib/netscape/plugins-libc6");
+ result.append("/usr/lib64/netscape/plugins");
+ result.append("/usr/lib64/mozilla/plugins");
+ result.append("/usr/lib/nsbrowser/plugins");
+ result.append("/usr/lib64/nsbrowser/plugins");
+#endif
+
+ return result;
+}
+
+} // namespace WebKit
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/Shared/Plugins/unix/PluginSearchPath.h webkitgtk-2.32.0/Source/WebKit/Shared/Plugins/unix/PluginSearchPath.h
--- webkitgtk-2.32.0.orig/Source/WebKit/Shared/Plugins/unix/PluginSearchPath.h 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/Shared/Plugins/unix/PluginSearchPath.h 2021-04-12 12:00:15.989985232 -0500
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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 PluginSearchPath_h
+#define PluginSearchPath_h
+
+#include <wtf/Forward.h>
+#include <wtf/Vector.h>
+
+namespace WebKit {
+
+Vector<String> pluginsDirectories();
+
+} // namespace WebKit
+
+#endif // PluginSandboxProfile_h
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/SourcesGTK.txt webkitgtk-2.32.0/Source/WebKit/SourcesGTK.txt
--- webkitgtk-2.32.0.orig/Source/WebKit/SourcesGTK.txt 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/SourcesGTK.txt 2021-04-12 12:00:15.989985232 -0500
@@ -60,6 +60,10 @@ Platform/glib/ModuleGlib.cpp
Platform/unix/LoggingUnix.cpp
Platform/unix/SharedMemoryUnix.cpp
+PluginProcess/unix/PluginControllerProxyUnix.cpp
+PluginProcess/unix/PluginProcessMainUnix.cpp
+PluginProcess/unix/PluginProcessUnix.cpp
+
Shared/API/c/cairo/WKImageCairo.cpp
Shared/API/glib/WebKitContextMenu.cpp @no-unify
@@ -77,6 +81,11 @@ Shared/CoordinatedGraphics/threadedcompo
Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.cpp
Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp
+Shared/Plugins/Netscape/NetscapePluginModuleNone.cpp
+Shared/Plugins/Netscape/unix/NetscapePluginModuleUnix.cpp
+
+Shared/Plugins/unix/PluginSearchPath.cpp
+
Shared/cairo/ShareableBitmapCairo.cpp
Shared/glib/ArgumentCodersGLib.cpp
@@ -233,6 +242,11 @@ UIProcess/Launcher/glib/FlatpakLauncher.
UIProcess/linux/MemoryPressureMonitor.cpp
+UIProcess/Plugins/gtk/PluginInfoCache.cpp
+
+UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp
+UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp
+
UIProcess/WebsiteData/soup/WebsiteDataStoreSoup.cpp
UIProcess/WebsiteData/unix/WebsiteDataStoreUnix.cpp
@@ -404,6 +418,11 @@ WebProcess/Inspector/gtk/WebInspectorUIG
WebProcess/MediaCache/WebMediaKeyStorageManager.cpp
+WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp @no-unify
+WebProcess/Plugins/Netscape/unix/PluginProxyUnix.cpp @no-unify
+
+WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp @no-unify
+
WebProcess/WebCoreSupport/glib/WebEditorClientGLib.cpp
WebProcess/WebCoreSupport/gtk/WebContextMenuClientGtk.cpp
@@ -436,3 +455,5 @@ WebProcess/glib/WebProcessGLib.cpp
WebProcess/gtk/WaylandCompositorDisplay.cpp
WebProcess/gtk/WebProcessMainGtk.cpp
+
+WebProcess/Plugins/Netscape/NetscapePluginNone.cpp
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/SourcesWPE.txt webkitgtk-2.32.0/Source/WebKit/SourcesWPE.txt
--- webkitgtk-2.32.0.orig/Source/WebKit/SourcesWPE.txt 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/SourcesWPE.txt 2021-04-12 12:00:15.989985232 -0500
@@ -60,6 +60,10 @@ Platform/glib/ModuleGlib.cpp
Platform/unix/LoggingUnix.cpp
Platform/unix/SharedMemoryUnix.cpp
+PluginProcess/unix/PluginControllerProxyUnix.cpp
+PluginProcess/unix/PluginProcessMainUnix.cpp
+PluginProcess/unix/PluginProcessUnix.cpp
+
Shared/API/c/cairo/WKImageCairo.cpp
Shared/API/glib/WebKitContextMenu.cpp @no-unify
@@ -77,6 +81,9 @@ Shared/CoordinatedGraphics/threadedcompo
Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp
Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.cpp
+Shared/Plugins/Netscape/NetscapePluginModuleNone.cpp
+Shared/Plugins/Netscape/unix/NetscapePluginModuleUnix.cpp
+
Shared/cairo/ShareableBitmapCairo.cpp
Shared/glib/ArgumentCodersGLib.cpp
@@ -206,6 +213,9 @@ UIProcess/Launcher/glib/ProcessLauncherG
UIProcess/Launcher/glib/BubblewrapLauncher.cpp
UIProcess/Launcher/glib/FlatpakLauncher.cpp
+UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp
+UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp
+
UIProcess/WebsiteData/soup/WebsiteDataStoreSoup.cpp
UIProcess/WebsiteData/unix/WebsiteDataStoreUnix.cpp
@@ -243,6 +253,8 @@ WebProcess/InjectedBundle/glib/InjectedB
WebProcess/MediaCache/WebMediaKeyStorageManager.cpp
+WebProcess/Plugins/Netscape/NetscapePluginNone.cpp @no-unify
+
WebProcess/WebCoreSupport/glib/WebEditorClientGLib.cpp
WebProcess/WebCoreSupport/soup/WebFrameNetworkingContext.cpp
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitMimeInfo.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitMimeInfo.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitMimeInfo.cpp 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitMimeInfo.cpp 2021-04-12 12:00:15.989985232 -0500
@@ -20,12 +20,32 @@
#include "config.h"
#include "WebKitMimeInfo.h"
+#include "WebKitMimeInfoPrivate.h"
+#include <wtf/glib/GRefPtr.h>
+#include <wtf/text/CString.h>
+
struct _WebKitMimeInfo {
+ _WebKitMimeInfo(const WebCore::MimeClassInfo& mimeInfo)
+ : mimeInfo(mimeInfo)
+ {
+ }
+
+ WebCore::MimeClassInfo mimeInfo;
+ CString mimeType;
+ CString description;
+ GRefPtr<GPtrArray> extensions;
+
+ int referenceCount { 0 };
};
-ALLOW_DEPRECATED_DECLARATIONS_BEGIN
G_DEFINE_BOXED_TYPE(WebKitMimeInfo, webkit_mime_info, webkit_mime_info_ref, webkit_mime_info_unref)
-ALLOW_DEPRECATED_DECLARATIONS_END
+
+WebKitMimeInfo* webkitMimeInfoCreate(const WebCore::MimeClassInfo& mimeInfo)
+{
+ WebKitMimeInfo* info = static_cast<WebKitMimeInfo*>(fastMalloc(sizeof(WebKitMimeInfo)));
+ new (info) WebKitMimeInfo(mimeInfo);
+ return info;
+}
/**
* webkit_mime_info_ref:
@@ -35,12 +55,11 @@ ALLOW_DEPRECATED_DECLARATIONS_END
* function is MT-safe and may be called from any thread.
*
* Returns: The passed in #WebKitMimeInfo
- *
- * Deprecated: 2.32
*/
-WebKitMimeInfo* webkit_mime_info_ref(WebKitMimeInfo*)
+WebKitMimeInfo* webkit_mime_info_ref(WebKitMimeInfo* info)
{
- return nullptr;
+ g_atomic_int_inc(&info->referenceCount);
+ return info;
}
/**
@@ -51,11 +70,13 @@ WebKitMimeInfo* webkit_mime_info_ref(Web
* reference count drops to 0, all memory allocated by the #WebKitMimeInfo is
* released. This function is MT-safe and may be called from any
* thread.
- *
- * Deprecated: 2.32
*/
-void webkit_mime_info_unref(WebKitMimeInfo*)
+void webkit_mime_info_unref(WebKitMimeInfo* info)
{
+ if (g_atomic_int_dec_and_test(&info->referenceCount)) {
+ info->~WebKitMimeInfo();
+ fastFree(info);
+ }
}
/**
@@ -63,12 +84,17 @@ void webkit_mime_info_unref(WebKitMimeIn
* @info: a #WebKitMimeInfo
*
* Returns: the MIME type of @info
- *
- * Deprecated: 2.32
*/
-const char* webkit_mime_info_get_mime_type(WebKitMimeInfo*)
+const char* webkit_mime_info_get_mime_type(WebKitMimeInfo* info)
{
- return nullptr;
+ if (!info->mimeType.isNull())
+ return info->mimeType.data();
+
+ if (info->mimeInfo.type.isEmpty())
+ return 0;
+
+ info->mimeType = info->mimeInfo.type.utf8();
+ return info->mimeType.data();
}
/**
@@ -76,12 +102,17 @@ const char* webkit_mime_info_get_mime_ty
* @info: a #WebKitMimeInfo
*
* Returns: the description of the MIME type of @info
- *
- * Deprecated: 2.32
*/
-const char* webkit_mime_info_get_description(WebKitMimeInfo*)
+const char* webkit_mime_info_get_description(WebKitMimeInfo* info)
{
- return nullptr;
+ if (!info->description.isNull())
+ return info->description.data();
+
+ if (info->mimeInfo.desc.isEmpty())
+ return 0;
+
+ info->description = info->mimeInfo.desc.utf8();
+ return info->description.data();
}
/**
@@ -93,10 +124,22 @@ const char* webkit_mime_info_get_descrip
*
* Returns: (array zero-terminated=1) (transfer none): a
* %NULL-terminated array of strings
- *
- * Deprecated: 2.32
*/
-const char* const* webkit_mime_info_get_extensions(WebKitMimeInfo*)
+const char* const* webkit_mime_info_get_extensions(WebKitMimeInfo* info)
{
- return nullptr;
+ if (info->extensions)
+ return reinterpret_cast<gchar**>(info->extensions->pdata);
+
+ if (info->mimeInfo.extensions.isEmpty())
+ return 0;
+
+ info->extensions = adoptGRef(g_ptr_array_new_with_free_func(g_free));
+ for (size_t i = 0; i < info->mimeInfo.extensions.size(); ++i) {
+ if (info->mimeInfo.extensions[i].isEmpty())
+ continue;
+ g_ptr_array_add(info->extensions.get(), g_strdup(info->mimeInfo.extensions[i].utf8().data()));
+ }
+ g_ptr_array_add(info->extensions.get(), 0);
+
+ return reinterpret_cast<gchar**>(info->extensions->pdata);
}
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitMimeInfoPrivate.h webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitMimeInfoPrivate.h
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitMimeInfoPrivate.h 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitMimeInfoPrivate.h 2021-04-12 12:00:15.989985232 -0500
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2012 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#pragma once
+
+#include "WebKitMimeInfo.h"
+#include <WebCore/PluginData.h>
+
+WebKitMimeInfo* webkitMimeInfoCreate(const WebCore::MimeClassInfo&);
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitPlugin.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitPlugin.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitPlugin.cpp 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitPlugin.cpp 2021-04-12 12:00:15.989985232 -0500
@@ -20,7 +20,12 @@
#include "config.h"
#include "WebKitPlugin.h"
+#include "WebKitMimeInfoPrivate.h"
+#include "WebKitPluginPrivate.h"
#include <wtf/glib/WTFGType.h>
+#include <wtf/text/CString.h>
+
+using namespace WebKit;
/**
* SECTION: WebKitPlugin
@@ -34,31 +39,52 @@
* be obtained from the #WebKitWebContext, with
* webkit_web_context_get_plugins().
*
- * Deprecated: 2.32
*/
struct _WebKitPluginPrivate {
+ ~_WebKitPluginPrivate()
+ {
+ g_list_free_full(mimeInfoList, reinterpret_cast<GDestroyNotify>(webkit_mime_info_unref));
+ }
+
+ PluginModuleInfo pluginInfo;
+ CString name;
+ CString description;
+ CString path;
+ GList* mimeInfoList;
};
-ALLOW_DEPRECATED_DECLARATIONS_BEGIN
WEBKIT_DEFINE_TYPE(WebKitPlugin, webkit_plugin, G_TYPE_OBJECT)
-ALLOW_DEPRECATED_DECLARATIONS_END
static void webkit_plugin_class_init(WebKitPluginClass*)
{
}
+WebKitPlugin* webkitPluginCreate(const PluginModuleInfo& pluginInfo)
+{
+ WebKitPlugin* plugin = WEBKIT_PLUGIN(g_object_new(WEBKIT_TYPE_PLUGIN, NULL));
+ plugin->priv->pluginInfo = pluginInfo;
+ return plugin;
+}
+
/**
* webkit_plugin_get_name:
* @plugin: a #WebKitPlugin
*
* Returns: the name of the plugin.
- *
- * Deprecated: 2.32
*/
-const char* webkit_plugin_get_name(WebKitPlugin*)
+const char* webkit_plugin_get_name(WebKitPlugin* plugin)
{
- return nullptr;
+ g_return_val_if_fail(WEBKIT_IS_PLUGIN(plugin), 0);
+
+ if (!plugin->priv->name.isNull())
+ return plugin->priv->name.data();
+
+ if (plugin->priv->pluginInfo.info.name.isEmpty())
+ return 0;
+
+ plugin->priv->name = plugin->priv->pluginInfo.info.name.utf8();
+ return plugin->priv->name.data();
}
/**
@@ -66,12 +92,19 @@ const char* webkit_plugin_get_name(WebKi
* @plugin: a #WebKitPlugin
*
* Returns: the description of the plugin.
- *
- * Deprecated: 2.32
*/
-const char* webkit_plugin_get_description(WebKitPlugin*)
+const char* webkit_plugin_get_description(WebKitPlugin* plugin)
{
- return nullptr;
+ g_return_val_if_fail(WEBKIT_IS_PLUGIN(plugin), 0);
+
+ if (!plugin->priv->description.isNull())
+ return plugin->priv->description.data();
+
+ if (plugin->priv->pluginInfo.info.desc.isEmpty())
+ return 0;
+
+ plugin->priv->description = plugin->priv->pluginInfo.info.desc.utf8();
+ return plugin->priv->description.data();
}
/**
@@ -79,12 +112,19 @@ const char* webkit_plugin_get_descriptio
* @plugin: a #WebKitPlugin
*
* Returns: the absolute path where the plugin is installed.
- *
- * Deprecated: 2.32
*/
-const char* webkit_plugin_get_path(WebKitPlugin*)
+const char* webkit_plugin_get_path(WebKitPlugin* plugin)
{
- return nullptr;
+ g_return_val_if_fail(WEBKIT_IS_PLUGIN(plugin), 0);
+
+ if (!plugin->priv->path.isNull())
+ return plugin->priv->path.data();
+
+ if (plugin->priv->pluginInfo.path.isEmpty())
+ return 0;
+
+ plugin->priv->path = plugin->priv->pluginInfo.path.utf8();
+ return plugin->priv->path.data();
}
/**
@@ -95,10 +135,18 @@ const char* webkit_plugin_get_path(WebKi
* as a list of #WebKitMimeInfo.
*
* Returns: (element-type WebKitMimeInfo) (transfer none): a #GList of #WebKitMimeInfo.
- *
- * Deprecated: 2.32
*/
-GList* webkit_plugin_get_mime_info_list(WebKitPlugin*)
+GList* webkit_plugin_get_mime_info_list(WebKitPlugin* plugin)
{
- return nullptr;
+ g_return_val_if_fail(WEBKIT_IS_PLUGIN(plugin), 0);
+
+ if (plugin->priv->mimeInfoList)
+ return plugin->priv->mimeInfoList;
+
+ if (plugin->priv->pluginInfo.info.mimes.isEmpty())
+ return 0;
+
+ for (size_t i = 0; i < plugin->priv->pluginInfo.info.mimes.size(); ++i)
+ plugin->priv->mimeInfoList = g_list_prepend(plugin->priv->mimeInfoList, webkitMimeInfoCreate(plugin->priv->pluginInfo.info.mimes[i]));
+ return plugin->priv->mimeInfoList;
}
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitPluginPrivate.h webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitPluginPrivate.h
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitPluginPrivate.h 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitPluginPrivate.h 2021-04-12 12:00:15.989985232 -0500
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2012 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#pragma once
+
+#include "PluginModuleInfo.h"
+#include "WebKitPlugin.h"
+
+WebKitPlugin* webkitPluginCreate(const WebKit::PluginModuleInfo&);
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitSettings.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitSettings.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitSettings.cpp 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitSettings.cpp 2021-04-12 12:21:48.308807941 -0500
@@ -222,6 +222,7 @@ static void webKitSettingsSetProperty(GO
webkit_settings_set_enable_frame_flattening(settings, g_value_get_boolean(value));
break;
case PROP_ENABLE_PLUGINS:
+ webkit_settings_set_enable_plugins(settings, g_value_get_boolean(value));
break;
case PROP_ENABLE_JAVA:
webkit_settings_set_enable_java(settings, g_value_get_boolean(value));
@@ -424,7 +425,7 @@ static void webKitSettingsGetProperty(GO
g_value_set_boolean(value, webkit_settings_get_enable_frame_flattening(settings));
break;
case PROP_ENABLE_PLUGINS:
- g_value_set_boolean(value, FALSE);
+ g_value_set_boolean(value, webkit_settings_get_enable_plugins(settings));
break;
case PROP_ENABLE_JAVA:
g_value_set_boolean(value, webkit_settings_get_enable_java(settings));
@@ -726,15 +727,13 @@ static void webkit_settings_class_init(W
* WebKitSettings:enable-plugins:
*
* Determines whether or not plugins on the page are enabled.
- *
- * Deprecated: 2.32
*/
g_object_class_install_property(gObjectClass,
PROP_ENABLE_PLUGINS,
g_param_spec_boolean("enable-plugins",
_("Enable plugins"),
_("Enable embedded plugin objects."),
- FALSE,
+ TRUE,
readWriteConstructParamFlags));
/**
@@ -1880,16 +1879,12 @@ void webkit_settings_set_enable_frame_fl
* Get the #WebKitSettings:enable-plugins property.
*
* Returns: %TRUE If plugins are enabled or %FALSE otherwise.
- *
- * Deprecated: 2.32
*/
gboolean webkit_settings_get_enable_plugins(WebKitSettings* settings)
{
g_return_val_if_fail(WEBKIT_IS_SETTINGS(settings), FALSE);
- g_warning("webkit_settings_get_enable_plugins is deprecated and always returns FALSE. Plugins are no longer supported.");
-
- return FALSE;
+ return settings->priv->preferences->pluginsEnabled();
}
/**
@@ -1898,15 +1893,18 @@ gboolean webkit_settings_get_enable_plug
* @enabled: Value to be set
*
* Set the #WebKitSettings:enable-plugins property.
- *
- * Deprecated: 2.32
*/
void webkit_settings_set_enable_plugins(WebKitSettings* settings, gboolean enabled)
{
g_return_if_fail(WEBKIT_IS_SETTINGS(settings));
- if (enabled)
- g_warning("webkit_settings_set_enable_plugins is deprecated and does nothing. Plugins are no longer supported.");
+ WebKitSettingsPrivate* priv = settings->priv;
+ bool currentValue = priv->preferences->pluginsEnabled();
+ if (currentValue == enabled)
+ return;
+
+ priv->preferences->setPluginsEnabled(enabled);
+ g_object_notify(G_OBJECT(settings), "enable-plugins");
}
/**
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp 2021-03-12 03:49:24.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp 2021-04-12 12:00:15.989985232 -0500
@@ -40,6 +40,7 @@
#include "WebKitInitialize.h"
#include "WebKitInjectedBundleClient.h"
#include "WebKitNotificationProvider.h"
+#include "WebKitPluginPrivate.h"
#include "WebKitPrivate.h"
#include "WebKitProtocolHandler.h"
#include "WebKitSecurityManagerPrivate.h"
@@ -1121,12 +1122,31 @@ WebKitSecurityManager* webkit_web_contex
* @directory: the directory to add
*
* Set an additional directory where WebKit will look for plugins.
- *
- * Deprecated: 2.32
*/
-void webkit_web_context_set_additional_plugins_directory(WebKitWebContext*, const char*)
+void webkit_web_context_set_additional_plugins_directory(WebKitWebContext* context, const char* directory)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_CONTEXT(context));
+ g_return_if_fail(directory);
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ context->priv->processPool->setAdditionalPluginsDirectory(FileSystem::stringFromFileSystemRepresentation(directory));
+#endif
+}
+
+static void destroyPluginList(GList* plugins)
+{
+ g_list_free_full(plugins, g_object_unref);
+}
+
+static void webkitWebContextGetPluginThread(GTask* task, gpointer object, gpointer /* taskData */, GCancellable*)
{
- g_warning("webkit_web_context_set_additional_plugins_directory is deprecated and does nothing. Netscape plugins are no longer supported.");
+ GList* returnValue = 0;
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ Vector<PluginModuleInfo> plugins = WEBKIT_WEB_CONTEXT(object)->priv->processPool->pluginInfoStore().plugins();
+ for (size_t i = 0; i < plugins.size(); ++i)
+ returnValue = g_list_prepend(returnValue, webkitPluginCreate(plugins[i]));
+#endif
+ g_task_return_pointer(task, returnValue, reinterpret_cast<GDestroyNotify>(destroyPluginList));
}
/**
@@ -1140,17 +1160,13 @@ void webkit_web_context_set_additional_p
*
* When the operation is finished, @callback will be called. You can then call
* webkit_web_context_get_plugins_finish() to get the result of the operation.
- *
- * Deprecated: 2.32
*/
void webkit_web_context_get_plugins(WebKitWebContext* context, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer userData)
{
g_return_if_fail(WEBKIT_IS_WEB_CONTEXT(context));
- g_warning("webkit_web_context_get_plugins is deprecated and always returns an empty list. Netscape plugins are no longer supported.");
-
GRefPtr<GTask> task = adoptGRef(g_task_new(context, cancellable, callback, userData));
- g_task_return_pointer(task.get(), nullptr, nullptr);
+ g_task_run_in_thread(task.get(), webkitWebContextGetPluginThread);
}
/**
@@ -1163,13 +1179,11 @@ void webkit_web_context_get_plugins(WebK
*
* Returns: (element-type WebKitPlugin) (transfer full): a #GList of #WebKitPlugin. You must free the #GList with
* g_list_free() and unref the #WebKitPlugin<!-- -->s with g_object_unref() when you're done with them.
- *
- * Deprecated: 2.32
*/
GList* webkit_web_context_get_plugins_finish(WebKitWebContext* context, GAsyncResult* result, GError** error)
{
- g_return_val_if_fail(WEBKIT_IS_WEB_CONTEXT(context), nullptr);
- g_return_val_if_fail(g_task_is_valid(result, context), nullptr);
+ g_return_val_if_fail(WEBKIT_IS_WEB_CONTEXT(context), 0);
+ g_return_val_if_fail(g_task_is_valid(result, context), 0);
return static_cast<GList*>(g_task_propagate_pointer(G_TASK(result), error));
}
@@ -1200,7 +1214,9 @@ GList* webkit_web_context_get_plugins_fi
* const gchar *path;
*
* path = webkit_uri_scheme_request_get_path (request);
- * if (!g_strcmp0 (path, "memory")) {
+ * if (!g_strcmp0 (path, "plugins")) {
+ * /<!-- -->* Create a GInputStream with the contents of plugins about page, and set its length to stream_length *<!-- -->/
+ * } else if (!g_strcmp0 (path, "memory")) {
* /<!-- -->* Create a GInputStream with the contents of memory about page, and set its length to stream_length *<!-- -->/
* } else if (!g_strcmp0 (path, "applications")) {
* /<!-- -->* Create a GInputStream with the contents of applications about page, and set its length to stream_length *<!-- -->/
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitWebsiteData.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitWebsiteData.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitWebsiteData.cpp 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitWebsiteData.cpp 2021-04-12 12:00:15.989985232 -0500
@@ -74,6 +74,9 @@ static bool recordContainsSupportedDataT
WebsiteDataType::WebSQLDatabases,
WebsiteDataType::IndexedDBDatabases,
WebsiteDataType::HSTSCache,
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ WebsiteDataType::PlugInData,
+#endif
WebsiteDataType::Cookies,
WebsiteDataType::DeviceIdHashSalt,
WebsiteDataType::ResourceLoadStatistics,
@@ -103,6 +106,10 @@ static WebKitWebsiteDataTypes toWebKitWe
returnValue |= WEBKIT_WEBSITE_DATA_INDEXEDDB_DATABASES;
if (types.contains(WebsiteDataType::HSTSCache))
returnValue |= WEBKIT_WEBSITE_DATA_HSTS_CACHE;
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ if (types.contains(WebsiteDataType::PlugInData))
+ returnValue |= WEBKIT_WEBSITE_DATA_PLUGIN_DATA;
+#endif
if (types.contains(WebsiteDataType::Cookies))
returnValue |= WEBKIT_WEBSITE_DATA_COOKIES;
if (types.contains(WebsiteDataType::DeviceIdHashSalt))
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitWebsiteDataManager.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitWebsiteDataManager.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitWebsiteDataManager.cpp 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitWebsiteDataManager.cpp 2021-04-12 12:00:15.989985232 -0500
@@ -990,6 +990,10 @@ static OptionSet<WebsiteDataType> toWebs
returnValue.add(WebsiteDataType::IndexedDBDatabases);
if (types & WEBKIT_WEBSITE_DATA_HSTS_CACHE)
returnValue.add(WebsiteDataType::HSTSCache);
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ if (types & WEBKIT_WEBSITE_DATA_PLUGIN_DATA)
+ returnValue.add(WebsiteDataType::PlugInData);
+#endif
if (types & WEBKIT_WEBSITE_DATA_COOKIES)
returnValue.add(WebsiteDataType::Cookies);
if (types & WEBKIT_WEBSITE_DATA_DEVICE_ID_HASH_SALT)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp 2021-03-25 10:14:06.000000000 -0500
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp 2021-04-12 12:23:24.881317705 -0500
@@ -473,7 +473,8 @@ static gboolean webkitWebViewLoadFail(We
{
if (g_error_matches(error, WEBKIT_NETWORK_ERROR, WEBKIT_NETWORK_ERROR_CANCELLED)
|| g_error_matches(error, WEBKIT_PLUGIN_ERROR, WEBKIT_PLUGIN_ERROR_WILL_HANDLE_LOAD)
- || g_error_matches(error, WEBKIT_POLICY_ERROR, WEBKIT_POLICY_ERROR_FRAME_LOAD_INTERRUPTED_BY_POLICY_CHANGE))
+ || g_error_matches(error, WEBKIT_POLICY_ERROR, WEBKIT_POLICY_ERROR_FRAME_LOAD_INTERRUPTED_BY_POLICY_CHANGE)
+ || g_error_matches(error, WEBKIT_PLUGIN_ERROR, WEBKIT_PLUGIN_ERROR_WILL_HANDLE_LOAD))
return FALSE;
GUniquePtr<char> htmlString(g_strdup_printf("<html><body>%s</body></html>", error->message));
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitError.h webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitError.h
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitError.h 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitError.h 2021-04-12 15:44:09.088905612 -0500
@@ -41,6 +41,12 @@ G_BEGIN_DECLS
/**
* WebKitNetworkError:
* @WEBKIT_NETWORK_ERROR_FAILED: Generic load failure
+ * @WEBKIT_PLUGIN_ERROR_FAILED: Generic plugin load failure
+ * @WEBKIT_PLUGIN_ERROR_CANNOT_FIND_PLUGIN: Load failure due to missing plugin
+ * @WEBKIT_PLUGIN_ERROR_CANNOT_LOAD_PLUGIN: Load failure due to inability to load plugin
+ * @WEBKIT_PLUGIN_ERROR_JAVA_UNAVAILABLE: Load failure due to missing Java support that is required to load plugin
+ * @WEBKIT_PLUGIN_ERROR_CONNECTION_CANCELLED: Load failure due to connection cancellation
+ * @WEBKIT_PLUGIN_ERROR_WILL_HANDLE_LOAD: Load failure since plugin handles the load
* @WEBKIT_NETWORK_ERROR_TRANSPORT: Load failure due to transport error
* @WEBKIT_NETWORK_ERROR_UNKNOWN_PROTOCOL: Load failure due to unknown protocol
* @WEBKIT_NETWORK_ERROR_CANCELLED: Load failure due to cancellation
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitMimeInfo.h webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitMimeInfo.h
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitMimeInfo.h 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitMimeInfo.h 2021-04-12 12:00:15.989985232 -0500
@@ -34,22 +34,22 @@ G_BEGIN_DECLS
typedef struct _WebKitMimeInfo WebKitMimeInfo;
-WEBKIT_DEPRECATED GType
+WEBKIT_API GType
webkit_mime_info_get_type (void);
-WEBKIT_DEPRECATED WebKitMimeInfo *
+WEBKIT_API WebKitMimeInfo *
webkit_mime_info_ref (WebKitMimeInfo *info);
-WEBKIT_DEPRECATED void
+WEBKIT_API void
webkit_mime_info_unref (WebKitMimeInfo *info);
-WEBKIT_DEPRECATED const gchar *
+WEBKIT_API const gchar *
webkit_mime_info_get_mime_type (WebKitMimeInfo *info);
-WEBKIT_DEPRECATED const gchar *
+WEBKIT_API const gchar *
webkit_mime_info_get_description (WebKitMimeInfo *info);
-WEBKIT_DEPRECATED const gchar * const *
+WEBKIT_API const gchar * const *
webkit_mime_info_get_extensions (WebKitMimeInfo *info);
G_END_DECLS
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitPlugin.h webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitPlugin.h
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitPlugin.h 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitPlugin.h 2021-04-12 12:00:15.993985254 -0500
@@ -55,19 +55,19 @@ struct _WebKitPluginClass {
void (*_webkit_reserved3) (void);
};
-WEBKIT_DEPRECATED GType
+WEBKIT_API GType
webkit_plugin_get_type (void);
-WEBKIT_DEPRECATED const gchar *
+WEBKIT_API const gchar *
webkit_plugin_get_name (WebKitPlugin *plugin);
-WEBKIT_DEPRECATED const gchar *
+WEBKIT_API const gchar *
webkit_plugin_get_description (WebKitPlugin *plugin);
-WEBKIT_DEPRECATED const gchar *
+WEBKIT_API const gchar *
webkit_plugin_get_path (WebKitPlugin *plugin);
-WEBKIT_DEPRECATED GList *
+WEBKIT_API GList *
webkit_plugin_get_mime_info_list (WebKitPlugin *plugin);
G_END_DECLS
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitSettings.h webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitSettings.h
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitSettings.h 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitSettings.h 2021-04-12 12:00:15.993985254 -0500
@@ -147,10 +147,10 @@ WEBKIT_API void
webkit_settings_set_enable_frame_flattening (WebKitSettings *settings,
gboolean enabled);
-WEBKIT_DEPRECATED gboolean
+WEBKIT_API gboolean
webkit_settings_get_enable_plugins (WebKitSettings *settings);
-WEBKIT_DEPRECATED void
+WEBKIT_API void
webkit_settings_set_enable_plugins (WebKitSettings *settings,
gboolean enabled);
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitWebContext.h webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitWebContext.h
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitWebContext.h 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitWebContext.h 2021-04-12 12:00:15.993985254 -0500
@@ -197,17 +197,17 @@ webkit_web_context_get_favicon_database_
WEBKIT_API WebKitSecurityManager *
webkit_web_context_get_security_manager (WebKitWebContext *context);
-WEBKIT_DEPRECATED void
+WEBKIT_API void
webkit_web_context_set_additional_plugins_directory (WebKitWebContext *context,
const gchar *directory);
-WEBKIT_DEPRECATED void
+WEBKIT_API void
webkit_web_context_get_plugins (WebKitWebContext *context,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
-WEBKIT_DEPRECATED GList *
+WEBKIT_API GList *
webkit_web_context_get_plugins_finish (WebKitWebContext *context,
GAsyncResult *result,
GError **error);
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitWebsiteData.h webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitWebsiteData.h
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/API/gtk/WebKitWebsiteData.h 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/API/gtk/WebKitWebsiteData.h 2021-04-12 12:00:15.993985254 -0500
@@ -42,7 +42,7 @@ typedef struct _WebKitWebsiteData WebKit
* @WEBKIT_WEBSITE_DATA_LOCAL_STORAGE: Local storage data.
* @WEBKIT_WEBSITE_DATA_WEBSQL_DATABASES: WebSQL databases. Deprecated 2.24
* @WEBKIT_WEBSITE_DATA_INDEXEDDB_DATABASES: IndexedDB databases.
- * @WEBKIT_WEBSITE_DATA_PLUGIN_DATA: Plugins data. Deprecated 2.32
+ * @WEBKIT_WEBSITE_DATA_PLUGIN_DATA: Plugins data.
* @WEBKIT_WEBSITE_DATA_COOKIES: Cookies.
* @WEBKIT_WEBSITE_DATA_DEVICE_ID_HASH_SALT: Hash salt used to generate the device ids used by webpages. Since 2.24
* @WEBKIT_WEBSITE_DATA_HSTS_CACHE: HSTS cache. Since 2.26
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/gtk/WebPageProxyGtk.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/gtk/WebPageProxyGtk.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/gtk/WebPageProxyGtk.cpp 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/gtk/WebPageProxyGtk.cpp 2021-04-12 12:00:15.993985254 -0500
@@ -38,6 +38,10 @@
#include <WebCore/PlatformDisplay.h>
#include <wtf/NeverDestroyed.h>
+#if PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+#include <gtk/gtkx.h>
+#endif
+
namespace WebKit {
void WebPageProxy::platformInitialize()
@@ -69,6 +73,62 @@ void WebPageProxy::updateEditorState(con
pageClient().selectionDidChange();
}
+#if PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+typedef HashMap<uint64_t, GtkWidget* > PluginWindowMap;
+static PluginWindowMap& pluginWindowMap()
+{
+ static NeverDestroyed<PluginWindowMap> map;
+ return map;
+}
+
+static gboolean pluginContainerPlugRemoved(GtkSocket* socket)
+{
+ uint64_t windowID = static_cast<uint64_t>(gtk_socket_get_id(socket));
+ pluginWindowMap().remove(windowID);
+ return FALSE;
+}
+
+void WebPageProxy::createPluginContainer(CompletionHandler<void(uint64_t)>&& completionHandler)
+{
+ RELEASE_ASSERT(WebCore::PlatformDisplay::sharedDisplay().type() == WebCore::PlatformDisplay::Type::X11);
+ GtkWidget* socket = gtk_socket_new();
+ g_signal_connect(socket, "plug-removed", G_CALLBACK(pluginContainerPlugRemoved), 0);
+ gtk_container_add(GTK_CONTAINER(viewWidget()), socket);
+
+ uint64_t windowID = static_cast<uint64_t>(gtk_socket_get_id(GTK_SOCKET(socket)));
+ pluginWindowMap().set(windowID, socket);
+ completionHandler(windowID);
+}
+
+void WebPageProxy::windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID)
+{
+ GtkWidget* plugin = pluginWindowMap().get(windowID);
+ if (!plugin)
+ return;
+
+ if (gtk_widget_get_realized(plugin)) {
+ GdkRectangle clip = clipRect;
+ cairo_region_t* clipRegion = cairo_region_create_rectangle(&clip);
+ gdk_window_shape_combine_region(gtk_widget_get_window(plugin), clipRegion, 0, 0);
+ cairo_region_destroy(clipRegion);
+ }
+
+ webkitWebViewBaseChildMoveResize(WEBKIT_WEB_VIEW_BASE(viewWidget()), plugin, frameRect);
+}
+
+void WebPageProxy::windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID)
+{
+ GtkWidget* plugin = pluginWindowMap().get(windowID);
+ if (!plugin)
+ return;
+
+ if (isVisible)
+ gtk_widget_show(plugin);
+ else
+ gtk_widget_hide(plugin);
+}
+#endif // PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+
void WebPageProxy::setInputMethodState(Optional<InputMethodState>&& state)
{
webkitWebViewBaseSetInputMethodState(WEBKIT_WEB_VIEW_BASE(viewWidget()), WTFMove(state));
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Launcher/glib/BubblewrapLauncher.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/Launcher/glib/BubblewrapLauncher.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Launcher/glib/BubblewrapLauncher.cpp 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/Launcher/glib/BubblewrapLauncher.cpp 2021-04-12 12:00:15.993985254 -0500
@@ -720,6 +720,13 @@ GRefPtr<GSubprocess> bubblewrapSpawn(GSu
{
ASSERT(launcher);
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ // It is impossible to know what access arbitrary plugins need and since it is for legacy
+ // reasons lets just leave it unsandboxed.
+ if (launchOptions.processType == ProcessLauncher::ProcessType::Plugin)
+ return adoptGRef(g_subprocess_launcher_spawnv(launcher, argv, error));
+#endif
+
// For now we are just considering the network process trusted as it
// requires a lot of access but doesn't execute arbitrary code like
// the WebProcess where our focus lies.
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Launcher/glib/ProcessLauncherGLib.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/Launcher/glib/ProcessLauncherGLib.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Launcher/glib/ProcessLauncherGLib.cpp 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/Launcher/glib/ProcessLauncherGLib.cpp 2021-04-12 12:00:15.993985254 -0500
@@ -105,10 +105,21 @@ void ProcessLauncher::launchProcess()
String executablePath;
CString realExecutablePath;
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ String pluginPath;
+ CString realPluginPath;
+#endif
switch (m_launchOptions.processType) {
case ProcessLauncher::ProcessType::Web:
executablePath = executablePathOfWebProcess();
break;
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ case ProcessLauncher::ProcessType::Plugin:
+ executablePath = executablePathOfPluginProcess();
+ pluginPath = m_launchOptions.extraInitializationData.get("plugin-path");
+ realPluginPath = FileSystem::fileSystemRepresentation(pluginPath);
+ break;
+#endif
case ProcessLauncher::ProcessType::Network:
executablePath = executablePathOfNetworkProcess();
break;
@@ -156,7 +167,11 @@ void ProcessLauncher::launchProcess()
if (configureJSCForTesting)
argv[i++] = const_cast<char*>("--configure-jsc-for-testing");
#endif
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ argv[i++] = const_cast<char*>(realPluginPath.data());
+#else
argv[i++] = nullptr;
+#endif
argv[i++] = nullptr;
GRefPtr<GSubprocessLauncher> launcher = adoptGRef(g_subprocess_launcher_new(G_SUBPROCESS_FLAGS_INHERIT_FDS));
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Plugins/gtk/PluginInfoCache.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/Plugins/gtk/PluginInfoCache.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Plugins/gtk/PluginInfoCache.cpp 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/Plugins/gtk/PluginInfoCache.cpp 2021-04-12 12:00:15.993985254 -0500
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2014 Igalia S.L.
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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 "PluginInfoCache.h"
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+
+#include "NetscapePluginModule.h"
+#include <WebCore/PlatformDisplay.h>
+#include <wtf/FileSystem.h>
+#include <wtf/text/CString.h>
+
+namespace WebKit {
+
+static const unsigned gSchemaVersion = 3;
+
+PluginInfoCache& PluginInfoCache::singleton()
+{
+ static NeverDestroyed<PluginInfoCache> pluginInfoCache;
+ return pluginInfoCache;
+}
+
+static inline const char* cacheFilenameForCurrentDisplay()
+{
+#if PLATFORM(X11)
+ if (WebCore::PlatformDisplay::sharedDisplay().type() == WebCore::PlatformDisplay::Type::X11)
+ return "plugins-x11";
+#endif
+#if PLATFORM(WAYLAND)
+ if (WebCore::PlatformDisplay::sharedDisplay().type() == WebCore::PlatformDisplay::Type::Wayland)
+ return "plugins-wayland";
+#endif
+
+ ASSERT_NOT_REACHED();
+ return "plugins";
+}
+
+PluginInfoCache::PluginInfoCache()
+ : m_cacheFile(g_key_file_new())
+ , m_saveToFileIdle(RunLoop::main(), this, &PluginInfoCache::saveToFile)
+ , m_readOnlyMode(false)
+{
+ m_saveToFileIdle.setPriority(G_PRIORITY_DEFAULT_IDLE);
+
+ GUniquePtr<char> cacheDirectory(g_build_filename(g_get_user_cache_dir(), "webkitgtk", nullptr));
+ if (FileSystem::makeAllDirectories(cacheDirectory.get())) {
+ // Delete old cache file.
+ GUniquePtr<char> oldCachePath(g_build_filename(cacheDirectory.get(), "plugins", nullptr));
+ FileSystem::deleteFile(FileSystem::stringFromFileSystemRepresentation(oldCachePath.get()));
+
+ m_cachePath.reset(g_build_filename(cacheDirectory.get(), cacheFilenameForCurrentDisplay(), nullptr));
+ g_key_file_load_from_file(m_cacheFile.get(), m_cachePath.get(), G_KEY_FILE_NONE, nullptr);
+ }
+
+ if (g_key_file_has_group(m_cacheFile.get(), "schema")) {
+ unsigned schemaVersion = static_cast<unsigned>(g_key_file_get_integer(m_cacheFile.get(), "schema", "version", nullptr));
+ if (schemaVersion < gSchemaVersion) {
+ // Cache file using an old schema, create a new empty file.
+ m_cacheFile.reset(g_key_file_new());
+ } else if (schemaVersion > gSchemaVersion) {
+ // Cache file using a newer schema, use the cache in read only mode.
+ m_readOnlyMode = true;
+ } else {
+ // Same schema version, we don't need to update it.
+ return;
+ }
+ }
+
+ g_key_file_set_integer(m_cacheFile.get(), "schema", "version", static_cast<unsigned>(gSchemaVersion));
+}
+
+PluginInfoCache::~PluginInfoCache()
+{
+}
+
+void PluginInfoCache::saveToFile()
+{
+ gsize dataLength;
+ GUniquePtr<char> data(g_key_file_to_data(m_cacheFile.get(), &dataLength, nullptr));
+ if (!data)
+ return;
+
+ g_file_set_contents(m_cachePath.get(), data.get(), dataLength, nullptr);
+}
+
+bool PluginInfoCache::getPluginInfo(const String& pluginPath, PluginModuleInfo& plugin)
+{
+ CString pluginGroup = pluginPath.utf8();
+ if (!g_key_file_has_group(m_cacheFile.get(), pluginGroup.data()))
+ return false;
+
+ auto lastModifiedTime = FileSystem::getFileModificationTime(pluginPath);
+ if (!lastModifiedTime)
+ return false;
+ time_t cachedLastModified = static_cast<time_t>(g_key_file_get_uint64(m_cacheFile.get(), pluginGroup.data(), "mtime", nullptr));
+ if (lastModifiedTime->secondsSinceEpoch().secondsAs<time_t>() != cachedLastModified)
+ return false;
+
+ plugin.path = pluginPath;
+ plugin.info.file = FileSystem::pathGetFileName(pluginPath);
+
+ GUniquePtr<char> stringValue(g_key_file_get_string(m_cacheFile.get(), pluginGroup.data(), "name", nullptr));
+ plugin.info.name = String::fromUTF8(stringValue.get());
+
+ stringValue.reset(g_key_file_get_string(m_cacheFile.get(), pluginGroup.data(), "description", nullptr));
+ plugin.info.desc = String::fromUTF8(stringValue.get());
+
+#if PLUGIN_ARCHITECTURE(UNIX)
+ stringValue.reset(g_key_file_get_string(m_cacheFile.get(), pluginGroup.data(), "mime-description", nullptr));
+ NetscapePluginModule::parseMIMEDescription(String::fromUTF8(stringValue.get()), plugin.info.mimes);
+#endif
+
+ return true;
+}
+
+void PluginInfoCache::updatePluginInfo(const String& pluginPath, const PluginModuleInfo& plugin)
+{
+ auto lastModifiedTime = FileSystem::getFileModificationTime(pluginPath);
+ if (!lastModifiedTime)
+ return;
+
+ CString pluginGroup = pluginPath.utf8();
+ g_key_file_set_uint64(m_cacheFile.get(), pluginGroup.data(), "mtime", lastModifiedTime->secondsSinceEpoch().secondsAs<guint64>());
+ g_key_file_set_string(m_cacheFile.get(), pluginGroup.data(), "name", plugin.info.name.utf8().data());
+ g_key_file_set_string(m_cacheFile.get(), pluginGroup.data(), "description", plugin.info.desc.utf8().data());
+
+#if PLUGIN_ARCHITECTURE(UNIX)
+ String mimeDescription = NetscapePluginModule::buildMIMEDescription(plugin.info.mimes);
+ g_key_file_set_string(m_cacheFile.get(), pluginGroup.data(), "mime-description", mimeDescription.utf8().data());
+#endif
+
+ if (m_cachePath && !m_readOnlyMode) {
+ // 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.
+ if (m_saveToFileIdle.isActive())
+ return;
+
+ m_saveToFileIdle.startOneShot(0_s);
+ }
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(NETSCAPE_PLUGIN_API)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Plugins/gtk/PluginInfoCache.h webkitgtk-2.32.0/Source/WebKit/UIProcess/Plugins/gtk/PluginInfoCache.h
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Plugins/gtk/PluginInfoCache.h 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/Plugins/gtk/PluginInfoCache.h 2021-04-12 12:00:15.993985254 -0500
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2014 Igalia S.L.
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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 PluginInfoCache_h
+#define PluginInfoCache_h
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+
+#include "PluginModuleInfo.h"
+#include <wtf/NeverDestroyed.h>
+#include <wtf/RunLoop.h>
+#include <wtf/glib/GUniquePtr.h>
+
+namespace WebKit {
+
+class PluginInfoCache {
+ WTF_MAKE_NONCOPYABLE(PluginInfoCache);
+ friend NeverDestroyed<PluginInfoCache>;
+public:
+ static PluginInfoCache& singleton();
+
+ bool getPluginInfo(const String& pluginPath, PluginModuleInfo&);
+ void updatePluginInfo(const String& pluginPath, const PluginModuleInfo&);
+
+private:
+ PluginInfoCache();
+ ~PluginInfoCache();
+
+ void saveToFile();
+
+ GUniquePtr<GKeyFile> m_cacheFile;
+ GUniquePtr<char> m_cachePath;
+ RunLoop::Timer<PluginInfoCache> m_saveToFileIdle;
+ bool m_readOnlyMode;
+};
+
+} // namespace WebKit
+
+#endif // ENABLE(NETSCAPE_PLUGIN_API)
+
+#endif // PluginInfoCache_h
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp 2021-04-12 12:00:15.993985254 -0500
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2010 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. AND ITS CONTRIBUTORS ``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 ITS 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.
+ */
+
+// Note: this file is only for UNIX. On other platforms we can reuse the native implementation.
+
+#include "config.h"
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+
+#include "PluginInfoStore.h"
+
+#include "NetscapePluginModule.h"
+#include "PluginSearchPath.h"
+#include "ProcessExecutablePath.h"
+#include <WebCore/PlatformDisplay.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <wtf/FileSystem.h>
+
+#if PLATFORM(GTK)
+#include "PluginInfoCache.h"
+#endif
+
+namespace WebKit {
+using namespace WebCore;
+
+Vector<String> PluginInfoStore::pluginsDirectories()
+{
+ return WebKit::pluginsDirectories();
+}
+
+Vector<String> PluginInfoStore::pluginPathsInDirectory(const String& directory)
+{
+ Vector<String> result;
+ char normalizedPath[PATH_MAX];
+ for (const auto& path : FileSystem::listDirectory(directory, String("*.so"))) {
+ CString filename = FileSystem::fileSystemRepresentation(path);
+ if (realpath(filename.data(), normalizedPath))
+ result.append(FileSystem::stringFromFileSystemRepresentation(normalizedPath));
+ }
+
+ return result;
+}
+
+Vector<String> PluginInfoStore::individualPluginPaths()
+{
+ return Vector<String>();
+}
+
+bool PluginInfoStore::getPluginInfo(const String& pluginPath, PluginModuleInfo& plugin)
+{
+#if PLATFORM(GTK)
+ if (PluginInfoCache::singleton().getPluginInfo(pluginPath, plugin))
+ return true;
+
+ if (NetscapePluginModule::getPluginInfo(pluginPath, plugin)) {
+ PluginInfoCache::singleton().updatePluginInfo(pluginPath, plugin);
+ return true;
+ }
+ return false;
+#else
+ return NetscapePluginModule::getPluginInfo(pluginPath, plugin);
+#endif
+}
+
+bool PluginInfoStore::shouldUsePlugin(Vector<PluginModuleInfo>& /*alreadyLoadedPlugins*/, const PluginModuleInfo& /*plugin*/)
+{
+ // We do not do any black-listing presently.
+ return true;
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(NETSCAPE_PLUGIN_API)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp webkitgtk-2.32.0/Source/WebKit/UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp 2021-04-12 12:00:15.993985254 -0500
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2011, 2014 Igalia S.L.
+ * Copyright (C) 2011 Apple Inc.
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``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 THE COPYRIGHT OWNER 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 "PluginProcessProxy.h"
+
+#if ENABLE(PLUGIN_PROCESS)
+
+#include "PluginProcessCreationParameters.h"
+#include "ProcessExecutablePath.h"
+#include <WebCore/PlatformDisplay.h>
+#include <sys/wait.h>
+#include <wtf/FileSystem.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/WTFString.h>
+
+#if PLATFORM(GTK)
+#include <glib.h>
+#include <wtf/glib/GUniquePtr.h>
+#endif
+
+#if PLATFORM(GTK)
+#include "Module.h"
+#endif
+
+namespace WebKit {
+using namespace WebCore;
+
+void PluginProcessProxy::platformGetLaunchOptionsWithAttributes(ProcessLauncher::LaunchOptions& launchOptions, const PluginProcessAttributes& pluginProcessAttributes)
+{
+ launchOptions.processType = ProcessLauncher::ProcessType::Plugin;
+ launchOptions.extraInitializationData.add("plugin-path", pluginProcessAttributes.moduleInfo.path);
+}
+
+void PluginProcessProxy::platformInitializePluginProcess(PluginProcessCreationParameters&)
+{
+}
+
+#if PLATFORM(GTK)
+static bool pluginRequiresGtk2(const String& pluginPath)
+{
+ std::unique_ptr<Module> module = makeUnique<Module>(pluginPath);
+ if (!module->load())
+ return false;
+ return module->functionPointer<gpointer>("gtk_object_get_type");
+}
+#endif
+
+#if PLUGIN_ARCHITECTURE(UNIX)
+bool PluginProcessProxy::scanPlugin(const String& pluginPath, RawPluginMetaData& result)
+{
+ String pluginProcessPath = executablePathOfPluginProcess();
+
+#if PLATFORM(GTK)
+ if (pluginRequiresGtk2(pluginPath))
+ return false;
+#endif
+
+ CString binaryPath = FileSystem::fileSystemRepresentation(pluginProcessPath);
+ CString pluginPathCString = FileSystem::fileSystemRepresentation(pluginPath);
+ char* argv[4];
+ argv[0] = const_cast<char*>(binaryPath.data());
+ argv[1] = const_cast<char*>("-scanPlugin");
+ argv[2] = const_cast<char*>(pluginPathCString.data());
+ argv[3] = nullptr;
+
+ // If the disposition of SIGCLD signal is set to SIG_IGN (default)
+ // then the signal will be ignored and g_spawn_sync() will not be
+ // able to return the status.
+ // As a consequence, we make sure that the disposition is set to
+ // SIG_DFL before calling g_spawn_sync().
+#if defined(SIGCLD)
+ struct sigaction action;
+ sigaction(SIGCLD, 0, &action);
+ if (action.sa_handler == SIG_IGN) {
+ action.sa_handler = SIG_DFL;
+ sigaction(SIGCLD, &action, 0);
+ }
+#endif
+
+ int status;
+ GUniqueOutPtr<char> stdOut;
+ GUniqueOutPtr<GError> error;
+ if (!g_spawn_sync(nullptr, argv, nullptr, G_SPAWN_STDERR_TO_DEV_NULL, nullptr, nullptr, &stdOut.outPtr(), nullptr, &status, &error.outPtr())) {
+ WTFLogAlways("Failed to launch %s: %s", argv[0], error->message);
+ return false;
+ }
+
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS) {
+ WTFLogAlways("Error scanning plugin %s, %s returned %d exit status", argv[2], argv[0], status);
+ return false;
+ }
+
+ if (!stdOut) {
+ WTFLogAlways("Error scanning plugin %s, %s didn't write any output to stdout", argv[2], argv[0]);
+ return false;
+ }
+
+ Vector<String> lines = String::fromUTF8(stdOut.get()).splitAllowingEmptyEntries('\n');
+
+ if (lines.size() < 3) {
+ WTFLogAlways("Error scanning plugin %s, too few lines of output provided", argv[2]);
+ return false;
+ }
+
+ result.name.swap(lines[0]);
+ result.description.swap(lines[1]);
+ result.mimeDescription.swap(lines[2]);
+ return !result.mimeDescription.isEmpty();
+}
+#endif // PLUGIN_ARCHITECTURE(UNIX)
+
+} // namespace WebKit
+
+#endif // ENABLE(PLUGIN_PROCESS)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/WebPageProxy.h webkitgtk-2.32.0/Source/WebKit/UIProcess/WebPageProxy.h
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/WebPageProxy.h 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/WebPageProxy.h 2021-04-12 12:43:18.983621960 -0500
@@ -2267,6 +2267,12 @@ private:
void setRenderTreeSize(uint64_t treeSize) { m_renderTreeSize = treeSize; }
+#if PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+ void createPluginContainer(CompletionHandler<void(uint64_t)>&&);
+ void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID);
+ void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID);
+#endif
+
void sendWheelEvent(const WebWheelEvent&);
WebWheelEventCoalescer& wheelEventCoalescer();
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/WebPageProxy.messages.in webkitgtk-2.32.0/Source/WebKit/UIProcess/WebPageProxy.messages.in
--- webkitgtk-2.32.0.orig/Source/WebKit/UIProcess/WebPageProxy.messages.in 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/UIProcess/WebPageProxy.messages.in 2021-04-12 12:00:15.993985254 -0500
@@ -379,6 +379,13 @@ messages -> WebPageProxy {
DictationAlternatives(WebCore::DictationContext dictationContext) -> (Vector<String> alternatives) Synchronous
#endif
+#if PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+ # X11 windowed plugin messages
+ CreatePluginContainer() -> (uint64_t windowID) Synchronous
+ WindowedPluginGeometryDidChange(WebCore::IntRect frameRect, WebCore::IntRect clipRect, uint64_t windowID)
+ WindowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID)
+#endif
+
#if PLATFORM(IOS_FAMILY)
CouldNotRestorePageState()
RestorePageState(Optional<WebCore::FloatPoint> scrollPosition, WebCore::FloatPoint scrollOrigin, WebCore::RectEdges<float> obscuredInsetsOnSave, double scale)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/webkitglib-symbols.map webkitgtk-2.32.0/Source/WebKit/webkitglib-symbols.map
--- webkitgtk-2.32.0.orig/Source/WebKit/webkitglib-symbols.map 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/webkitglib-symbols.map 2021-04-19 16:49:17.362376924 -0500
@@ -7,6 +7,7 @@ global:
"bmalloc::PerThreadStorage<bmalloc::PerHeapKind<bmalloc::Cache> >::s_key";
"bmalloc::vmPageSize()::cached";
"WebKit::NetworkProcessMain(int, char**)";
+ "WebKit::PluginProcessMain(int, char**)";
"WebKit::WebKitExtensionManager::initialize(WebKit::InjectedBundle*, API::Object*)";
"WebKit::WebKitExtensionManager::singleton()";
"WebKit::WebProcessMain(int, char**)";
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp 2021-04-15 17:26:14.751968735 -0500
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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 "NetscapePluginUnix.h"
+
+#if PLUGIN_ARCHITECTURE(UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
+
+#include "NetscapePlugin.h"
+#include "WebEvent.h"
+#include "WebMouseEvent.h"
+#include "WebWheelEvent.h"
+#include <WebCore/NotImplemented.h>
+#include <WebCore/PlatformDisplay.h>
+
+#if PLATFORM(X11)
+#include "NetscapePluginX11.h"
+#endif
+
+namespace WebKit {
+using namespace WebCore;
+
+void NetscapePlugin::platformPreInitialize()
+{
+}
+
+bool NetscapePlugin::platformPostInitialize()
+{
+#if PLATFORM(X11)
+ if (PlatformDisplay::sharedDisplay().type() == PlatformDisplay::Type::X11) {
+ m_impl = NetscapePluginX11::create(*this);
+ if (!m_impl)
+ return false;
+ }
+#endif
+
+ // Windowed plugins need a platform implementation.
+ if (!m_impl)
+ return !m_isWindowed;
+
+ m_npWindow.type = m_impl->windowType();
+ m_npWindow.window = m_impl->window();
+ m_npWindow.ws_info = m_impl->windowSystemInfo();
+ callSetWindow();
+ return true;
+}
+
+void NetscapePlugin::platformDestroy()
+{
+ m_impl = nullptr;
+}
+
+bool NetscapePlugin::platformInvalidate(const IntRect&)
+{
+ notImplemented();
+ return false;
+}
+
+void NetscapePlugin::platformGeometryDidChange()
+{
+ if (!m_impl)
+ return;
+ m_impl->geometryDidChange();
+}
+
+void NetscapePlugin::platformVisibilityDidChange()
+{
+ if (!m_isWindowed || !m_impl)
+ return;
+
+ m_impl->visibilityDidChange();
+}
+
+void NetscapePlugin::platformPaint(GraphicsContext& context, const IntRect& dirtyRect, bool /*isSnapshot*/)
+{
+ if (m_isWindowed || !m_impl)
+ return;
+
+ if (!m_isStarted) {
+ // FIXME: we should paint a missing plugin icon.
+ return;
+ }
+
+ m_impl->paint(context, dirtyRect);
+}
+
+bool NetscapePlugin::platformHandleMouseEvent(const WebMouseEvent& event)
+{
+ if (m_isWindowed || !m_impl)
+ return false;
+
+#if PLATFORM(X11)
+ if ((event.type() == WebEvent::MouseDown || event.type() == WebEvent::MouseUp)
+ && event.button() == WebMouseEvent::RightButton
+ && quirks().contains(PluginQuirks::IgnoreRightClickInWindowlessMode))
+ return false;
+#endif
+
+ return m_impl->handleMouseEvent(event);
+}
+
+bool NetscapePlugin::platformHandleWheelEvent(const WebWheelEvent& event)
+{
+ if (m_isWindowed || !m_impl)
+ return false;
+
+ return m_impl->handleWheelEvent(event);
+}
+
+void NetscapePlugin::platformSetFocus(bool focusIn)
+{
+ if (m_isWindowed || !m_impl)
+ return;
+
+ m_impl->setFocus(focusIn);
+}
+
+bool NetscapePlugin::wantsPluginRelativeNPWindowCoordinates()
+{
+ return true;
+}
+
+bool NetscapePlugin::platformHandleMouseEnterEvent(const WebMouseEvent& event)
+{
+ if (m_isWindowed || !m_impl)
+ return false;
+
+ return m_impl->handleMouseEnterEvent(event);
+}
+
+bool NetscapePlugin::platformHandleMouseLeaveEvent(const WebMouseEvent& event)
+{
+ if (m_isWindowed || !m_impl)
+ return false;
+
+ return m_impl->handleMouseLeaveEvent(event);
+}
+
+bool NetscapePlugin::platformHandleKeyboardEvent(const WebKeyboardEvent& event)
+{
+ // We don't generate other types of keyboard events via WebEventFactory.
+ ASSERT(event.type() == WebEvent::KeyDown || event.type() == WebEvent::KeyUp);
+
+ if (m_isWindowed || !m_impl)
+ return false;
+
+ return m_impl->handleKeyboardEvent(event);
+}
+
+} // namespace WebKit
+
+#endif // PLUGIN_ARCHITECTURE(UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.h webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.h
--- webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.h 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.h 2021-04-12 12:00:15.993985254 -0500
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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 NetscapePluginUnix_h
+#define NetscapePluginUnix_h
+
+#if PLUGIN_ARCHITECTURE(UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
+
+#include <WebCore/npruntime_internal.h>
+
+namespace WebCore {
+class GraphicsContext;
+class IntRect;
+}
+
+namespace WebKit {
+
+class WebKeyboardEvent;
+class WebMouseEvent;
+class WebWheelEvent;
+
+class NetscapePluginUnix {
+public:
+ virtual ~NetscapePluginUnix() { }
+ virtual NPWindowType windowType() const = 0;
+ virtual void* window() const = 0;
+ virtual NPSetWindowCallbackStruct* windowSystemInfo() = 0;
+ virtual void geometryDidChange() = 0;
+ virtual void visibilityDidChange() = 0;
+ virtual void paint(WebCore::GraphicsContext&, const WebCore::IntRect&) = 0;
+ virtual bool handleMouseEvent(const WebMouseEvent&) = 0;
+ virtual bool handleWheelEvent(const WebWheelEvent&) = 0;
+ virtual bool handleMouseEnterEvent(const WebMouseEvent&) = 0;
+ virtual bool handleMouseLeaveEvent(const WebMouseEvent&) = 0;
+ virtual bool handleKeyboardEvent(const WebKeyboardEvent&) = 0;
+ virtual void setFocus(bool) = 0;
+};
+
+} // namespace WebKit
+
+#endif // PLUGIN_ARCHITECTURE(UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
+
+#endif // NetscapePluginUnix_h
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/Netscape/unix/PluginProxyUnix.cpp webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/Netscape/unix/PluginProxyUnix.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/Netscape/unix/PluginProxyUnix.cpp 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/Netscape/unix/PluginProxyUnix.cpp 2021-04-12 12:00:15.993985254 -0500
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2011 Igalia S.L.
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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 "PluginProxy.h"
+
+#if ENABLE(PLUGIN_PROCESS)
+
+#include <WebCore/NotImplemented.h>
+
+namespace WebKit {
+
+bool PluginProxy::needsBackingStore() const
+{
+ notImplemented();
+ return true;
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(PLUGIN_PROCESS)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp 2021-04-16 08:44:51.043403353 -0500
@@ -0,0 +1,542 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 University of Szeged
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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 "NetscapePluginX11.h"
+
+#if PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+
+#include "NetscapePlugin.h"
+#include "PluginController.h"
+#include "WebEvent.h"
+#include "WebMouseEvent.h"
+#include "WebWheelEvent.h"
+#include "WebKeyboardEvent.h"
+#include <WebCore/GraphicsContext.h>
+#include <WebCore/NotImplemented.h>
+#include <WebCore/PlatformDisplayX11.h>
+#include <WebCore/XUniquePtr.h>
+
+#if PLATFORM(GTK)
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
+#include <gtk/gtkx.h>
+#endif
+
+#if USE(CAIRO)
+#include <WebCore/PlatformContextCairo.h>
+#include <WebCore/RefPtrCairo.h>
+#include <cairo/cairo-xlib.h>
+#endif
+
+namespace WebKit {
+using namespace WebCore;
+
+static inline Display* x11HostDisplay()
+{
+ return downcast<PlatformDisplayX11>(PlatformDisplay::sharedDisplay()).native();
+}
+
+static Display* getPluginDisplay()
+{
+#if PLATFORM(GTK)
+ // Since we're a gdk/gtk app, we'll (probably?) have the same X connection as any gdk-based
+ // plugins, so we can return that. We might want to add other implementations here later.
+ return gdk_x11_get_default_xdisplay();
+#else
+ return nullptr;
+#endif
+}
+
+static inline int x11Screen()
+{
+#if PLATFORM(GTK)
+ return gdk_x11_screen_get_screen_number(gdk_screen_get_default());
+#else
+ return 0;
+#endif
+}
+
+static inline int displayDepth()
+{
+#if PLATFORM(GTK)
+ return gdk_visual_get_depth(gdk_screen_get_system_visual(gdk_screen_get_default()));
+#else
+ return 0;
+#endif
+}
+
+static inline unsigned long rootWindowID()
+{
+#if PLATFORM(GTK)
+ return GDK_ROOT_WINDOW();
+#else
+ return 0;
+#endif
+}
+
+#if PLATFORM(GTK)
+static gboolean socketPlugRemovedCallback(GtkSocket*)
+{
+ // Default action is to destroy the GtkSocket, so we just return TRUE here
+ // to be able to reuse the socket. For some obscure reason, newer versions
+ // of flash plugin remove the plug from the socket, probably because the plug
+ // created by the plugin is re-parented.
+ return TRUE;
+}
+#endif
+
+std::unique_ptr<NetscapePluginX11> NetscapePluginX11::create(NetscapePlugin& plugin)
+{
+#if PLATFORM(GTK)
+ uint64_t windowID = 0;
+#endif
+ if (plugin.isWindowed()) {
+#if PLATFORM(GTK)
+ // NPPVplugiNeedsXEmbed is a boolean value, but at least the
+ // Flash player plugin is using an 'int' instead.
+ int needsXEmbed = 0;
+ plugin.NPP_GetValue(NPPVpluginNeedsXEmbed, &needsXEmbed);
+ if (needsXEmbed) {
+ windowID = plugin.controller()->createPluginContainer();
+ if (!windowID)
+ return nullptr;
+ } else {
+ notImplemented();
+ return nullptr;
+ }
+#else
+ notImplemented();
+ return nullptr;
+#endif
+ }
+
+ Display* display = getPluginDisplay();
+ if (!display)
+ return nullptr;
+
+#if PLATFORM(GTK)
+ if (plugin.isWindowed())
+ return makeUnique<NetscapePluginX11>(plugin, display, windowID);
+#endif
+
+ return makeUnique<NetscapePluginX11>(plugin, display);
+}
+
+NetscapePluginX11::NetscapePluginX11(NetscapePlugin& plugin, Display* display)
+ : m_plugin(plugin)
+ , m_pluginDisplay(display)
+{
+ Display* hostDisplay = x11HostDisplay();
+ int depth = displayDepth();
+ m_setWindowCallbackStruct.display = hostDisplay;
+ m_setWindowCallbackStruct.depth = depth;
+
+ XVisualInfo visualTemplate;
+ visualTemplate.screen = x11Screen();
+ visualTemplate.depth = depth;
+ visualTemplate.c_class = TrueColor;
+ int numMatching;
+ XUniquePtr<XVisualInfo> visualInfo(XGetVisualInfo(hostDisplay, VisualScreenMask | VisualDepthMask | VisualClassMask, &visualTemplate, &numMatching));
+ ASSERT(visualInfo);
+ Visual* visual = visualInfo.get()[0].visual;
+ ASSERT(visual);
+
+ m_setWindowCallbackStruct.type = NP_SETWINDOW;
+ m_setWindowCallbackStruct.visual = visual;
+ m_setWindowCallbackStruct.colormap = XCreateColormap(hostDisplay, rootWindowID(), visual, AllocNone);
+}
+
+#if PLATFORM(GTK)
+NetscapePluginX11::NetscapePluginX11(NetscapePlugin& plugin, Display* display, uint64_t windowID)
+ : m_plugin(plugin)
+ , m_pluginDisplay(display)
+{
+ // It seems flash needs the socket to be in the same process,
+ // I guess it uses gdk_window_lookup(), so we create a new socket here
+ // containing a plug with the UI process socket embedded.
+ m_platformPluginWidget = gtk_plug_new(static_cast<Window>(windowID));
+
+ // Hide the GtkPlug on delete-event since we assume the widget is valid while the plugin is active.
+ // platformDestroy() will be called anyway right after the delete-event.
+ g_signal_connect(m_platformPluginWidget, "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), nullptr);
+
+ GtkWidget* socket = gtk_socket_new();
+ // Do not show the plug widget until the socket is connected.
+ g_signal_connect_swapped(socket, "plug-added", G_CALLBACK(gtk_widget_show), m_platformPluginWidget);
+ g_signal_connect(socket, "plug-removed", G_CALLBACK(socketPlugRemovedCallback), nullptr);
+ gtk_container_add(GTK_CONTAINER(m_platformPluginWidget), socket);
+ gtk_widget_show(socket);
+
+ Display* hostDisplay = x11HostDisplay();
+ m_npWindowID = gtk_socket_get_id(GTK_SOCKET(socket));
+ GdkWindow* window = gtk_widget_get_window(socket);
+ m_setWindowCallbackStruct.type = NP_SETWINDOW;
+ m_setWindowCallbackStruct.display = GDK_WINDOW_XDISPLAY(window);
+ m_setWindowCallbackStruct.visual = GDK_VISUAL_XVISUAL(gdk_window_get_visual(window));
+ m_setWindowCallbackStruct.depth = gdk_visual_get_depth(gdk_window_get_visual(window));
+ m_setWindowCallbackStruct.colormap = XCreateColormap(hostDisplay, GDK_ROOT_WINDOW(), m_setWindowCallbackStruct.visual, AllocNone);
+
+ XFlush(hostDisplay);
+}
+#endif
+
+NetscapePluginX11::~NetscapePluginX11()
+{
+ XFreeColormap(x11HostDisplay(), m_setWindowCallbackStruct.colormap);
+
+ m_drawable.reset();
+
+#if PLATFORM(GTK)
+ if (m_platformPluginWidget)
+ gtk_widget_destroy(m_platformPluginWidget);
+#endif
+}
+
+NPWindowType NetscapePluginX11::windowType() const
+{
+ return m_plugin.isWindowed() ? NPWindowTypeWindow : NPWindowTypeDrawable;
+}
+
+void* NetscapePluginX11::window() const
+{
+#if PLATFORM(GTK)
+ return m_plugin.isWindowed() ? GINT_TO_POINTER(m_npWindowID) : nullptr;
+#else
+ return nullptr;
+#endif
+}
+
+void NetscapePluginX11::geometryDidChange()
+{
+ if (m_plugin.isWindowed()) {
+ uint64_t windowID = 0;
+#if PLATFORM(GTK)
+ if (!gtk_plug_get_embedded(GTK_PLUG(m_platformPluginWidget)))
+ return;
+ windowID = static_cast<uint64_t>(GDK_WINDOW_XID(gtk_plug_get_socket_window(GTK_PLUG(m_platformPluginWidget))));
+#endif
+ m_plugin.controller()->windowedPluginGeometryDidChange(m_plugin.frameRectInWindowCoordinates(), m_plugin.clipRect(), windowID);
+ return;
+ }
+
+ m_drawable.reset();
+ if (m_plugin.size().isEmpty())
+ return;
+
+ m_drawable = XCreatePixmap(x11HostDisplay(), rootWindowID(), m_plugin.size().width(), m_plugin.size().height(), displayDepth());
+ XSync(x11HostDisplay(), false); // Make sure that the server knows about the Drawable.
+}
+
+void NetscapePluginX11::visibilityDidChange()
+{
+ ASSERT(m_plugin.isWindowed());
+ uint64_t windowID = 0;
+#if PLATFORM(GTK)
+ if (!gtk_plug_get_embedded(GTK_PLUG(m_platformPluginWidget)))
+ return;
+ windowID = static_cast<uint64_t>(GDK_WINDOW_XID(gtk_plug_get_socket_window(GTK_PLUG(m_platformPluginWidget))));
+#endif
+ m_plugin.controller()->windowedPluginVisibilityDidChange(m_plugin.isVisible(), windowID);
+ m_plugin.controller()->windowedPluginGeometryDidChange(m_plugin.frameRectInWindowCoordinates(), m_plugin.clipRect(), windowID);
+}
+
+void NetscapePluginX11::paint(GraphicsContext& context, const IntRect& dirtyRect)
+{
+ ASSERT(!m_plugin.isWindowed());
+
+ if (context.paintingDisabled() || !m_drawable)
+ return;
+
+ XEvent xevent;
+ memset(&xevent, 0, sizeof(XEvent));
+ XGraphicsExposeEvent& exposeEvent = xevent.xgraphicsexpose;
+ exposeEvent.type = GraphicsExpose;
+ exposeEvent.display = x11HostDisplay();
+ exposeEvent.drawable = m_drawable.get();
+
+ IntRect exposedRect(dirtyRect);
+ exposeEvent.x = exposedRect.x();
+ exposeEvent.y = exposedRect.y();
+
+ // Note: in transparent mode Flash thinks width is the right and height is the bottom.
+ // We should take it into account if we want to support transparency.
+ exposeEvent.width = exposedRect.width();
+ exposeEvent.height = exposedRect.height();
+
+ m_plugin.NPP_HandleEvent(&xevent);
+
+ if (m_pluginDisplay != x11HostDisplay())
+ XSync(m_pluginDisplay, false);
+
+#if PLATFORM(GTK)
+ RefPtr<cairo_surface_t> drawableSurface = adoptRef(cairo_xlib_surface_create(m_pluginDisplay, m_drawable.get(),
+ m_setWindowCallbackStruct.visual, m_plugin.size().width(), m_plugin.size().height()));
+ cairo_t* cr = context.platformContext()->cr();
+ cairo_save(cr);
+
+ cairo_set_source_surface(cr, drawableSurface.get(), 0, 0);
+
+ cairo_rectangle(cr, exposedRect.x(), exposedRect.y(), exposedRect.width(), exposedRect.height());
+ cairo_clip(cr);
+ cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
+ cairo_paint(cr);
+
+ cairo_restore(cr);
+#else
+ notImplemented();
+#endif
+}
+
+static inline void initializeXEvent(XEvent& event)
+{
+ memset(&event, 0, sizeof(XEvent));
+ event.xany.serial = 0;
+ event.xany.send_event = false;
+ event.xany.display = x11HostDisplay();
+ event.xany.window = 0;
+}
+
+static inline uint64_t xTimeStamp(WallTime timestamp)
+{
+ return timestamp.secondsSinceEpoch().milliseconds();
+}
+
+static inline unsigned xKeyModifiers(const WebEvent& event)
+{
+ unsigned xModifiers = 0;
+ if (event.controlKey())
+ xModifiers |= ControlMask;
+ if (event.shiftKey())
+ xModifiers |= ShiftMask;
+ if (event.altKey())
+ xModifiers |= Mod1Mask;
+ if (event.metaKey())
+ xModifiers |= Mod4Mask;
+
+ return xModifiers;
+}
+
+template <typename XEventType, typename WebEventType>
+static inline void setCommonMouseEventFields(XEventType& xEvent, const WebEventType& webEvent, const WebCore::IntPoint& pluginLocation)
+{
+ xEvent.root = rootWindowID();
+ xEvent.subwindow = 0;
+ xEvent.time = xTimeStamp(webEvent.timestamp());
+ xEvent.x = webEvent.position().x() - pluginLocation.x();
+ xEvent.y = webEvent.position().y() - pluginLocation.y();
+ xEvent.x_root = webEvent.globalPosition().x();
+ xEvent.y_root = webEvent.globalPosition().y();
+ xEvent.state = xKeyModifiers(webEvent);
+ xEvent.same_screen = true;
+}
+
+static inline void setXMotionEventFields(XEvent& xEvent, const WebMouseEvent& webEvent, const WebCore::IntPoint& pluginLocation)
+{
+ XMotionEvent& xMotion = xEvent.xmotion;
+ setCommonMouseEventFields(xMotion, webEvent, pluginLocation);
+ xMotion.type = MotionNotify;
+}
+
+static inline void setXButtonEventFields(XEvent& xEvent, const WebMouseEvent& webEvent, const WebCore::IntPoint& pluginLocation)
+{
+ XButtonEvent& xButton = xEvent.xbutton;
+ setCommonMouseEventFields(xButton, webEvent, pluginLocation);
+
+ xButton.type = (webEvent.type() == WebEvent::MouseDown) ? ButtonPress : ButtonRelease;
+ switch (webEvent.button()) {
+ case WebMouseEvent::LeftButton:
+ xButton.button = Button1;
+ break;
+ case WebMouseEvent::MiddleButton:
+ xButton.button = Button2;
+ break;
+ case WebMouseEvent::RightButton:
+ xButton.button = Button3;
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ break;
+ }
+}
+
+static inline void setXButtonEventFieldsByWebWheelEvent(XEvent& xEvent, const WebWheelEvent& webEvent, const WebCore::IntPoint& pluginLocation)
+{
+ XButtonEvent& xButton = xEvent.xbutton;
+ setCommonMouseEventFields(xButton, webEvent, pluginLocation);
+
+ xButton.type = ButtonPress;
+ FloatSize ticks = webEvent.wheelTicks();
+ if (ticks.height()) {
+ if (ticks.height() > 0)
+ xButton.button = 4; // up
+ else
+ xButton.button = 5; // down
+ } else {
+ if (ticks.width() > 0)
+ xButton.button = 6; // left
+ else
+ xButton.button = 7; // right
+ }
+}
+
+static inline void setXCrossingEventFields(XEvent& xEvent, const WebMouseEvent& webEvent, const WebCore::IntPoint& pluginLocation, int type)
+{
+ XCrossingEvent& xCrossing = xEvent.xcrossing;
+ setCommonMouseEventFields(xCrossing, webEvent, pluginLocation);
+
+ xCrossing.type = type;
+ xCrossing.mode = NotifyNormal;
+ xCrossing.detail = NotifyDetailNone;
+ xCrossing.focus = false;
+}
+
+bool NetscapePluginX11::handleMouseEvent(const WebMouseEvent& event)
+{
+ ASSERT(!m_plugin.isWindowed());
+
+ XEvent xEvent;
+ initializeXEvent(xEvent);
+
+ switch (event.type()) {
+ case WebEvent::MouseDown:
+ case WebEvent::MouseUp:
+ setXButtonEventFields(xEvent, event, m_plugin.convertToRootView(IntPoint()));
+ break;
+ case WebEvent::MouseMove:
+ setXMotionEventFields(xEvent, event, m_plugin.convertToRootView(IntPoint()));
+ break;
+ case WebEvent::MouseForceChanged:
+ case WebEvent::MouseForceDown:
+ case WebEvent::MouseForceUp:
+ case WebEvent::NoType:
+ case WebEvent::Wheel:
+ case WebEvent::KeyDown:
+ case WebEvent::KeyUp:
+ case WebEvent::RawKeyDown:
+ case WebEvent::Char:
+#if ENABLE(TOUCH_EVENTS)
+ case WebEvent::TouchStart:
+ case WebEvent::TouchMove:
+ case WebEvent::TouchEnd:
+ case WebEvent::TouchCancel:
+#endif
+ return false;
+ }
+
+ return !m_plugin.NPP_HandleEvent(&xEvent);
+}
+
+// We undefine these constants in npruntime_internal.h to avoid collision
+// with WebKit and platform headers. Values are defined in X.h.
+const int kKeyPressType = 2;
+const int kKeyReleaseType = 3;
+const int kFocusInType = 9;
+const int kFocusOutType = 10;
+
+bool NetscapePluginX11::handleWheelEvent(const WebWheelEvent& event)
+{
+ ASSERT(!m_plugin.isWindowed());
+
+ XEvent xEvent;
+ initializeXEvent(xEvent);
+ setXButtonEventFieldsByWebWheelEvent(xEvent, event, m_plugin.convertToRootView(IntPoint()));
+
+ return !m_plugin.NPP_HandleEvent(&xEvent);
+}
+
+void NetscapePluginX11::setFocus(bool focusIn)
+{
+ ASSERT(!m_plugin.isWindowed());
+
+ XEvent xEvent;
+ initializeXEvent(xEvent);
+ XFocusChangeEvent& focusEvent = xEvent.xfocus;
+ focusEvent.type = focusIn ? kFocusInType : kFocusOutType;
+ focusEvent.mode = NotifyNormal;
+ focusEvent.detail = NotifyDetailNone;
+
+ m_plugin.NPP_HandleEvent(&xEvent);
+}
+
+bool NetscapePluginX11::handleMouseEnterEvent(const WebMouseEvent& event)
+{
+ ASSERT(!m_plugin.isWindowed());
+
+ XEvent xEvent;
+ initializeXEvent(xEvent);
+ setXCrossingEventFields(xEvent, event, m_plugin.convertToRootView(IntPoint()), EnterNotify);
+
+ return !m_plugin.NPP_HandleEvent(&xEvent);
+}
+
+bool NetscapePluginX11::handleMouseLeaveEvent(const WebMouseEvent& event)
+{
+ ASSERT(!m_plugin.isWindowed());
+
+ XEvent xEvent;
+ initializeXEvent(xEvent);
+ setXCrossingEventFields(xEvent, event, m_plugin.convertToRootView(IntPoint()), LeaveNotify);
+
+ return !m_plugin.NPP_HandleEvent(&xEvent);
+}
+
+static inline void setXKeyEventFields(XEvent& xEvent, const WebKeyboardEvent& webEvent)
+{
+ xEvent.xany.type = (webEvent.type() == WebEvent::KeyDown) ? kKeyPressType : kKeyReleaseType;
+ XKeyEvent& xKey = xEvent.xkey;
+ xKey.root = rootWindowID();
+ xKey.subwindow = 0;
+ xKey.time = xTimeStamp(webEvent.timestamp());
+ xKey.state = xKeyModifiers(webEvent);
+ xKey.keycode = webEvent.nativeVirtualKeyCode();
+
+ xKey.same_screen = true;
+
+ // Key events propagated to the plugin does not need to have position.
+ // source: https://developer.mozilla.org/en/NPEvent
+ xKey.x = 0;
+ xKey.y = 0;
+ xKey.x_root = 0;
+ xKey.y_root = 0;
+}
+
+bool NetscapePluginX11::handleKeyboardEvent(const WebKeyboardEvent& event)
+{
+ ASSERT(!m_plugin.isWindowed());
+ // We don't generate other types of keyboard events via WebEventFactory.
+ ASSERT(event.type() == WebEvent::KeyDown || event.type() == WebEvent::KeyUp);
+
+ XEvent xEvent;
+ initializeXEvent(xEvent);
+ setXKeyEventFields(xEvent, event);
+
+ return !m_plugin.NPP_HandleEvent(&xEvent);
+}
+
+} // namespace WebKit
+
+#endif // PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.h webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.h
--- webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.h 1969-12-31 18:00:00.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.h 2021-04-12 12:00:15.993985254 -0500
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 University of Szeged
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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 NetscapePluginX11_h
+#define NetscapePluginX11_h
+
+#if PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+
+#include "NetscapePluginUnix.h"
+#include <WebCore/XUniqueResource.h>
+
+namespace WebKit {
+
+class NetscapePlugin;
+
+class NetscapePluginX11 final : public NetscapePluginUnix {
+ WTF_MAKE_FAST_ALLOCATED;
+public:
+ static std::unique_ptr<NetscapePluginX11> create(NetscapePlugin&);
+ NetscapePluginX11(NetscapePlugin&, Display*);
+#if PLATFORM(GTK)
+ NetscapePluginX11(NetscapePlugin&, Display*, uint64_t windowID);
+#endif
+ virtual ~NetscapePluginX11();
+
+private:
+ NPWindowType windowType() const override;
+ void* window() const override;
+ NPSetWindowCallbackStruct* windowSystemInfo() override { return &m_setWindowCallbackStruct; }
+ void geometryDidChange() override;
+ void visibilityDidChange() override;
+ void paint(WebCore::GraphicsContext&, const WebCore::IntRect&) override;
+ bool handleMouseEvent(const WebMouseEvent&) override;
+ bool handleWheelEvent(const WebWheelEvent&) override;
+ bool handleMouseEnterEvent(const WebMouseEvent&) override;
+ bool handleMouseLeaveEvent(const WebMouseEvent&) override;
+ bool handleKeyboardEvent(const WebKeyboardEvent&) override;
+ void setFocus(bool) override;
+
+ NetscapePlugin& m_plugin;
+ Display* m_pluginDisplay { nullptr };
+ WebCore::XUniquePixmap m_drawable;
+ NPSetWindowCallbackStruct m_setWindowCallbackStruct;
+#if PLATFORM(GTK)
+ unsigned long m_npWindowID { 0 };
+ GtkWidget* m_platformPluginWidget { nullptr };
+#endif
+};
+} // namespace WebKit
+
+#endif // PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+
+#endif // NetscapePluginX11_h
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/PluginController.h webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/PluginController.h
--- webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/PluginController.h 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/PluginController.h 2021-04-12 12:00:15.993985254 -0500
@@ -145,6 +145,13 @@ public:
// Decrements a counter that, when it reaches 0, stops preventing the plug-in from being destroyed.
virtual void unprotectPluginFromDestruction() = 0;
+#if PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+ // Create a plugin container for windowed plugins
+ virtual uint64_t createPluginContainer() = 0;
+ virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID) = 0;
+ virtual void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID) = 0;
+#endif
+
// Called when the a plug-in instance is successfully initialized, either synchronously or asynchronously.
virtual void didInitializePlugin() = 0;
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/PluginView.cpp webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/PluginView.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/PluginView.cpp 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/PluginView.cpp 2021-04-12 12:00:15.993985254 -0500
@@ -74,6 +74,10 @@
#include <wtf/CompletionHandler.h>
#include <wtf/text/StringBuilder.h>
+#if PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+#include <WebCore/PlatformDisplay.h>
+#endif
+
namespace WebKit {
using namespace JSC;
using namespace WebCore;
@@ -1500,6 +1504,26 @@ void PluginView::pluginProcessCrashed()
Widget::invalidate();
}
+#if PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+uint64_t PluginView::createPluginContainer()
+{
+ uint64_t windowID = 0;
+ if (PlatformDisplay::sharedDisplay().type() == PlatformDisplay::Type::X11)
+ m_webPage->sendSync(Messages::WebPageProxy::CreatePluginContainer(), Messages::WebPageProxy::CreatePluginContainer::Reply(windowID));
+ return windowID;
+}
+
+void PluginView::windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID)
+{
+ m_webPage->send(Messages::WebPageProxy::WindowedPluginGeometryDidChange(frameRect, clipRect, windowID));
+}
+
+void PluginView::windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID)
+{
+ m_webPage->send(Messages::WebPageProxy::WindowedPluginVisibilityDidChange(isVisible, windowID));
+}
+#endif
+
#if PLATFORM(COCOA)
void PluginView::pluginFocusOrWindowFocusChanged(bool pluginHasFocusAndWindowHasFocus)
{
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/PluginView.h webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/PluginView.h
--- webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/PluginView.h 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/PluginView.h 2021-04-12 12:00:15.993985254 -0500
@@ -221,6 +221,11 @@ private:
bool artificialPluginInitializationDelayEnabled() const override;
void protectPluginFromDestruction() override;
void unprotectPluginFromDestruction() override;
+#if PLATFORM(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+ uint64_t createPluginContainer() override;
+ void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID) override;
+ void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID) override;
+#endif
void didInitializePlugin() override;
void didFailToInitializePlugin() override;
diff -urpN webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/WebPluginInfoProvider.cpp webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/WebPluginInfoProvider.cpp
--- webkitgtk-2.32.0.orig/Source/WebKit/WebProcess/Plugins/WebPluginInfoProvider.cpp 2021-02-26 03:57:16.000000000 -0600
+++ webkitgtk-2.32.0/Source/WebKit/WebProcess/Plugins/WebPluginInfoProvider.cpp 2021-04-15 15:42:46.990778158 -0500
@@ -114,7 +114,7 @@ Vector<WebCore::PluginInfo> WebPluginInf
}
#if ENABLE(NETSCAPE_PLUGIN_API)
-void WebPluginInfoProvider::populatePluginCache(const WebCore::Page&)
+void WebPluginInfoProvider::populatePluginCache(const WebCore::Page& page)
{
if (!m_pluginCacheIsPopulated) {
#if PLATFORM(COCOA)
diff -urpN webkitgtk-2.32.0.orig/Tools/PlatformGTK.cmake webkitgtk-2.32.0/Tools/PlatformGTK.cmake
--- webkitgtk-2.32.0.orig/Tools/PlatformGTK.cmake 2021-02-26 03:57:17.000000000 -0600
+++ webkitgtk-2.32.0/Tools/PlatformGTK.cmake 2021-04-12 12:00:15.993985254 -0500
@@ -7,6 +7,10 @@ if (DEVELOPER_MODE)
if (ENABLE_API_TESTS)
add_subdirectory(TestWebKitAPI/glib)
endif ()
+
+ if (ENABLE_NETSCAPE_PLUGIN_API)
+ add_subdirectory(DumpRenderTree/TestNetscapePlugIn)
+ endif ()
endif ()
if (ENABLE_MINIBROWSER)
diff -urpN webkitgtk-2.32.0.orig/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitSettings.cpp webkitgtk-2.32.0/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitSettings.cpp
--- webkitgtk-2.32.0.orig/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitSettings.cpp 2021-02-26 03:57:18.000000000 -0600
+++ webkitgtk-2.32.0/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitSettings.cpp 2021-04-12 12:00:15.993985254 -0500
@@ -82,6 +82,11 @@ static void testWebKitSettings(Test*, gc
webkit_settings_set_enable_frame_flattening(settings, TRUE);
g_assert_true(webkit_settings_get_enable_frame_flattening(settings));
+ // Plugins are enabled by default.
+ g_assert_true(webkit_settings_get_enable_plugins(settings));
+ webkit_settings_set_enable_plugins(settings, FALSE);
+ g_assert_false(webkit_settings_get_enable_plugins(settings));
+
// Java is enabled by default.
g_assert_true(webkit_settings_get_enable_java(settings));
webkit_settings_set_enable_java(settings, FALSE);
diff -urpN webkitgtk-2.32.0.orig/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp webkitgtk-2.32.0/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp
--- webkitgtk-2.32.0.orig/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp 2021-03-12 03:39:54.000000000 -0600
+++ webkitgtk-2.32.0/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp 2021-04-12 12:00:15.993985254 -0500
@@ -77,6 +77,84 @@ static void testWebContextEphemeral(Test
g_assert_true(webkit_web_context_is_ephemeral(context.get()));
}
+#if ENABLE(NETSCAPE_PLUGIN_API)
+class PluginsTest: public Test {
+public:
+ MAKE_GLIB_TEST_FIXTURE(PluginsTest);
+
+ PluginsTest()
+ : m_mainLoop(g_main_loop_new(nullptr, TRUE))
+ , m_plugins(nullptr)
+ {
+ webkit_web_context_set_additional_plugins_directory(m_webContext.get(), WEBKIT_TEST_PLUGIN_DIR);
+ }
+
+ ~PluginsTest()
+ {
+ g_main_loop_unref(m_mainLoop);
+ g_list_free_full(m_plugins, g_object_unref);
+ }
+
+ static void getPluginsAsyncReadyCallback(GObject*, GAsyncResult* result, PluginsTest* test)
+ {
+ test->m_plugins = webkit_web_context_get_plugins_finish(test->m_webContext.get(), result, nullptr);
+ g_main_loop_quit(test->m_mainLoop);
+ }
+
+ GList* getPlugins()
+ {
+ g_list_free_full(m_plugins, g_object_unref);
+ webkit_web_context_get_plugins(m_webContext.get(), nullptr, reinterpret_cast<GAsyncReadyCallback>(getPluginsAsyncReadyCallback), this);
+ g_main_loop_run(m_mainLoop);
+ return m_plugins;
+ }
+
+ GMainLoop* m_mainLoop;
+ GList* m_plugins;
+};
+
+static void testWebContextGetPlugins(PluginsTest* test, gconstpointer)
+{
+ GList* plugins = test->getPlugins();
+ g_assert_nonnull(plugins);
+
+ GRefPtr<WebKitPlugin> testPlugin;
+ for (GList* item = plugins; item; item = g_list_next(item)) {
+ WebKitPlugin* plugin = WEBKIT_PLUGIN(item->data);
+ test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(plugin));
+ if (!g_strcmp0(webkit_plugin_get_name(plugin), "WebKit Test PlugIn")) {
+ testPlugin = plugin;
+ break;
+ }
+ }
+ g_assert_true(WEBKIT_IS_PLUGIN(testPlugin.get()));
+
+ char normalizedPath[PATH_MAX];
+ g_assert_nonnull(realpath(WEBKIT_TEST_PLUGIN_DIR, normalizedPath));
+ GUniquePtr<char> pluginPath(g_build_filename(normalizedPath, "libTestNetscapePlugIn.so", nullptr));
+ g_assert_cmpstr(webkit_plugin_get_path(testPlugin.get()), ==, pluginPath.get());
+ g_assert_cmpstr(webkit_plugin_get_description(testPlugin.get()), ==, "Simple Netscape® plug-in that handles test content for WebKit");
+ GList* mimeInfoList = webkit_plugin_get_mime_info_list(testPlugin.get());
+ g_assert_nonnull(mimeInfoList);
+ g_assert_cmpuint(g_list_length(mimeInfoList), ==, 2);
+
+ WebKitMimeInfo* mimeInfo = static_cast<WebKitMimeInfo*>(mimeInfoList->data);
+ g_assert_cmpstr(webkit_mime_info_get_mime_type(mimeInfo), ==, "image/png");
+ g_assert_cmpstr(webkit_mime_info_get_description(mimeInfo), ==, "png image");
+ const gchar* const* extensions = webkit_mime_info_get_extensions(mimeInfo);
+ g_assert_nonnull(extensions);
+ g_assert_cmpstr(extensions[0], ==, "png");
+
+ mimeInfoList = g_list_next(mimeInfoList);
+ mimeInfo = static_cast<WebKitMimeInfo*>(mimeInfoList->data);
+ g_assert_cmpstr(webkit_mime_info_get_mime_type(mimeInfo), ==, "application/x-webkit-test-netscape");
+ g_assert_cmpstr(webkit_mime_info_get_description(mimeInfo), ==, "test netscape content");
+ extensions = webkit_mime_info_get_extensions(mimeInfo);
+ g_assert_nonnull(extensions);
+ g_assert_cmpstr(extensions[0], ==, "testnetscape");
+}
+#endif // ENABLE(NETSCAPE_PLUGIN_API)
+
static const char* kBarHTML = "<html><body>Bar</body></html>";
static const char* kEchoHTMLFormat = "<html><body>%s</body></html>";
static const char* errorDomain = "test";
@@ -777,6 +855,9 @@ void beforeAll()
Test::add("WebKitWebContext", "default-context", testWebContextDefault);
Test::add("WebKitWebContext", "ephemeral", testWebContextEphemeral);
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ PluginsTest::add("WebKitWebContext", "get-plugins", testWebContextGetPlugins);
+#endif
URISchemeTest::add("WebKitWebContext", "uri-scheme", testWebContextURIScheme);
// FIXME: implement spellchecker in WPE.
#if PLATFORM(GTK)