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

Unified Diff: components/plugins/renderer/webview_plugin.cc

Issue 1764043002: Update a webview plugin's WebView's lifecycle immediately after resizing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/plugins/renderer/webview_plugin.h ('k') | third_party/WebKit/Source/core/frame/FrameView.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/plugins/renderer/webview_plugin.cc
diff --git a/components/plugins/renderer/webview_plugin.cc b/components/plugins/renderer/webview_plugin.cc
index b6ddb46033241a3afc3a2cc15e12b7bbfd70179a..05611db29fa03b22b96bc626c86907cd498d2485 100644
--- a/components/plugins/renderer/webview_plugin.cc
+++ b/components/plugins/renderer/webview_plugin.cc
@@ -57,7 +57,8 @@ WebViewPlugin::WebViewPlugin(content::RenderView* render_view,
web_view_(WebView::create(this)),
finished_loading_(false),
focused_(false),
- is_painting_(false) {
+ is_painting_(false),
+ is_resizing_(false) {
// ApplyWebPreferences before making a WebLocalFrame so that the frame sees a
// consistent view of our preferences.
content::RenderView::ApplyWebPreferences(preferences, web_view_);
@@ -199,14 +200,22 @@ void WebViewPlugin::updateGeometry(const WebRect& window_rect,
const WebRect& unobscured_rect,
const WebVector<WebRect>& cut_outs_rects,
bool is_visible) {
+ base::AutoReset<bool> is_resizing(
+ &is_resizing_, true);
+
if (static_cast<gfx::Rect>(window_rect) != rect_) {
rect_ = window_rect;
WebSize newSize(window_rect.width, window_rect.height);
web_view_->resize(newSize);
}
- if (delegate_)
+ if (delegate_) {
delegate_->OnUnobscuredRectUpdate(gfx::Rect(unobscured_rect));
+ // The delegate may have dirtied style and layout of the WebView.
+ // See for example the resizePoster function in plugin_poster.html.
+ // Run the lifecycle now so that it is clean.
+ web_view_->updateAllLifecyclePhases();
leviw_travelin_and_unemployed 2016/03/04 19:24:58 When all you've got is a hammer :p
+ }
}
void WebViewPlugin::updateFocus(bool focused, blink::WebFocusType focus_type) {
@@ -293,6 +302,14 @@ void WebViewPlugin::didChangeCursor(const WebCursorInfo& cursor) {
}
void WebViewPlugin::scheduleAnimation() {
+ // Resizes must be self-contained: any lifecycle updating must
+ // be triggerd from within the WebView or this WebViewPlugin.
+ // This is because this WebViewPlugin is contained in another
+ // Web View which may be in the middle of updating its lifecycle,
+ // but after layout is done, and it is illegal to dirty earlier
+ // lifecycle stages during later ones.
+ if (is_resizing_)
+ return;
if (container_) {
// This should never happen; see also crbug.com/545039 for context.
CHECK(!is_painting_);
« no previous file with comments | « components/plugins/renderer/webview_plugin.h ('k') | third_party/WebKit/Source/core/frame/FrameView.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698