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