Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(435)

Side by Side Diff: chrome/browser/plugin_process_host.cc

Issue 18082: Improve scrolling performance when there are many windowed plugins in a page.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Call DestroyWindow on the right thread & ensure NPP_SetWindow is called right away Created 11 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/plugin_process_host.h" 5 #include "chrome/browser/plugin_process_host.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 339
340 private: 340 private:
341 // |plugin_host_| is only valid if !this->revoked(). 341 // |plugin_host_| is only valid if !this->revoked().
342 PluginProcessHost* plugin_host_; 342 PluginProcessHost* plugin_host_;
343 IPC::Message* reply_msg_; 343 IPC::Message* reply_msg_;
344 net::CompletionCallbackImpl<PluginResolveProxyHelper> callback_; 344 net::CompletionCallbackImpl<PluginResolveProxyHelper> callback_;
345 net::ProxyInfo proxy_info_; 345 net::ProxyInfo proxy_info_;
346 }; 346 };
347 347
348 348
349 // Sends the reply to the create window message on the IO thread.
350 class SendReplyTask : public Task {
351 public:
352 SendReplyTask(FilePath plugin_path, IPC::Message* reply_msg)
353 : plugin_path_(plugin_path), reply_msg_(reply_msg) { }
354
355 virtual void Run() {
356 PluginProcessHost* plugin =
357 PluginService::GetInstance()->FindPluginProcess(plugin_path_);
358 if (!plugin)
359 return;
360
361 plugin->Send(reply_msg_);
362 }
363
364 private:
365 FilePath plugin_path_;
366 IPC::Message* reply_msg_;
367 };
368
369
370 // Creates a child window of the given HWND on the UI thread.
371 class CreateWindowTask : public Task {
372 public:
373 CreateWindowTask(
374 FilePath plugin_path, HWND parent, IPC::Message* reply_msg)
375 : plugin_path_(plugin_path), parent_(parent), reply_msg_(reply_msg) { }
376
377 virtual void Run() {
378 static ATOM window_class = 0;
379 if (!window_class) {
380 WNDCLASSEX wcex;
381 wcex.cbSize = sizeof(WNDCLASSEX);
382 wcex.style = CS_DBLCLKS;
383 wcex.lpfnWndProc = DefWindowProc;
384 wcex.cbClsExtra = 0;
385 wcex.cbWndExtra = 0;
386 wcex.hInstance = GetModuleHandle(NULL);
387 wcex.hIcon = 0;
388 wcex.hCursor = 0;
389 wcex.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW+1);
390 wcex.lpszMenuName = 0;
391 wcex.lpszClassName = L"NativeWindowClassWrapper";
392 wcex.hIconSm = 0;
393 window_class = RegisterClassEx(&wcex);
394 }
395
396 HWND window = CreateWindowEx(
397 WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR,
398 MAKEINTATOM(window_class), 0,
399 WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
400 0, 0, 0, 0, parent_, 0, GetModuleHandle(NULL), 0);
401
402 PluginProcessHostMsg_CreateWindow::WriteReplyParams(
403 reply_msg_, window);
404
405 g_browser_process->io_thread()->message_loop()->PostTask(
406 FROM_HERE, new SendReplyTask(plugin_path_, reply_msg_));
407 }
408
409 private:
410 FilePath plugin_path_;
411 HWND parent_;
412 IPC::Message* reply_msg_;
413 };
414
415 // Destroys the given window on the UI thread.
416 class DestroyWindowTask : public Task {
417 public:
418 DestroyWindowTask(HWND window) : window_(window) { }
419
420 virtual void Run() {
421 DestroyWindow(window_);
422 }
423
424 private:
425 HWND window_;
426 };
427
428
349 PluginProcessHost::PluginProcessHost(PluginService* plugin_service) 429 PluginProcessHost::PluginProcessHost(PluginService* plugin_service)
350 : process_(NULL), 430 : process_(NULL),
351 opening_channel_(false), 431 opening_channel_(false),
352 resource_dispatcher_host_(plugin_service->resource_dispatcher_host()), 432 resource_dispatcher_host_(plugin_service->resource_dispatcher_host()),
353 plugin_service_(plugin_service) { 433 plugin_service_(plugin_service) {
354 DCHECK(resource_dispatcher_host_); 434 DCHECK(resource_dispatcher_host_);
355 } 435 }
356 436
357 PluginProcessHost::~PluginProcessHost() { 437 PluginProcessHost::~PluginProcessHost() {
358 if (process_.handle()) { 438 if (process_.handle()) {
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
572 IPC_MESSAGE_HANDLER(PluginProcessHostMsg_GetPluginDataDir, 652 IPC_MESSAGE_HANDLER(PluginProcessHostMsg_GetPluginDataDir,
573 OnGetPluginDataDir) 653 OnGetPluginDataDir)
574 IPC_MESSAGE_HANDLER(ViewHostMsg_RequestResource, OnRequestResource) 654 IPC_MESSAGE_HANDLER(ViewHostMsg_RequestResource, OnRequestResource)
575 IPC_MESSAGE_HANDLER(ViewHostMsg_CancelRequest, OnCancelRequest) 655 IPC_MESSAGE_HANDLER(ViewHostMsg_CancelRequest, OnCancelRequest)
576 IPC_MESSAGE_HANDLER(ViewHostMsg_DataReceived_ACK, OnDataReceivedACK) 656 IPC_MESSAGE_HANDLER(ViewHostMsg_DataReceived_ACK, OnDataReceivedACK)
577 IPC_MESSAGE_HANDLER(ViewHostMsg_UploadProgress_ACK, OnUploadProgressACK) 657 IPC_MESSAGE_HANDLER(ViewHostMsg_UploadProgress_ACK, OnUploadProgressACK)
578 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_SyncLoad, OnSyncLoad) 658 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_SyncLoad, OnSyncLoad)
579 IPC_MESSAGE_HANDLER(PluginProcessHostMsg_GetCookies, OnGetCookies) 659 IPC_MESSAGE_HANDLER(PluginProcessHostMsg_GetCookies, OnGetCookies)
580 IPC_MESSAGE_HANDLER_DELAY_REPLY(PluginProcessHostMsg_ResolveProxy, 660 IPC_MESSAGE_HANDLER_DELAY_REPLY(PluginProcessHostMsg_ResolveProxy,
581 OnResolveProxy) 661 OnResolveProxy)
662 IPC_MESSAGE_HANDLER_DELAY_REPLY(PluginProcessHostMsg_CreateWindow,
663 OnCreateWindow)
664 IPC_MESSAGE_HANDLER(PluginProcessHostMsg_DestroyWindow, OnDestroyWindow)
582 IPC_MESSAGE_UNHANDLED_ERROR() 665 IPC_MESSAGE_UNHANDLED_ERROR()
583 IPC_END_MESSAGE_MAP() 666 IPC_END_MESSAGE_MAP()
584 667
585 #ifdef IPC_MESSAGE_LOG_ENABLED 668 #ifdef IPC_MESSAGE_LOG_ENABLED
586 if (logger->Enabled()) 669 if (logger->Enabled())
587 logger->OnPostDispatchMessage(msg, channel_id_); 670 logger->OnPostDispatchMessage(msg, channel_id_);
588 #endif 671 #endif
589 } 672 }
590 673
591 void PluginProcessHost::OnChannelConnected(int32 peer_pid) { 674 void PluginProcessHost::OnChannelConnected(int32 peer_pid) {
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 void *data_ptr = const_cast<void*>(reinterpret_cast<const void*>(&data[0])); 914 void *data_ptr = const_cast<void*>(reinterpret_cast<const void*>(&data[0]));
832 uint32 data_len = static_cast<uint32>(data.size()); 915 uint32 data_len = static_cast<uint32>(data.size());
833 chrome_plugin->functions().on_message(data_ptr, data_len); 916 chrome_plugin->functions().on_message(data_ptr, data_len);
834 } 917 }
835 } 918 }
836 919
837 void PluginProcessHost::OnGetPluginDataDir(std::wstring* retval) { 920 void PluginProcessHost::OnGetPluginDataDir(std::wstring* retval) {
838 *retval = plugin_service_->GetChromePluginDataDir(); 921 *retval = plugin_service_->GetChromePluginDataDir();
839 } 922 }
840 923
924 void PluginProcessHost::OnCreateWindow(HWND parent, IPC::Message* reply_msg) {
925 // Need to create this window on the UI thread.
926 plugin_service_->main_message_loop()->PostTask(FROM_HERE,
927 new CreateWindowTask(plugin_path_, parent, reply_msg));
928 }
929
930 void PluginProcessHost::OnDestroyWindow(HWND window) {
931 plugin_service_->main_message_loop()->PostTask(FROM_HERE,
932 new DestroyWindowTask(window));
933 }
934
841 void PluginProcessHost::Shutdown() { 935 void PluginProcessHost::Shutdown() {
842 936
843 Send(new PluginProcessMsg_BrowserShutdown); 937 Send(new PluginProcessMsg_BrowserShutdown);
844 } 938 }
845 939
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698