blob: ae55f9394b4cc3e48bf9ba085daa55818e0dcccc [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/chrome_midi_permission_context.h"
#include "base/prefs/pref_service.h"
#include "chrome/browser/content_settings/host_content_settings_map.h"
#include "chrome/browser/content_settings/permission_queue_controller.h"
#include "chrome/browser/content_settings/permission_request_id.h"
#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 "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
ChromeMIDIPermissionContext::ChromeMIDIPermissionContext(Profile* profile)
: profile_(profile),
shutting_down_(false) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
}
ChromeMIDIPermissionContext::~ChromeMIDIPermissionContext() {
DCHECK(!permission_queue_controller_);
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
}
void ChromeMIDIPermissionContext::Shutdown() {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
permission_queue_controller_.reset();
shutting_down_ = true;
}
void ChromeMIDIPermissionContext::RequestMIDISysExPermission(
int render_process_id,
int render_view_id,
int bridge_id,
const GURL& requesting_frame,
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 .
content::WebContents* web_contents =
tab_util::GetWebContentsByID(render_process_id, render_view_id);
// The page doesn't exist any more.
if (!web_contents)
return;
const PermissionRequestID id(render_process_id, render_view_id, bridge_id);
GURL embedder = web_contents->GetURL();
if (!requesting_frame.is_valid() || !embedder.is_valid()) {
LOG(WARNING) << "Attempt to use MIDI sysex from an invalid URL: "
<< requesting_frame << "," << embedder
<< " (Web MIDI is not supported in popups)";
PermissionDecided(id, requesting_frame, embedder, callback, false);
return;
}
DecidePermission(id, requesting_frame, embedder, callback);
}
void ChromeMIDIPermissionContext::CancelMIDISysExPermissionRequest(
int render_process_id,
int render_view_id,
int bridge_id,
const GURL& requesting_frame) {
CancelPendingInfoBarRequest(
PermissionRequestID(render_process_id, render_view_id, bridge_id));
}
void ChromeMIDIPermissionContext::DecidePermission(
const PermissionRequestID& id,
const GURL& requesting_frame,
const GURL& embedder,
const content::BrowserContext::MIDISysExPermissionCallback& callback) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
ContentSetting content_setting =
profile_->GetHostContentSettingsMap()->GetContentSetting(
requesting_frame,
embedder,
CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
std::string());
switch (content_setting) {
case CONTENT_SETTING_BLOCK:
PermissionDecided(id, requesting_frame, embedder, callback, false);
break;
case CONTENT_SETTING_ALLOW:
PermissionDecided(id, requesting_frame, embedder, callback, true);
break;
default:
GetQueueController()->CreateInfoBarRequest(
id, requesting_frame, embedder, base::Bind(
&ChromeMIDIPermissionContext::NotifyPermissionSet,
base::Unretained(this), id, requesting_frame, callback));
}
}
void ChromeMIDIPermissionContext::PermissionDecided(
const PermissionRequestID& id,
const GURL& requesting_frame,
const GURL& embedder,
const content::BrowserContext::MIDISysExPermissionCallback& callback,
bool allowed) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
NotifyPermissionSet(id, requesting_frame, callback, allowed);
}
void ChromeMIDIPermissionContext::NotifyPermissionSet(
const PermissionRequestID& id,
const GURL& requesting_frame,
const content::BrowserContext::MIDISysExPermissionCallback& callback,
bool allowed) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
TabSpecificContentSettings* content_settings =
TabSpecificContentSettings::Get(id.render_process_id(),
id.render_view_id());
if (content_settings) {
if (allowed)
content_settings->OnMIDISysExAccessed(requesting_frame);
else
content_settings->OnMIDISysExAccessBlocked(requesting_frame);
}
callback.Run(allowed);
}
PermissionQueueController* ChromeMIDIPermissionContext::GetQueueController() {
if (!permission_queue_controller_) {
permission_queue_controller_.reset(
new PermissionQueueController(profile_,
CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
}
return permission_queue_controller_.get();
}
void ChromeMIDIPermissionContext::CancelPendingInfoBarRequest(
const PermissionRequestID& id) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
if (shutting_down_)
return;
GetQueueController()->CancelInfoBarRequest(id);
}