2012-04-03 03:34:16 +02:00
|
|
|
// Copyright (c) 2012 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 "libcef/browser/browser_context.h"
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
|
|
|
|
#include "libcef/browser/browser_host_impl.h"
|
2012-06-25 20:22:50 +02:00
|
|
|
#include "libcef/browser/context.h"
|
2012-04-03 03:34:16 +02:00
|
|
|
#include "libcef/browser/download_manager_delegate.h"
|
|
|
|
#include "libcef/browser/resource_context.h"
|
|
|
|
#include "libcef/browser/thread_util.h"
|
|
|
|
#include "libcef/browser/url_request_context_getter.h"
|
|
|
|
|
|
|
|
#include "base/bind.h"
|
|
|
|
#include "base/logging.h"
|
|
|
|
#include "base/threading/thread.h"
|
2012-04-04 20:18:09 +02:00
|
|
|
#include "content/public/browser/download_manager.h"
|
2012-04-03 03:34:16 +02:00
|
|
|
#include "content/public/browser/browser_thread.h"
|
|
|
|
#include "content/public/browser/geolocation_permission_context.h"
|
|
|
|
#include "content/public/browser/speech_recognition_preferences.h"
|
|
|
|
|
|
|
|
using content::BrowserThread;
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
class CefGeolocationPermissionContext
|
|
|
|
: public content::GeolocationPermissionContext {
|
|
|
|
public:
|
|
|
|
// CefGeolocationCallback implementation.
|
|
|
|
class CallbackImpl : public CefGeolocationCallback {
|
|
|
|
public:
|
|
|
|
typedef base::Callback<void(bool)> // NOLINT(readability/function)
|
|
|
|
CallbackType;
|
|
|
|
|
|
|
|
explicit CallbackImpl(
|
|
|
|
CefGeolocationPermissionContext* context,
|
|
|
|
int bridge_id,
|
|
|
|
const CallbackType& callback)
|
|
|
|
: context_(context),
|
|
|
|
bridge_id_(bridge_id),
|
|
|
|
callback_(callback) {}
|
|
|
|
|
|
|
|
virtual void Continue(bool allow) OVERRIDE {
|
|
|
|
if (CEF_CURRENTLY_ON_IOT()) {
|
|
|
|
if (!callback_.is_null()) {
|
|
|
|
// Callback must be executed on the UI thread.
|
|
|
|
CEF_POST_TASK(CEF_UIT,
|
|
|
|
base::Bind(&CallbackImpl::Run, callback_, allow));
|
|
|
|
context_->RemoveCallback(bridge_id_);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
CEF_POST_TASK(CEF_IOT,
|
|
|
|
base::Bind(&CallbackImpl::Continue, this, allow));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Disconnect() {
|
|
|
|
callback_.Reset();
|
|
|
|
context_ = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
static void Run(const CallbackType& callback, bool allow) {
|
|
|
|
CEF_REQUIRE_UIT();
|
|
|
|
callback.Run(allow);
|
|
|
|
}
|
|
|
|
|
|
|
|
CefGeolocationPermissionContext* context_;
|
|
|
|
int bridge_id_;
|
|
|
|
CallbackType callback_;
|
|
|
|
|
|
|
|
IMPLEMENT_REFCOUNTING(CallbackImpl);
|
|
|
|
};
|
|
|
|
|
|
|
|
CefGeolocationPermissionContext() {}
|
|
|
|
|
|
|
|
virtual void RequestGeolocationPermission(
|
|
|
|
int render_process_id,
|
|
|
|
int render_view_id,
|
|
|
|
int bridge_id,
|
|
|
|
const GURL& requesting_frame,
|
|
|
|
base::Callback<void(bool)> callback) // NOLINT(readability/function)
|
|
|
|
OVERRIDE {
|
|
|
|
CEF_REQUIRE_IOT();
|
|
|
|
|
|
|
|
CefRefPtr<CefBrowserHostImpl> browser =
|
|
|
|
CefBrowserHostImpl::GetBrowserByRoutingID(render_process_id,
|
|
|
|
render_view_id);
|
|
|
|
if (browser.get()) {
|
|
|
|
CefRefPtr<CefClient> client = browser->GetClient();
|
|
|
|
if (client.get()) {
|
|
|
|
CefRefPtr<CefGeolocationHandler> handler =
|
|
|
|
client->GetGeolocationHandler();
|
|
|
|
if (handler.get()) {
|
|
|
|
CefRefPtr<CallbackImpl> callbackPtr(
|
|
|
|
new CallbackImpl(this, bridge_id, callback));
|
|
|
|
|
|
|
|
// Add the callback reference to the map.
|
|
|
|
callback_map_.insert(std::make_pair(bridge_id, callbackPtr));
|
|
|
|
|
|
|
|
// Notify the handler.
|
|
|
|
handler->OnRequestGeolocationPermission(browser.get(),
|
|
|
|
requesting_frame.spec(), bridge_id, callbackPtr.get());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Disallow geolocation access by default.
|
2013-01-18 18:09:48 +01:00
|
|
|
CEF_POST_TASK(CEF_UIT, base::Bind(callback, false));
|
2012-04-03 03:34:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
virtual void CancelGeolocationPermissionRequest(
|
|
|
|
int render_process_id,
|
|
|
|
int render_view_id,
|
|
|
|
int bridge_id,
|
|
|
|
const GURL& requesting_frame) OVERRIDE {
|
|
|
|
RemoveCallback(bridge_id);
|
|
|
|
|
|
|
|
CefRefPtr<CefBrowserHostImpl> browser =
|
|
|
|
CefBrowserHostImpl::GetBrowserByRoutingID(render_process_id,
|
|
|
|
render_view_id);
|
|
|
|
if (browser.get()) {
|
|
|
|
CefRefPtr<CefClient> client = browser->GetClient();
|
|
|
|
if (client.get()) {
|
|
|
|
CefRefPtr<CefGeolocationHandler> handler =
|
|
|
|
client->GetGeolocationHandler();
|
|
|
|
if (handler.get()) {
|
|
|
|
// Notify the handler.
|
|
|
|
handler->OnCancelGeolocationPermission(browser.get(),
|
|
|
|
requesting_frame.spec(), bridge_id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void RemoveCallback(int bridge_id) {
|
|
|
|
CEF_REQUIRE_IOT();
|
|
|
|
|
|
|
|
// Disconnect the callback and remove the reference from the map.
|
|
|
|
CallbackMap::iterator it = callback_map_.find(bridge_id);
|
|
|
|
if (it != callback_map_.end()) {
|
|
|
|
it->second->Disconnect();
|
|
|
|
callback_map_.erase(it);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
// Map of bridge ids to callback references.
|
|
|
|
typedef std::map<int, CefRefPtr<CallbackImpl> > CallbackMap;
|
|
|
|
CallbackMap callback_map_;
|
|
|
|
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(CefGeolocationPermissionContext);
|
|
|
|
};
|
|
|
|
|
|
|
|
class CefSpeechRecognitionPreferences
|
|
|
|
: public content::SpeechRecognitionPreferences {
|
|
|
|
public:
|
|
|
|
CefSpeechRecognitionPreferences() {
|
|
|
|
}
|
|
|
|
|
|
|
|
// Overridden from SpeechRecognitionPreferences:
|
|
|
|
virtual bool FilterProfanities() const OVERRIDE {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(CefSpeechRecognitionPreferences);
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
2012-11-21 01:40:15 +01:00
|
|
|
CefBrowserContext::CefBrowserContext()
|
|
|
|
: use_osr_next_contents_view_(false) {
|
2012-04-03 03:34:16 +02:00
|
|
|
// Initialize the request context getter.
|
|
|
|
url_request_getter_ = new CefURLRequestContextGetter(
|
2012-10-03 21:52:50 +02:00
|
|
|
false,
|
2012-04-03 03:34:16 +02:00
|
|
|
GetPath(),
|
|
|
|
BrowserThread::UnsafeGetMessageLoopForThread(BrowserThread::IO),
|
|
|
|
BrowserThread::UnsafeGetMessageLoopForThread(BrowserThread::FILE));
|
|
|
|
}
|
|
|
|
|
|
|
|
CefBrowserContext::~CefBrowserContext() {
|
2012-11-30 20:08:20 +01:00
|
|
|
// Delete the download manager delegate here because otherwise we'll crash
|
2012-06-28 19:21:18 +02:00
|
|
|
// when it's accessed from the content::BrowserContext destructor.
|
|
|
|
if (download_manager_delegate_.get())
|
2012-11-30 20:08:20 +01:00
|
|
|
download_manager_delegate_.reset(NULL);
|
2012-06-11 19:35:23 +02:00
|
|
|
|
2012-04-03 03:34:16 +02:00
|
|
|
if (resource_context_.get()) {
|
|
|
|
BrowserThread::DeleteSoon(
|
2012-06-28 19:21:18 +02:00
|
|
|
BrowserThread::IO, FROM_HERE, resource_context_.release());
|
2012-04-03 03:34:16 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-04 20:18:09 +02:00
|
|
|
FilePath CefBrowserContext::GetPath() {
|
2012-06-25 20:22:50 +02:00
|
|
|
return _Context->cache_path();
|
2012-04-03 03:34:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
bool CefBrowserContext::IsOffTheRecord() const {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2012-06-22 00:50:34 +02:00
|
|
|
content::DownloadManagerDelegate*
|
|
|
|
CefBrowserContext::GetDownloadManagerDelegate() {
|
2012-06-28 19:21:18 +02:00
|
|
|
DCHECK(!download_manager_delegate_.get());
|
|
|
|
|
2012-11-30 20:08:20 +01:00
|
|
|
content::DownloadManager* manager = BrowserContext::GetDownloadManager(this);
|
|
|
|
download_manager_delegate_.reset(new CefDownloadManagerDelegate(manager));
|
2012-06-22 00:50:34 +02:00
|
|
|
return download_manager_delegate_.get();
|
2012-04-03 03:34:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
net::URLRequestContextGetter* CefBrowserContext::GetRequestContext() {
|
|
|
|
return url_request_getter_;
|
|
|
|
}
|
|
|
|
|
|
|
|
net::URLRequestContextGetter*
|
|
|
|
CefBrowserContext::GetRequestContextForRenderProcess(
|
|
|
|
int renderer_child_id) {
|
|
|
|
CefRefPtr<CefBrowserHostImpl> browser =
|
|
|
|
CefBrowserHostImpl::GetBrowserByChildID(renderer_child_id);
|
|
|
|
if (browser.get())
|
|
|
|
return browser->GetRequestContext();
|
|
|
|
return GetRequestContext();
|
|
|
|
}
|
|
|
|
|
|
|
|
net::URLRequestContextGetter*
|
2012-08-29 00:26:35 +02:00
|
|
|
CefBrowserContext::GetMediaRequestContext() {
|
|
|
|
return GetRequestContext();
|
|
|
|
}
|
|
|
|
|
|
|
|
net::URLRequestContextGetter*
|
|
|
|
CefBrowserContext::GetMediaRequestContextForRenderProcess(
|
|
|
|
int renderer_child_id) {
|
2012-04-03 03:34:16 +02:00
|
|
|
return GetRequestContext();
|
|
|
|
}
|
|
|
|
|
2012-10-03 21:52:50 +02:00
|
|
|
net::URLRequestContextGetter*
|
|
|
|
CefBrowserContext::GetMediaRequestContextForStoragePartition(
|
2012-11-05 21:18:20 +01:00
|
|
|
const FilePath& partition_path,
|
|
|
|
bool in_memory) {
|
2012-10-03 21:52:50 +02:00
|
|
|
return GetRequestContext();
|
|
|
|
}
|
|
|
|
|
|
|
|
net::URLRequestContextGetter*
|
|
|
|
CefBrowserContext::GetRequestContextForStoragePartition(
|
2012-11-05 21:18:20 +01:00
|
|
|
const FilePath& partition_path,
|
|
|
|
bool in_memory) {
|
2012-10-03 21:52:50 +02:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2012-04-03 03:34:16 +02:00
|
|
|
content::ResourceContext* CefBrowserContext::GetResourceContext() {
|
|
|
|
if (!resource_context_.get()) {
|
|
|
|
resource_context_.reset(new CefResourceContext(
|
|
|
|
static_cast<CefURLRequestContextGetter*>(GetRequestContext())));
|
|
|
|
}
|
|
|
|
return resource_context_.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
content::GeolocationPermissionContext*
|
|
|
|
CefBrowserContext::GetGeolocationPermissionContext() {
|
|
|
|
if (!geolocation_permission_context_) {
|
|
|
|
geolocation_permission_context_ =
|
|
|
|
new CefGeolocationPermissionContext();
|
|
|
|
}
|
|
|
|
return geolocation_permission_context_;
|
|
|
|
}
|
|
|
|
|
|
|
|
content::SpeechRecognitionPreferences*
|
|
|
|
CefBrowserContext::GetSpeechRecognitionPreferences() {
|
|
|
|
if (!speech_recognition_preferences_.get())
|
|
|
|
speech_recognition_preferences_ = new CefSpeechRecognitionPreferences();
|
|
|
|
return speech_recognition_preferences_.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
quota::SpecialStoragePolicy* CefBrowserContext::GetSpecialStoragePolicy() {
|
|
|
|
return NULL;
|
|
|
|
}
|
2012-11-21 01:40:15 +01:00
|
|
|
|
|
|
|
bool CefBrowserContext::use_osr_next_contents_view() const {
|
|
|
|
return use_osr_next_contents_view_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CefBrowserContext::set_use_osr_next_contents_view(bool override) {
|
|
|
|
use_osr_next_contents_view_ = override;
|
|
|
|
}
|