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