| Index: chrome/browser/plugin_process_host.cc
|
| ===================================================================
|
| --- chrome/browser/plugin_process_host.cc (revision 8043)
|
| +++ chrome/browser/plugin_process_host.cc (working copy)
|
| @@ -346,6 +346,86 @@
|
| };
|
|
|
|
|
| +// Sends the reply to the create window message on the IO thread.
|
| +class SendReplyTask : public Task {
|
| + public:
|
| + SendReplyTask(FilePath plugin_path, IPC::Message* reply_msg)
|
| + : plugin_path_(plugin_path), reply_msg_(reply_msg) { }
|
| +
|
| + virtual void Run() {
|
| + PluginProcessHost* plugin =
|
| + PluginService::GetInstance()->FindPluginProcess(plugin_path_);
|
| + if (!plugin)
|
| + return;
|
| +
|
| + plugin->Send(reply_msg_);
|
| + }
|
| +
|
| + private:
|
| + FilePath plugin_path_;
|
| + IPC::Message* reply_msg_;
|
| +};
|
| +
|
| +
|
| +// Creates a child window of the given HWND on the UI thread.
|
| +class CreateWindowTask : public Task {
|
| + public:
|
| + CreateWindowTask(
|
| + FilePath plugin_path, HWND parent, IPC::Message* reply_msg)
|
| + : plugin_path_(plugin_path), parent_(parent), reply_msg_(reply_msg) { }
|
| +
|
| + virtual void Run() {
|
| + static ATOM window_class = 0;
|
| + if (!window_class) {
|
| + WNDCLASSEX wcex;
|
| + wcex.cbSize = sizeof(WNDCLASSEX);
|
| + wcex.style = CS_DBLCLKS;
|
| + wcex.lpfnWndProc = DefWindowProc;
|
| + wcex.cbClsExtra = 0;
|
| + wcex.cbWndExtra = 0;
|
| + wcex.hInstance = GetModuleHandle(NULL);
|
| + wcex.hIcon = 0;
|
| + wcex.hCursor = 0;
|
| + wcex.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW+1);
|
| + wcex.lpszMenuName = 0;
|
| + wcex.lpszClassName = L"NativeWindowClassWrapper";
|
| + wcex.hIconSm = 0;
|
| + window_class = RegisterClassEx(&wcex);
|
| + }
|
| +
|
| + HWND window = CreateWindowEx(
|
| + WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR,
|
| + MAKEINTATOM(window_class), 0,
|
| + WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
| + 0, 0, 0, 0, parent_, 0, GetModuleHandle(NULL), 0);
|
| +
|
| + PluginProcessHostMsg_CreateWindow::WriteReplyParams(
|
| + reply_msg_, window);
|
| +
|
| + g_browser_process->io_thread()->message_loop()->PostTask(
|
| + FROM_HERE, new SendReplyTask(plugin_path_, reply_msg_));
|
| + }
|
| +
|
| + private:
|
| + FilePath plugin_path_;
|
| + HWND parent_;
|
| + IPC::Message* reply_msg_;
|
| +};
|
| +
|
| +// Destroys the given window on the UI thread.
|
| +class DestroyWindowTask : public Task {
|
| + public:
|
| + DestroyWindowTask(HWND window) : window_(window) { }
|
| +
|
| + virtual void Run() {
|
| + DestroyWindow(window_);
|
| + }
|
| +
|
| + private:
|
| + HWND window_;
|
| +};
|
| +
|
| +
|
| PluginProcessHost::PluginProcessHost(PluginService* plugin_service)
|
| : process_(NULL),
|
| opening_channel_(false),
|
| @@ -579,6 +659,9 @@
|
| IPC_MESSAGE_HANDLER(PluginProcessHostMsg_GetCookies, OnGetCookies)
|
| IPC_MESSAGE_HANDLER_DELAY_REPLY(PluginProcessHostMsg_ResolveProxy,
|
| OnResolveProxy)
|
| + IPC_MESSAGE_HANDLER_DELAY_REPLY(PluginProcessHostMsg_CreateWindow,
|
| + OnCreateWindow)
|
| + IPC_MESSAGE_HANDLER(PluginProcessHostMsg_DestroyWindow, OnDestroyWindow)
|
| IPC_MESSAGE_UNHANDLED_ERROR()
|
| IPC_END_MESSAGE_MAP()
|
|
|
| @@ -838,6 +921,17 @@
|
| *retval = plugin_service_->GetChromePluginDataDir();
|
| }
|
|
|
| +void PluginProcessHost::OnCreateWindow(HWND parent, IPC::Message* reply_msg) {
|
| + // Need to create this window on the UI thread.
|
| + plugin_service_->main_message_loop()->PostTask(FROM_HERE,
|
| + new CreateWindowTask(plugin_path_, parent, reply_msg));
|
| +}
|
| +
|
| +void PluginProcessHost::OnDestroyWindow(HWND window) {
|
| + plugin_service_->main_message_loop()->PostTask(FROM_HERE,
|
| + new DestroyWindowTask(window));
|
| +}
|
| +
|
| void PluginProcessHost::Shutdown() {
|
|
|
| Send(new PluginProcessMsg_BrowserShutdown);
|
|
|