| 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);
 | 
| 
 |