Chromium Code Reviews| Index: chrome/browser/guest_view/web_view/web_view_guest.cc |
| diff --git a/chrome/browser/guest_view/web_view/web_view_guest.cc b/chrome/browser/guest_view/web_view/web_view_guest.cc |
| index a40447731215b6656c8b6dbae7222f9843672386..a08cf67c2fce5757484562b4b71f048968d90dd9 100644 |
| --- a/chrome/browser/guest_view/web_view/web_view_guest.cc |
| +++ b/chrome/browser/guest_view/web_view/web_view_guest.cc |
| @@ -297,6 +297,20 @@ void WebViewGuest::CreateWebContents( |
| } |
| void WebViewGuest::DidAttachToEmbedder() { |
| + extra_params()->GetBoolean(webview::kAttributeAutoSize, &auto_size_enabled_); |
| + |
| + int max_height = 0; |
| + int max_width = 0; |
| + extra_params()->GetInteger(webview::kAttributeMaxHeight, &max_height); |
|
lazyboy
2014/07/31 04:24:22
Do we need to DCHECK if GetInteger() returns true/
Fady Samuel
2014/08/01 18:12:52
Well we just rely on these being the default value
|
| + extra_params()->GetInteger(webview::kAttributeMaxWidth, &max_width); |
| + max_auto_size_.SetSize(max_width, max_height); |
| + |
| + int min_height = 0; |
| + int min_width = 0; |
| + extra_params()->GetInteger(webview::kAttributeMinHeight, &min_height); |
| + extra_params()->GetInteger(webview::kAttributeMinWidth, &min_width); |
| + min_auto_size_.SetSize(min_width, min_height); |
| + |
| std::string name; |
| if (extra_params()->GetString(webview::kName, &name)) { |
| // If the guest window's name is empty, then the WebView tag's name is |
| @@ -700,7 +714,8 @@ WebViewGuest::WebViewGuest(content::BrowserContext* browser_context, |
| chromevox_injected_(false), |
| current_zoom_factor_(1.0), |
| find_helper_(this), |
| - javascript_dialog_helper_(this) { |
| + javascript_dialog_helper_(this), |
| + auto_size_enabled_(false) { |
| } |
| WebViewGuest::~WebViewGuest() { |
| @@ -802,6 +817,12 @@ void WebViewGuest::RenderViewReady() { |
| // The guest RenderView should always live in an isolated guest process. |
| CHECK(guest_web_contents()->GetRenderProcessHost()->IsIsolatedGuest()); |
| Send(new ChromeViewMsg_SetName(guest_web_contents()->GetRoutingID(), name_)); |
| + content::RenderViewHost* rvh = guest_web_contents()->GetRenderViewHost(); |
| + if (auto_size_enabled_) |
| + rvh->EnableAutoResize(min_auto_size_, max_auto_size_); |
| + else |
| + rvh->DisableAutoResize(element_size_); |
| + |
| } |
| void WebViewGuest::ReportFrameNameChange(const std::string& name) { |
| @@ -880,15 +901,11 @@ content::WebContents* WebViewGuest::CreateNewGuestWindow( |
| create_params); |
| } |
| -void WebViewGuest::SizeChanged(const gfx::Size& old_size, |
| - const gfx::Size& new_size) { |
| - scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
| - args->SetInteger(webview::kOldHeight, old_size.height()); |
| - args->SetInteger(webview::kOldWidth, old_size.width()); |
| - args->SetInteger(webview::kNewHeight, new_size.height()); |
| - args->SetInteger(webview::kNewWidth, new_size.width()); |
| - DispatchEventToEmbedder( |
| - new GuestViewBase::Event(webview::kEventSizeChanged, args.Pass())); |
| +void WebViewGuest::GuestSizeChanged(const gfx::Size& old_size, |
| + const gfx::Size& new_size) { |
| + if (!auto_size_enabled_) |
| + return; |
| + DispatchSizeChangedEvent(old_size, new_size); |
| } |
| void WebViewGuest::RequestMediaAccessPermission( |
| @@ -911,6 +928,11 @@ void WebViewGuest::CanDownload( |
| callback); |
| } |
| +void WebViewGuest::ElementSizeChanged(const gfx::Size& old_size, |
| + const gfx::Size& new_size) { |
| + element_size_ = new_size; |
| +} |
| + |
| void WebViewGuest::RequestPointerLockPermission( |
| bool user_gesture, |
| bool last_unlocked_by_target, |
| @@ -951,6 +973,31 @@ void WebViewGuest::RunFileChooser(WebContents* web_contents, |
| embedder_web_contents()->GetDelegate()->RunFileChooser(web_contents, params); |
| } |
| +void WebViewGuest::SetAutoSize(bool enabled, |
| + const gfx::Size& min_size, |
| + const gfx::Size& max_size) { |
| + min_auto_size_ = gfx::Size(std::min(max_size.width(), min_size.width()), |
| + std::min(max_size.height(), min_size.height())); |
| + max_auto_size_ = gfx::Size(std::max(max_size.width(), min_size.width()), |
| + std::max(max_size.height(), min_size.height())); |
| + enabled &= !!max_auto_size_.width() && !!max_auto_size_.height(); |
| + if (!enabled && !auto_size_enabled_) |
| + return; |
| + |
| + auto_size_enabled_ = enabled; |
| + |
| + if (!attached()) |
| + return; |
| + |
| + content::RenderViewHost* rvh = guest_web_contents()->GetRenderViewHost(); |
| + if (auto_size_enabled_) { |
| + rvh->EnableAutoResize(min_auto_size_, max_auto_size_); |
| + } else { |
| + rvh->DisableAutoResize(element_size_); |
| + DispatchSizeChangedEvent(guest_size_, element_size_); |
| + } |
| +} |
| + |
| void WebViewGuest::NavigateGuest(const std::string& src) { |
| GURL url = ResolveURL(src); |
| @@ -1052,6 +1099,18 @@ bool WebViewGuest::HandleKeyboardShortcuts( |
| return false; |
| } |
| +void WebViewGuest::DispatchSizeChangedEvent(const gfx::Size& old_size, |
| + const gfx::Size& new_size) { |
| + guest_size_ = new_size; |
| + scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
| + args->SetInteger(webview::kOldHeight, old_size.height()); |
| + args->SetInteger(webview::kOldWidth, old_size.width()); |
| + args->SetInteger(webview::kNewHeight, new_size.height()); |
| + args->SetInteger(webview::kNewWidth, new_size.width()); |
| + DispatchEventToEmbedder( |
| + new GuestViewBase::Event(webview::kEventSizeChanged, args.Pass())); |
| +} |
| + |
| void WebViewGuest::ShowContextMenu(int request_id, |
| const MenuItemVector* items) { |
| if (!pending_menu_.get()) |