Index: trunk/src/content/browser/browser_plugin/browser_plugin_guest.cc |
=================================================================== |
--- trunk/src/content/browser/browser_plugin/browser_plugin_guest.cc (revision 287745) |
+++ trunk/src/content/browser/browser_plugin/browser_plugin_guest.cc (working copy) |
@@ -80,8 +80,10 @@ |
guest_visible_(false), |
guest_opaque_(true), |
embedder_visible_(true), |
+ auto_size_enabled_(false), |
copy_request_id_(0), |
has_render_view_(has_render_view), |
+ last_seen_auto_size_enabled_(false), |
is_in_destruction_(false), |
last_text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
last_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), |
@@ -149,6 +151,7 @@ |
IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ReclaimCompositorResources, |
OnReclaimCompositorResources) |
IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ResizeGuest, OnResizeGuest) |
+ IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetAutoSize, OnSetAutoSize) |
IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetEditCommandsForNextKeyEvent, |
OnSetEditCommandsForNextKeyEvent) |
IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetFocus, OnSetFocus) |
@@ -172,6 +175,10 @@ |
guest_window_rect_ = gfx::Rect(params.origin, |
params.resize_guest_params.view_size); |
+ auto_size_enabled_ = params.auto_size_params.enable; |
+ max_auto_size_ = params.auto_size_params.max_size; |
+ min_auto_size_ = params.auto_size_params.min_size; |
+ |
// Once a BrowserPluginGuest has an embedder WebContents, it's considered to |
// be attached. |
embedder_web_contents_ = embedder_web_contents; |
@@ -204,7 +211,8 @@ |
embedder_web_contents_observer_.reset(new EmbedderWebContentsObserver(this)); |
- OnResizeGuest(instance_id_, params.resize_guest_params); |
+ OnSetAutoSize( |
+ instance_id_, params.auto_size_params, params.resize_guest_params); |
// Create a swapped out RenderView for the guest in the embedder render |
// process, so that the embedder can access the guest's window object. |
@@ -321,6 +329,11 @@ |
return screen_pos; |
} |
+bool BrowserPluginGuest::InAutoSizeBounds(const gfx::Size& size) const { |
+ return size.width() <= max_auto_size_.width() && |
+ size.height() <= max_auto_size_.height(); |
+} |
+ |
void BrowserPluginGuest::SendMessageToEmbedder(IPC::Message* msg) { |
if (!attached()) { |
// Some pages such as data URLs, javascript URLs, and about:blank |
@@ -371,6 +384,10 @@ |
// here (see http://crbug.com/158151). |
Send(new InputMsg_SetFocus(routing_id(), focused_)); |
UpdateVisibility(); |
+ if (auto_size_enabled_) |
+ rvh->EnableAutoResize(min_auto_size_, max_auto_size_); |
+ else |
+ rvh->DisableAutoResize(full_size_); |
OnSetContentsOpaque(instance_id_, guest_opaque_); |
@@ -412,6 +429,7 @@ |
case BrowserPluginHostMsg_PluginDestroyed::ID: |
case BrowserPluginHostMsg_ReclaimCompositorResources::ID: |
case BrowserPluginHostMsg_ResizeGuest::ID: |
+ case BrowserPluginHostMsg_SetAutoSize::ID: |
case BrowserPluginHostMsg_SetEditCommandsForNextKeyEvent::ID: |
case BrowserPluginHostMsg_SetFocus::ID: |
case BrowserPluginHostMsg_SetContentsOpaque::ID: |
@@ -671,14 +689,15 @@ |
render_widget_host->NotifyScreenInfoChanged(); |
} |
} |
- |
- if (last_seen_browser_plugin_size_ != params.view_size) { |
- delegate_->ElementSizeChanged(last_seen_browser_plugin_size_, |
- params.view_size); |
- last_seen_browser_plugin_size_ = params.view_size; |
+ // When autosize is turned off and as a result there is a layout change, we |
+ // send a sizechanged event. |
+ if (!auto_size_enabled_ && last_seen_auto_size_enabled_ && |
+ !params.view_size.IsEmpty()) { |
+ delegate_->SizeChanged(last_seen_view_size_, params.view_size); |
+ last_seen_auto_size_enabled_ = false; |
} |
- |
// Just resize the WebContents and repaint if needed. |
+ full_size_ = params.view_size; |
if (!params.view_size.IsEmpty()) |
GetWebContents()->GetView()->SizeContents(params.view_size); |
if (params.repaint) |
@@ -703,6 +722,37 @@ |
} |
} |
+void BrowserPluginGuest::OnSetAutoSize( |
+ int instance_id, |
+ const BrowserPluginHostMsg_AutoSize_Params& auto_size_params, |
+ const BrowserPluginHostMsg_ResizeGuest_Params& resize_guest_params) { |
+ bool old_auto_size_enabled = auto_size_enabled_; |
+ gfx::Size old_max_size = max_auto_size_; |
+ gfx::Size old_min_size = min_auto_size_; |
+ auto_size_enabled_ = auto_size_params.enable; |
+ max_auto_size_ = auto_size_params.max_size; |
+ min_auto_size_ = auto_size_params.min_size; |
+ if (auto_size_enabled_ && (!old_auto_size_enabled || |
+ (old_max_size != max_auto_size_) || |
+ (old_min_size != min_auto_size_))) { |
+ RecordAction( |
+ base::UserMetricsAction("BrowserPlugin.Guest.EnableAutoResize")); |
+ GetWebContents()->GetRenderViewHost()->EnableAutoResize( |
+ min_auto_size_, max_auto_size_); |
+ // TODO(fsamuel): If we're changing autosize parameters, then we force |
+ // the guest to completely repaint itself. |
+ // Ideally, we shouldn't need to do this unless |max_auto_size_| has |
+ // changed. |
+ // However, even in that case, layout may not change and so we may |
+ // not get a full frame worth of pixels. |
+ Send(new ViewMsg_Repaint(routing_id(), max_auto_size_)); |
+ } else if (!auto_size_enabled_ && old_auto_size_enabled) { |
+ GetWebContents()->GetRenderViewHost()->DisableAutoResize( |
+ resize_guest_params.view_size); |
+ } |
+ OnResizeGuest(instance_id_, resize_guest_params); |
+} |
+ |
void BrowserPluginGuest::OnSetEditCommandsForNextKeyEvent( |
int instance_id, |
const std::vector<EditCommand>& edit_commands) { |
@@ -805,10 +855,15 @@ |
relay_params.is_resize_ack = ViewHostMsg_UpdateRect_Flags::is_resize_ack( |
params.flags); |
- if (last_seen_view_size_ != params.view_size) { |
- delegate_->GuestSizeChanged(last_seen_view_size_, params.view_size); |
- last_seen_view_size_ = params.view_size; |
+ bool size_changed = last_seen_view_size_ != params.view_size; |
+ gfx::Size old_size = last_seen_view_size_; |
+ last_seen_view_size_ = params.view_size; |
+ |
+ if ((auto_size_enabled_ || last_seen_auto_size_enabled_) && |
+ size_changed) { |
+ delegate_->SizeChanged(old_size, last_seen_view_size_); |
} |
+ last_seen_auto_size_enabled_ = auto_size_enabled_; |
SendMessageToEmbedder( |
new BrowserPluginMsg_UpdateRect(instance_id(), relay_params)); |