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

Side by Side Diff: chrome/browser/guest_view/web_view/web_view_guest.cc

Issue 306473012: Plumb file system permission into WebviewGuest. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move permission requests to WebViewGuest. Created 6 years, 6 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/debug/stack_trace.h" 7 #include "base/debug/stack_trace.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/browser/chrome_notification_types.h" 11 #include "chrome/browser/chrome_notification_types.h"
12 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
12 #include "chrome/browser/extensions/api/web_request/web_request_api.h" 13 #include "chrome/browser/extensions/api/web_request/web_request_api.h"
13 #include "chrome/browser/extensions/api/webview/webview_api.h" 14 #include "chrome/browser/extensions/api/webview/webview_api.h"
14 #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" 15 #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
15 #include "chrome/browser/extensions/extension_renderer_state.h" 16 #include "chrome/browser/extensions/extension_renderer_state.h"
16 #include "chrome/browser/extensions/menu_manager.h" 17 #include "chrome/browser/extensions/menu_manager.h"
17 #include "chrome/browser/extensions/script_executor.h" 18 #include "chrome/browser/extensions/script_executor.h"
18 #include "chrome/browser/favicon/favicon_tab_helper.h" 19 #include "chrome/browser/favicon/favicon_tab_helper.h"
19 #include "chrome/browser/guest_view/guest_view_constants.h" 20 #include "chrome/browser/guest_view/guest_view_constants.h"
20 #include "chrome/browser/guest_view/guest_view_manager.h" 21 #include "chrome/browser/guest_view/guest_view_manager.h"
21 #include "chrome/browser/guest_view/web_view/web_view_constants.h" 22 #include "chrome/browser/guest_view/web_view/web_view_constants.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 63
63 #if defined(ENABLE_PLUGINS) 64 #if defined(ENABLE_PLUGINS)
64 #include "chrome/browser/guest_view/web_view/plugin_permission_helper.h" 65 #include "chrome/browser/guest_view/web_view/plugin_permission_helper.h"
65 #endif 66 #endif
66 67
67 #if defined(OS_CHROMEOS) 68 #if defined(OS_CHROMEOS)
68 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h" 69 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
69 #endif 70 #endif
70 71
71 using base::UserMetricsAction; 72 using base::UserMetricsAction;
72 using content::RenderFrameHost;
73 using content::WebContents; 73 using content::WebContents;
74 74
75 namespace { 75 namespace {
76 76
77 std::string WindowOpenDispositionToString( 77 std::string WindowOpenDispositionToString(
78 WindowOpenDisposition window_open_disposition) { 78 WindowOpenDisposition window_open_disposition) {
79 switch (window_open_disposition) { 79 switch (window_open_disposition) {
80 case IGNORE_ACTION: 80 case IGNORE_ACTION:
81 return "ignore"; 81 return "ignore";
82 case SAVE_TO_DISK: 82 case SAVE_TO_DISK:
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: 127 case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG:
128 return webview::kPermissionTypeDialog; 128 return webview::kPermissionTypeDialog;
129 case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: 129 case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN:
130 return webview::kPermissionTypeLoadPlugin; 130 return webview::kPermissionTypeLoadPlugin;
131 case WEB_VIEW_PERMISSION_TYPE_MEDIA: 131 case WEB_VIEW_PERMISSION_TYPE_MEDIA:
132 return webview::kPermissionTypeMedia; 132 return webview::kPermissionTypeMedia;
133 case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: 133 case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW:
134 return webview::kPermissionTypeNewWindow; 134 return webview::kPermissionTypeNewWindow;
135 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: 135 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK:
136 return webview::kPermissionTypePointerLock; 136 return webview::kPermissionTypePointerLock;
137 case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM:
fsamuel 2014/05/30 15:13:21 Order alphabetically.
Xi Han 2014/05/30 18:15:56 Done.
138 return webview::kPermissionTypeFileSystem;
137 default: 139 default:
138 NOTREACHED(); 140 NOTREACHED();
139 return std::string(); 141 return std::string();
140 } 142 }
141 } 143 }
142 144
143 void RemoveWebViewEventListenersOnIOThread( 145 void RemoveWebViewEventListenersOnIOThread(
144 void* profile, 146 void* profile,
145 const std::string& extension_id, 147 const std::string& extension_id,
146 int embedder_process_id, 148 int embedder_process_id,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 UserMetricsAction("WebView.PermissionAllow.Media")); 252 UserMetricsAction("WebView.PermissionAllow.Media"));
251 break; 253 break;
252 case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: 254 case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW:
253 content::RecordAction( 255 content::RecordAction(
254 UserMetricsAction("BrowserPlugin.PermissionAllow.NewWindow")); 256 UserMetricsAction("BrowserPlugin.PermissionAllow.NewWindow"));
255 break; 257 break;
256 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: 258 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK:
257 content::RecordAction( 259 content::RecordAction(
258 UserMetricsAction("WebView.PermissionAllow.PointerLock")); 260 UserMetricsAction("WebView.PermissionAllow.PointerLock"));
259 break; 261 break;
262 case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM:
fsamuel 2014/05/30 15:13:21 Order alphabetically
Xi Han 2014/05/30 18:15:56 Done.
263 content::RecordAction(
264 UserMetricsAction("WebView.PermissionAllow.FileSystem"));
260 default: 265 default:
261 break; 266 break;
262 } 267 }
263 } else { 268 } else {
264 switch (info.permission_type) { 269 switch (info.permission_type) {
265 case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: 270 case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD:
266 content::RecordAction( 271 content::RecordAction(
267 UserMetricsAction("WebView.PermissionDeny.Download")); 272 UserMetricsAction("WebView.PermissionDeny.Download"));
268 break; 273 break;
269 case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: 274 case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION:
(...skipping 12 matching lines...) Expand all
282 UserMetricsAction("WebView.PermissionDeny.Media")); 287 UserMetricsAction("WebView.PermissionDeny.Media"));
283 break; 288 break;
284 case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: 289 case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW:
285 content::RecordAction( 290 content::RecordAction(
286 UserMetricsAction("BrowserPlugin.PermissionDeny.NewWindow")); 291 UserMetricsAction("BrowserPlugin.PermissionDeny.NewWindow"));
287 break; 292 break;
288 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: 293 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK:
289 content::RecordAction( 294 content::RecordAction(
290 UserMetricsAction("WebView.PermissionDeny.PointerLock")); 295 UserMetricsAction("WebView.PermissionDeny.PointerLock"));
291 break; 296 break;
297 case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM:
fsamuel 2014/05/30 15:13:21 Order alphabetically.
Xi Han 2014/05/30 18:15:56 Done.
298 content::RecordAction(
299 UserMetricsAction("WebView.PermissionDeny.FileSystem"));
300 break;
292 default: 301 default:
293 break; 302 break;
294 } 303 }
295 } 304 }
296 } 305 }
297 306
298 // static 307 // static
299 scoped_ptr<base::ListValue> WebViewGuest::MenuModelToValue( 308 scoped_ptr<base::ListValue> WebViewGuest::MenuModelToValue(
300 const ui::SimpleMenuModel& menu_model) { 309 const ui::SimpleMenuModel& menu_model) {
301 scoped_ptr<base::ListValue> items(new base::ListValue()); 310 scoped_ptr<base::ListValue> items(new base::ListValue());
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 guest_web_contents()->GetController().GoToOffset(relative_index); 618 guest_web_contents()->GetController().GoToOffset(relative_index);
610 } 619 }
611 620
612 void WebViewGuest::Reload() { 621 void WebViewGuest::Reload() {
613 // TODO(fsamuel): Don't check for repost because we don't want to show 622 // TODO(fsamuel): Don't check for repost because we don't want to show
614 // Chromium's repost warning. We might want to implement a separate API 623 // Chromium's repost warning. We might want to implement a separate API
615 // for registering a callback if a repost is about to happen. 624 // for registering a callback if a repost is about to happen.
616 guest_web_contents()->GetController().Reload(false); 625 guest_web_contents()->GetController().Reload(false);
617 } 626 }
618 627
628 void WebViewGuest::RequestFileSystemPermission(
629 const GURL& url,
630 const base::Callback<void(bool)>& callback) {
631 base::DictionaryValue request_info;
632 request_info.Set(guestview::kUrl, base::Value::CreateStringValue(url.spec()));
633 RequestPermission(
634 WEB_VIEW_PERMISSION_TYPE_FILESYSTEM,
635 request_info,
636 base::Bind(&WebViewGuest::OnWebViewFileSystemPermissionResponse,
637 base::Unretained(this),
638 callback),
639 false /* allowed_by_default */);
640 }
641
642 void WebViewGuest::OnWebViewFileSystemPermissionResponse(
643 const base::Callback<void(bool)>& callback,
644 bool allow,
645 const std::string& user_input) {
646 callback.Run(!allow || !attached());
647 }
648
619 void WebViewGuest::RequestGeolocationPermission( 649 void WebViewGuest::RequestGeolocationPermission(
620 int bridge_id, 650 int bridge_id,
621 const GURL& requesting_frame, 651 const GURL& requesting_frame,
622 bool user_gesture, 652 bool user_gesture,
623 const base::Callback<void(bool)>& callback) { 653 const base::Callback<void(bool)>& callback) {
624 base::DictionaryValue request_info; 654 base::DictionaryValue request_info;
625 request_info.Set(guestview::kUrl, 655 request_info.Set(guestview::kUrl,
626 base::Value::CreateStringValue(requesting_frame.spec())); 656 base::Value::CreateStringValue(requesting_frame.spec()));
627 request_info.Set(guestview::kUserGesture, 657 request_info.Set(guestview::kUserGesture,
628 base::Value::CreateBooleanValue(user_gesture)); 658 base::Value::CreateBooleanValue(user_gesture));
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
780 removal_mask, 810 removal_mask,
781 content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL, 811 content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
782 GURL(), 812 GURL(),
783 content::StoragePartition::OriginMatcherFunction(), 813 content::StoragePartition::OriginMatcherFunction(),
784 remove_since, 814 remove_since,
785 base::Time::Now(), 815 base::Time::Now(),
786 callback); 816 callback);
787 return true; 817 return true;
788 } 818 }
789 819
820 // static
821 void WebViewGuest::FileSystemAccessedAsync(int render_process_id,
822 int render_frame_id,
823 int request_id,
824 const GURL& url,
825 bool blocked_by_policy) {
fsamuel 2014/05/30 15:13:21 This should be passing into allowed_by_default
Xi Han 2014/05/30 18:15:56 Done.
826 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
fsamuel 2014/05/30 15:13:21 Drop this.
Xi Han 2014/05/30 18:15:56 Done.
827 WebViewGuest* guest = GetWebViewGuest(render_process_id, render_frame_id);
828 DCHECK(guest);
829 guest->RequestFileSystemPermission(
830 url,
831 base::Bind(&WebViewGuest::FileSystemAccessedAsyncInternal,
832 render_process_id,
833 render_frame_id,
834 request_id,
835 url));
836 }
837
838 // static
839 void WebViewGuest::FileSystemAccessedAsyncInternal(int render_process_id,
fsamuel 2014/05/30 15:13:21 WebViewGuest::FileSystemAccessedAsyncResponse
Xi Han 2014/05/30 18:15:56 Done.
840 int render_frame_id,
841 int request_id,
842 const GURL& url,
843 bool blocked_by_policy) {
fsamuel 2014/05/30 15:13:21 This should be passed into allowed_by_default.
Xi Han 2014/05/30 18:15:56 Not this one, but the one in WebViewGuest::FileSys
844 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
fsamuel 2014/05/30 15:13:21 Drop this.
Xi Han 2014/05/30 18:15:56 Done.
845 TabSpecificContentSettings::FileSystemAccessed(
846 render_process_id, render_frame_id, url, blocked_by_policy);
847 content::RenderFrameHost* render_frame_host =
848 content::RenderFrameHost::FromID(render_process_id, render_frame_id);
849 render_frame_host->Send(
850 new ChromeViewMsg_RequestFileSystemAccessAsyncResponse(
851 render_frame_id, request_id, !blocked_by_policy));
852 }
853
854 // static
855 WebViewGuest* WebViewGuest::GetWebViewGuest(int render_process_id,
fsamuel 2014/05/30 15:13:21 Call it from WebViewGuest::FromFrame, and make it
Xi Han 2014/05/30 18:15:56 Done.
856 int render_frame_id) {
857 content::RenderFrameHost* render_frame_host =
858 content::RenderFrameHost::FromID(render_process_id, render_frame_id);
fsamuel 2014/05/30 15:13:21 if (!render_frame_host) return NULL;
Xi Han 2014/05/30 18:15:56 Done.
859 WebContents* web_contents =
860 WebContents::FromRenderFrameHost(render_frame_host);
861 return WebViewGuest::FromWebContents(web_contents);
862 }
863
864 // static
865 void WebViewGuest::FileSystemAccessedSyncDelayReply(int render_process_id,
fsamuel 2014/05/30 15:13:21 WebViewGuest::FileSystemAccessedSync
Xi Han 2014/05/30 18:15:56 Done.
866 int render_frame_id,
867 const GURL& url,
868 IPC::Message* reply_msg,
869 bool blocked_by_policy) {
870 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
fsamuel 2014/05/30 15:13:21 Drop this. Everything in WebViewGuest is assumed U
Xi Han 2014/05/30 18:15:56 Done.
871 WebViewGuest* guest = GetWebViewGuest(render_process_id, render_frame_id);
872 DCHECK(guest);
873 guest->RequestFileSystemPermission(
874 url,
875 base::Bind(&WebViewGuest::FileSystemAccessedSyncDelayReplyInternal,
876 render_process_id,
877 render_frame_id,
878 url,
879 reply_msg));
880 }
881
882 // static
883 void WebViewGuest::FileSystemAccessedSyncDelayReplyInternal(
fsamuel 2014/05/30 15:13:21 WebViewGuest::FileSystemAccessedSyncResponse
Xi Han 2014/05/30 18:15:56 Done.
884 int render_process_id,
885 int render_frame_id,
886 const GURL& url,
887 IPC::Message* reply_msg,
888 bool blocked_by_policy) {
fsamuel 2014/05/30 15:13:21 This is not blocked_by_policy. This is allowed.
Xi Han 2014/05/30 18:15:56 Done.
889 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
fsamuel 2014/05/30 15:13:21 Drop this. Everything in WebViewGuest is assumed U
Xi Han 2014/05/30 18:15:56 Done.
Xi Han 2014/05/30 18:15:56 Done.
890 TabSpecificContentSettings::FileSystemAccessed(
891 render_process_id, render_frame_id, url, blocked_by_policy);
892 ChromeViewHostMsg_RequestFileSystemAccessSync::WriteReplyParams(
893 reply_msg, !blocked_by_policy);
fsamuel 2014/05/30 15:13:21 Do you have the logic reversed here?
894 content::RenderFrameHost* render_frame_host =
895 content::RenderFrameHost::FromID(render_process_id, render_frame_id);
896 render_frame_host->Send(reply_msg);
897 }
898
790 WebViewGuest::~WebViewGuest() { 899 WebViewGuest::~WebViewGuest() {
791 } 900 }
792 901
793 void WebViewGuest::DidCommitProvisionalLoadForFrame( 902 void WebViewGuest::DidCommitProvisionalLoadForFrame(
794 int64 frame_id, 903 int64 frame_id,
795 const base::string16& frame_unique_name, 904 const base::string16& frame_unique_name,
796 bool is_main_frame, 905 bool is_main_frame,
797 const GURL& url, 906 const GURL& url,
798 content::PageTransition transition_type, 907 content::PageTransition transition_type,
799 content::RenderViewHost* render_view_host) { 908 content::RenderViewHost* render_view_host) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 content::RenderViewHost* render_view_host) { 964 content::RenderViewHost* render_view_host) {
856 if (frame_id == main_frame_id_) 965 if (frame_id == main_frame_id_)
857 InjectChromeVoxIfNeeded(render_view_host); 966 InjectChromeVoxIfNeeded(render_view_host);
858 } 967 }
859 968
860 void WebViewGuest::DidStopLoading(content::RenderViewHost* render_view_host) { 969 void WebViewGuest::DidStopLoading(content::RenderViewHost* render_view_host) {
861 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); 970 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
862 DispatchEvent(new GuestViewBase::Event(webview::kEventLoadStop, args.Pass())); 971 DispatchEvent(new GuestViewBase::Event(webview::kEventLoadStop, args.Pass()));
863 } 972 }
864 973
865 bool WebViewGuest::OnMessageReceived(const IPC::Message& message, 974 bool WebViewGuest::OnMessageReceived(
fsamuel 2014/05/30 15:13:21 Revert this part. This seems unnecessary.
Xi Han 2014/05/30 18:15:56 This is necessary to add "content::" before Render
866 RenderFrameHost* render_frame_host) { 975 const IPC::Message& message,
976 content::RenderFrameHost* render_frame_host) {
867 bool handled = true; 977 bool handled = true;
868 IPC_BEGIN_MESSAGE_MAP(WebViewGuest, message) 978 IPC_BEGIN_MESSAGE_MAP(WebViewGuest, message)
869 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_UpdateFrameName, OnUpdateFrameName) 979 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_UpdateFrameName, OnUpdateFrameName)
870 IPC_MESSAGE_UNHANDLED(handled = false) 980 IPC_MESSAGE_UNHANDLED(handled = false)
871 IPC_END_MESSAGE_MAP() 981 IPC_END_MESSAGE_MAP()
872 return handled; 982 return handled;
873 } 983 }
874 984
875 void WebViewGuest::WebContentsDestroyed() { 985 void WebViewGuest::WebContentsDestroyed() {
876 // Clean up custom context menu items for this guest. 986 // Clean up custom context menu items for this guest.
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
1404 bool allow, 1514 bool allow,
1405 const std::string& user_input) { 1515 const std::string& user_input) {
1406 WebViewGuest* guest = 1516 WebViewGuest* guest =
1407 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id); 1517 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id);
1408 if (!guest) 1518 if (!guest)
1409 return; 1519 return;
1410 1520
1411 if (!allow) 1521 if (!allow)
1412 guest->Destroy(); 1522 guest->Destroy();
1413 } 1523 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698