diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebKit2/PluginProcess | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebKit2/PluginProcess')
16 files changed, 367 insertions, 290 deletions
diff --git a/Source/WebKit2/PluginProcess/EntryPoint/unix/PluginProcessMain.cpp b/Source/WebKit2/PluginProcess/EntryPoint/unix/PluginProcessMain.cpp new file mode 100644 index 000000000..3df509057 --- /dev/null +++ b/Source/WebKit2/PluginProcess/EntryPoint/unix/PluginProcessMain.cpp @@ -0,0 +1,33 @@ +/* + * 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 "PluginProcessMainUnix.h" + +using namespace WebKit; + +int main(int argc, char** argv) +{ + return PluginProcessMainUnix(argc, argv); +} diff --git a/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp b/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp index 467b3952a..da9db224e 100644 --- a/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp +++ b/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp @@ -41,12 +41,13 @@ #include "WebCoreArgumentCoders.h" #include "WebProcessConnection.h" #include <WebCore/GraphicsContext.h> +#include <WebCore/HTTPHeaderMap.h> #include <WebCore/IdentifierRep.h> #include <WebCore/NotImplemented.h> -#include <wtf/TemporaryChange.h> +#include <wtf/SetForScope.h> #include <wtf/text/WTFString.h> -#if PLATFORM(MAC) +#if PLATFORM(COCOA) #include "LayerHostingContext.h" #endif @@ -59,21 +60,23 @@ PluginControllerProxy::PluginControllerProxy(WebProcessConnection* connection, c , m_pluginInstanceID(creationParameters.pluginInstanceID) , m_userAgent(creationParameters.userAgent) , m_isPrivateBrowsingEnabled(creationParameters.isPrivateBrowsingEnabled) -#if USE(ACCELERATED_COMPOSITING) + , m_isMuted(creationParameters.isMuted) , m_isAcceleratedCompositingEnabled(creationParameters.isAcceleratedCompositingEnabled) -#endif , m_isInitializing(false) + , m_isVisible(false) + , m_isWindowVisible(false) , m_paintTimer(RunLoop::main(), this, &PluginControllerProxy::paint) , m_pluginDestructionProtectCount(0) , m_pluginDestroyTimer(RunLoop::main(), this, &PluginControllerProxy::destroy) , m_waitingForDidUpdate(false) , m_pluginCanceledManualStreamLoad(false) -#if PLATFORM(MAC) +#if PLATFORM(COCOA) , m_isComplexTextInputEnabled(false) #endif , m_contentsScaleFactor(creationParameters.contentsScaleFactor) , m_windowNPObject(0) , m_pluginElementNPObject(0) + , m_visiblityActivity("Plugin is visible.") { } @@ -94,9 +97,9 @@ void PluginControllerProxy::setInitializationReply(PassRefPtr<Messages::WebProce m_initializationReply = reply; } -PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> PluginControllerProxy::takeInitializationReply() +RefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> PluginControllerProxy::takeInitializationReply() { - return m_initializationReply.release(); + return m_initializationReply; } bool PluginControllerProxy::initialize(const PluginCreationParameters& creationParameters) @@ -104,9 +107,9 @@ bool PluginControllerProxy::initialize(const PluginCreationParameters& creationP ASSERT(!m_plugin); ASSERT(!m_isInitializing); - m_isInitializing = true; // Cannot use TemporaryChange here, because this object can be deleted before the function returns. + m_isInitializing = true; // Cannot use SetForScope here, because this object can be deleted before the function returns. - m_plugin = NetscapePlugin::create(PluginProcess::shared().netscapePluginModule()); + m_plugin = NetscapePlugin::create(PluginProcess::singleton().netscapePluginModule()); if (!m_plugin) { // This will delete the plug-in controller proxy object. m_connection->removePluginControllerProxy(this, 0); @@ -123,7 +126,7 @@ bool PluginControllerProxy::initialize(const PluginCreationParameters& creationP // used as an identifier so it's OK to just get a weak reference. Plugin* plugin = m_plugin.get(); - m_plugin = 0; + m_plugin = nullptr; // This will delete the plug-in controller proxy object. m_connection->removePluginControllerProxy(this, plugin); @@ -153,7 +156,7 @@ void PluginControllerProxy::destroy() Plugin* plugin = m_plugin.get(); m_plugin->destroyPlugin(); - m_plugin = 0; + m_plugin = nullptr; platformDestroy(); @@ -182,16 +185,16 @@ void PluginControllerProxy::paint() // Create a graphics context. auto graphicsContext = m_backingStore->createGraphicsContext(); -#if PLATFORM(MAC) +#if PLATFORM(COCOA) // FIXME: We should really call applyDeviceScaleFactor instead of scale, but that ends up calling into WKSI // which we currently don't have initiated in the plug-in process. - graphicsContext->scale(FloatSize(m_contentsScaleFactor, m_contentsScaleFactor)); + graphicsContext->scale(m_contentsScaleFactor); #endif if (m_plugin->isTransparent()) graphicsContext->clearRect(dirtyRect); - m_plugin->paint(graphicsContext.get(), dirtyRect); + m_plugin->paint(*graphicsContext, dirtyRect); m_connection->connection()->send(Messages::PluginProxy::Update(dirtyRect), m_pluginInstanceID); } @@ -217,13 +220,6 @@ void PluginControllerProxy::startPaintTimer() m_waitingForDidUpdate = true; } -bool PluginControllerProxy::isPluginVisible() -{ - // FIXME: Implement this. - notImplemented(); - return false; -} - void PluginControllerProxy::invalidate(const IntRect& rect) { IntRect dirtyRect = rect; @@ -245,6 +241,11 @@ void PluginControllerProxy::loadURL(uint64_t requestID, const String& method, co m_connection->connection()->send(Messages::PluginProxy::LoadURL(requestID, method, urlString, target, headerFields, httpBody, allowPopups), m_pluginInstanceID); } +void PluginControllerProxy::continueStreamLoad(uint64_t streamID) +{ + m_connection->connection()->send(Messages::PluginProxy::ContinueStreamLoad(streamID), m_pluginInstanceID); +} + void PluginControllerProxy::cancelStreamLoad(uint64_t streamID) { m_connection->connection()->send(Messages::PluginProxy::CancelStreamLoad(streamID), m_pluginInstanceID); @@ -308,6 +309,11 @@ bool PluginControllerProxy::evaluate(NPObject* npObject, const String& scriptStr return true; } +void PluginControllerProxy::setPluginIsPlayingAudio(bool pluginIsPlayingAudio) +{ + m_connection->connection()->send(Messages::PluginProxy::SetPluginIsPlayingAudio(pluginIsPlayingAudio), m_pluginInstanceID); +} + void PluginControllerProxy::setStatusbarText(const String& statusbarText) { m_connection->connection()->send(Messages::PluginProxy::SetStatusbarText(statusbarText), m_pluginInstanceID); @@ -324,12 +330,6 @@ void PluginControllerProxy::pluginProcessCrashed() ASSERT_NOT_REACHED(); } -void PluginControllerProxy::willSendEventToPlugin() -{ - // This is only used when running plugins in the web process. - ASSERT_NOT_REACHED(); -} - void PluginControllerProxy::didInitializePlugin() { // This should only be called on the plugin in the web process. @@ -431,8 +431,36 @@ void PluginControllerProxy::geometryDidChange(const IntSize& pluginSize, const I void PluginControllerProxy::visibilityDidChange(bool isVisible) { + m_isVisible = isVisible; + ASSERT(m_plugin); m_plugin->visibilityDidChange(isVisible); + + updateVisibilityActivity(); +} + +void PluginControllerProxy::windowFocusChanged(bool hasFocus) +{ + ASSERT(m_plugin); + m_plugin->windowFocusChanged(hasFocus); +} + +void PluginControllerProxy::windowVisibilityChanged(bool isVisible) +{ + m_isWindowVisible = isVisible; + + ASSERT(m_plugin); + m_plugin->windowVisibilityChanged(isVisible); + + updateVisibilityActivity(); +} + +void PluginControllerProxy::updateVisibilityActivity() +{ + if (m_isVisible && m_isWindowVisible) + m_visiblityActivity.start(); + else + m_visiblityActivity.stop(); } void PluginControllerProxy::didEvaluateJavaScript(uint64_t requestID, const String& result) @@ -440,6 +468,11 @@ void PluginControllerProxy::didEvaluateJavaScript(uint64_t requestID, const Stri m_plugin->didEvaluateJavaScript(requestID, result); } +void PluginControllerProxy::streamWillSendRequest(uint64_t streamID, const String& requestURLString, const String& redirectResponseURLString, uint32_t redirectResponseStatusCode) +{ + m_plugin->streamWillSendRequest(streamID, URL(ParsedURLString, requestURLString), URL(ParsedURLString, redirectResponseURLString), redirectResponseStatusCode); +} + void PluginControllerProxy::streamDidReceiveResponse(uint64_t streamID, const String& responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers) { m_plugin->streamDidReceiveResponse(streamID, URL(ParsedURLString, responseURLString), streamLength, lastModifiedTime, mimeType, headers, String()); @@ -491,17 +524,9 @@ void PluginControllerProxy::manualStreamDidFail(bool wasCancelled) m_plugin->manualStreamDidFail(wasCancelled); } - -void PluginControllerProxy::handleMouseEvent(const WebMouseEvent& mouseEvent, PassRefPtr<Messages::PluginControllerProxy::HandleMouseEvent::DelayedReply> reply) -{ - // Always let the web process think that we've handled this mouse event, even before passing it along to the plug-in. - // This is a workaround for - // <rdar://problem/9299901> UI process thinks the page is unresponsive when a plug-in is showing a context menu. - // The web process sends a synchronous HandleMouseEvent message and the plug-in process spawns a nested - // run loop when showing the context menu, so eventually the unresponsiveness timer kicks in in the UI process. - // FIXME: We should come up with a better way to do this. - reply->send(true); +void PluginControllerProxy::handleMouseEvent(const WebMouseEvent& mouseEvent) +{ m_plugin->handleMouseEvent(mouseEvent); } @@ -540,6 +565,11 @@ void PluginControllerProxy::handlesPageScaleFactor(bool& isHandled) isHandled = m_plugin->handlesPageScaleFactor(); } +void PluginControllerProxy::requiresUnifiedScaleFactor(bool& required) +{ + required = m_plugin->requiresUnifiedScaleFactor(); +} + void PluginControllerProxy::paintEntirePlugin() { if (m_pluginSize.isEmpty()) @@ -602,6 +632,15 @@ void PluginControllerProxy::privateBrowsingStateChanged(bool isPrivateBrowsingEn m_plugin->privateBrowsingStateChanged(isPrivateBrowsingEnabled); } +void PluginControllerProxy::mutedStateChanged(bool isMuted) +{ + if (m_isMuted == isMuted) + return; + + m_isMuted = isMuted; + m_plugin->mutedStateChanged(isMuted); +} + void PluginControllerProxy::getFormValue(bool& returnValue, String& formValue) { returnValue = m_plugin->getFormValue(formValue); diff --git a/Source/WebKit2/PluginProcess/PluginControllerProxy.h b/Source/WebKit2/PluginProcess/PluginControllerProxy.h index d048d03aa..764d097dd 100644 --- a/Source/WebKit2/PluginProcess/PluginControllerProxy.h +++ b/Source/WebKit2/PluginProcess/PluginControllerProxy.h @@ -35,6 +35,7 @@ #include "ShareableBitmap.h" #include "WebProcessConnectionMessages.h" #include <WebCore/SecurityOrigin.h> +#include <WebCore/UserActivity.h> #include <wtf/Noncopyable.h> #include <wtf/RunLoop.h> @@ -61,12 +62,12 @@ public: bool initialize(const PluginCreationParameters&); void destroy(); - void didReceivePluginControllerProxyMessage(IPC::Connection*, IPC::MessageDecoder&); - void didReceiveSyncPluginControllerProxyMessage(IPC::Connection*, IPC::MessageDecoder&, std::unique_ptr<IPC::MessageEncoder>&); + void didReceivePluginControllerProxyMessage(IPC::Connection&, IPC::Decoder&); + void didReceiveSyncPluginControllerProxyMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&); bool wantsWheelEvents() const; -#if PLATFORM(MAC) +#if PLATFORM(COCOA) uint32_t remoteLayerClientID() const; #endif @@ -75,48 +76,48 @@ public: bool isInitializing() const { return m_isInitializing; } void setInitializationReply(PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply>); - PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> takeInitializationReply(); + RefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> takeInitializationReply(); private: void startPaintTimer(); void paint(); // PluginController - virtual bool isPluginVisible(); - virtual void invalidate(const WebCore::IntRect&); - virtual String userAgent(); - virtual void loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, const WebCore::HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups); - virtual void cancelStreamLoad(uint64_t streamID); - virtual void cancelManualStreamLoad(); - virtual NPObject* windowScriptNPObject(); - virtual NPObject* pluginElementNPObject(); - virtual bool evaluate(NPObject*, const String& scriptString, NPVariant* result, bool allowPopups); - virtual void setStatusbarText(const String&); - virtual bool isAcceleratedCompositingEnabled(); - virtual void pluginProcessCrashed(); - virtual void willSendEventToPlugin(); - virtual void didInitializePlugin() override; - virtual void didFailToInitializePlugin() override; - -#if PLATFORM(MAC) - virtual void pluginFocusOrWindowFocusChanged(bool) override; - virtual void setComplexTextInputState(PluginComplexTextInputState) override; - virtual mach_port_t compositingRenderServerPort() override; - virtual void openPluginPreferencePane() override; + void invalidate(const WebCore::IntRect&) override; + String userAgent() override; + void loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, const WebCore::HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups) override; + void continueStreamLoad(uint64_t streamID) override; + void cancelStreamLoad(uint64_t streamID) override; + void cancelManualStreamLoad() override; + NPObject* windowScriptNPObject() override; + NPObject* pluginElementNPObject() override; + bool evaluate(NPObject*, const String& scriptString, NPVariant* result, bool allowPopups) override; + void setPluginIsPlayingAudio(bool) override; + void setStatusbarText(const String&) override; + bool isAcceleratedCompositingEnabled() override; + void pluginProcessCrashed() override; + void didInitializePlugin() override; + void didFailToInitializePlugin() override; + +#if PLATFORM(COCOA) + void pluginFocusOrWindowFocusChanged(bool) override; + void setComplexTextInputState(PluginComplexTextInputState) override; + const WebCore::MachSendRight& compositingRenderServerPort() override; #endif - virtual float contentsScaleFactor(); - virtual String proxiesForURL(const String&); - virtual String cookiesForURL(const String&); - virtual void setCookiesForURL(const String& urlString, const String& cookieString); - virtual bool isPrivateBrowsingEnabled(); - virtual bool getAuthenticationInfo(const WebCore::ProtectionSpace&, String& username, String& password); - virtual void protectPluginFromDestruction(); - virtual void unprotectPluginFromDestruction(); + float contentsScaleFactor() override; + String proxiesForURL(const String&) override; + String cookiesForURL(const String&) override; + void setCookiesForURL(const String& urlString, const String& cookieString) override; + bool isPrivateBrowsingEnabled() override; + bool isMuted() const override { return m_isMuted; } + bool getAuthenticationInfo(const WebCore::ProtectionSpace&, String& username, String& password) override; + void protectPluginFromDestruction() override; + void unprotectPluginFromDestruction() override; #if PLUGIN_ARCHITECTURE(X11) - virtual uint64_t createPluginContainer(); - virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID); - virtual void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID); + 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 // Message handlers. @@ -125,6 +126,7 @@ private: void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform, float contentsScaleFactor, const ShareableBitmap::Handle& backingStoreHandle); void visibilityDidChange(bool isVisible); void didEvaluateJavaScript(uint64_t requestID, const String& result); + void streamWillSendRequest(uint64_t streamID, const String& requestURLString, const String& redirectResponseURLString, uint32_t redirectResponseStatusCode); void streamDidReceiveResponse(uint64_t streamID, const String& responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers); void streamDidReceiveData(uint64_t streamID, const IPC::DataReference& data); void streamDidFinishLoading(uint64_t streamID); @@ -133,7 +135,7 @@ private: void manualStreamDidReceiveData(const IPC::DataReference& data); void manualStreamDidFinishLoading(); void manualStreamDidFail(bool wasCancelled); - void handleMouseEvent(const WebMouseEvent&, PassRefPtr<Messages::PluginControllerProxy::HandleMouseEvent::DelayedReply>); + void handleMouseEvent(const WebMouseEvent&); void handleWheelEvent(const WebWheelEvent&, bool& handled); void handleMouseEnterEvent(const WebMouseEvent&, bool& handled); void handleMouseLeaveEvent(const WebMouseEvent&, bool& handled); @@ -141,6 +143,7 @@ private: void handleEditingCommand(const String&, const String&, bool&); void isEditingCommandEnabled(const String&, bool&); void handlesPageScaleFactor(bool&); + void requiresUnifiedScaleFactor(bool&); void paintEntirePlugin(); void supportsSnapshotting(bool&); void snapshot(ShareableBitmap::Handle& backingStoreHandle); @@ -148,10 +151,12 @@ private: void didUpdate(); void getPluginScriptableNPObject(uint64_t& pluginScriptableNPObjectID); -#if PLATFORM(MAC) void windowFocusChanged(bool); - void windowAndViewFramesChanged(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates); void windowVisibilityChanged(bool); + void updateVisibilityActivity(); + +#if PLATFORM(COCOA) + void windowAndViewFramesChanged(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates); void sendComplexTextInput(const String& textInput); void setLayerHostingMode(uint32_t); @@ -160,6 +165,7 @@ private: void storageBlockingStateChanged(bool); void privateBrowsingStateChanged(bool); + void mutedStateChanged(bool); void getFormValue(bool& returnValue, String& formValue); void platformInitialize(const PluginCreationParameters&); @@ -172,8 +178,11 @@ private: String m_userAgent; bool m_storageBlockingEnabled; bool m_isPrivateBrowsingEnabled; + bool m_isMuted; bool m_isAcceleratedCompositingEnabled; bool m_isInitializing; + bool m_isVisible; + bool m_isWindowVisible; RefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> m_initializationReply; @@ -201,7 +210,7 @@ private: // Whether the plug-in has canceled the manual stream load. bool m_pluginCanceledManualStreamLoad; -#if PLATFORM(MAC) +#if PLATFORM(COCOA) // Whether complex text input is enabled for this plug-in. bool m_isComplexTextInputEnabled; @@ -220,6 +229,9 @@ private: // The plug-in element NPObject. NPObject* m_pluginElementNPObject; + + // Hold an activity when the plugin is visible to prevent throttling. + UserActivity m_visiblityActivity; }; } // namespace WebKit diff --git a/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in b/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in index 0c61c813a..18e8c80b6 100644 --- a/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in +++ b/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in @@ -38,6 +38,9 @@ messages -> PluginControllerProxy LegacyReceiver { # Sent when JavaScript that the plug-in asked to be evaluated has been evaluated. DidEvaluateJavaScript(uint64_t requestID, String result) + # Sent when the plug-in receives will send a request for a stream. + StreamWillSendRequest(uint64_t streamID, String requestURLString, String redirectResponseURLString, uint32_t redirectResponseStatusCode) + # Sent when the plug-in receives a response for a stream. StreamDidReceiveResponse(uint64_t streamID, String responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, String mimeType, String headers) @@ -63,7 +66,7 @@ messages -> PluginControllerProxy LegacyReceiver { ManualStreamDidFail(bool wasCancelled) # Sent when a mouse event (that isn't a mouse enter/leave event or a wheel event) should be processed. - HandleMouseEvent(WebKit::WebMouseEvent mouseEvent) -> (bool handled) Delayed + HandleMouseEvent(WebKit::WebMouseEvent mouseEvent) # Sent when a mouse wheel event should be processed. HandleWheelEvent(WebKit::WebWheelEvent wheelEvent) -> (bool handled) @@ -86,6 +89,9 @@ messages -> PluginControllerProxy LegacyReceiver { # Return whether or not a plugin wants to handle page scale factor itself. HandlesPageScaleFactor() -> (bool enabled); + # Return whether or not a plugin wants page scale, page zoom, and text zoom all to affect page scale. + RequiresUnifiedScaleFactor() -> (bool required); + # Sent when the plug-in focus changes. SetFocus(bool isFocused) @@ -98,19 +104,19 @@ messages -> PluginControllerProxy LegacyReceiver { # Get a reference to the plug-in's scriptable NPObject. GetPluginScriptableNPObject() -> (uint64_t pluginScriptableNPObjectID) -#if PLATFORM(MAC) - # Send the complex text input to the plug-in. - SendComplexTextInput(String textInput) - # Sent when the containing NSWindow's focus changes WindowFocusChanged(bool hasFocus) - # Sent when the containing NSWindow or NSView frame changes - WindowAndViewFramesChanged(WebCore::IntRect windowFrameInScreenCoordinates, WebCore::IntRect viewFrameInWindowCoordinates) - # Sent when the containing NSWindow's visibility changes WindowVisibilityChanged(bool isVisible) +#if PLATFORM(COCOA) + # Send the complex text input to the plug-in. + SendComplexTextInput(String textInput) + + # Sent when the containing NSWindow or NSView frame changes + WindowAndViewFramesChanged(WebCore::IntRect windowFrameInScreenCoordinates, WebCore::IntRect viewFrameInWindowCoordinates) + # Sent when the containing window's layer hosting mode changes SetLayerHostingMode(uint32_t layerHostingMode) #endif @@ -129,6 +135,9 @@ messages -> PluginControllerProxy LegacyReceiver { # Gets the string representating the form value of the plug-in GetFormValue() -> (bool returnValue, String formValue) + + # Sent when the browser wants to mute or unmute the plugin. + MutedStateChanged(bool muted) } #endif diff --git a/Source/WebKit2/PluginProcess/PluginCreationParameters.cpp b/Source/WebKit2/PluginProcess/PluginCreationParameters.cpp index 3d2492f96..ec27eed74 100644 --- a/Source/WebKit2/PluginProcess/PluginCreationParameters.cpp +++ b/Source/WebKit2/PluginProcess/PluginCreationParameters.cpp @@ -37,15 +37,14 @@ PluginCreationParameters::PluginCreationParameters() , windowNPObjectID(0) , contentsScaleFactor(1) , isPrivateBrowsingEnabled(false) + , isMuted(false) , asynchronousCreationIncomplete(false) , artificialPluginInitializationDelayEnabled(false) -#if USE(ACCELERATED_COMPOSITING) , isAcceleratedCompositingEnabled(false) -#endif { } -void PluginCreationParameters::encode(IPC::ArgumentEncoder& encoder) const +void PluginCreationParameters::encode(IPC::Encoder& encoder) const { encoder << pluginInstanceID; encoder << windowNPObjectID; @@ -53,15 +52,13 @@ void PluginCreationParameters::encode(IPC::ArgumentEncoder& encoder) const encoder << userAgent; encoder << contentsScaleFactor; encoder << isPrivateBrowsingEnabled; + encoder << isMuted; encoder << asynchronousCreationIncomplete; encoder << artificialPluginInitializationDelayEnabled; - -#if USE(ACCELERATED_COMPOSITING) encoder << isAcceleratedCompositingEnabled; -#endif } -bool PluginCreationParameters::decode(IPC::ArgumentDecoder& decoder, PluginCreationParameters& result) +bool PluginCreationParameters::decode(IPC::Decoder& decoder, PluginCreationParameters& result) { if (!decoder.decode(result.pluginInstanceID) || !result.pluginInstanceID) return false; @@ -81,16 +78,17 @@ bool PluginCreationParameters::decode(IPC::ArgumentDecoder& decoder, PluginCreat if (!decoder.decode(result.isPrivateBrowsingEnabled)) return false; + if (!decoder.decode(result.isMuted)) + return false; + if (!decoder.decode(result.asynchronousCreationIncomplete)) return false; if (!decoder.decode(result.artificialPluginInitializationDelayEnabled)) return false; -#if USE(ACCELERATED_COMPOSITING) if (!decoder.decode(result.isAcceleratedCompositingEnabled)) return false; -#endif return true; } diff --git a/Source/WebKit2/PluginProcess/PluginCreationParameters.h b/Source/WebKit2/PluginProcess/PluginCreationParameters.h index 389f755cb..c3751682c 100644 --- a/Source/WebKit2/PluginProcess/PluginCreationParameters.h +++ b/Source/WebKit2/PluginProcess/PluginCreationParameters.h @@ -31,8 +31,8 @@ #include "Plugin.h" namespace IPC { - class ArgumentDecoder; - class ArgumentEncoder; +class Decoder; +class Encoder; } namespace WebKit { @@ -40,8 +40,8 @@ namespace WebKit { struct PluginCreationParameters { PluginCreationParameters(); - void encode(IPC::ArgumentEncoder&) const; - static bool decode(IPC::ArgumentDecoder&, PluginCreationParameters&); + void encode(IPC::Encoder&) const; + static bool decode(IPC::Decoder&, PluginCreationParameters&); // The unique ID of this plug-in instance. uint64_t pluginInstanceID; @@ -60,6 +60,9 @@ struct PluginCreationParameters { // Whether private browsing is enabled at the time of instantiation. bool isPrivateBrowsingEnabled; + + // Whether the plugin should be muted. + bool isMuted; // If requesting synchronous initialization, whether this plugin had previously been requested asynchronously bool asynchronousCreationIncomplete; @@ -67,10 +70,8 @@ struct PluginCreationParameters { // Simulated initialization delay test asynchronous plugin initialization bool artificialPluginInitializationDelayEnabled; -#if USE(ACCELERATED_COMPOSITING) // Whether accelerated compositing is enabled. bool isAcceleratedCompositingEnabled; -#endif }; } // namespace WebKit diff --git a/Source/WebKit2/PluginProcess/PluginProcess.cpp b/Source/WebKit2/PluginProcess/PluginProcess.cpp index 37bcd783b..aea6d8873 100644 --- a/Source/WebKit2/PluginProcess/PluginProcess.cpp +++ b/Source/WebKit2/PluginProcess/PluginProcess.cpp @@ -48,7 +48,7 @@ using namespace WebCore; namespace WebKit { -PluginProcess& PluginProcess::shared() +PluginProcess& PluginProcess::singleton() { static NeverDestroyed<PluginProcess> pluginProcess; return pluginProcess; @@ -57,9 +57,7 @@ PluginProcess& PluginProcess::shared() PluginProcess::PluginProcess() : m_supportsAsynchronousPluginInitialization(false) , m_minimumLifetimeTimer(RunLoop::main(), this, &PluginProcess::minimumLifetimeTimerFired) -#if PLATFORM(MAC) - , m_compositingRenderServerPort(MACH_PORT_NULL) -#endif + , m_connectionActivity("PluginProcess connection activity.") { NetscapePlugin::setSetExceptionFunction(WebProcessConnection::setGlobalException); } @@ -68,20 +66,10 @@ PluginProcess::~PluginProcess() { } -void PluginProcess::lowMemoryHandler(bool critical) -{ - UNUSED_PARAM(critical); - if (shared().shouldTerminate()) - shared().terminate(); -} - void PluginProcess::initializeProcess(const ChildProcessInitializationParameters& parameters) { m_pluginPath = parameters.extraInitializationData.get("plugin-path"); platformInitializeProcess(parameters); - - memoryPressureHandler().setLowMemoryHandler(lowMemoryHandler); - memoryPressureHandler().install(); } void PluginProcess::removeWebProcessConnection(WebProcessConnection* webProcessConnection) @@ -121,56 +109,64 @@ bool PluginProcess::shouldTerminate() return m_webProcessConnections.isEmpty(); } -void PluginProcess::didReceiveMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder) +void PluginProcess::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder) { didReceivePluginProcessMessage(connection, decoder); } -void PluginProcess::didClose(IPC::Connection*) +void PluginProcess::didClose(IPC::Connection&) { - // The UI process has crashed, just go ahead and quit. + // The UI process has crashed, just quit. // FIXME: If the plug-in is spinning in the main loop, we'll never get this message. stopRunLoop(); } -void PluginProcess::didReceiveInvalidMessage(IPC::Connection*, IPC::StringReference, IPC::StringReference) -{ -} - -void PluginProcess::initializePluginProcess(const PluginProcessCreationParameters& parameters) +void PluginProcess::initializePluginProcess(PluginProcessCreationParameters&& parameters) { ASSERT(!m_pluginModule); + auto& memoryPressureHandler = MemoryPressureHandler::singleton(); +#if OS(LINUX) + if (parameters.memoryPressureMonitorHandle.fileDescriptor() != -1) + memoryPressureHandler.setMemoryPressureMonitorHandle(parameters.memoryPressureMonitorHandle.releaseFileDescriptor()); +#endif + memoryPressureHandler.setLowMemoryHandler([this] (Critical, Synchronous) { + if (shouldTerminate()) + terminate(); + }); + memoryPressureHandler.install(); + m_supportsAsynchronousPluginInitialization = parameters.supportsAsynchronousPluginInitialization; setMinimumLifetime(parameters.minimumLifetime); setTerminationTimeout(parameters.terminationTimeout); - platformInitializePluginProcess(parameters); + platformInitializePluginProcess(WTFMove(parameters)); } void PluginProcess::createWebProcessConnection() { bool didHaveAnyWebProcessConnections = !m_webProcessConnections.isEmpty(); -#if PLATFORM(MAC) +#if USE(UNIX_DOMAIN_SOCKETS) + IPC::Connection::SocketPair socketPair = IPC::Connection::createPlatformConnection(); + + auto connection = WebProcessConnection::create(socketPair.server); + m_webProcessConnections.append(WTFMove(connection)); + + IPC::Attachment clientSocket(socketPair.client); + parentProcessConnection()->send(Messages::PluginProcessProxy::DidCreateWebProcessConnection(clientSocket, m_supportsAsynchronousPluginInitialization), 0); +#elif OS(DARWIN) // Create the listening port. mach_port_t listeningPort; mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &listeningPort); // Create a listening connection. - RefPtr<WebProcessConnection> connection = WebProcessConnection::create(IPC::Connection::Identifier(listeningPort)); - m_webProcessConnections.append(connection.release()); + auto connection = WebProcessConnection::create(IPC::Connection::Identifier(listeningPort)); + + m_webProcessConnections.append(WTFMove(connection)); IPC::Attachment clientPort(listeningPort, MACH_MSG_TYPE_MAKE_SEND); parentProcessConnection()->send(Messages::PluginProcessProxy::DidCreateWebProcessConnection(clientPort, m_supportsAsynchronousPluginInitialization), 0); -#elif USE(UNIX_DOMAIN_SOCKETS) - IPC::Connection::SocketPair socketPair = IPC::Connection::createPlatformConnection(); - - RefPtr<WebProcessConnection> connection = WebProcessConnection::create(socketPair.server); - m_webProcessConnections.append(connection.release()); - - IPC::Attachment clientSocket(socketPair.client); - parentProcessConnection()->send(Messages::PluginProcessProxy::DidCreateWebProcessConnection(clientSocket, m_supportsAsynchronousPluginInitialization), 0); #else notImplemented(); #endif @@ -195,19 +191,29 @@ void PluginProcess::getSitesWithData(uint64_t callbackID) parentProcessConnection()->send(Messages::PluginProcessProxy::DidGetSitesWithData(sites, callbackID), 0); } -void PluginProcess::clearSiteData(const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID) +void PluginProcess::deleteWebsiteData(std::chrono::system_clock::time_point modifiedSince, uint64_t callbackID) { - if (NetscapePluginModule* module = netscapePluginModule()) { - if (sites.isEmpty()) { - // Clear everything. - module->clearSiteData(String(), flags, maxAgeInSeconds); - } else { - for (size_t i = 0; i < sites.size(); ++i) - module->clearSiteData(sites[i], flags, maxAgeInSeconds); + if (auto* module = netscapePluginModule()) { + auto currentTime = std::chrono::system_clock::now(); + + if (currentTime > modifiedSince) { + uint64_t maximumAge = std::chrono::duration_cast<std::chrono::seconds>(currentTime - modifiedSince).count(); + + module->clearSiteData(String(), NP_CLEAR_ALL, maximumAge); } } - parentProcessConnection()->send(Messages::PluginProcessProxy::DidClearSiteData(callbackID), 0); + parentProcessConnection()->send(Messages::PluginProcessProxy::DidDeleteWebsiteData(callbackID), 0); +} + +void PluginProcess::deleteWebsiteDataForHostNames(const Vector<String>& hostNames, uint64_t callbackID) +{ + if (auto* module = netscapePluginModule()) { + for (auto& hostName : hostNames) + module->clearSiteData(hostName, NP_CLEAR_ALL, std::numeric_limits<uint64_t>::max()); + } + + parentProcessConnection()->send(Messages::PluginProcessProxy::DidDeleteWebsiteDataForHostNames(callbackID), 0); } void PluginProcess::setMinimumLifetime(double lifetime) @@ -225,7 +231,7 @@ void PluginProcess::minimumLifetimeTimerFired() enableTermination(); } -#if !PLATFORM(MAC) +#if !PLATFORM(COCOA) void PluginProcess::initializeProcessName(const ChildProcessInitializationParameters&) { } diff --git a/Source/WebKit2/PluginProcess/PluginProcess.h b/Source/WebKit2/PluginProcess/PluginProcess.h index a87a38824..92c677752 100644 --- a/Source/WebKit2/PluginProcess/PluginProcess.h +++ b/Source/WebKit2/PluginProcess/PluginProcess.h @@ -29,21 +29,27 @@ #if ENABLE(NETSCAPE_PLUGIN_API) #include "ChildProcess.h" +#include <WebCore/CountedUserActivity.h> #include <wtf/Forward.h> #include <wtf/NeverDestroyed.h> #include <wtf/text/WTFString.h> +#if PLATFORM(COCOA) +#include <WebCore/MachSendRight.h> +#endif + namespace WebKit { class NetscapePluginModule; class WebProcessConnection; struct PluginProcessCreationParameters; -class PluginProcess : public ChildProcess { +class PluginProcess : public ChildProcess +{ WTF_MAKE_NONCOPYABLE(PluginProcess); friend class NeverDestroyed<PluginProcess>; public: - static PluginProcess& shared(); + static PluginProcess& singleton(); void removeWebProcessConnection(WebProcessConnection*); @@ -51,13 +57,11 @@ public: const String& pluginPath() const { return m_pluginPath; } -#if PLATFORM(MAC) +#if PLATFORM(COCOA) void setModalWindowIsShowing(bool); void setFullscreenWindowIsShowing(bool); -#if USE(ACCELERATED_COMPOSITING) - mach_port_t compositingRenderServerPort() const { return m_compositingRenderServerPort; } -#endif + const WebCore::MachSendRight& compositingRenderServerPort() const { return m_compositingRenderServerPort; } bool launchProcess(const String& launchPath, const Vector<String>& arguments); bool launchApplicationAtURL(const String& urlString, const Vector<String>& arguments); @@ -65,34 +69,37 @@ public: bool openFile(const String& urlString); #endif + CountedUserActivity& connectionActivity() { return m_connectionActivity; } + private: PluginProcess(); ~PluginProcess(); // ChildProcess - virtual void initializeProcess(const ChildProcessInitializationParameters&) override; - virtual void initializeProcessName(const ChildProcessInitializationParameters&) override; - virtual void initializeSandbox(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) override; - virtual bool shouldTerminate() override; + void initializeProcess(const ChildProcessInitializationParameters&) override; + void initializeProcessName(const ChildProcessInitializationParameters&) override; + void initializeSandbox(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) override; + bool shouldTerminate() override; void platformInitializeProcess(const ChildProcessInitializationParameters&); -#if PLATFORM(MAC) - virtual void stopRunLoop() override; +#if USE(APPKIT) + void stopRunLoop() override; #endif // IPC::Connection::Client - virtual void didReceiveMessage(IPC::Connection*, IPC::MessageDecoder&) override; - virtual void didClose(IPC::Connection*) override; - virtual void didReceiveInvalidMessage(IPC::Connection*, IPC::StringReference messageReceiverName, IPC::StringReference messageName) override; + void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override; + void didClose(IPC::Connection&) override; // Message handlers. - void didReceivePluginProcessMessage(IPC::Connection*, IPC::MessageDecoder&); - void initializePluginProcess(const PluginProcessCreationParameters&); + void didReceivePluginProcessMessage(IPC::Connection&, IPC::Decoder&); + void initializePluginProcess(PluginProcessCreationParameters&&); void createWebProcessConnection(); + void getSitesWithData(uint64_t callbackID); - void clearSiteData(const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID); + void deleteWebsiteData(std::chrono::system_clock::time_point modifiedSince, uint64_t callbackID); + void deleteWebsiteDataForHostNames(const Vector<String>& hostNames, uint64_t callbackID); - void platformInitializePluginProcess(const PluginProcessCreationParameters&); + void platformInitializePluginProcess(PluginProcessCreationParameters&&); void setMinimumLifetime(double); void minimumLifetimeTimerFired(); @@ -102,7 +109,7 @@ private: // The plug-in path. String m_pluginPath; -#if PLATFORM(MAC) +#if PLATFORM(COCOA) String m_pluginBundleIdentifier; #endif @@ -113,12 +120,14 @@ private: RunLoop::Timer<PluginProcess> m_minimumLifetimeTimer; -#if USE(ACCELERATED_COMPOSITING) && PLATFORM(MAC) +#if PLATFORM(COCOA) // The Mach port used for accelerated compositing. - mach_port_t m_compositingRenderServerPort; + WebCore::MachSendRight m_compositingRenderServerPort; + + String m_nsurlCacheDirectory; #endif - static void lowMemoryHandler(bool critical); + CountedUserActivity m_connectionActivity; }; } // namespace WebKit diff --git a/Source/WebKit2/PluginProcess/PluginProcess.messages.in b/Source/WebKit2/PluginProcess/PluginProcess.messages.in index 60a598205..070e9400c 100644 --- a/Source/WebKit2/PluginProcess/PluginProcess.messages.in +++ b/Source/WebKit2/PluginProcess/PluginProcess.messages.in @@ -24,7 +24,7 @@ messages -> PluginProcess LegacyReceiver { # Initializes the plug-in process. - InitializePluginProcess(WebKit::PluginProcessCreationParameters processCreationParameters) + InitializePluginProcess(struct WebKit::PluginProcessCreationParameters processCreationParameters) # Creates a web process connection. When the connection has been created, # The plug-in process sends back a DidCreateWebProcessConnection message with @@ -35,12 +35,11 @@ messages -> PluginProcess LegacyReceiver { # DidGetSitesWithData message with the sites. GetSitesWithData(uint64_t callbackID) - # Asks the plug-in to clear data for the given sites. The plug-in process sends back - # a DidClearSiteData message when done. - ClearSiteData(Vector<String> sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID) + DeleteWebsiteData(std::chrono::system_clock::time_point modifiedSince, uint64_t callbackID) + DeleteWebsiteDataForHostNames(Vector<String> hostNames, uint64_t callbackID) -#if PLATFORM(MAC) SetProcessSuppressionEnabled(bool flag) +#if PLATFORM(COCOA) SetQOS(int latencyQOS, int throughputQOS) #endif } diff --git a/Source/WebKit2/PluginProcess/WebProcessConnection.cpp b/Source/WebKit2/PluginProcess/WebProcessConnection.cpp index 5011089d6..54a8ee65e 100644 --- a/Source/WebKit2/PluginProcess/WebProcessConnection.cpp +++ b/Source/WebKit2/PluginProcess/WebProcessConnection.cpp @@ -30,7 +30,6 @@ #include "ActivityAssertion.h" #include "ArgumentCoders.h" -#include "ConnectionStack.h" #include "NPObjectMessageReceiverMessages.h" #include "NPRemoteObjectMap.h" #include "PluginControllerProxy.h" @@ -40,15 +39,17 @@ #include "PluginProxyMessages.h" #include "WebProcessConnectionMessages.h" #include <unistd.h> -#include <wtf/RunLoop.h> +#include <wtf/SetForScope.h> using namespace WebCore; namespace WebKit { -PassRefPtr<WebProcessConnection> WebProcessConnection::create(IPC::Connection::Identifier connectionIdentifier) +static IPC::Connection* currentConnection; + +RefPtr<WebProcessConnection> WebProcessConnection::create(IPC::Connection::Identifier connectionIdentifier) { - return adoptRef(new WebProcessConnection(connectionIdentifier)); + return adoptRef(*new WebProcessConnection(connectionIdentifier)); } WebProcessConnection::~WebProcessConnection() @@ -60,7 +61,7 @@ WebProcessConnection::~WebProcessConnection() WebProcessConnection::WebProcessConnection(IPC::Connection::Identifier connectionIdentifier) { - m_connection = IPC::Connection::createServerConnection(connectionIdentifier, this, RunLoop::main()); + m_connection = IPC::Connection::createServerConnection(connectionIdentifier, *this); m_npRemoteObjectMap = NPRemoteObjectMap::create(m_connection.get()); m_connection->setOnlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage(true); @@ -72,7 +73,7 @@ void WebProcessConnection::addPluginControllerProxy(std::unique_ptr<PluginContro uint64_t pluginInstanceID = pluginController->pluginInstanceID(); ASSERT(!m_pluginControllers.contains(pluginInstanceID)); - m_pluginControllers.set(pluginInstanceID, std::move(pluginController)); + m_pluginControllers.set(pluginInstanceID, WTFMove(pluginController)); } void WebProcessConnection::destroyPluginControllerProxy(PluginControllerProxy* pluginController) @@ -84,10 +85,11 @@ void WebProcessConnection::destroyPluginControllerProxy(PluginControllerProxy* p void WebProcessConnection::removePluginControllerProxy(PluginControllerProxy* pluginController, Plugin* plugin) { + unsigned pluginInstanceID = pluginController->pluginInstanceID(); { - ASSERT(m_pluginControllers.contains(pluginController->pluginInstanceID())); + ASSERT(m_pluginControllers.contains(pluginInstanceID)); - std::unique_ptr<PluginControllerProxy> pluginControllerUniquePtr = m_pluginControllers.take(pluginController->pluginInstanceID()); + std::unique_ptr<PluginControllerProxy> pluginControllerUniquePtr = m_pluginControllers.take(pluginInstanceID); ASSERT(pluginControllerUniquePtr.get() == pluginController); } @@ -105,21 +107,20 @@ void WebProcessConnection::removePluginControllerProxy(PluginControllerProxy* pl m_connection = nullptr; // This will cause us to be deleted. - PluginProcess::shared().removeWebProcessConnection(this); + PluginProcess::singleton().removeWebProcessConnection(this); } void WebProcessConnection::setGlobalException(const String& exceptionString) { - IPC::Connection* connection = ConnectionStack::shared().current(); - if (!connection) + if (!currentConnection) return; - connection->sendSync(Messages::PluginProcessConnection::SetException(exceptionString), Messages::PluginProcessConnection::SetException::Reply(), 0); + currentConnection->sendSync(Messages::PluginProcessConnection::SetException(exceptionString), Messages::PluginProcessConnection::SetException::Reply(), 0); } -void WebProcessConnection::didReceiveMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder) +void WebProcessConnection::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder) { - ConnectionStack::CurrentConnectionPusher currentConnection(ConnectionStack::shared(), connection); + SetForScope<IPC::Connection*> currentConnectionChange(currentConnection, &connection); if (decoder.messageReceiverName() == Messages::WebProcessConnection::messageReceiverName()) { didReceiveWebProcessConnectionMessage(connection, decoder); @@ -139,12 +140,9 @@ void WebProcessConnection::didReceiveMessage(IPC::Connection* connection, IPC::M pluginControllerProxy->didReceivePluginControllerProxyMessage(connection, decoder); } -void WebProcessConnection::didReceiveSyncMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder, std::unique_ptr<IPC::MessageEncoder>& replyEncoder) +void WebProcessConnection::didReceiveSyncMessage(IPC::Connection& connection, IPC::Decoder& decoder, std::unique_ptr<IPC::Encoder>& replyEncoder) { - // Force all timers to run at full speed when processing a synchronous message - ActivityAssertion activityAssertion(PluginProcess::shared()); - - ConnectionStack::CurrentConnectionPusher currentConnection(ConnectionStack::shared(), connection); + SetForScope<IPC::Connection*> currentConnectionChange(currentConnection, &connection); uint64_t destinationID = decoder.destinationID(); @@ -166,7 +164,7 @@ void WebProcessConnection::didReceiveSyncMessage(IPC::Connection* connection, IP pluginControllerProxy->didReceiveSyncPluginControllerProxyMessage(connection, decoder, replyEncoder); } -void WebProcessConnection::didClose(IPC::Connection*) +void WebProcessConnection::didClose(IPC::Connection&) { // The web process crashed. Destroy all the plug-in controllers. Destroying the last plug-in controller // will cause the web process connection itself to be destroyed. @@ -178,10 +176,14 @@ void WebProcessConnection::didClose(IPC::Connection*) destroyPluginControllerProxy(pluginControllers[i]); } -void WebProcessConnection::destroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete) +void WebProcessConnection::destroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete, PassRefPtr<Messages::WebProcessConnection::DestroyPlugin::DelayedReply> reply) { + // We return immediately from this synchronous IPC. We want to make sure the plugin destruction is just about to start so audio playback + // will finish soon after returning. However we don't want to wait for destruction to complete fully as that may take a while. + reply->send(); + // Ensure we don't clamp any timers during destruction - ActivityAssertion activityAssertion(PluginProcess::shared()); + ActivityAssertion activityAssertion(PluginProcess::singleton().connectionActivity()); PluginControllerProxy* pluginControllerProxy = m_pluginControllers.get(pluginInstanceID); @@ -198,7 +200,7 @@ void WebProcessConnection::destroyPlugin(uint64_t pluginInstanceID, bool asynchr destroyPluginControllerProxy(pluginControllerProxy); } -void WebProcessConnection::didReceiveInvalidMessage(IPC::Connection*, IPC::StringReference, IPC::StringReference) +void WebProcessConnection::didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference, IPC::StringReference) { // FIXME: Implement. } @@ -211,7 +213,7 @@ void WebProcessConnection::createPluginInternal(const PluginCreationParameters& // Make sure to add the proxy to the map before initializing it, since the plug-in might call out to the web process from // its NPP_New function. This will hand over ownership of the proxy to the web process connection. - addPluginControllerProxy(std::move(pluginControllerProxy)); + addPluginControllerProxy(WTFMove(pluginControllerProxy)); // Now try to initialize the plug-in. result = pluginControllerProxyPtr->initialize(creationParameters); @@ -220,7 +222,7 @@ void WebProcessConnection::createPluginInternal(const PluginCreationParameters& return; wantsWheelEvents = pluginControllerProxyPtr->wantsWheelEvents(); -#if PLATFORM(MAC) +#if PLATFORM(COCOA) remoteLayerClientID = pluginControllerProxyPtr->remoteLayerClientID(); #else UNUSED_PARAM(remoteLayerClientID); @@ -230,7 +232,7 @@ void WebProcessConnection::createPluginInternal(const PluginCreationParameters& void WebProcessConnection::createPlugin(const PluginCreationParameters& creationParameters, PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> reply) { // Ensure we don't clamp any timers during initialization - ActivityAssertion activityAssertion(PluginProcess::shared()); + ActivityAssertion activityAssertion(PluginProcess::singleton().connectionActivity()); PluginControllerProxy* pluginControllerProxy = m_pluginControllers.get(creationParameters.pluginInstanceID); @@ -243,7 +245,7 @@ void WebProcessConnection::createPlugin(const PluginCreationParameters& creation } // If its initialization is complete then we need to respond to this message with the correct information about its creation. -#if PLATFORM(MAC) +#if PLATFORM(COCOA) reply->send(true, pluginControllerProxy->wantsWheelEvents(), pluginControllerProxy->remoteLayerClientID()); #else reply->send(true, pluginControllerProxy->wantsWheelEvents(), 0); @@ -319,7 +321,7 @@ void WebProcessConnection::createPluginAsynchronously(const PluginCreationParame m_connection->sendSync(Messages::PluginProxy::DidCreatePlugin(wantsWheelEvents, remoteLayerClientID), Messages::PluginProxy::DidCreatePlugin::Reply(), creationParameters.pluginInstanceID); } - + } // namespace WebKit #endif // ENABLE(NETSCAPE_PLUGIN_API) diff --git a/Source/WebKit2/PluginProcess/WebProcessConnection.h b/Source/WebKit2/PluginProcess/WebProcessConnection.h index f7b92c6e4..3f7c90379 100644 --- a/Source/WebKit2/PluginProcess/WebProcessConnection.h +++ b/Source/WebKit2/PluginProcess/WebProcessConnection.h @@ -44,7 +44,7 @@ struct PluginCreationParameters; class WebProcessConnection : public RefCounted<WebProcessConnection>, IPC::Connection::Client { public: - static PassRefPtr<WebProcessConnection> create(IPC::Connection::Identifier); + static RefPtr<WebProcessConnection> create(IPC::Connection::Identifier); virtual ~WebProcessConnection(); IPC::Connection* connection() const { return m_connection.get(); } @@ -53,7 +53,7 @@ public: void removePluginControllerProxy(PluginControllerProxy*, Plugin*); static void setGlobalException(const String&); - + private: WebProcessConnection(IPC::Connection::Identifier); @@ -62,17 +62,17 @@ private: void destroyPluginControllerProxy(PluginControllerProxy*); // IPC::Connection::Client - virtual void didReceiveMessage(IPC::Connection*, IPC::MessageDecoder&) override; - virtual void didReceiveSyncMessage(IPC::Connection*, IPC::MessageDecoder&, std::unique_ptr<IPC::MessageEncoder>&) override; - virtual void didClose(IPC::Connection*); - virtual void didReceiveInvalidMessage(IPC::Connection*, IPC::StringReference messageReceiverName, IPC::StringReference messageName); + void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override; + void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override; + void didClose(IPC::Connection&) override; + void didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference messageReceiverName, IPC::StringReference messageName) override; // Message handlers. - void didReceiveWebProcessConnectionMessage(IPC::Connection*, IPC::MessageDecoder&); - void didReceiveSyncWebProcessConnectionMessage(IPC::Connection*, IPC::MessageDecoder&, std::unique_ptr<IPC::MessageEncoder>&); + void didReceiveWebProcessConnectionMessage(IPC::Connection&, IPC::Decoder&); + void didReceiveSyncWebProcessConnectionMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&); void createPlugin(const PluginCreationParameters&, PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply>); void createPluginAsynchronously(const PluginCreationParameters&); - void destroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete); + void destroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete, PassRefPtr<Messages::WebProcessConnection::DestroyPlugin::DelayedReply>); void createPluginInternal(const PluginCreationParameters&, bool& result, bool& wantsWheelEvents, uint32_t& remoteLayerClientID); diff --git a/Source/WebKit2/PluginProcess/WebProcessConnection.messages.in b/Source/WebKit2/PluginProcess/WebProcessConnection.messages.in index 985b2a596..ece24e844 100644 --- a/Source/WebKit2/PluginProcess/WebProcessConnection.messages.in +++ b/Source/WebKit2/PluginProcess/WebProcessConnection.messages.in @@ -24,13 +24,13 @@ messages -> WebProcessConnection LegacyReceiver { # Creates a plug-in instance using the given creation parameters. - CreatePlugin(WebKit::PluginCreationParameters pluginCreationParameters) -> (bool creationResult, bool wantsWheelEvents, uint32_t remoteLayerClientID) Delayed + CreatePlugin(struct WebKit::PluginCreationParameters pluginCreationParameters) -> (bool creationResult, bool wantsWheelEvents, uint32_t remoteLayerClientID) Delayed # Creates a plug-in instance asynchronously using the given creation parameters. - CreatePluginAsynchronously(WebKit::PluginCreationParameters pluginCreationParameters) + CreatePluginAsynchronously(struct WebKit::PluginCreationParameters pluginCreationParameters) # Destroys the plug-in instance with the given instance ID. - DestroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete) -> () + DestroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete) -> () Delayed } #endif diff --git a/Source/WebKit2/PluginProcess/unix/PluginControllerProxyUnix.cpp b/Source/WebKit2/PluginProcess/unix/PluginControllerProxyUnix.cpp index cbcc1d730..f567a66b1 100644 --- a/Source/WebKit2/PluginProcess/unix/PluginControllerProxyUnix.cpp +++ b/Source/WebKit2/PluginProcess/unix/PluginControllerProxyUnix.cpp @@ -26,7 +26,7 @@ #include "config.h" #include "PluginControllerProxy.h" -#if ENABLE(PLUGIN_PROCESS) +#if ENABLE(NETSCAPE_PLUGIN_API) #include <WebCore/NotImplemented.h> @@ -51,4 +51,4 @@ void PluginControllerProxy::platformGeometryDidChange() } // namespace WebKit -#endif // ENABLE(PLUGIN_PROCESS) +#endif // ENABLE(NETSCAPE_PLUGIN_API) diff --git a/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp b/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp index 6a4c26ef2..02a816b27 100644 --- a/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp +++ b/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Igalia S.L. + * Copyright (C) 2011, 2014 Igalia S.L. * Copyright (C) 2011 Apple Inc. * Copyright (C) 2012 Samsung Electronics * @@ -30,96 +30,67 @@ #if ENABLE(PLUGIN_PROCESS) +#include "ChildProcessMain.h" #include "Logging.h" #include "NetscapePlugin.h" #include "PluginProcess.h" -#include "WebKit2Initialize.h" -#include <libgen.h> -#include <wtf/RunLoop.h> +#include <WebCore/FileSystem.h> +#include <stdlib.h> + #if PLATFORM(GTK) #include <gtk/gtk.h> -#if PLATFORM(X11) && defined(GDK_WINDOWING_X11) -#include <gdk/gdkx.h> -#endif -#elif PLATFORM(EFL) && HAVE_ECORE_X -#include <Ecore_X.h> #endif -using namespace WebCore; +#if defined(XP_UNIX) +#include <WebCore/PlatformDisplayX11.h> +#include <WebCore/XErrorTrapper.h> +#endif namespace WebKit { -#ifdef XP_UNIX - -#if !LOG_DISABLED -static const char xErrorString[] = "The program '%s' received an X Window System error.\n" - "This probably reflects a bug in a browser plugin.\n" - "The error was '%s'.\n" - " (Details: serial %ld error_code %d request_code %d minor_code %d)\n"; -#endif /* !LOG_DISABLED */ - -static char* programName = 0; - -static int webkitXError(Display* xdisplay, XErrorEvent* error) -{ - char errorMessage[64]; - XGetErrorText(xdisplay, error->error_code, errorMessage, 63); - - LOG(Plugins, xErrorString, - programName, errorMessage, - error->serial, error->error_code, - error->request_code, error->minor_code); - - return 0; -} -#endif - -WK_EXPORT int PluginProcessMainUnix(int argc, char* argv[]) -{ -#if PLUGIN_ARCHITECTURE(X11) - bool scanPlugin = !strcmp(argv[1], "-scanPlugin"); -#endif - ASSERT_UNUSED(argc, argc == 3); +#if defined(XP_UNIX) +static std::unique_ptr<WebCore::XErrorTrapper> xErrorTrapper; +#endif // XP_UNIX +class PluginProcessMain final: public ChildProcessMainBase { +public: + bool platformInitialize() override + { #if PLATFORM(GTK) - gtk_init(&argc, &argv); -#elif PLATFORM(EFL) -#ifdef HAVE_ECORE_X - if (!ecore_x_init(0)) -#endif - return 1; + gtk_init(nullptr, nullptr); #endif - InitializeWebKit2(); + return true; + } + + bool parseCommandLine(int argc, char** argv) override + { + ASSERT(argc == 3); + if (argc != 3) + return false; + if (!strcmp(argv[1], "-scanPlugin")) #if PLUGIN_ARCHITECTURE(X11) - if (scanPlugin) { - String pluginPath(argv[2]); - if (!NetscapePluginModule::scanPlugin(pluginPath)) - return EXIT_FAILURE; - return EXIT_SUCCESS; - } + exit(NetscapePluginModule::scanPlugin(argv[2]) ? EXIT_SUCCESS : EXIT_FAILURE); +#else + exit(EXIT_FAILURE); #endif - // Plugins can produce X errors that are handled by the GDK X error handler, which - // exits the process. Since we don't want to crash due to plugin bugs, we install a - // custom error handler to show a warning when a X error happens without aborting. #if defined(XP_UNIX) - programName = basename(argv[0]); - XSetErrorHandler(webkitXError); + if (WebCore::PlatformDisplay::sharedDisplay().type() == WebCore::PlatformDisplay::Type::X11) { + auto* display = downcast<WebCore::PlatformDisplayX11>(WebCore::PlatformDisplay::sharedDisplay()).native(); + xErrorTrapper = std::make_unique<WebCore::XErrorTrapper>(display, WebCore::XErrorTrapper::Policy::Warn); + } #endif - int socket = atoi(argv[1]); - - WebKit::ChildProcessInitializationParameters parameters; - parameters.connectionIdentifier = socket; - parameters.extraInitializationData.add("plugin-path", argv[2]); - - WebKit::PluginProcess::shared().initialize(parameters); - - RunLoop::run(); + m_parameters.extraInitializationData.add("plugin-path", argv[2]); + return ChildProcessMainBase::parseCommandLine(argc, argv); + } +}; - return 0; +int PluginProcessMainUnix(int argc, char** argv) +{ + return ChildProcessMain<PluginProcess, PluginProcessMain>(argc, argv); } } // namespace WebKit diff --git a/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.h b/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.h index 540c596aa..f79c1d26c 100644 --- a/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.h +++ b/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.h @@ -27,16 +27,14 @@ #ifndef PluginProcessMainUnix_h #define PluginProcessMainUnix_h -#include <WebKit2/WKBase.h> +#include <WebKit/WKBase.h> namespace WebKit { -#ifdef __cplusplus extern "C" { -WK_EXPORT int PluginProcessMainUnix(int argc, char* argv[]); -} // extern "C" -#endif // __cplusplus +WK_EXPORT int PluginProcessMainUnix(int argc, char** argv); +} } // namespace WebKit -#endif // PluginProcessMain_h +#endif // PluginProcessMainUnix_h diff --git a/Source/WebKit2/PluginProcess/unix/PluginProcessUnix.cpp b/Source/WebKit2/PluginProcess/unix/PluginProcessUnix.cpp index 43eb8848b..c6eb49df4 100644 --- a/Source/WebKit2/PluginProcess/unix/PluginProcessUnix.cpp +++ b/Source/WebKit2/PluginProcess/unix/PluginProcessUnix.cpp @@ -37,7 +37,7 @@ void PluginProcess::platformInitializeProcess(const ChildProcessInitializationPa { } -void PluginProcess::platformInitializePluginProcess(const PluginProcessCreationParameters&) +void PluginProcess::platformInitializePluginProcess(PluginProcessCreationParameters&&) { notImplemented(); } |