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

Side by Side Diff: content/renderer/browser_plugin/browser_plugin.cc

Issue 427883002: <webview>: Move autosize from content to chrome (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@remove_frame_url
Patch Set: Initialize variable Created 6 years, 4 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 "content/renderer/browser_plugin/browser_plugin.h" 5 #include "content/renderer/browser_plugin/browser_plugin.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 bool auto_navigate) 47 bool auto_navigate)
48 : guest_instance_id_(browser_plugin::kInstanceIDNone), 48 : guest_instance_id_(browser_plugin::kInstanceIDNone),
49 attached_(false), 49 attached_(false),
50 render_view_(render_view->AsWeakPtr()), 50 render_view_(render_view->AsWeakPtr()),
51 render_view_routing_id_(render_view->GetRoutingID()), 51 render_view_routing_id_(render_view->GetRoutingID()),
52 container_(NULL), 52 container_(NULL),
53 paint_ack_received_(true), 53 paint_ack_received_(true),
54 last_device_scale_factor_(GetDeviceScaleFactor()), 54 last_device_scale_factor_(GetDeviceScaleFactor()),
55 sad_guest_(NULL), 55 sad_guest_(NULL),
56 guest_crashed_(false), 56 guest_crashed_(false),
57 is_auto_size_state_dirty_(false),
58 content_window_routing_id_(MSG_ROUTING_NONE), 57 content_window_routing_id_(MSG_ROUTING_NONE),
59 plugin_focused_(false), 58 plugin_focused_(false),
60 visible_(true), 59 visible_(true),
61 auto_navigate_(auto_navigate), 60 auto_navigate_(auto_navigate),
62 mouse_locked_(false), 61 mouse_locked_(false),
63 browser_plugin_manager_(render_view->GetBrowserPluginManager()), 62 browser_plugin_manager_(render_view->GetBrowserPluginManager()),
64 weak_ptr_factory_(this) { 63 weak_ptr_factory_(this) {
65 } 64 }
66 65
67 BrowserPlugin::~BrowserPlugin() { 66 BrowserPlugin::~BrowserPlugin() {
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 return false; 136 return false;
138 137
139 return container()->element().hasAttribute( 138 return container()->element().hasAttribute(
140 blink::WebString::fromUTF8(attribute_name)); 139 blink::WebString::fromUTF8(attribute_name));
141 } 140 }
142 141
143 bool BrowserPlugin::GetAllowTransparencyAttribute() const { 142 bool BrowserPlugin::GetAllowTransparencyAttribute() const {
144 return HasDOMAttribute(browser_plugin::kAttributeAllowTransparency); 143 return HasDOMAttribute(browser_plugin::kAttributeAllowTransparency);
145 } 144 }
146 145
147 bool BrowserPlugin::GetAutoSizeAttribute() const {
148 return HasDOMAttribute(browser_plugin::kAttributeAutoSize);
149 }
150
151 int BrowserPlugin::GetMaxHeightAttribute() const {
152 int max_height;
153 base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMaxHeight),
154 &max_height);
155 return max_height;
156 }
157
158 int BrowserPlugin::GetMaxWidthAttribute() const {
159 int max_width;
160 base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMaxWidth),
161 &max_width);
162 return max_width;
163 }
164
165 int BrowserPlugin::GetMinHeightAttribute() const {
166 int min_height;
167 base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMinHeight),
168 &min_height);
169 return min_height;
170 }
171
172 int BrowserPlugin::GetMinWidthAttribute() const {
173 int min_width;
174 base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMinWidth),
175 &min_width);
176 return min_width;
177 }
178
179 int BrowserPlugin::GetAdjustedMaxHeight() const {
180 int max_height = GetMaxHeightAttribute();
181 return max_height ? max_height : height();
182 }
183
184 int BrowserPlugin::GetAdjustedMaxWidth() const {
185 int max_width = GetMaxWidthAttribute();
186 return max_width ? max_width : width();
187 }
188
189 int BrowserPlugin::GetAdjustedMinHeight() const {
190 int min_height = GetMinHeightAttribute();
191 // FrameView.cpp does not allow this value to be <= 0, so when the value is
192 // unset (or set to 0), we set it to the container size.
193 min_height = min_height ? min_height : height();
194 // For autosize, minHeight should not be bigger than maxHeight.
195 return std::min(min_height, GetAdjustedMaxHeight());
196 }
197
198 int BrowserPlugin::GetAdjustedMinWidth() const {
199 int min_width = GetMinWidthAttribute();
200 // FrameView.cpp does not allow this value to be <= 0, so when the value is
201 // unset (or set to 0), we set it to the container size.
202 min_width = min_width ? min_width : width();
203 // For autosize, minWidth should not be bigger than maxWidth.
204 return std::min(min_width, GetAdjustedMaxWidth());
205 }
206
207 void BrowserPlugin::ParseAllowTransparencyAttribute() { 146 void BrowserPlugin::ParseAllowTransparencyAttribute() {
208 if (!HasGuestInstanceID()) 147 if (!HasGuestInstanceID())
209 return; 148 return;
210 149
211 bool opaque = !GetAllowTransparencyAttribute(); 150 bool opaque = !GetAllowTransparencyAttribute();
212 151
213 if (compositing_helper_) 152 if (compositing_helper_)
214 compositing_helper_->SetContentsOpaque(opaque); 153 compositing_helper_->SetContentsOpaque(opaque);
215 154
216 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetContentsOpaque( 155 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetContentsOpaque(
217 render_view_routing_id_, 156 render_view_routing_id_,
218 guest_instance_id_, 157 guest_instance_id_,
219 opaque)); 158 opaque));
220 } 159 }
221 160
222 void BrowserPlugin::ParseAutoSizeAttribute() {
223 last_view_size_ = plugin_size();
224 is_auto_size_state_dirty_ = true;
225 UpdateGuestAutoSizeState(GetAutoSizeAttribute());
226 }
227
228 void BrowserPlugin::PopulateAutoSizeParameters(
229 BrowserPluginHostMsg_AutoSize_Params* params, bool auto_size_enabled) {
230 params->enable = auto_size_enabled;
231 // No need to populate the params if autosize is off.
232 if (auto_size_enabled) {
233 params->max_size = gfx::Size(GetAdjustedMaxWidth(), GetAdjustedMaxHeight());
234 params->min_size = gfx::Size(GetAdjustedMinWidth(), GetAdjustedMinHeight());
235
236 if (max_auto_size_ != params->max_size)
237 is_auto_size_state_dirty_ = true;
238
239 max_auto_size_ = params->max_size;
240 } else {
241 max_auto_size_ = gfx::Size();
242 }
243 }
244
245 void BrowserPlugin::UpdateGuestAutoSizeState(bool auto_size_enabled) {
246 // If we haven't yet heard back from the guest about the last resize request,
247 // then we don't issue another request until we do in
248 // BrowserPlugin::OnUpdateRect.
249 if (!HasGuestInstanceID() || !paint_ack_received_)
250 return;
251
252 BrowserPluginHostMsg_AutoSize_Params auto_size_params;
253 BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params;
254 if (auto_size_enabled) {
255 GetSizeParams(&auto_size_params, &resize_guest_params, true);
256 } else {
257 GetSizeParams(NULL, &resize_guest_params, true);
258 }
259 paint_ack_received_ = false;
260 browser_plugin_manager()->Send(
261 new BrowserPluginHostMsg_SetAutoSize(render_view_routing_id_,
262 guest_instance_id_,
263 auto_size_params,
264 resize_guest_params));
265 }
266
267 void BrowserPlugin::Attach(int guest_instance_id, 161 void BrowserPlugin::Attach(int guest_instance_id,
268 scoped_ptr<base::DictionaryValue> extra_params) { 162 scoped_ptr<base::DictionaryValue> extra_params) {
269 CHECK(guest_instance_id != browser_plugin::kInstanceIDNone); 163 CHECK(guest_instance_id != browser_plugin::kInstanceIDNone);
270 164
271 // If this BrowserPlugin is already attached to a guest, then kill the guest. 165 // If this BrowserPlugin is already attached to a guest, then kill the guest.
272 if (HasGuestInstanceID()) { 166 if (HasGuestInstanceID()) {
273 if (guest_instance_id == guest_instance_id_) 167 if (guest_instance_id == guest_instance_id_)
274 return; 168 return;
275 guest_crashed_ = false; 169 guest_crashed_ = false;
276 EnableCompositing(false); 170 EnableCompositing(false);
277 if (compositing_helper_) { 171 if (compositing_helper_) {
278 compositing_helper_->OnContainerDestroy(); 172 compositing_helper_->OnContainerDestroy();
279 compositing_helper_ = NULL; 173 compositing_helper_ = NULL;
280 } 174 }
281 browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_); 175 browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_);
282 browser_plugin_manager()->Send(new BrowserPluginHostMsg_PluginDestroyed( 176 browser_plugin_manager()->Send(new BrowserPluginHostMsg_PluginDestroyed(
283 render_view_routing_id_, guest_instance_id_)); 177 render_view_routing_id_, guest_instance_id_));
284 } 178 }
285 179
286 // This API may be called directly without setting the src attribute. 180 // This API may be called directly without setting the src attribute.
287 // In that case, we need to make sure we don't allocate another instance ID. 181 // In that case, we need to make sure we don't allocate another instance ID.
288 guest_instance_id_ = guest_instance_id; 182 guest_instance_id_ = guest_instance_id;
289 browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this); 183 browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this);
290 184
291 BrowserPluginHostMsg_Attach_Params attach_params; 185 BrowserPluginHostMsg_Attach_Params attach_params;
292 attach_params.focused = ShouldGuestBeFocused(); 186 attach_params.focused = ShouldGuestBeFocused();
293 attach_params.visible = visible_; 187 attach_params.visible = visible_;
294 attach_params.opaque = !GetAllowTransparencyAttribute(); 188 attach_params.opaque = !GetAllowTransparencyAttribute();
295 attach_params.origin = plugin_rect().origin(); 189 attach_params.origin = plugin_rect().origin();
296 GetSizeParams(&attach_params.auto_size_params, 190 GetSizeParams(&attach_params.resize_guest_params, false);
297 &attach_params.resize_guest_params,
298 false);
299 191
300 browser_plugin_manager()->Send( 192 browser_plugin_manager()->Send(
301 new BrowserPluginHostMsg_Attach(render_view_routing_id_, 193 new BrowserPluginHostMsg_Attach(render_view_routing_id_,
302 guest_instance_id_, attach_params, 194 guest_instance_id_, attach_params,
303 *extra_params)); 195 *extra_params));
304 } 196 }
305 197
306 void BrowserPlugin::DidCommitCompositorFrame() { 198 void BrowserPlugin::DidCommitCompositorFrame() {
307 if (compositing_helper_.get()) 199 if (compositing_helper_.get())
308 compositing_helper_->DidCommitCompositorFrame(); 200 compositing_helper_->DidCommitCompositorFrame();
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 } 305 }
414 } 306 }
415 307
416 void BrowserPlugin::OnUpdateRect( 308 void BrowserPlugin::OnUpdateRect(
417 int guest_instance_id, 309 int guest_instance_id,
418 const BrowserPluginMsg_UpdateRect_Params& params) { 310 const BrowserPluginMsg_UpdateRect_Params& params) {
419 // Note that there is no need to send ACK for this message. 311 // Note that there is no need to send ACK for this message.
420 // If the guest has updated pixels then it is no longer crashed. 312 // If the guest has updated pixels then it is no longer crashed.
421 guest_crashed_ = false; 313 guest_crashed_ = false;
422 314
423 bool auto_size = GetAutoSizeAttribute();
424 // We receive a resize ACK in regular mode, but not in autosize. 315 // We receive a resize ACK in regular mode, but not in autosize.
425 // In Compositing mode, we need to do it here so we can continue sending 316 // In Compositing mode, we need to do it here so we can continue sending
426 // resize messages when needed. 317 // resize messages when needed.
427 if (params.is_resize_ack || (auto_size || is_auto_size_state_dirty_)) 318 if (params.is_resize_ack)
428 paint_ack_received_ = true; 319 paint_ack_received_ = true;
429 320
430 bool was_auto_size_state_dirty = auto_size && is_auto_size_state_dirty_; 321 if (params.view_size.width() == width() &&
431 is_auto_size_state_dirty_ = false; 322 params.view_size.height() == height()) {
432
433 if ((!auto_size && (width() != params.view_size.width() ||
434 height() != params.view_size.height())) ||
435 (auto_size && was_auto_size_state_dirty) ||
436 GetDeviceScaleFactor() != params.scale_factor) {
437 UpdateGuestAutoSizeState(auto_size);
438 return; 323 return;
439 } 324 }
440 325
441 if (auto_size && (params.view_size != last_view_size_)) 326 BrowserPluginHostMsg_ResizeGuest_Params resize_params;
442 last_view_size_ = params.view_size; 327 PopulateResizeGuestParameters(&resize_params, plugin_size(), false);
443 328 paint_ack_received_ = false;
444 BrowserPluginHostMsg_AutoSize_Params auto_size_params; 329 browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest(
445 BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params; 330 render_view_routing_id_,
446 331 guest_instance_id_,
447 // BrowserPluginHostMsg_UpdateRect_ACK is used by both the compositing and 332 resize_params));
448 // software paths to piggyback updated autosize parameters.
449 if (auto_size)
450 PopulateAutoSizeParameters(&auto_size_params, auto_size);
451
452 browser_plugin_manager()->Send(
453 new BrowserPluginHostMsg_SetAutoSize(render_view_routing_id_,
454 guest_instance_id_,
455 auto_size_params,
456 resize_guest_params));
457 }
458
459 void BrowserPlugin::ParseSizeContraintsChanged() {
460 bool auto_size = GetAutoSizeAttribute();
461 if (auto_size) {
462 is_auto_size_state_dirty_ = true;
463 UpdateGuestAutoSizeState(true);
464 }
465 }
466
467 bool BrowserPlugin::InAutoSizeBounds(const gfx::Size& size) const {
468 return size.width() <= GetAdjustedMaxWidth() &&
469 size.height() <= GetAdjustedMaxHeight();
470 } 333 }
471 334
472 NPObject* BrowserPlugin::GetContentWindow() const { 335 NPObject* BrowserPlugin::GetContentWindow() const {
473 if (content_window_routing_id_ == MSG_ROUTING_NONE) 336 if (content_window_routing_id_ == MSG_ROUTING_NONE)
474 return NULL; 337 return NULL;
475 RenderViewImpl* guest_render_view = RenderViewImpl::FromRoutingID( 338 RenderViewImpl* guest_render_view = RenderViewImpl::FromRoutingID(
476 content_window_routing_id_); 339 content_window_routing_id_);
477 if (!guest_render_view) 340 if (!guest_render_view)
478 return NULL; 341 return NULL;
479 blink::WebFrame* guest_frame = guest_render_view->GetWebView()->mainFrame(); 342 blink::WebFrame* guest_frame = guest_render_view->GetWebView()->mainFrame();
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 if (!attached()) 540 if (!attached())
678 return; 541 return;
679 542
680 // In AutoSize mode, guests don't care when the BrowserPlugin container is 543 // In AutoSize mode, guests don't care when the BrowserPlugin container is
681 // resized. If |!paint_ack_received_|, then we are still waiting on a 544 // resized. If |!paint_ack_received_|, then we are still waiting on a
682 // previous resize to be ACK'ed and so we don't issue additional resizes 545 // previous resize to be ACK'ed and so we don't issue additional resizes
683 // until the previous one is ACK'ed. 546 // until the previous one is ACK'ed.
684 // TODO(mthiesse): Assess the performance of calling GetAutoSizeAttribute() on 547 // TODO(mthiesse): Assess the performance of calling GetAutoSizeAttribute() on
685 // resize. 548 // resize.
686 if (!paint_ack_received_ || 549 if (!paint_ack_received_ ||
687 (old_width == window_rect.width && old_height == window_rect.height) || 550 (old_width == window_rect.width && old_height == window_rect.height)) {
688 GetAutoSizeAttribute()) {
689 // Let the browser know about the updated view rect. 551 // Let the browser know about the updated view rect.
690 browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateGeometry( 552 browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateGeometry(
691 render_view_routing_id_, guest_instance_id_, plugin_rect_)); 553 render_view_routing_id_, guest_instance_id_, plugin_rect_));
692 return; 554 return;
693 } 555 }
694 556
695 BrowserPluginHostMsg_ResizeGuest_Params params; 557 BrowserPluginHostMsg_ResizeGuest_Params params;
696 PopulateResizeGuestParameters(&params, plugin_size(), false); 558 PopulateResizeGuestParameters(&params, plugin_size(), false);
697 paint_ack_received_ = false; 559 paint_ack_received_ = false;
698 browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest( 560 browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest(
699 render_view_routing_id_, 561 render_view_routing_id_,
700 guest_instance_id_, 562 guest_instance_id_,
701 params)); 563 params));
702 } 564 }
703 565
704 void BrowserPlugin::PopulateResizeGuestParameters( 566 void BrowserPlugin::PopulateResizeGuestParameters(
705 BrowserPluginHostMsg_ResizeGuest_Params* params, 567 BrowserPluginHostMsg_ResizeGuest_Params* params,
706 const gfx::Size& view_size, 568 const gfx::Size& view_size,
707 bool needs_repaint) { 569 bool needs_repaint) {
708 params->size_changed = true; 570 params->size_changed = true;
709 params->view_size = view_size; 571 params->view_size = view_size;
710 params->repaint = needs_repaint; 572 params->repaint = needs_repaint;
711 params->scale_factor = GetDeviceScaleFactor(); 573 params->scale_factor = GetDeviceScaleFactor();
712 if (last_device_scale_factor_ != params->scale_factor){ 574 if (last_device_scale_factor_ != params->scale_factor) {
713 DCHECK(params->repaint); 575 DCHECK(params->repaint);
714 last_device_scale_factor_ = params->scale_factor; 576 last_device_scale_factor_ = params->scale_factor;
715 } 577 }
716 } 578 }
717 579
718 void BrowserPlugin::GetSizeParams( 580 void BrowserPlugin::GetSizeParams(
719 BrowserPluginHostMsg_AutoSize_Params* auto_size_params,
720 BrowserPluginHostMsg_ResizeGuest_Params* resize_guest_params, 581 BrowserPluginHostMsg_ResizeGuest_Params* resize_guest_params,
721 bool needs_repaint) { 582 bool needs_repaint) {
722 if (auto_size_params) { 583 gfx::Size view_size(width(), height());
723 PopulateAutoSizeParameters(auto_size_params, GetAutoSizeAttribute());
724 } else {
725 max_auto_size_ = gfx::Size();
726 }
727 gfx::Size view_size = (auto_size_params && auto_size_params->enable) ?
728 auto_size_params->max_size : gfx::Size(width(), height());
729 if (view_size.IsEmpty()) 584 if (view_size.IsEmpty())
730 return; 585 return;
731 paint_ack_received_ = false; 586 paint_ack_received_ = false;
732 PopulateResizeGuestParameters(resize_guest_params, view_size, needs_repaint); 587 PopulateResizeGuestParameters(resize_guest_params, view_size, needs_repaint);
733 } 588 }
734 589
735 void BrowserPlugin::updateFocus(bool focused) { 590 void BrowserPlugin::updateFocus(bool focused) {
736 plugin_focused_ = focused; 591 plugin_focused_ = focused;
737 UpdateGuestFocusState(); 592 UpdateGuestFocusState();
738 } 593 }
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 const blink::WebMouseEvent& event) { 816 const blink::WebMouseEvent& event) {
962 browser_plugin_manager()->Send( 817 browser_plugin_manager()->Send(
963 new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_, 818 new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_,
964 guest_instance_id_, 819 guest_instance_id_,
965 plugin_rect_, 820 plugin_rect_,
966 &event)); 821 &event));
967 return true; 822 return true;
968 } 823 }
969 824
970 } // namespace content 825 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/browser_plugin/browser_plugin.h ('k') | content/renderer/browser_plugin/browser_plugin_bindings.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698