summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-27 16:21:25 +0000
committerananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-27 16:21:25 +0000
commit24e863243cc6e12da33425f8401f0920170d7062 (patch)
tree670fc34a9eb817605eb6bca3fda7f46fc811f43d
parent014664d1a84c416cc67a91a9338ad08e3179050d (diff)
downloadchromium_src-24e863243cc6e12da33425f8401f0920170d7062.zip
chromium_src-24e863243cc6e12da33425f8401f0920170d7062.tar.gz
chromium_src-24e863243cc6e12da33425f8401f0920170d7062.tar.bz2
We need to set the clipping region of the HDC passed in to a windowless flash plugin instance in NPP_HandleEvent for WM_PAINT. The windowless flash plugin instance queries the clipping region of the DC and on not finding it proceeds
to paint the plugin window rect, which causes unnecessary CPU spikes. This fixes bug http://code.google.com/p/chromium/issues/detail?id=8835, where the plugin process would consume CPU even when we scrolled down to the static video images. With this fix the CPU usage for windowless flash plugins is on par with Firefox. Added a uitest which validates whether the hdc passed in to HandleEvent for WM_PAINT has a valid clipping region. Bug=8835 Review URL: http://codereview.chromium.org/53106 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12651 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/plugin/webplugin_proxy.cc7
-rw-r--r--webkit/glue/plugins/test/npapi_test_plugin.vcproj16
-rw-r--r--webkit/glue/plugins/test/plugin_client.cc15
-rw-r--r--webkit/glue/plugins/test/plugin_windowless_test.cc (renamed from webkit/glue/plugins/test/plugin_execute_script_delete_test.cc)23
-rw-r--r--webkit/glue/plugins/test/plugin_windowless_test.h (renamed from webkit/glue/plugins/test/plugin_execute_script_delete_test.h)10
5 files changed, 46 insertions, 25 deletions
diff --git a/chrome/plugin/webplugin_proxy.cc b/chrome/plugin/webplugin_proxy.cc
index 38310fb..34bdb92 100644
--- a/chrome/plugin/webplugin_proxy.cc
+++ b/chrome/plugin/webplugin_proxy.cc
@@ -322,9 +322,16 @@ void WebPluginProxy::Paint(const gfx::Rect& rect) {
rect.x(), rect.y(), SRCCOPY);
}
+ RECT clip_rect = rect.ToRECT();
+ HRGN clip_region = CreateRectRgnIndirect(&clip_rect);
+ SelectClipRgn(windowless_hdc_, clip_region);
+
// Before we send the invalidate, paint so that renderer uses the updated
// bitmap.
delegate_->Paint(windowless_hdc_, offset_rect);
+
+ SelectClipRgn(windowless_hdc_, NULL);
+ DeleteObject(clip_region);
}
void WebPluginProxy::UpdateGeometry(
diff --git a/webkit/glue/plugins/test/npapi_test_plugin.vcproj b/webkit/glue/plugins/test/npapi_test_plugin.vcproj
index 426885d..5c5d95a 100644
--- a/webkit/glue/plugins/test/npapi_test_plugin.vcproj
+++ b/webkit/glue/plugins/test/npapi_test_plugin.vcproj
@@ -183,14 +183,6 @@
>
</File>
<File
- RelativePath=".\plugin_execute_script_delete_test.cc"
- >
- </File>
- <File
- RelativePath=".\plugin_execute_script_delete_test.h"
- >
- </File>
- <File
RelativePath=".\plugin_get_javascript_url_test.cc"
>
</File>
@@ -263,6 +255,14 @@
>
</File>
<File
+ RelativePath=".\plugin_windowless_test.cc"
+ >
+ </File>
+ <File
+ RelativePath=".\plugin_windowless_test.h"
+ >
+ </File>
+ <File
RelativePath=".\resource.h"
>
</File>
diff --git a/webkit/glue/plugins/test/plugin_client.cc b/webkit/glue/plugins/test/plugin_client.cc
index 7b00e7c..b515779 100644
--- a/webkit/glue/plugins/test/plugin_client.cc
+++ b/webkit/glue/plugins/test/plugin_client.cc
@@ -6,7 +6,6 @@
#include "webkit/glue/plugins/test/plugin_client.h"
#include "webkit/glue/plugins/test/plugin_arguments_test.h"
#include "webkit/glue/plugins/test/plugin_delete_plugin_in_stream_test.h"
-#include "webkit/glue/plugins/test/plugin_execute_script_delete_test.h"
#include "webkit/glue/plugins/test/plugin_get_javascript_url_test.h"
#include "webkit/glue/plugins/test/plugin_geturl_test.h"
#include "webkit/glue/plugins/test/plugin_javascript_open_popup.h"
@@ -15,6 +14,7 @@
#include "webkit/glue/plugins/test/plugin_npobject_lifetime_test.h"
#include "webkit/glue/plugins/test/plugin_npobject_proxy_test.h"
#include "webkit/glue/plugins/test/plugin_window_size_test.h"
+#include "webkit/glue/plugins/test/plugin_windowless_test.h"
#include "third_party/npapi/bindings/npapi.h"
#include "third_party/npapi/bindings/npruntime.h"
@@ -100,9 +100,11 @@ NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode,
} else if (base::strcasecmp(argv[name_index], "npobject_proxy") == 0) {
new_test = new NPAPIClient::NPObjectProxyTest(instance,
NPAPIClient::PluginClient::HostFunctions());
- } else if (base::strcasecmp(argv[name_index],
- "execute_script_delete_in_paint") == 0) {
- new_test = new NPAPIClient::ExecuteScriptDeleteTest(instance,
+ } else if ((base::strcasecmp(argv[name_index],
+ "execute_script_delete_in_paint") == 0) ||
+ (base::strcasecmp(argv[name_index],
+ "execute_script_delete_in_mouse_move") == 0)) {
+ new_test = new NPAPIClient::WindowlessPluginTest(instance,
NPAPIClient::PluginClient::HostFunctions(), argv[name_index]);
windowless_plugin = true;
} else if (base::strcasecmp(argv[name_index], "getjavascripturl") == 0) {
@@ -138,11 +140,6 @@ NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode,
"plugin_popup_with_plugin_target") == 0) {
new_test = new NPAPIClient::ExecuteJavascriptPopupWindowTargetPluginTest(
instance, NPAPIClient::PluginClient::HostFunctions());
- } else if (base::strcasecmp(argv[name_index],
- "execute_script_delete_in_mouse_move") == 0) {
- new_test = new NPAPIClient::ExecuteScriptDeleteTest(instance,
- NPAPIClient::PluginClient::HostFunctions(), argv[name_index]);
- windowless_plugin = true;
} else if (base::strcasecmp(argv[name_index], "private") == 0) {
new_test = new NPAPIClient::PrivateTest(instance,
NPAPIClient::PluginClient::HostFunctions());
diff --git a/webkit/glue/plugins/test/plugin_execute_script_delete_test.cc b/webkit/glue/plugins/test/plugin_windowless_test.cc
index 1087fc3..131102c 100644
--- a/webkit/glue/plugins/test/plugin_execute_script_delete_test.cc
+++ b/webkit/glue/plugins/test/plugin_windowless_test.cc
@@ -3,18 +3,18 @@
// found in the LICENSE file.
#define STRSAFE_NO_DEPRECATE
-#include "webkit/glue/plugins/test/plugin_execute_script_delete_test.h"
+#include "webkit/glue/plugins/test/plugin_windowless_test.h"
#include "webkit/glue/plugins/test/plugin_client.h"
namespace NPAPIClient {
-ExecuteScriptDeleteTest::ExecuteScriptDeleteTest(
+WindowlessPluginTest::WindowlessPluginTest(
NPP id, NPNetscapeFuncs *host_functions, const std::string& test_name)
: PluginTest(id, host_functions),
test_name_(test_name) {
}
-int16 ExecuteScriptDeleteTest::HandleEvent(void* event) {
+int16 WindowlessPluginTest::HandleEvent(void* event) {
NPNetscapeFuncs* browser = NPAPIClient::PluginClient::HostFunctions();
@@ -31,6 +31,23 @@ int16 ExecuteScriptDeleteTest::HandleEvent(void* event) {
if (WM_PAINT == np_event->event &&
base::strcasecmp(test_name_.c_str(),
"execute_script_delete_in_paint") == 0) {
+ HDC paint_dc = reinterpret_cast<HDC>(np_event->wParam);
+ if (paint_dc == NULL) {
+ SetError("Invalid Window DC passed to HandleEvent for WM_PAINT");
+ SignalTestCompleted();
+ return NPERR_GENERIC_ERROR;
+ }
+
+ HRGN clipping_region = CreateRectRgn(0, 0, 0, 0);
+ if (!GetClipRgn(paint_dc, clipping_region)) {
+ SetError("No clipping region set in window DC");
+ DeleteObject(clipping_region);
+ SignalTestCompleted();
+ return NPERR_GENERIC_ERROR;
+ }
+
+ DeleteObject(clipping_region);
+
NPUTF8* urlString = "javascript:DeletePluginWithinScript()";
NPUTF8* targetString = NULL;
browser->geturl(id(), urlString, targetString);
diff --git a/webkit/glue/plugins/test/plugin_execute_script_delete_test.h b/webkit/glue/plugins/test/plugin_windowless_test.h
index 2830fa1..93f7cfc 100644
--- a/webkit/glue/plugins/test/plugin_execute_script_delete_test.h
+++ b/webkit/glue/plugins/test/plugin_windowless_test.h
@@ -9,13 +9,13 @@
namespace NPAPIClient {
-// This class tests the case where a plugin instance is deleted by invoking
-// a javascript function in the context of a paint event.
-class ExecuteScriptDeleteTest : public PluginTest {
+// This class contains a list of windowless plugin tests. Please add additional
+// tests to this class.
+class WindowlessPluginTest : public PluginTest {
public:
// Constructor.
- ExecuteScriptDeleteTest(NPP id, NPNetscapeFuncs *host_functions,
- const std::string& test_name);
+ WindowlessPluginTest(NPP id, NPNetscapeFuncs *host_functions,
+ const std::string& test_name);
// NPAPI HandleEvent handler
virtual int16 HandleEvent(void* event);