diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-12 19:07:31 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-12 19:07:31 +0000 |
commit | 825b16687e0de3ef4ec3b7dd60fc1dfb237947c9 (patch) | |
tree | 8831f3f038a28b69c8dd976a7381aa66c1406ff4 /content/browser/browser_url_handler_impl.cc | |
parent | a60de956ec71ec185684f6d6167d5c8547f3639f (diff) | |
download | chromium_src-825b16687e0de3ef4ec3b7dd60fc1dfb237947c9.zip chromium_src-825b16687e0de3ef4ec3b7dd60fc1dfb237947c9.tar.gz chromium_src-825b16687e0de3ef4ec3b7dd60fc1dfb237947c9.tar.bz2 |
Add a Content API around BrowserURLHandler.
BUG=98716
Review URL: https://chromiumcodereview.appspot.com/9688019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@126180 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/browser_url_handler_impl.cc')
-rw-r--r-- | content/browser/browser_url_handler_impl.cc | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/content/browser/browser_url_handler_impl.cc b/content/browser/browser_url_handler_impl.cc new file mode 100644 index 0000000..7eef43f --- /dev/null +++ b/content/browser/browser_url_handler_impl.cc @@ -0,0 +1,135 @@ +// Copyright (c) 2011 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 "content/browser/browser_url_handler_impl.h" + +#include "base/string_util.h" +#include "content/browser/webui/web_ui_impl.h" +#include "content/public/browser/content_browser_client.h" +#include "content/public/common/url_constants.h" +#include "googleurl/src/gurl.h" + +using content::BrowserURLHandler; + +// Handles rewriting view-source URLs for what we'll actually load. +static bool HandleViewSource(GURL* url, + content::BrowserContext* browser_context) { + if (url->SchemeIs(chrome::kViewSourceScheme)) { + // Load the inner URL instead. + *url = GURL(url->path()); + + // Bug 26129: limit view-source to view the content and not any + // other kind of 'active' url scheme like 'javascript' or 'data'. + static const char* const allowed_sub_schemes[] = { + chrome::kHttpScheme, chrome::kHttpsScheme, chrome::kFtpScheme, + chrome::kChromeDevToolsScheme, chrome::kChromeUIScheme, + chrome::kFileScheme + }; + + bool is_sub_scheme_allowed = false; + for (size_t i = 0; i < arraysize(allowed_sub_schemes); i++) { + if (url->SchemeIs(allowed_sub_schemes[i])) { + is_sub_scheme_allowed = true; + break; + } + } + + if (!is_sub_scheme_allowed) { + *url = GURL(chrome::kAboutBlankURL); + return false; + } + + return true; + } + return false; +} + +// Turns a non view-source URL into the corresponding view-source URL. +static bool ReverseViewSource(GURL* url, + content::BrowserContext* browser_context) { + // No action necessary if the URL is already view-source: + if (url->SchemeIs(chrome::kViewSourceScheme)) + return false; + + url_canon::Replacements<char> repl; + repl.SetScheme(chrome::kViewSourceScheme, + url_parse::Component(0, strlen(chrome::kViewSourceScheme))); + repl.SetPath(url->spec().c_str(), + url_parse::Component(0, url->spec().size())); + *url = url->ReplaceComponents(repl); + return true; +} + +static bool HandleDebugUrl(GURL* url, + content::BrowserContext* browser_context) { + // Circumvent processing URLs that the renderer process will handle. + return *url == GURL(chrome::kChromeUICrashURL) || + *url == GURL(chrome::kChromeUIHangURL) || + *url == GURL(chrome::kChromeUIKillURL) || + *url == GURL(chrome::kChromeUIShorthangURL); +} + +// static +BrowserURLHandler* BrowserURLHandler::GetInstance() { + return BrowserURLHandlerImpl::GetInstance(); +} + +// static +BrowserURLHandler::URLHandler BrowserURLHandler::null_handler() { + // Required for VS2010: http://connect.microsoft.com/VisualStudio/feedback/details/520043/error-converting-from-null-to-a-pointer-type-in-std-pair + return NULL; +} + +// static +BrowserURLHandlerImpl* BrowserURLHandlerImpl::GetInstance() { + return Singleton<BrowserURLHandlerImpl>::get(); +} + +BrowserURLHandlerImpl::BrowserURLHandlerImpl() { + AddHandlerPair(&HandleDebugUrl, BrowserURLHandlerImpl::null_handler()); + + content::GetContentClient()->browser()->BrowserURLHandlerCreated(this); + + // view-source: + AddHandlerPair(&HandleViewSource, &ReverseViewSource); +} + +BrowserURLHandlerImpl::~BrowserURLHandlerImpl() { +} + +void BrowserURLHandlerImpl::AddHandlerPair(URLHandler handler, + URLHandler reverse_handler) { + url_handlers_.push_back(HandlerPair(handler, reverse_handler)); +} + +void BrowserURLHandlerImpl::RewriteURLIfNecessary( + GURL* url, + content::BrowserContext* browser_context, + bool* reverse_on_redirect) { + for (size_t i = 0; i < url_handlers_.size(); ++i) { + URLHandler handler = *url_handlers_[i].first; + if (handler && handler(url, browser_context)) { + *reverse_on_redirect = (url_handlers_[i].second != NULL); + return; + } + } +} + +bool BrowserURLHandlerImpl::ReverseURLRewrite( + GURL* url, const GURL& original, content::BrowserContext* browser_context) { + for (size_t i = 0; i < url_handlers_.size(); ++i) { + URLHandler reverse_rewriter = *url_handlers_[i].second; + if (reverse_rewriter) { + GURL test_url(original); + URLHandler handler = *url_handlers_[i].first; + if (!handler) { + if (reverse_rewriter(url, browser_context)) + return true; + } else if (handler(&test_url, browser_context)) { + return reverse_rewriter(url, browser_context); + } + } + } + return false; +} |