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

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

Issue 19679002: <webview>: Implement dialog API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added more tests and fixed a bug Created 7 years, 5 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 4055cb7ab95f74aa7193e992db5ebfe9a9687740..c504abd04244e83a12880aec23909bb2092c1930 100644
--- a/content/browser/browser_plugin/browser_plugin_guest.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -61,8 +61,9 @@ BrowserPluginHostFactory* BrowserPluginGuest::factory_ = NULL;
// should be able to handle the response to their permission request.
class BrowserPluginGuest::PermissionRequest {
public:
- virtual void Respond(bool should_allow) = 0;
+ virtual void Respond(bool should_allow, const std::string& user_input) = 0;
virtual ~PermissionRequest() {}
+ virtual BrowserPluginPermissionType GetType() const = 0;
protected:
PermissionRequest() {
RecordAction(UserMetricsAction("BrowserPlugin.Guest.PermissionRequest"));
@@ -76,9 +77,13 @@ class BrowserPluginGuest::DownloadRequest : public PermissionRequest {
RecordAction(
UserMetricsAction("BrowserPlugin.Guest.PermissionRequest.Download"));
}
- virtual void Respond(bool should_allow) OVERRIDE {
+ virtual void Respond(bool should_allow,
+ const std::string& user_input) OVERRIDE {
callback_.Run(should_allow);
}
+ virtual BrowserPluginPermissionType GetType() const OVERRIDE {
+ return BrowserPluginPermissionTypeDownload;
+ }
virtual ~DownloadRequest() {}
private:
base::Callback<void(bool)> callback_;
@@ -98,7 +103,8 @@ class BrowserPluginGuest::GeolocationRequest : public PermissionRequest {
UserMetricsAction("BrowserPlugin.Guest.PermissionRequest.Geolocation"));
}
- virtual void Respond(bool should_allow) OVERRIDE {
+ virtual void Respond(bool should_allow,
+ const std::string& user_input) OVERRIDE {
WebContents* web_contents = guest_->embedder_web_contents();
if (should_allow && web_contents) {
// If renderer side embedder decides to allow gelocation, we need to check
@@ -129,6 +135,9 @@ class BrowserPluginGuest::GeolocationRequest : public PermissionRequest {
}
guest_->SetGeolocationPermission(callback_, bridge_id_, false);
}
+ virtual BrowserPluginPermissionType GetType() const OVERRIDE {
+ return BrowserPluginPermissionTypeGeolocation;
+ }
virtual ~GeolocationRequest() {}
private:
base::Callback<void(bool)> callback_;
@@ -149,7 +158,8 @@ class BrowserPluginGuest::MediaRequest : public PermissionRequest {
UserMetricsAction("BrowserPlugin.Guest.PermissionRequest.Media"));
}
- virtual void Respond(bool should_allow) OVERRIDE {
+ virtual void Respond(bool should_allow,
+ const std::string& user_input) OVERRIDE {
WebContentsImpl* web_contents = guest_->embedder_web_contents();
if (should_allow && web_contents) {
// Re-route the request to the embedder's WebContents; the guest gets the
@@ -159,7 +169,9 @@ class BrowserPluginGuest::MediaRequest : public PermissionRequest {
// Deny the request.
callback_.Run(MediaStreamDevices(), scoped_ptr<MediaStreamUI>());
}
-
+ }
+ virtual BrowserPluginPermissionType GetType() const OVERRIDE {
+ return BrowserPluginPermissionTypeMedia;
}
virtual ~MediaRequest() {}
private:
@@ -177,7 +189,8 @@ class BrowserPluginGuest::NewWindowRequest : public PermissionRequest {
UserMetricsAction("BrowserPlugin.Guest.PermissionRequest.NewWindow"));
}
- virtual void Respond(bool should_allow) OVERRIDE {
+ virtual void Respond(bool should_allow,
+ const std::string& user_input) OVERRIDE {
int embedder_render_process_id =
guest_->embedder_web_contents()->GetRenderProcessHost()->GetID();
BrowserPluginGuest* guest =
@@ -192,12 +205,42 @@ class BrowserPluginGuest::NewWindowRequest : public PermissionRequest {
if (!should_allow)
guest->Destroy();
}
+ virtual BrowserPluginPermissionType GetType() const OVERRIDE {
+ return BrowserPluginPermissionTypeNewWindow;
+ }
virtual ~NewWindowRequest() {}
private:
int instance_id_;
BrowserPluginGuest* guest_;
};
+class BrowserPluginGuest::JavaScriptDialogRequest : public PermissionRequest {
+ public:
+ JavaScriptDialogRequest(const DialogClosedCallback& callback,
+ BrowserPluginGuest* guest)
+ : callback_(callback),
+ guest_(guest) {
+ RecordAction(
+ UserMetricsAction(
+ "BrowserPlugin.Guest.PermissionRequest.JavaScriptDialog"));
+ }
+
+ virtual void Respond(bool should_allow,
+ const std::string& user_input) OVERRIDE {
+ if (!guest_)
lazyboy 2013/07/19 21:43:16 How could this turn to null?
Fady Samuel 2013/07/23 15:41:10 Hmm, with the cleanup I recently added for pointer
Fady Samuel 2013/07/23 15:41:10 Hmm, it can't removed.
+ return;
+ callback_.Run(should_allow, UTF8ToUTF16(user_input));
+ }
+ virtual BrowserPluginPermissionType GetType() const OVERRIDE {
+ return BrowserPluginPermissionTypeJavaScriptDialog;
+ }
+
+ virtual ~JavaScriptDialogRequest() {}
+ private:
+ DialogClosedCallback callback_;
+ BrowserPluginGuest* guest_;
lazyboy 2013/07/19 21:43:16 A raw pointer is probably not ok here. Also what
Fady Samuel 2013/07/23 15:41:10 Removed pointer. This request goes away when Brows
+};
+
namespace {
const size_t kNumMaxOutstandingPermissionRequests = 1024;
@@ -224,6 +267,21 @@ static std::string WindowOpenDispositionToString(
}
}
+static std::string JavaScriptMessageTypeToString(
+ JavaScriptMessageType message_type) {
+ switch (message_type) {
+ case JAVASCRIPT_MESSAGE_TYPE_ALERT:
+ return "alert";
+ case JAVASCRIPT_MESSAGE_TYPE_CONFIRM:
+ return "confirm";
+ case JAVASCRIPT_MESSAGE_TYPE_PROMPT:
+ return "prompt";
+ default:
+ NOTREACHED() << "Unknown JavaScript Message Type.";
+ return "unknown";
+ }
+}
+
// Called on IO thread.
static std::string RetrieveDownloadURLFromRequestId(
RenderViewHost* render_view_host,
@@ -563,6 +621,10 @@ void BrowserPluginGuest::CloseContents(WebContents* source) {
delegate_->Close();
}
+JavaScriptDialogManager* BrowserPluginGuest::GetJavaScriptDialogManager() {
+ return this;
+}
+
bool BrowserPluginGuest::HandleContextMenu(const ContextMenuParams& params) {
// TODO(fsamuel): We show the regular page context menu handler for now until
// we implement the Apps Context Menu API for Browser Plugin (see
@@ -1290,15 +1352,16 @@ void BrowserPluginGuest::OnSetVisibility(int instance_id, bool visible) {
void BrowserPluginGuest::OnRespondPermission(
int instance_id,
- BrowserPluginPermissionType permission_type,
int request_id,
- bool should_allow) {
+ bool should_allow,
+ const std::string& user_input) {
RequestMap::iterator request_itr = permission_request_map_.find(request_id);
if (request_itr == permission_request_map_.end()) {
LOG(INFO) << "Not a valid request ID.";
return;
}
- request_itr->second->Respond(should_allow);
+ BrowserPluginPermissionType permission_type = request_itr->second->GetType();
+ request_itr->second->Respond(should_allow, user_input);
// Geolocation requests have to hang around for a while, so we don't delete
// them here.
@@ -1425,6 +1488,61 @@ void BrowserPluginGuest::RequestMediaAccessPermission(
request_id, request_info));
}
+void BrowserPluginGuest::RunJavaScriptDialog(
+ WebContents* web_contents,
+ const GURL& origin_url,
+ const std::string& accept_lang,
+ JavaScriptMessageType javascript_message_type,
+ const string16& message_text,
+ const string16& default_prompt_text,
+ const DialogClosedCallback& callback,
+ bool* did_suppress_message) {
+ if (permission_request_map_.size() >= kNumMaxOutstandingPermissionRequests) {
+ // Cancel the dialog.
+ callback.Run(false, string16());
+ return;
+ }
+ int request_id = next_permission_request_id_++;
+ permission_request_map_[request_id] =
+ new JavaScriptDialogRequest(callback, this);
+ base::DictionaryValue request_info;
+ request_info.Set(
+ browser_plugin::kDefaultPromptText,
+ base::Value::CreateStringValue(UTF16ToUTF8(default_prompt_text)));
+ request_info.Set(
+ browser_plugin::kMessageText,
+ base::Value::CreateStringValue(UTF16ToUTF8(message_text)));
+ request_info.Set(
+ browser_plugin::kMessageType,
+ base::Value::CreateStringValue(
+ JavaScriptMessageTypeToString(javascript_message_type)));
+ request_info.Set(
+ browser_plugin::kURL,
+ base::Value::CreateStringValue(origin_url.spec()));
+ SendMessageToEmbedder(new BrowserPluginMsg_RequestPermission(
+ instance_id(), BrowserPluginPermissionTypeJavaScriptDialog,
+ request_id, request_info));
+}
+
+void BrowserPluginGuest::RunBeforeUnloadDialog(
+ WebContents* web_contents,
+ const string16& message_text,
+ bool is_reload,
+ const DialogClosedCallback& callback) {
+ callback.Run(true, string16());
lazyboy 2013/07/19 21:43:16 What does this do? Can you add a comment.
+}
+
+bool BrowserPluginGuest::HandleJavaScriptDialog(
+ WebContents* web_contents,
lazyboy 2013/07/19 21:43:16 nit: can fit in previous line.
Fady Samuel 2013/07/23 15:41:10 The third line cannot.
+ bool accept,
+ const string16* prompt_override) {
+ return false;
+}
+
+void BrowserPluginGuest::ResetJavaScriptState(
+ WebContents* web_contents) {
lazyboy 2013/07/19 21:43:16 nit: can fit in previous line.
Fady Samuel 2013/07/23 15:41:10 Done.
+}
+
void BrowserPluginGuest::OnUpdateRect(
const ViewHostMsg_UpdateRect_Params& params) {
@@ -1485,8 +1603,8 @@ void BrowserPluginGuest::DidRetrieveDownloadURLFromRequestId(
int permission_request_id,
const std::string& url) {
if (url.empty()) {
- OnRespondPermission(instance_id(), BrowserPluginPermissionTypeDownload,
- permission_request_id, false);
+ OnRespondPermission(instance_id(), permission_request_id,
+ false, std::string());
return;
}

Powered by Google App Engine
This is Rietveld 408576698