summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/render_widget.h
diff options
context:
space:
mode:
authormbelshe@google.com <mbelshe@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-09 00:02:24 +0000
committermbelshe@google.com <mbelshe@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-09 00:02:24 +0000
commit2533ce1803f3324e69134e93f59acbb44afb1aa2 (patch)
tree59f0afeb73854fcfe39ae92ae7f8df07c9d24526 /chrome/renderer/render_widget.h
parentdef2c34edce5346ea285d47c3653c5d4192b406e (diff)
downloadchromium_src-2533ce1803f3324e69134e93f59acbb44afb1aa2.zip
chromium_src-2533ce1803f3324e69134e93f59acbb44afb1aa2.tar.gz
chromium_src-2533ce1803f3324e69134e93f59acbb44afb1aa2.tar.bz2
Defer window.close(), resizeTo() and moveTo() actions
by posting a task back to the message loop before notifying the RenderWidgetHost to perform these operations. Otherwise the JS code races with the browser to use the modified window. BUG=http://crbug.com/6377 BUG=http://crbug.com/6192 Cache a pending_window_rect on the render_view (moved from prior CL where I had it on the chrome_client_impl). This is a short lived cache, and not a complete solution. It fixes this case, where a JS script makes multiple operations and expects the GetWindowSize() to be correct immedately after having called SetWindowSize(). BUG=http://crbug.com/835 Review URL: http://codereview.chromium.org/115030 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15698 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/render_widget.h')
-rw-r--r--chrome/renderer/render_widget.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/chrome/renderer/render_widget.h b/chrome/renderer/render_widget.h
index 62777e8..660ccbb 100644
--- a/chrome/renderer/render_widget.h
+++ b/chrome/renderer/render_widget.h
@@ -18,6 +18,7 @@
#include "skia/ext/platform_canvas.h"
#include "skia/include/SkBitmap.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebRect.h"
#include "webkit/glue/webwidget_delegate.h"
#include "webkit/glue/webcursor.h"
@@ -119,6 +120,8 @@ class RenderWidget : public IPC::Channel::Listener,
void DoDeferredPaint();
void DoDeferredScroll();
+ void DoDeferredClose();
+ void DoDeferredSetWindowRect(const WebKit::WebRect& pos);
// This method is called immediately after PaintRect but before the
// corresponding paint or scroll message is send to the widget host.
@@ -138,6 +141,7 @@ class RenderWidget : public IPC::Channel::Listener,
void OnWasRestored(bool needs_repainting);
void OnPaintRectAck();
void OnScrollRectAck();
+ void OnRequestMoveAck();
void OnHandleInputEvent(const IPC::Message& message);
void OnMouseCaptureLost();
void OnSetFocus(bool enable);
@@ -175,6 +179,14 @@ class RenderWidget : public IPC::Channel::Listener,
// the focus on our own when the browser did not focus us.
void ClearFocus();
+ // Set the pending window rect.
+ // Because the real render_widget is hosted in another process, there is
+ // a time period where we may have set a new window rect which has not yet
+ // been processed by the browser. So we maintain a pending window rect
+ // size. If JS code sets the WindowRect, and then immediately calls
+ // GetWindowRect() we'll use this pending window rect as the size.
+ void SetPendingWindowRect(const WebKit::WebRect& r);
+
// Routing ID that allows us to communicate to the parent browser process
// RenderWidgetHost. When MSG_ROUTING_NONE, no messages may be sent.
int32 routing_id_;
@@ -280,6 +292,11 @@ class RenderWidget : public IPC::Channel::Listener,
// A custom background for the widget.
SkBitmap background_;
+ // While we are waiting for the browser to update window sizes,
+ // we track the pending size temporarily.
+ int pending_window_rect_count_;
+ WebKit::WebRect pending_window_rect_;
+
DISALLOW_COPY_AND_ASSIGN(RenderWidget);
};