browser_url_rewriter_impl.mm 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ios/web/browser_url_rewriter_impl.h"
  5. #include "base/check.h"
  6. #include "base/no_destructor.h"
  7. #include "base/strings/string_util.h"
  8. #include "ios/web/public/browser_state.h"
  9. #import "ios/web/public/web_client.h"
  10. #include "url/gurl.h"
  11. #if !defined(__has_feature) || !__has_feature(objc_arc)
  12. #error "This file requires ARC support."
  13. #endif
  14. namespace web {
  15. namespace {
  16. // The scheme used to view the source of a page using WebUI in content/.
  17. const char kViewSourceScheme[] = "view-source";
  18. // Handles rewriting view-source URLs for what we'll actually load. Since
  19. // WebUI-based view-source isn't supported on iOS, simply strip out the scheme
  20. // and load the URL. This is to gracefully handle tabs synced from other
  21. // platforms with the "view-source:" scheme.
  22. static bool HandleViewSource(GURL* url, BrowserState* browser_state) {
  23. DCHECK(url);
  24. if (url->SchemeIs(kViewSourceScheme)) {
  25. // Load the inner URL instead.
  26. *url = GURL(url->GetContent());
  27. return true;
  28. }
  29. return false;
  30. }
  31. } // namespace
  32. // static
  33. BrowserURLRewriter* BrowserURLRewriter::GetInstance() {
  34. return BrowserURLRewriterImpl::GetInstance();
  35. }
  36. // static
  37. bool BrowserURLRewriter::RewriteURLWithWriters(
  38. GURL* url,
  39. web::BrowserState* browser_state,
  40. const std::vector<BrowserURLRewriter::URLRewriter>& rewriters) {
  41. bool rewritten = false;
  42. for (URLRewriter rewriter : rewriters) {
  43. if ((rewritten = rewriter(url, browser_state)))
  44. break;
  45. }
  46. return rewritten;
  47. }
  48. // static
  49. BrowserURLRewriterImpl* BrowserURLRewriterImpl::GetInstance() {
  50. static base::NoDestructor<BrowserURLRewriterImpl> instance;
  51. return instance.get();
  52. }
  53. BrowserURLRewriterImpl::BrowserURLRewriterImpl() {
  54. web::WebClient* web_client = web::GetWebClient();
  55. if (web_client)
  56. web_client->PostBrowserURLRewriterCreation(this);
  57. // view-source:
  58. AddURLRewriter(&HandleViewSource);
  59. }
  60. BrowserURLRewriterImpl::~BrowserURLRewriterImpl() {}
  61. void BrowserURLRewriterImpl::AddURLRewriter(URLRewriter rewriter) {
  62. DCHECK(rewriter);
  63. url_rewriters_.push_back(rewriter);
  64. }
  65. bool BrowserURLRewriterImpl::RewriteURLIfNecessary(
  66. GURL* url,
  67. BrowserState* browser_state) {
  68. return BrowserURLRewriter::RewriteURLWithWriters(url, browser_state,
  69. url_rewriters_);
  70. }
  71. } // namespace web