| Index: chrome/plugin/plugin_main.cc
|
| ===================================================================
|
| --- chrome/plugin/plugin_main.cc (revision 20445)
|
| +++ chrome/plugin/plugin_main.cc (working copy)
|
| @@ -27,6 +27,47 @@
|
| #include "base/global_descriptors_posix.h"
|
| #endif
|
|
|
| +#if defined(OS_MACOSX)
|
| +
|
| +// To support Mac NPAPI plugins that use the Carbon event model (i.e., most
|
| +// shipping plugins for MacOS X 10.5 and earlier), we need some way for the
|
| +// Carbon event dispatcher to run, even though the plugin host process itself
|
| +// does not use Carbon events. Rather than give control to the standard
|
| +// Carbon event loop, we schedule a periodic task on the main thread which
|
| +// empties the Carbon event queue every 20ms (chosen to match how often Safari
|
| +// does the equivalent operation). This allows plugins to receive idle events
|
| +// and schedule Carbon timers without swamping the CPU. If, in the future,
|
| +// we remove support for the Carbon event model and only support the Cocoa
|
| +// event model, this can be removed. Note that this approach does not install
|
| +// standard application event handlers for the menubar, AppleEvents, and so on.
|
| +// This is intentional, since the plugin process is not actually an application
|
| +// with its own UI elements--all rendering and event handling happens via IPC
|
| +// to the renderer process which invoked it.
|
| +
|
| +namespace {
|
| +
|
| +const int kPluginUpdateIntervalMs = 20; // 20ms = 50Hz
|
| +
|
| +void PluginCarbonEventTask() {
|
| + EventRef theEvent;
|
| + EventTargetRef theTarget;
|
| +
|
| + theTarget = GetEventDispatcherTarget();
|
| +
|
| + // Dispatch any pending events. but do not block if there are no events.
|
| + while (ReceiveNextEvent(0, NULL, kEventDurationNoWait,
|
| + true, &theEvent) == noErr) {
|
| + SendEventToEventTarget (theEvent, theTarget);
|
| + ReleaseEvent(theEvent);
|
| + }
|
| +
|
| + MessageLoop::current()->PostDelayedTask(FROM_HERE,
|
| + NewRunnableFunction(PluginCarbonEventTask), kPluginUpdateIntervalMs);
|
| +}
|
| +
|
| +}
|
| +#endif
|
| +
|
| // main() routine for running as the plugin process.
|
| int PluginMain(const MainFunctionParams& parameters) {
|
| // The main thread of the plugin services IO.
|
| @@ -37,9 +78,9 @@
|
| // Initialize the SystemMonitor
|
| base::SystemMonitor::Start();
|
|
|
| -#if defined(OS_WIN)
|
| const CommandLine& parsed_command_line = parameters.command_line_;
|
|
|
| +#if defined(OS_WIN)
|
| sandbox::TargetServices* target_services =
|
| parameters.sandbox_info_.TargetServices();
|
|
|
| @@ -59,17 +100,33 @@
|
| DCHECK(sandbox_test_module);
|
| }
|
| }
|
| -
|
| +#endif
|
| if (parsed_command_line.HasSwitch(switches::kPluginStartupDialog)) {
|
| +#if defined(OS_WIN)
|
| std::wstring title = chrome::kBrowserAppName;
|
| title += L" plugin"; // makes attaching to process easier
|
| win_util::MessageBox(NULL, L"plugin starting...", title,
|
| MB_OK | MB_SETFOREGROUND);
|
| - }
|
| +#elif defined(OS_MACOSX)
|
| + // TODO(playmobil): In the long term, overriding this flag doesn't seem
|
| + // right, either use our own flag or open a dialog we can use.
|
| + // This is just to ease debugging in the interim.
|
| + LOG(WARNING) << "Plugin ("
|
| + << getpid()
|
| + << ") paused waiting for debugger to attach @ pid";
|
| + pause();
|
| #else
|
| NOTIMPLEMENTED() << " non-windows startup, plugin startup dialog etc.";
|
| #endif
|
| + }
|
|
|
| +#if defined(OS_MACOSX)
|
| + // Spin off a consumer for the native (Carbon) event stream so
|
| + // that plugin timers, event handlers, etc. will work properly.
|
| + MessageLoop::current()->PostDelayedTask(FROM_HERE,
|
| + NewRunnableFunction(PluginCarbonEventTask), kPluginUpdateIntervalMs);
|
| +#endif
|
| +
|
| {
|
| ChildProcess plugin_process(new PluginThread());
|
| #if defined(OS_WIN)
|
|
|