| // Copyright 2016 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 "ios/chrome/browser/browser_about_rewriter.h" |
| |
| #include <string> |
| |
| #include "base/feature_list.h" |
| #include "base/logging.h" |
| #include "base/stl_util.h" |
| #include "components/url_formatter/url_fixer.h" |
| #include "ios/chrome/browser/chrome_url_constants.h" |
| #include "ios/chrome/browser/ui/ui_feature_flags.h" |
| #include "url/url_constants.h" |
| |
| namespace { |
| |
| const struct HostReplacement { |
| const char* old_host_name; |
| const char* new_host_name; |
| } kHostReplacements[] = { |
| {"about", kChromeUIChromeURLsHost}, |
| {"sync", kChromeUISyncInternalsHost}, |
| }; |
| |
| } // namespace |
| |
| bool WillHandleWebBrowserAboutURL(GURL* url, web::BrowserState* browser_state) { |
| GURL original_url = *url; |
| |
| // Ensure that any cleanup done by FixupURL happens before the rewriting |
| // phase that determines the virtual URL, by including it in an initial |
| // URLHandler. This prevents minor changes from producing a virtual URL, |
| // which could lead to a URL spoof. |
| *url = url_formatter::FixupURL(url->possibly_invalid_spec(), std::string()); |
| |
| // Check that about: URLs are fixed up to chrome: by url_formatter::FixupURL. |
| DCHECK((*url == url::kAboutBlankURL) || !url->SchemeIs(url::kAboutScheme)); |
| |
| // url_formatter::FixupURL translates about:foo into chrome://foo/. |
| if (!url->SchemeIs(kChromeUIScheme)) |
| return false; |
| |
| // Translate chrome://newtab back into about://newtab so the WebState shows a |
| // blank page under the NTP. |
| if (url->GetOrigin() == kChromeUINewTabURL) { |
| GURL::Replacements replacements; |
| replacements.SetSchemeStr(url::kAboutScheme); |
| *url = url->ReplaceComponents(replacements); |
| return *url != original_url; |
| } |
| |
| std::string host(url->host()); |
| for (size_t i = 0; i < base::size(kHostReplacements); ++i) { |
| if (host != kHostReplacements[i].old_host_name) |
| continue; |
| |
| host.assign(kHostReplacements[i].new_host_name); |
| break; |
| } |
| |
| GURL::Replacements replacements; |
| replacements.SetHostStr(host); |
| *url = url->ReplaceComponents(replacements); |
| |
| // Having re-written the URL, make the chrome: handler process it. |
| return false; |
| } |