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

Side by Side Diff: chrome/browser/guest_view/web_view/web_view_guest.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: Works 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "chrome/browser/guest_view/web_view/web_view_guest.h" 5 #include "chrome/browser/guest_view/web_view/web_view_guest.h"
6 6
7 #include "base/message_loop/message_loop.h" 7 #include "base/message_loop/message_loop.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/chrome_notification_types.h" 10 #include "chrome/browser/chrome_notification_types.h"
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 embedder_render_process_host->GetBrowserContext(), guest_site); 290 embedder_render_process_host->GetBrowserContext(), guest_site);
291 } 291 }
292 WebContents::CreateParams params( 292 WebContents::CreateParams params(
293 embedder_render_process_host->GetBrowserContext(), 293 embedder_render_process_host->GetBrowserContext(),
294 guest_site_instance); 294 guest_site_instance);
295 params.guest_delegate = this; 295 params.guest_delegate = this;
296 callback.Run(WebContents::Create(params)); 296 callback.Run(WebContents::Create(params));
297 } 297 }
298 298
299 void WebViewGuest::DidAttachToEmbedder() { 299 void WebViewGuest::DidAttachToEmbedder() {
300 extra_params()->GetBoolean(webview::kAttributeAutoSize, &auto_size_enabled_);
301
302 int max_height = 0;
303 int max_width = 0;
304 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
305 extra_params()->GetInteger(webview::kAttributeMaxWidth, &max_width);
306 max_auto_size_.SetSize(max_width, max_height);
307
308 int min_height = 0;
309 int min_width = 0;
310 extra_params()->GetInteger(webview::kAttributeMinHeight, &min_height);
311 extra_params()->GetInteger(webview::kAttributeMinWidth, &min_width);
312 min_auto_size_.SetSize(min_width, min_height);
313
300 std::string name; 314 std::string name;
301 if (extra_params()->GetString(webview::kName, &name)) { 315 if (extra_params()->GetString(webview::kName, &name)) {
302 // If the guest window's name is empty, then the WebView tag's name is 316 // If the guest window's name is empty, then the WebView tag's name is
303 // assigned. Otherwise, the guest window's name takes precedence over the 317 // assigned. Otherwise, the guest window's name takes precedence over the
304 // WebView tag's name. 318 // WebView tag's name.
305 if (name_.empty()) 319 if (name_.empty())
306 name_ = name; 320 name_ = name;
307 } 321 }
308 ReportFrameNameChange(name_); 322 ReportFrameNameChange(name_);
309 323
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 } 707 }
694 708
695 WebViewGuest::WebViewGuest(content::BrowserContext* browser_context, 709 WebViewGuest::WebViewGuest(content::BrowserContext* browser_context,
696 int guest_instance_id) 710 int guest_instance_id)
697 : GuestView<WebViewGuest>(browser_context, guest_instance_id), 711 : GuestView<WebViewGuest>(browser_context, guest_instance_id),
698 pending_context_menu_request_id_(0), 712 pending_context_menu_request_id_(0),
699 is_overriding_user_agent_(false), 713 is_overriding_user_agent_(false),
700 chromevox_injected_(false), 714 chromevox_injected_(false),
701 current_zoom_factor_(1.0), 715 current_zoom_factor_(1.0),
702 find_helper_(this), 716 find_helper_(this),
703 javascript_dialog_helper_(this) { 717 javascript_dialog_helper_(this),
718 auto_size_enabled_(false) {
704 } 719 }
705 720
706 WebViewGuest::~WebViewGuest() { 721 WebViewGuest::~WebViewGuest() {
707 } 722 }
708 723
709 void WebViewGuest::DidCommitProvisionalLoadForFrame( 724 void WebViewGuest::DidCommitProvisionalLoadForFrame(
710 content::RenderFrameHost* render_frame_host, 725 content::RenderFrameHost* render_frame_host,
711 const GURL& url, 726 const GURL& url,
712 content::PageTransition transition_type) { 727 content::PageTransition transition_type) {
713 find_helper_.CancelAllFindSessions(); 728 find_helper_.CancelAllFindSessions();
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
795 if (!entry) 810 if (!entry)
796 return; 811 return;
797 entry->SetIsOverridingUserAgent(!user_agent.empty()); 812 entry->SetIsOverridingUserAgent(!user_agent.empty());
798 guest_web_contents()->GetController().Reload(false); 813 guest_web_contents()->GetController().Reload(false);
799 } 814 }
800 815
801 void WebViewGuest::RenderViewReady() { 816 void WebViewGuest::RenderViewReady() {
802 // The guest RenderView should always live in an isolated guest process. 817 // The guest RenderView should always live in an isolated guest process.
803 CHECK(guest_web_contents()->GetRenderProcessHost()->IsIsolatedGuest()); 818 CHECK(guest_web_contents()->GetRenderProcessHost()->IsIsolatedGuest());
804 Send(new ChromeViewMsg_SetName(guest_web_contents()->GetRoutingID(), name_)); 819 Send(new ChromeViewMsg_SetName(guest_web_contents()->GetRoutingID(), name_));
820 content::RenderViewHost* rvh = guest_web_contents()->GetRenderViewHost();
821 if (auto_size_enabled_)
822 rvh->EnableAutoResize(min_auto_size_, max_auto_size_);
823 else
824 rvh->DisableAutoResize(element_size_);
825
805 } 826 }
806 827
807 void WebViewGuest::ReportFrameNameChange(const std::string& name) { 828 void WebViewGuest::ReportFrameNameChange(const std::string& name) {
808 name_ = name; 829 name_ = name;
809 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); 830 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
810 args->SetString(webview::kName, name); 831 args->SetString(webview::kName, name);
811 DispatchEventToEmbedder( 832 DispatchEventToEmbedder(
812 new GuestViewBase::Event(webview::kEventFrameNameChanged, args.Pass())); 833 new GuestViewBase::Event(webview::kEventFrameNameChanged, args.Pass()));
813 } 834 }
814 835
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 const content::WebContents::CreateParams& create_params) { 894 const content::WebContents::CreateParams& create_params) {
874 GuestViewManager* guest_manager = 895 GuestViewManager* guest_manager =
875 GuestViewManager::FromBrowserContext(browser_context()); 896 GuestViewManager::FromBrowserContext(browser_context());
876 return guest_manager->CreateGuestWithWebContentsParams( 897 return guest_manager->CreateGuestWithWebContentsParams(
877 WebViewGuest::Type, 898 WebViewGuest::Type,
878 embedder_extension_id(), 899 embedder_extension_id(),
879 embedder_web_contents()->GetRenderProcessHost()->GetID(), 900 embedder_web_contents()->GetRenderProcessHost()->GetID(),
880 create_params); 901 create_params);
881 } 902 }
882 903
883 void WebViewGuest::SizeChanged(const gfx::Size& old_size, 904 void WebViewGuest::GuestSizeChanged(const gfx::Size& old_size,
884 const gfx::Size& new_size) { 905 const gfx::Size& new_size) {
885 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); 906 if (!auto_size_enabled_)
886 args->SetInteger(webview::kOldHeight, old_size.height()); 907 return;
887 args->SetInteger(webview::kOldWidth, old_size.width()); 908 DispatchSizeChangedEvent(old_size, new_size);
888 args->SetInteger(webview::kNewHeight, new_size.height());
889 args->SetInteger(webview::kNewWidth, new_size.width());
890 DispatchEventToEmbedder(
891 new GuestViewBase::Event(webview::kEventSizeChanged, args.Pass()));
892 } 909 }
893 910
894 void WebViewGuest::RequestMediaAccessPermission( 911 void WebViewGuest::RequestMediaAccessPermission(
895 content::WebContents* source, 912 content::WebContents* source,
896 const content::MediaStreamRequest& request, 913 const content::MediaStreamRequest& request,
897 const content::MediaResponseCallback& callback) { 914 const content::MediaResponseCallback& callback) {
898 web_view_permission_helper_->RequestMediaAccessPermission(source, 915 web_view_permission_helper_->RequestMediaAccessPermission(source,
899 request, 916 request,
900 callback); 917 callback);
901 } 918 }
902 919
903 void WebViewGuest::CanDownload( 920 void WebViewGuest::CanDownload(
904 content::RenderViewHost* render_view_host, 921 content::RenderViewHost* render_view_host,
905 const GURL& url, 922 const GURL& url,
906 const std::string& request_method, 923 const std::string& request_method,
907 const base::Callback<void(bool)>& callback) { 924 const base::Callback<void(bool)>& callback) {
908 web_view_permission_helper_->CanDownload(render_view_host, 925 web_view_permission_helper_->CanDownload(render_view_host,
909 url, 926 url,
910 request_method, 927 request_method,
911 callback); 928 callback);
912 } 929 }
913 930
931 void WebViewGuest::ElementSizeChanged(const gfx::Size& old_size,
932 const gfx::Size& new_size) {
933 element_size_ = new_size;
934 }
935
914 void WebViewGuest::RequestPointerLockPermission( 936 void WebViewGuest::RequestPointerLockPermission(
915 bool user_gesture, 937 bool user_gesture,
916 bool last_unlocked_by_target, 938 bool last_unlocked_by_target,
917 const base::Callback<void(bool)>& callback) { 939 const base::Callback<void(bool)>& callback) {
918 web_view_permission_helper_->RequestPointerLockPermission( 940 web_view_permission_helper_->RequestPointerLockPermission(
919 user_gesture, 941 user_gesture,
920 last_unlocked_by_target, 942 last_unlocked_by_target,
921 callback); 943 callback);
922 } 944 }
923 945
(...skipping 20 matching lines...) Expand all
944 } 966 }
945 967
946 void WebViewGuest::RunFileChooser(WebContents* web_contents, 968 void WebViewGuest::RunFileChooser(WebContents* web_contents,
947 const content::FileChooserParams& params) { 969 const content::FileChooserParams& params) {
948 if (!attached() || !embedder_web_contents()->GetDelegate()) 970 if (!attached() || !embedder_web_contents()->GetDelegate())
949 return; 971 return;
950 972
951 embedder_web_contents()->GetDelegate()->RunFileChooser(web_contents, params); 973 embedder_web_contents()->GetDelegate()->RunFileChooser(web_contents, params);
952 } 974 }
953 975
976 void WebViewGuest::SetAutoSize(bool enabled,
977 const gfx::Size& min_size,
978 const gfx::Size& max_size) {
979 min_auto_size_ = gfx::Size(std::min(max_size.width(), min_size.width()),
980 std::min(max_size.height(), min_size.height()));
981 max_auto_size_ = gfx::Size(std::max(max_size.width(), min_size.width()),
982 std::max(max_size.height(), min_size.height()));
983 enabled &= !!max_auto_size_.width() && !!max_auto_size_.height();
984 if (!enabled && !auto_size_enabled_)
985 return;
986
987 auto_size_enabled_ = enabled;
988
989 if (!attached())
990 return;
991
992 content::RenderViewHost* rvh = guest_web_contents()->GetRenderViewHost();
993 if (auto_size_enabled_) {
994 rvh->EnableAutoResize(min_auto_size_, max_auto_size_);
995 } else {
996 rvh->DisableAutoResize(element_size_);
997 DispatchSizeChangedEvent(guest_size_, element_size_);
998 }
999 }
1000
954 void WebViewGuest::NavigateGuest(const std::string& src) { 1001 void WebViewGuest::NavigateGuest(const std::string& src) {
955 GURL url = ResolveURL(src); 1002 GURL url = ResolveURL(src);
956 1003
957 // Do not allow navigating a guest to schemes other than known safe schemes. 1004 // Do not allow navigating a guest to schemes other than known safe schemes.
958 // This will block the embedder trying to load unwanted schemes, e.g. 1005 // This will block the embedder trying to load unwanted schemes, e.g.
959 // chrome://settings. 1006 // chrome://settings.
960 bool scheme_is_blocked = 1007 bool scheme_is_blocked =
961 (!content::ChildProcessSecurityPolicy::GetInstance()->IsWebSafeScheme( 1008 (!content::ChildProcessSecurityPolicy::GetInstance()->IsWebSafeScheme(
962 url.scheme()) && 1009 url.scheme()) &&
963 !url.SchemeIs(url::kAboutScheme)) || 1010 !url.SchemeIs(url::kAboutScheme)) ||
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 1092
1046 if (event.windowsKeyCode == ui::VKEY_BROWSER_FORWARD) { 1093 if (event.windowsKeyCode == ui::VKEY_BROWSER_FORWARD) {
1047 Go(1); 1094 Go(1);
1048 return true; 1095 return true;
1049 } 1096 }
1050 #endif 1097 #endif
1051 1098
1052 return false; 1099 return false;
1053 } 1100 }
1054 1101
1102 void WebViewGuest::DispatchSizeChangedEvent(const gfx::Size& old_size,
1103 const gfx::Size& new_size) {
1104 guest_size_ = new_size;
1105 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
1106 args->SetInteger(webview::kOldHeight, old_size.height());
1107 args->SetInteger(webview::kOldWidth, old_size.width());
1108 args->SetInteger(webview::kNewHeight, new_size.height());
1109 args->SetInteger(webview::kNewWidth, new_size.width());
1110 DispatchEventToEmbedder(
1111 new GuestViewBase::Event(webview::kEventSizeChanged, args.Pass()));
1112 }
1113
1055 void WebViewGuest::ShowContextMenu(int request_id, 1114 void WebViewGuest::ShowContextMenu(int request_id,
1056 const MenuItemVector* items) { 1115 const MenuItemVector* items) {
1057 if (!pending_menu_.get()) 1116 if (!pending_menu_.get())
1058 return; 1117 return;
1059 1118
1060 // Make sure this was the correct request. 1119 // Make sure this was the correct request.
1061 if (request_id != pending_context_menu_request_id_) 1120 if (request_id != pending_context_menu_request_id_)
1062 return; 1121 return;
1063 1122
1064 // TODO(lazyboy): Implement. 1123 // TODO(lazyboy): Implement.
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1239 bool allow, 1298 bool allow,
1240 const std::string& user_input) { 1299 const std::string& user_input) {
1241 WebViewGuest* guest = 1300 WebViewGuest* guest =
1242 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id); 1301 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id);
1243 if (!guest) 1302 if (!guest)
1244 return; 1303 return;
1245 1304
1246 if (!allow) 1305 if (!allow)
1247 guest->Destroy(); 1306 guest->Destroy();
1248 } 1307 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698