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

Unified Diff: content/browser/browser_plugin/browser_plugin_guest.cc

Issue 13037003: permissionrequest API for guest Download. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge two CanDownload* functions. Created 7 years, 9 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: content/browser/browser_plugin/browser_plugin_guest.cc
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc
index 973408fbd476f1fa1a1d651c24368d9a7ca8a06c..cfd9b5563bd6d916c8f55933f2ba1c71a7bcfaef 100644
--- a/content/browser/browser_plugin/browser_plugin_guest.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -307,14 +307,29 @@ void BrowserPluginGuest::AddNewContents(WebContents* source,
disposition, initial_pos, user_gesture);
}
-bool BrowserPluginGuest::CanDownload(RenderViewHost* render_view_host,
- int request_id,
- const std::string& request_method) {
- // TODO(fsamuel): We disable downloads in guests for now, but we will later
- // expose API to allow embedders to handle them.
- // Note: it seems content_shell ignores this. This should be fixed
- // for debugging and test purposes.
- return false;
+void BrowserPluginGuest::CanDownload(
+ RenderViewHost* render_view_host,
+ int request_id,
+ const std::string& request_method,
+ const base::Callback<void(bool)>& callback) {
+ if (download_request_callback_map_.size() >=
+ kNumMaxOutstandingPermissionRequests) {
+ // Deny the download request.
+ callback.Run(false);
+ return;
+ }
+
+ int download_request_id = next_permission_request_id_++;
+ download_request_callback_map_[download_request_id] = callback;
+
+ base::DictionaryValue request_info;
+ request_info.Set(browser_plugin::kRequestMethod,
+ base::Value::CreateStringValue(request_method));
+
+ SendMessageToEmbedder(
+ new BrowserPluginMsg_RequestPermission(instance_id(),
+ BrowserPluginPermissionTypeDownload, download_request_id,
+ request_info));
}
bool BrowserPluginGuest::HandleContextMenu(
@@ -945,6 +960,9 @@ void BrowserPluginGuest::OnRespondPermission(
int request_id,
bool should_allow) {
switch (permission_type) {
+ case BrowserPluginPermissionTypeDownload:
+ OnRespondPermissionDownload(request_id, should_allow);
+ break;
case BrowserPluginPermissionTypeGeolocation:
OnRespondPermissionGeolocation(request_id, should_allow);
break;
@@ -1157,6 +1175,20 @@ void BrowserPluginGuest::OnUpdateRect(
new BrowserPluginMsg_UpdateRect(instance_id(), relay_params));
}
+void BrowserPluginGuest::OnRespondPermissionDownload(int request_id,
+ bool should_allow) {
+ DownloadRequestMap::iterator download_request_iter =
+ download_request_callback_map_.find(request_id);
+ if (download_request_iter == download_request_callback_map_.end()) {
+ LOG(INFO) << "Not a valid request ID.";
+ return;
+ }
+
+ const base::Callback<void(bool)>& can_download_callback =
+ download_request_iter->second;
+ can_download_callback.Run(should_allow);
+}
+
void BrowserPluginGuest::OnRespondPermissionGeolocation(
int request_id, bool should_allow) {
if (should_allow && embedder_web_contents_) {

Powered by Google App Engine
This is Rietveld 408576698