#include "chrome/browser/content_settings/tab_specific_content_settings.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tab_contents/tab_util.h"
+#include "chrome/browser/ui/website_settings/permission_bubble_manager.h"
+#include "chrome/browser/ui/website_settings/permission_bubble_request.h"
+#include "chrome/common/pref_names.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
+#include "grit/generated_resources.h"
+#include "net/base/net_util.h"
+#include "ui/base/l10n/l10n_util.h"
+
+class MidiPermissionRequest : public PermissionBubbleRequest {
+ public:
+ MidiPermissionRequest(
+ ChromeMidiPermissionContext* context,
+ const PermissionRequestID& id,
+ const GURL& requesting_frame,
+ const std::string& display_languages,
+ const content::BrowserContext::MidiSysExPermissionCallback& callback);
+ virtual ~MidiPermissionRequest();
+
+ // PermissionBubbleDelegate:
+ virtual base::string16 GetMessageText() const OVERRIDE;
+ virtual base::string16 GetMessageTextFragment() const OVERRIDE;
+ virtual base::string16 GetAlternateAcceptButtonText() const OVERRIDE;
+ virtual base::string16 GetAlternateDenyButtonText() const OVERRIDE;
+ virtual void PermissionGranted() OVERRIDE;
+ virtual void PermissionDenied() OVERRIDE;
+ virtual void Cancelled() OVERRIDE;
+ virtual void RequestFinished() OVERRIDE;
+
+ private:
+ ChromeMidiPermissionContext* context_;
+ const PermissionRequestID id_;
+ GURL requesting_frame_;
+ std::string display_languages_;
+ const content::BrowserContext::MidiSysExPermissionCallback& callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(MidiPermissionRequest);
+};
+
+MidiPermissionRequest::MidiPermissionRequest(
+ ChromeMidiPermissionContext* context,
+ const PermissionRequestID& id,
+ const GURL& requesting_frame,
+ const std::string& display_languages,
+ const content::BrowserContext::MidiSysExPermissionCallback& callback)
+ : context_(context),
+ id_(id),
+ requesting_frame_(requesting_frame),
+ display_languages_(display_languages),
+ callback_(callback) {}
+
+MidiPermissionRequest::~MidiPermissionRequest() {}
+
+base::string16 MidiPermissionRequest::GetMessageText() const {
+ return l10n_util::GetStringFUTF16(
+ IDS_MIDI_SYSEX_INFOBAR_QUESTION,
+ net::FormatUrl(requesting_frame_.GetOrigin(), display_languages_));
+}
+
+base::string16 MidiPermissionRequest::GetMessageTextFragment() const {
+ return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_PERMISSION_FRAGMENT);
+}
+
+base::string16 MidiPermissionRequest::GetAlternateAcceptButtonText() const {
+ return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_ALLOW_BUTTON);
+}
+
+base::string16 MidiPermissionRequest::GetAlternateDenyButtonText() const {
+ return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_DENY_BUTTON);
+}
+
+void MidiPermissionRequest::PermissionGranted() {
+ context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true);
+}
+
+void MidiPermissionRequest::PermissionDenied() {
+ context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false);
+}
+
+void MidiPermissionRequest::Cancelled() {
+ context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false);
+}
+
+void MidiPermissionRequest::RequestFinished() {
+ delete this;
+}
-ChromeMIDIPermissionContext::ChromeMIDIPermissionContext(Profile* profile)
+ChromeMidiPermissionContext::ChromeMidiPermissionContext(Profile* profile)
: profile_(profile),
shutting_down_(false) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
}
-ChromeMIDIPermissionContext::~ChromeMIDIPermissionContext() {
+ChromeMidiPermissionContext::~ChromeMidiPermissionContext() {
DCHECK(!permission_queue_controller_);
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
}
-void ChromeMIDIPermissionContext::Shutdown() {
+void ChromeMidiPermissionContext::Shutdown() {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
permission_queue_controller_.reset();
shutting_down_ = true;
}
-void ChromeMIDIPermissionContext::RequestMIDISysExPermission(
+void ChromeMidiPermissionContext::RequestMidiSysExPermission(
int render_process_id,
int render_view_id,
int bridge_id,
const GURL& requesting_frame,
- const content::BrowserContext::MIDISysExPermissionCallback& callback) {
+ const content::BrowserContext::MidiSysExPermissionCallback& callback) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
DCHECK(!shutting_down_);
// TODO(toyoshim): Support Extension's manifest declared permission.
- // http://crbug.com/266338 .
+ // See http://crbug.com/266338.
content::WebContents* web_contents =
tab_util::GetWebContentsByID(render_process_id, render_view_id);
return;
}
- DecidePermission(id, requesting_frame, embedder, callback);
+ DecidePermission(web_contents, id, requesting_frame, embedder, callback);
}
-void ChromeMIDIPermissionContext::CancelMIDISysExPermissionRequest(
+void ChromeMidiPermissionContext::CancelMidiSysExPermissionRequest(
int render_process_id,
int render_view_id,
int bridge_id,
PermissionRequestID(render_process_id, render_view_id, bridge_id, 0));
}
-void ChromeMIDIPermissionContext::DecidePermission(
+void ChromeMidiPermissionContext::DecidePermission(
+ content::WebContents* web_contents,
const PermissionRequestID& id,
const GURL& requesting_frame,
const GURL& embedder,
- const content::BrowserContext::MIDISysExPermissionCallback& callback) {
+ const content::BrowserContext::MidiSysExPermissionCallback& callback) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
ContentSetting content_setting =
PermissionDecided(id, requesting_frame, embedder, callback, true);
break;
default:
+ if (PermissionBubbleManager::Enabled()) {
+ PermissionBubbleManager* bubble_manager =
+ PermissionBubbleManager::FromWebContents(web_contents);
+ bubble_manager->AddRequest(new MidiPermissionRequest(
+ this, id, requesting_frame,
+ profile_->GetPrefs()->GetString(prefs::kAcceptLanguages),
+ callback));
+ return;
+ }
+
+ // TODO(gbillock): Delete this and the infobar delegate when
+ // we're using only bubbles. crbug.com/337458
GetQueueController()->CreateInfoBarRequest(
id, requesting_frame, embedder, base::Bind(
- &ChromeMIDIPermissionContext::NotifyPermissionSet,
+ &ChromeMidiPermissionContext::NotifyPermissionSet,
base::Unretained(this), id, requesting_frame, callback));
}
}
-void ChromeMIDIPermissionContext::PermissionDecided(
+void ChromeMidiPermissionContext::PermissionDecided(
const PermissionRequestID& id,
const GURL& requesting_frame,
const GURL& embedder,
- const content::BrowserContext::MIDISysExPermissionCallback& callback,
+ const content::BrowserContext::MidiSysExPermissionCallback& callback,
bool allowed) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
NotifyPermissionSet(id, requesting_frame, callback, allowed);
}
-void ChromeMIDIPermissionContext::NotifyPermissionSet(
+void ChromeMidiPermissionContext::NotifyPermissionSet(
const PermissionRequestID& id,
const GURL& requesting_frame,
- const content::BrowserContext::MIDISysExPermissionCallback& callback,
+ const content::BrowserContext::MidiSysExPermissionCallback& callback,
bool allowed) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
id.render_view_id());
if (content_settings) {
if (allowed)
- content_settings->OnMIDISysExAccessed(requesting_frame);
+ content_settings->OnMidiSysExAccessed(requesting_frame);
else
- content_settings->OnMIDISysExAccessBlocked(requesting_frame);
+ content_settings->OnMidiSysExAccessBlocked(requesting_frame);
}
callback.Run(allowed);
}
-PermissionQueueController* ChromeMIDIPermissionContext::GetQueueController() {
+PermissionQueueController* ChromeMidiPermissionContext::GetQueueController() {
if (!permission_queue_controller_) {
permission_queue_controller_.reset(
new PermissionQueueController(profile_,
return permission_queue_controller_.get();
}
-void ChromeMIDIPermissionContext::CancelPendingInfobarRequest(
+void ChromeMidiPermissionContext::CancelPendingInfobarRequest(
const PermissionRequestID& id) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
if (shutting_down_)
return;
+ // TODO(gbillock): Add support for cancellation to permission bubbles.
GetQueueController()->CancelInfoBarRequest(id);
}