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..2c623a73431560d2cab092a121eadac6fbdbe123 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; |
| using content::WebContents; |
| namespace { |
| @@ -134,6 +134,8 @@ static std::string PermissionTypeToString(WebViewPermissionType type) { |
| return webview::kPermissionTypeNewWindow; |
| case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: |
| return webview::kPermissionTypePointerLock; |
| + case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: |
|
fsamuel
2014/05/30 15:13:21
Order alphabetically.
Xi Han
2014/05/30 18:15:56
Done.
|
| + return webview::kPermissionTypeFileSystem; |
| default: |
| NOTREACHED(); |
| return std::string(); |
| @@ -257,6 +259,9 @@ void WebViewGuest::RecordUserInitiatedUMA(const PermissionResponseInfo& info, |
| content::RecordAction( |
| UserMetricsAction("WebView.PermissionAllow.PointerLock")); |
| break; |
| + case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: |
|
fsamuel
2014/05/30 15:13:21
Order alphabetically
Xi Han
2014/05/30 18:15:56
Done.
|
| + content::RecordAction( |
| + UserMetricsAction("WebView.PermissionAllow.FileSystem")); |
| default: |
| break; |
| } |
| @@ -289,6 +294,10 @@ void WebViewGuest::RecordUserInitiatedUMA(const PermissionResponseInfo& info, |
| content::RecordAction( |
| UserMetricsAction("WebView.PermissionDeny.PointerLock")); |
| break; |
| + case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: |
|
fsamuel
2014/05/30 15:13:21
Order alphabetically.
Xi Han
2014/05/30 18:15:56
Done.
|
| + content::RecordAction( |
| + UserMetricsAction("WebView.PermissionDeny.FileSystem")); |
| + break; |
| default: |
| break; |
| } |
| @@ -616,6 +625,27 @@ void WebViewGuest::Reload() { |
| guest_web_contents()->GetController().Reload(false); |
| } |
| +void WebViewGuest::RequestFileSystemPermission( |
| + const GURL& url, |
| + 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), |
| + false /* 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 +817,85 @@ 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) { |
|
fsamuel
2014/05/30 15:13:21
This should be passing into allowed_by_default
Xi Han
2014/05/30 18:15:56
Done.
|
| + 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.
|
| + WebViewGuest* guest = GetWebViewGuest(render_process_id, render_frame_id); |
| + DCHECK(guest); |
| + guest->RequestFileSystemPermission( |
| + url, |
| + base::Bind(&WebViewGuest::FileSystemAccessedAsyncInternal, |
| + render_process_id, |
| + render_frame_id, |
| + request_id, |
| + url)); |
| +} |
| + |
| +// static |
| +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.
|
| + int render_frame_id, |
| + int request_id, |
| + const GURL& url, |
| + 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
|
| + 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.
|
| + TabSpecificContentSettings::FileSystemAccessed( |
| + render_process_id, render_frame_id, url, blocked_by_policy); |
| + content::RenderFrameHost* render_frame_host = |
| + content::RenderFrameHost::FromID(render_process_id, render_frame_id); |
| + render_frame_host->Send( |
| + new ChromeViewMsg_RequestFileSystemAccessAsyncResponse( |
| + render_frame_id, request_id, !blocked_by_policy)); |
| +} |
| + |
| +// static |
| +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.
|
| + int render_frame_id) { |
| + content::RenderFrameHost* render_frame_host = |
| + 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.
|
| + WebContents* web_contents = |
| + WebContents::FromRenderFrameHost(render_frame_host); |
| + return WebViewGuest::FromWebContents(web_contents); |
| +} |
| + |
| +// static |
| +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.
|
| + int render_frame_id, |
| + const GURL& url, |
| + IPC::Message* reply_msg, |
| + bool blocked_by_policy) { |
| + 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.
|
| + WebViewGuest* guest = GetWebViewGuest(render_process_id, render_frame_id); |
| + DCHECK(guest); |
| + guest->RequestFileSystemPermission( |
| + url, |
| + base::Bind(&WebViewGuest::FileSystemAccessedSyncDelayReplyInternal, |
| + render_process_id, |
| + render_frame_id, |
| + url, |
| + reply_msg)); |
| +} |
| + |
| +// static |
| +void WebViewGuest::FileSystemAccessedSyncDelayReplyInternal( |
|
fsamuel
2014/05/30 15:13:21
WebViewGuest::FileSystemAccessedSyncResponse
Xi Han
2014/05/30 18:15:56
Done.
|
| + int render_process_id, |
| + int render_frame_id, |
| + const GURL& url, |
| + IPC::Message* reply_msg, |
| + 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.
|
| + 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.
|
| + TabSpecificContentSettings::FileSystemAccessed( |
| + render_process_id, render_frame_id, url, blocked_by_policy); |
| + ChromeViewHostMsg_RequestFileSystemAccessSync::WriteReplyParams( |
| + reply_msg, !blocked_by_policy); |
|
fsamuel
2014/05/30 15:13:21
Do you have the logic reversed here?
|
| + content::RenderFrameHost* render_frame_host = |
| + content::RenderFrameHost::FromID(render_process_id, render_frame_id); |
| + render_frame_host->Send(reply_msg); |
| +} |
| + |
| WebViewGuest::~WebViewGuest() { |
| } |
| @@ -862,8 +971,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( |
|
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
|
| + const IPC::Message& message, |
| + content::RenderFrameHost* render_frame_host) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(WebViewGuest, message) |
| IPC_MESSAGE_HANDLER(ChromeViewHostMsg_UpdateFrameName, OnUpdateFrameName) |