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 9f9ea466b834bb7667ae8d76cd3b6dcf6b5638ab..35e3f8fa5864f7ffcaec0f3361b33a34b4d36096 100644 |
| --- a/chrome/browser/guest_view/web_view/web_view_guest.cc |
| +++ b/chrome/browser/guest_view/web_view/web_view_guest.cc |
| @@ -9,6 +9,7 @@ |
| #include "base/strings/stringprintf.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/chrome_notification_types.h" |
| +#include "chrome/browser/content_settings/tab_specific_content_settings.h" |
| #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
| #include "chrome/browser/extensions/api/webview/webview_api.h" |
| #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" |
| @@ -69,7 +70,6 @@ |
| #endif |
| using base::UserMetricsAction; |
| -using content::RenderFrameHost; |
|
Fady Samuel
2014/05/30 18:26:13
Put this back.
Xi Han
2014/05/30 19:35:30
Done.
|
| using content::WebContents; |
| namespace { |
| @@ -122,6 +122,8 @@ static std::string PermissionTypeToString(WebViewPermissionType type) { |
| switch (type) { |
| case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: |
| return webview::kPermissionTypeDownload; |
| + case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: |
| + return webview::kPermissionTypeFileSystem; |
| case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: |
| return webview::kPermissionTypeGeolocation; |
| case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: |
| @@ -234,6 +236,10 @@ void WebViewGuest::RecordUserInitiatedUMA(const PermissionResponseInfo& info, |
| content::RecordAction( |
| UserMetricsAction("WebView.PermissionAllow.Download")); |
| break; |
| + case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: |
| + content::RecordAction( |
| + UserMetricsAction("WebView.PermissionAllow.FileSystem")); |
| + break; |
| case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: |
| content::RecordAction( |
| UserMetricsAction("WebView.PermissionAllow.Geolocation")); |
| @@ -266,6 +272,10 @@ void WebViewGuest::RecordUserInitiatedUMA(const PermissionResponseInfo& info, |
| content::RecordAction( |
| UserMetricsAction("WebView.PermissionDeny.Download")); |
| break; |
| + case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: |
| + content::RecordAction( |
| + UserMetricsAction("WebView.PermissionDeny.FileSystem")); |
| + break; |
| case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: |
| content::RecordAction( |
| UserMetricsAction("WebView.PermissionDeny.Geolocation")); |
| @@ -616,6 +626,28 @@ void WebViewGuest::Reload() { |
| guest_web_contents()->GetController().Reload(false); |
| } |
| +void WebViewGuest::RequestFileSystemPermission( |
| + const GURL& url, |
| + bool allowed_by_default, |
| + const base::Callback<void(bool)>& callback) { |
| + base::DictionaryValue request_info; |
| + request_info.Set(guestview::kUrl, base::Value::CreateStringValue(url.spec())); |
| + RequestPermission( |
| + WEB_VIEW_PERMISSION_TYPE_FILESYSTEM, |
| + request_info, |
| + base::Bind(&WebViewGuest::OnWebViewFileSystemPermissionResponse, |
| + base::Unretained(this), |
| + callback), |
| + allowed_by_default); |
| +} |
| + |
| +void WebViewGuest::OnWebViewFileSystemPermissionResponse( |
| + const base::Callback<void(bool)>& callback, |
| + bool allow, |
| + const std::string& user_input) { |
| + callback.Run(allow && attached()); |
| +} |
| + |
| void WebViewGuest::RequestGeolocationPermission( |
| int bridge_id, |
| const GURL& requesting_frame, |
| @@ -787,6 +819,74 @@ bool WebViewGuest::ClearData(const base::Time remove_since, |
| return true; |
| } |
| +// static |
| +void WebViewGuest::FileSystemAccessedAsync(int render_process_id, |
| + int render_frame_id, |
| + int request_id, |
| + const GURL& url, |
| + bool blocked_by_policy) { |
| + WebViewGuest* guest = |
| + WebViewGuest::FromFrame(render_process_id, render_frame_id); |
| + DCHECK(guest); |
| + guest->RequestFileSystemPermission( |
| + url, |
| + !blocked_by_policy, |
| + base::Bind(&WebViewGuest::FileSystemAccessedAsyncResponse, |
| + render_process_id, |
| + render_frame_id, |
| + request_id, |
| + url)); |
| +} |
| + |
| +// static |
| +void WebViewGuest::FileSystemAccessedAsyncResponse(int render_process_id, |
| + int render_frame_id, |
| + int request_id, |
| + const GURL& url, |
| + bool allowed) { |
| + TabSpecificContentSettings::FileSystemAccessed( |
| + render_process_id, render_frame_id, url, !allowed); |
| + content::RenderFrameHost* render_frame_host = |
| + content::RenderFrameHost::FromID(render_process_id, render_frame_id); |
|
Fady Samuel
2014/05/30 18:26:13
It is possible for the frame to go away between th
Xi Han
2014/05/30 19:35:30
Done.
|
| + render_frame_host->Send( |
| + new ChromeViewMsg_RequestFileSystemAccessAsyncResponse( |
| + render_frame_id, request_id, allowed)); |
| +} |
| + |
| +// static |
| +void WebViewGuest::FileSystemAccessedSync(int render_process_id, |
| + int render_frame_id, |
| + const GURL& url, |
| + IPC::Message* reply_msg, |
| + bool blocked_by_policy) { |
| + WebViewGuest* guest = |
| + WebViewGuest::FromFrame(render_process_id, render_frame_id); |
| + DCHECK(guest); |
| + guest->RequestFileSystemPermission( |
| + url, |
| + !blocked_by_policy, |
| + base::Bind(&WebViewGuest::FileSystemAccessedSyncResponse, |
| + render_process_id, |
| + render_frame_id, |
| + url, |
| + reply_msg)); |
| +} |
| + |
| +// static |
| +void WebViewGuest::FileSystemAccessedSyncResponse(int render_process_id, |
| + int render_frame_id, |
| + const GURL& url, |
| + IPC::Message* reply_msg, |
| + bool allowed) { |
| + TabSpecificContentSettings::FileSystemAccessed( |
| + render_process_id, render_frame_id, url, !allowed); |
| + ChromeViewHostMsg_RequestFileSystemAccessSync::WriteReplyParams(reply_msg, |
| + allowed); |
| + content::RenderFrameHost* render_frame_host = |
| + content::RenderFrameHost::FromID(render_process_id, render_frame_id); |
|
Fady Samuel
2014/05/30 18:26:13
if (!render_frame_host)
return;
Xi Han
2014/05/30 19:35:30
Done.
|
| + render_frame_host->Send(reply_msg); |
| +} |
| + |
| WebViewGuest::~WebViewGuest() { |
| } |
| @@ -862,8 +962,9 @@ void WebViewGuest::DidStopLoading(content::RenderViewHost* render_view_host) { |
| DispatchEvent(new GuestViewBase::Event(webview::kEventLoadStop, args.Pass())); |
| } |
| -bool WebViewGuest::OnMessageReceived(const IPC::Message& message, |
| - RenderFrameHost* render_frame_host) { |
| +bool WebViewGuest::OnMessageReceived( |
|
Fady Samuel
2014/05/30 18:26:13
Restore this.
Xi Han
2014/05/30 19:35:30
Done.
|
| + const IPC::Message& message, |
| + content::RenderFrameHost* render_frame_host) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(WebViewGuest, message) |
| IPC_MESSAGE_HANDLER(ChromeViewHostMsg_UpdateFrameName, OnUpdateFrameName) |