Diff
Modified: branches/safari-537.43-branch/Source/WebKit2/ChangeLog (150648 => 150649)
--- branches/safari-537.43-branch/Source/WebKit2/ChangeLog 2013-05-24 18:09:09 UTC (rev 150648)
+++ branches/safari-537.43-branch/Source/WebKit2/ChangeLog 2013-05-24 18:42:31 UTC (rev 150649)
@@ -1,3 +1,42 @@
+2013-05-24 Lucas Forschler <lforsch...@apple.com>
+
+ Merge r150620
+
+ 2013-05-23 Anders Carlsson <ander...@apple.com>
+
+ Shim Flash plug-in to allow its updater to run
+ https://bugs.webkit.org/show_bug.cgi?id=116692
+ <rdar://problem/13938510>
+
+ Reviewed by Sam Weinig.
+
+ * PluginProcess/PluginProcess.h:
+ * PluginProcess/mac/PluginProcessMac.mm:
+ (WebKit::replacedNSConcreteTask_launch):
+ (WebKit::initializeCocoaOverrides):
+ Patch -[NSConcreteTask launch] to call PluginProcess::launchProcess.
+
+ (WebKit::PluginProcess::launchProcess):
+ Send a LaunchProcess message to the UI process.
+
+ * UIProcess/Plugins/PluginProcessProxy.cpp:
+ * UIProcess/Plugins/PluginProcessProxy.h:
+ Remove PluginProcessProxy::didReceiveMessage.
+
+ (PluginProcessProxy):
+ * UIProcess/Plugins/PluginProcessProxy.messages.in:
+ Add LaunchProcess message and remove LegacyReceiver attribute.
+
+ * UIProcess/Plugins/mac/PluginProcessProxyMac.mm:
+ (WebKit::isFlashUpdater):
+ Helper function to determine whether the process is the flash updater.
+
+ (WebKit::shouldLaunchProcess):
+ Return whether we should launch this process.
+
+ (WebKit::PluginProcessProxy::launchProcess):
+ Determine if we should launch this process and then do so.
+
2013-05-23 Lucas Forschler <lforsch...@apple.com>
Merge r150610
Modified: branches/safari-537.43-branch/Source/WebKit2/PluginProcess/PluginProcess.h (150648 => 150649)
--- branches/safari-537.43-branch/Source/WebKit2/PluginProcess/PluginProcess.h 2013-05-24 18:09:09 UTC (rev 150648)
+++ branches/safari-537.43-branch/Source/WebKit2/PluginProcess/PluginProcess.h 2013-05-24 18:42:31 UTC (rev 150649)
@@ -56,6 +56,8 @@
#if USE(ACCELERATED_COMPOSITING)
mach_port_t compositingRenderServerPort() const { return m_compositingRenderServerPort; }
#endif
+
+ bool launchProcess(const String& launchPath, const Vector<String>& arguments);
#endif
private:
Modified: branches/safari-537.43-branch/Source/WebKit2/PluginProcess/mac/PluginProcessMac.mm (150648 => 150649)
--- branches/safari-537.43-branch/Source/WebKit2/PluginProcess/mac/PluginProcessMac.mm 2013-05-24 18:09:09 UTC (rev 150648)
+++ branches/safari-537.43-branch/Source/WebKit2/PluginProcess/mac/PluginProcessMac.mm 2013-05-24 18:42:31 UTC (rev 150649)
@@ -29,6 +29,7 @@
#if ENABLE(PLUGIN_PROCESS)
+#import "ArgumentCoders.h"
#import "NetscapePlugin.h"
#import "PluginProcessCreationParameters.h"
#import "PluginProcessProxyMessages.h"
@@ -249,8 +250,30 @@
}
#endif
+static IMP NSConcreteTask_launch;
+
+static void replacedNSConcreteTask_launch(NSTask *self, SEL _cmd)
+{
+ String launchPath = self.launchPath;
+
+ Vector<String> arguments;
+ arguments.reserveInitialCapacity(self.arguments.count);
+ for (NSString *argument in self.arguments)
+ arguments.uncheckedAppend(argument);
+
+ if (PluginProcess::shared().launchProcess(launchPath, arguments))
+ return;
+
+ NSConcreteTask_launch(self, _cmd);
+}
+
static void initializeCocoaOverrides()
{
+ // Override -[NSConcreteTask launch:]
+ Method launchMethod = class_getInstanceMethod(objc_getClass("NSConcreteTask"), @selector(launch));
+
+ NSConcreteTask_launch = method_setImplementation(launchMethod, reinterpret_cast<IMP>(replacedNSConcreteTask_launch));
+
// Override -[NSApplication runModalForWindow:]
Method runModalForWindowMethod = class_getInstanceMethod(objc_getClass("NSApplication"), @selector(runModalForWindow:));
NSApplication_RunModalForWindow = method_setImplementation(runModalForWindowMethod, reinterpret_cast<IMP>(replacedRunModalForWindow));
@@ -283,6 +306,15 @@
parentProcessConnection()->send(Messages::PluginProcessProxy::SetFullscreenWindowIsShowing(fullscreenWindowIsShowing), 0);
}
+bool PluginProcess::launchProcess(const String& launchPath, const Vector<String>& arguments)
+{
+ bool result;
+ if (!parentProcessConnection()->sendSync(Messages::PluginProcessProxy::LaunchProcess(launchPath, arguments), Messages::PluginProcessProxy::LaunchProcess::Reply(result), 0))
+ return false;
+
+ return result;
+}
+
static void muteAudio(void)
{
AudioObjectPropertyAddress propertyAddress = { kAudioHardwarePropertyProcessIsAudible, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster };
Modified: branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp (150648 => 150649)
--- branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp 2013-05-24 18:09:09 UTC (rev 150648)
+++ branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp 2013-05-24 18:42:31 UTC (rev 150649)
@@ -156,11 +156,6 @@
m_pluginProcessManager->removePluginProcessProxy(this);
}
-void PluginProcessProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageDecoder& decoder)
-{
- didReceivePluginProcessProxyMessage(connection, decoder);
-}
-
void PluginProcessProxy::didClose(CoreIPC::Connection*)
{
#if PLATFORM(MAC)
Modified: branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.h (150648 => 150649)
--- branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.h 2013-05-24 18:09:09 UTC (rev 150648)
+++ branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.h 2013-05-24 18:42:31 UTC (rev 150649)
@@ -107,6 +107,8 @@
// CoreIPC::Connection::Client
virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder&) OVERRIDE;
+ virtual void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder&, OwnPtr<CoreIPC::MessageEncoder>&) OVERRIDE;
+
virtual void didClose(CoreIPC::Connection*) OVERRIDE;
virtual void didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::StringReference messageReceiverName, CoreIPC::StringReference messageName) OVERRIDE;
@@ -114,7 +116,6 @@
virtual void didFinishLaunching(ProcessLauncher*, CoreIPC::Connection::Identifier);
// Message handlers
- void didReceivePluginProcessProxyMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder&);
void didCreateWebProcessConnection(const CoreIPC::Attachment&, bool supportsAsynchronousPluginInitialization);
void didGetSitesWithData(const Vector<String>& sites, uint64_t callbackID);
void didClearSiteData(uint64_t callbackID);
@@ -134,6 +135,7 @@
void applicationDidBecomeActive();
void openPluginPreferencePane();
+ void launchProcess(const String& launchPath, const Vector<String>& arguments, bool& result);
#endif
void platformInitializePluginProcess(PluginProcessCreationParameters& parameters);
Modified: branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.messages.in (150648 => 150649)
--- branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.messages.in 2013-05-24 18:09:09 UTC (rev 150648)
+++ branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.messages.in 2013-05-24 18:42:31 UTC (rev 150649)
@@ -22,7 +22,7 @@
#if ENABLE(PLUGIN_PROCESS)
-messages -> PluginProcessProxy LegacyReceiver {
+messages -> PluginProcessProxy {
DidCreateWebProcessConnection(CoreIPC::Attachment connectionIdentifier, bool supportsAsynchronousPluginInitialization)
DidGetSitesWithData(Vector<WTF::String> sites, uint64_t callbackID)
@@ -34,6 +34,9 @@
# Open the plug-ins preference pane (as specified in the plug-in's Info.plist file).
OpenPluginPreferencePane()
+
+ # Returns true if the UI process launched the process.
+ LaunchProcess(WTF::String launchPath, Vector<WTF::String> arguments) -> (bool result)
#endif
}
Modified: branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/mac/PluginProcessProxyMac.mm (150648 => 150649)
--- branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/mac/PluginProcessProxyMac.mm 2013-05-24 18:09:09 UTC (rev 150648)
+++ branches/safari-537.43-branch/Source/WebKit2/UIProcess/Plugins/mac/PluginProcessProxyMac.mm 2013-05-24 18:42:31 UTC (rev 150649)
@@ -358,6 +358,44 @@
LOG_ERROR("LSOpenFromURLSpec to open \"%@\" failed with error %d.", (NSString *)m_pluginProcessAttributes.moduleInfo.preferencePanePath, error);
}
+static bool isFlashUpdater(const String& launchPath, const Vector<String>& arguments)
+{
+ if (launchPath != "/Applications/Utilities/Adobe Flash Player Install Manager.app/Contents/MacOS/Adobe Flash Player Install Manager")
+ return false;
+
+ if (arguments.size() != 1)
+ return false;
+
+ if (arguments[0] != "-update")
+ return false;
+
+ return true;
+}
+
+static bool shouldLaunchProcess(const PluginProcessAttributes& pluginProcessAttributes, const String& launchPath, const Vector<String>& arguments)
+{
+ if (pluginProcessAttributes.moduleInfo.bundleIdentifier == "com.macromedia.Flash Player.plugin")
+ return isFlashUpdater(launchPath, arguments);
+
+ return false;
+}
+
+void PluginProcessProxy::launchProcess(const String& launchPath, const Vector<String>& arguments, bool& result)
+{
+ if (!shouldLaunchProcess(m_pluginProcessAttributes, launchPath, arguments)) {
+ result = false;
+ return;
+ }
+
+ result = true;
+
+ RetainPtr<NSMutableArray> argumentsArray = adoptNS([[NSMutableArray alloc] initWithCapacity:arguments.size()]);
+ for (size_t i = 0; i < arguments.size(); ++i)
+ [argumentsArray addObject:(NSString *)arguments[i]];
+
+ [NSTask launchedTaskWithLaunchPath:launchPath arguments:argumentsArray.get()];
+}
+
} // namespace WebKit
#endif // ENABLE(PLUGIN_PROCESS)