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

Unified 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, 7 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 side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698