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()) |