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

Unified Diff: chrome/browser/custom_handlers/protocol_handler_registry.cc

Issue 11669012: Convert ProtocolHandlerRegistry::Interceptor to a net::URLRequestJobFactory. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address jhawkins' comments Created 7 years, 11 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: chrome/browser/custom_handlers/protocol_handler_registry.cc
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry.cc b/chrome/browser/custom_handlers/protocol_handler_registry.cc
index bab8c445560eba9b7b4e95bf914fa86c8dd9299c..b76bad6d11479b88f95738a3d14ae1e255a3f157 100644
--- a/chrome/browser/custom_handlers/protocol_handler_registry.cc
+++ b/chrome/browser/custom_handlers/protocol_handler_registry.cc
@@ -9,8 +9,6 @@
#include "base/bind.h"
#include "base/command_line.h"
#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/scoped_ptr.h"
#include "chrome/browser/custom_handlers/register_protocol_handler_infobar_delegate.h"
#include "chrome/browser/net/chrome_url_request_context.h"
#include "chrome/browser/prefs/pref_service.h"
@@ -19,13 +17,9 @@
#include "chrome/common/chrome_switches.h"
#include "chrome/common/custom_handlers/protocol_handler.h"
#include "chrome/common/pref_names.h"
-#include "content/public/browser/browser_thread.h"
#include "content/public/browser/child_process_security_policy.h"
-#include "content/public/browser/notification_service.h"
#include "grit/generated_resources.h"
#include "net/base/network_delegate.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_job.h"
#include "net/url_request/url_request_redirect_job.h"
#include "ui/base/l10n/l10n_util.h"
@@ -63,18 +57,19 @@ bool ShouldRemoveHandlersNotInOS() {
} // namespace
-// Core ------------------------------------------------------------------------
+// IOThreadDelegate ------------------------------------------------------------
-// Core is an IO thread specific object. Access to the class should all
-// be done via the IO thread. The registry living on the UI thread makes
+// IOThreadDelegate is an IO thread specific object. Access to the class should
+// all be done via the IO thread. The registry living on the UI thread makes
// a best effort to update the IO object after local updates are completed.
-class ProtocolHandlerRegistry::Core
- : public base::RefCountedThreadSafe<ProtocolHandlerRegistry::Core> {
+class ProtocolHandlerRegistry::IOThreadDelegate
+ : public base::RefCountedThreadSafe<
+ ProtocolHandlerRegistry::IOThreadDelegate> {
public:
// Creates a new instance. If |enabled| is true the registry is considered
// enabled on the IO thread.
- explicit Core(bool enabled);
+ explicit IOThreadDelegate(bool enabled);
// Returns true if the protocol has a default protocol handler.
// Should be called only from the IO thread.
@@ -102,8 +97,8 @@ class ProtocolHandlerRegistry::Core
void Disable() { enabled_ = false; }
private:
- friend class base::RefCountedThreadSafe<Core>;
- virtual ~Core();
+ friend class base::RefCountedThreadSafe<IOThreadDelegate>;
+ virtual ~IOThreadDelegate();
// Copy of protocol handlers use only on the IO thread.
ProtocolHandlerRegistry::ProtocolHandlerMap default_handlers_;
@@ -111,24 +106,27 @@ class ProtocolHandlerRegistry::Core
// Is the registry enabled on the IO thread.
bool enabled_;
- DISALLOW_COPY_AND_ASSIGN(Core);
+ DISALLOW_COPY_AND_ASSIGN(IOThreadDelegate);
};
-ProtocolHandlerRegistry::Core::Core(bool) : enabled_(true) {}
-ProtocolHandlerRegistry::Core::~Core() {}
+ProtocolHandlerRegistry::IOThreadDelegate::IOThreadDelegate(bool)
+ : enabled_(true) {}
+ProtocolHandlerRegistry::IOThreadDelegate::~IOThreadDelegate() {}
-bool ProtocolHandlerRegistry::Core::IsHandledProtocol(
+bool ProtocolHandlerRegistry::IOThreadDelegate::IsHandledProtocol(
const std::string& scheme) const {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
return enabled_ && !LookupHandler(default_handlers_, scheme).IsEmpty();
}
-void ProtocolHandlerRegistry::Core::ClearDefault(const std::string& scheme) {
+void ProtocolHandlerRegistry::IOThreadDelegate::ClearDefault(
+ const std::string& scheme) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
default_handlers_.erase(scheme);
}
-void ProtocolHandlerRegistry::Core::SetDefault(const ProtocolHandler& handler) {
+void ProtocolHandlerRegistry::IOThreadDelegate::SetDefault(
+ const ProtocolHandler& handler) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
ClearDefault(handler.protocol());
default_handlers_.insert(std::make_pair(handler.protocol(), handler));
@@ -137,7 +135,7 @@ void ProtocolHandlerRegistry::Core::SetDefault(const ProtocolHandler& handler) {
// Create a new job for the supplied |URLRequest| if a default handler
// is registered and the associated handler is able to interpret
// the url from |request|.
-net::URLRequestJob* ProtocolHandlerRegistry::Core::MaybeCreateJob(
+net::URLRequestJob* ProtocolHandlerRegistry::IOThreadDelegate::MaybeCreateJob(
net::URLRequest* request, net::NetworkDelegate* network_delegate) const {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
@@ -155,62 +153,86 @@ net::URLRequestJob* ProtocolHandlerRegistry::Core::MaybeCreateJob(
net::URLRequestRedirectJob::REDIRECT_302_FOUND);
}
-// URLInterceptor ------------------------------------------------------------
+// JobInterceptorFactory -------------------------------------------------------
-// Instances of this class are produced for ownership by the IO
+// Instances of JobInterceptorFactory are produced for ownership by the IO
// thread where it handler URL requests. We should never hold
// any pointers on this class, only produce them in response to
-// requests via |ProtocolHandlerRegistry::CreateURLInterceptor|.
-class ProtocolHandlerRegistry::URLInterceptor
- : public net::URLRequestJobFactory::Interceptor {
- public:
- explicit URLInterceptor(Core* core);
- virtual ~URLInterceptor();
+// requests via |ProtocolHandlerRegistry::CreateJobInterceptorFactory|.
+ProtocolHandlerRegistry::JobInterceptorFactory::JobInterceptorFactory(
+ IOThreadDelegate* io_thread_delegate)
+ : io_thread_delegate_(io_thread_delegate) {
+ DCHECK(io_thread_delegate_);
+ DetachFromThread();
+}
- virtual net::URLRequestJob* MaybeIntercept(
- net::URLRequest* request,
- net::NetworkDelegate* network_delegate) const OVERRIDE;
+ProtocolHandlerRegistry::JobInterceptorFactory::~JobInterceptorFactory() {
+}
- virtual bool WillHandleProtocol(const std::string& protocol) const OVERRIDE;
+void ProtocolHandlerRegistry::JobInterceptorFactory::Chain(
+ scoped_ptr<net::URLRequestJobFactory> job_factory) {
+ job_factory_ = job_factory.Pass();
+}
- virtual net::URLRequestJob* MaybeInterceptRedirect(
- const GURL& url,
- net::URLRequest* request,
- net::NetworkDelegate* network_delegate) const OVERRIDE {
- return NULL;
- }
+bool ProtocolHandlerRegistry::JobInterceptorFactory::SetProtocolHandler(
+ const std::string& scheme, ProtocolHandler* protocol_handler) {
+ return job_factory_->SetProtocolHandler(scheme, protocol_handler);
+}
- virtual net::URLRequestJob* MaybeInterceptResponse(
- net::URLRequest* request,
- net::NetworkDelegate* network_delegate) const OVERRIDE {
- return NULL;
- }
+void ProtocolHandlerRegistry::JobInterceptorFactory::AddInterceptor(
+ Interceptor* interceptor) {
+ return job_factory_->AddInterceptor(interceptor);
+}
- private:
- scoped_refptr<Core> core_;
- DISALLOW_COPY_AND_ASSIGN(URLInterceptor);
-};
+net::URLRequestJob*
+ProtocolHandlerRegistry::JobInterceptorFactory::MaybeCreateJobWithInterceptor(
+ net::URLRequest* request, net::NetworkDelegate* network_delegate) const {
+ return job_factory_->MaybeCreateJobWithInterceptor(request, network_delegate);
+}
-ProtocolHandlerRegistry::URLInterceptor::URLInterceptor(Core* core)
- : core_(core) {
- DCHECK(core_);
+net::URLRequestJob*
+ProtocolHandlerRegistry::JobInterceptorFactory::
+MaybeCreateJobWithProtocolHandler(
+ const std::string& scheme,
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate) const {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ net::URLRequestJob* job = io_thread_delegate_->MaybeCreateJob(
+ request, network_delegate);
+ if (job)
+ return job;
+ return job_factory_->MaybeCreateJobWithProtocolHandler(
+ scheme, request, network_delegate);
}
-ProtocolHandlerRegistry::URLInterceptor::~URLInterceptor() {
+net::URLRequestJob*
+ProtocolHandlerRegistry::JobInterceptorFactory::MaybeInterceptRedirect(
+ const GURL& location,
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate) const {
+ return job_factory_->MaybeInterceptRedirect(
+ location, request, network_delegate);
}
-net::URLRequestJob* ProtocolHandlerRegistry::URLInterceptor::MaybeIntercept(
+net::URLRequestJob*
+ProtocolHandlerRegistry::JobInterceptorFactory::MaybeInterceptResponse(
net::URLRequest* request, net::NetworkDelegate* network_delegate) const {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- return core_->MaybeCreateJob(request, network_delegate);
+ return job_factory_->MaybeInterceptResponse(request, network_delegate);
}
-bool ProtocolHandlerRegistry::URLInterceptor::WillHandleProtocol(
- const std::string& protocol) const {
+bool ProtocolHandlerRegistry::JobInterceptorFactory::IsHandledProtocol(
+ const std::string& scheme) const {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ return io_thread_delegate_->IsHandledProtocol(scheme) ||
+ job_factory_->IsHandledProtocol(scheme);
+}
- return core_->IsHandledProtocol(protocol);
+bool ProtocolHandlerRegistry::JobInterceptorFactory::IsHandledURL(
+ const GURL& url) const {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ return (url.is_valid() &&
+ io_thread_delegate_->IsHandledProtocol(url.scheme())) ||
+ job_factory_->IsHandledURL(url);
}
// DefaultClientObserver ------------------------------------------------------
@@ -317,7 +339,7 @@ ProtocolHandlerRegistry::ProtocolHandlerRegistry(Profile* profile,
enabled_(true),
is_loading_(false),
is_loaded_(false),
- core_(new Core(enabled_)){
+ io_thread_delegate_(new IOThreadDelegate(enabled_)){
}
bool ProtocolHandlerRegistry::SilentlyHandleRegisterHandlerRequest(
@@ -402,7 +424,7 @@ void ProtocolHandlerRegistry::ClearDefault(const std::string& scheme) {
BrowserThread::PostTask(
BrowserThread::IO,
FROM_HERE,
- base::Bind(&Core::ClearDefault, core_, scheme));
+ base::Bind(&IOThreadDelegate::ClearDefault, io_thread_delegate_, scheme));
Save();
NotifyChanged();
}
@@ -630,7 +652,8 @@ void ProtocolHandlerRegistry::RemoveHandler(
} else {
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
- base::Bind(&Core::ClearDefault, core_, q->second.protocol()));
+ base::Bind(&IOThreadDelegate::ClearDefault, io_thread_delegate_,
+ q->second.protocol()));
default_handlers_.erase(q);
}
@@ -665,7 +688,7 @@ void ProtocolHandlerRegistry::Enable() {
BrowserThread::PostTask(
BrowserThread::IO,
FROM_HERE,
- base::Bind(&Core::Enable, core_));
+ base::Bind(&IOThreadDelegate::Enable, io_thread_delegate_));
ProtocolHandlerMap::const_iterator p;
for (p = default_handlers_.begin(); p != default_handlers_.end(); ++p) {
@@ -684,7 +707,7 @@ void ProtocolHandlerRegistry::Disable() {
BrowserThread::PostTask(
BrowserThread::IO,
FROM_HERE,
- base::Bind(&Core::Disable, core_));
+ base::Bind(&IOThreadDelegate::Disable, io_thread_delegate_));
ProtocolHandlerMap::const_iterator p;
for (p = default_handlers_.begin(); p != default_handlers_.end(); ++p) {
@@ -773,7 +796,7 @@ void ProtocolHandlerRegistry::SetDefault(const ProtocolHandler& handler) {
BrowserThread::PostTask(
BrowserThread::IO,
FROM_HERE,
- base::Bind(&Core::SetDefault, core_, handler));
+ base::Bind(&IOThreadDelegate::SetDefault, io_thread_delegate_, handler));
}
void ProtocolHandlerRegistry::InsertHandler(const ProtocolHandler& handler) {
@@ -875,11 +898,12 @@ void ProtocolHandlerRegistry::AddPredefinedHandler(
SetDefault(handler);
}
-net::URLRequestJobFactory::Interceptor*
- ProtocolHandlerRegistry::CreateURLInterceptor() {
+scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
+ProtocolHandlerRegistry::CreateJobInterceptorFactory() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
// this is always created on the UI thread (in profile_io's
// InitializeOnUIThread. Any method calls must be done
// on the IO thread (this is checked).
- return new URLInterceptor(core_);
+ return scoped_ptr<JobInterceptorFactory>(new JobInterceptorFactory(
+ io_thread_delegate_));
}

Powered by Google App Engine
This is Rietveld 408576698