url_request_rewrite_rules_manager.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // Copyright 2019 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 "components/url_rewrite/browser/url_request_rewrite_rules_manager.h"
  5. #include "components/url_rewrite/browser/url_request_rewrite_rules_validation.h"
  6. #include "content/public/browser/web_contents.h"
  7. #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
  8. namespace url_rewrite {
  9. UrlRequestRewriteRulesManager::UrlRequestRewriteRulesManager() = default;
  10. UrlRequestRewriteRulesManager::~UrlRequestRewriteRulesManager() {
  11. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  12. }
  13. bool UrlRequestRewriteRulesManager::AddWebContents(
  14. content::WebContents* web_contents) {
  15. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  16. DCHECK(web_contents);
  17. if (updaters_.count(web_contents) > 0) {
  18. return false;
  19. }
  20. auto updater = std::make_unique<Updater>(web_contents, cached_rules_);
  21. updaters_.emplace(web_contents, std::move(updater));
  22. return true;
  23. }
  24. bool UrlRequestRewriteRulesManager::RemoveWebContents(
  25. content::WebContents* web_contents) {
  26. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  27. DCHECK(web_contents);
  28. auto iter = updaters_.find(web_contents);
  29. if (iter == updaters_.end()) {
  30. return false;
  31. }
  32. updaters_.erase(iter);
  33. return true;
  34. }
  35. bool UrlRequestRewriteRulesManager::OnRulesUpdated(
  36. mojom::UrlRequestRewriteRulesPtr rules) {
  37. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  38. if (!ValidateRules(rules.get())) {
  39. return false;
  40. }
  41. cached_rules_ =
  42. base::MakeRefCounted<UrlRequestRewriteRules>(std::move(rules));
  43. // Send the updated rules to the receivers.
  44. for (const auto& updater_pair : updaters_) {
  45. updater_pair.second->OnRulesUpdated(cached_rules_);
  46. }
  47. return true;
  48. }
  49. const scoped_refptr<UrlRequestRewriteRules>&
  50. UrlRequestRewriteRulesManager::GetCachedRules() const {
  51. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  52. return cached_rules_;
  53. }
  54. size_t UrlRequestRewriteRulesManager::GetUpdatersSizeForTesting() const {
  55. return updaters_.size();
  56. }
  57. UrlRequestRewriteRulesManager::Updater::Updater(
  58. content::WebContents* web_contents,
  59. const scoped_refptr<UrlRequestRewriteRules>& cached_rules)
  60. : content::WebContentsObserver(web_contents), cached_rules_(cached_rules) {
  61. web_contents->ForEachRenderFrameHost(base::BindRepeating(
  62. &UrlRequestRewriteRulesManager::Updater::MaybeRegisterExistingRenderFrame,
  63. base::Unretained(this)));
  64. }
  65. UrlRequestRewriteRulesManager::Updater::~Updater() {
  66. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  67. }
  68. void UrlRequestRewriteRulesManager::Updater::OnRulesUpdated(
  69. const scoped_refptr<UrlRequestRewriteRules>& cached_rules) {
  70. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  71. DCHECK(cached_rules);
  72. cached_rules_ = cached_rules;
  73. // Send the updated rules to the updaters.
  74. for (const auto& receiver_pair : active_remotes_) {
  75. receiver_pair.second->OnRulesUpdated(mojo::Clone(cached_rules_->data));
  76. }
  77. }
  78. void UrlRequestRewriteRulesManager::Updater::MaybeRegisterExistingRenderFrame(
  79. content::RenderFrameHost* render_frame_host) {
  80. if (render_frame_host->IsRenderFrameLive()) {
  81. // Call RenderFrameCreated() for frames that were created before this
  82. // observer started observing this WebContents.
  83. RenderFrameCreated(render_frame_host);
  84. }
  85. }
  86. void UrlRequestRewriteRulesManager::Updater::RenderFrameCreated(
  87. content::RenderFrameHost* render_frame_host) {
  88. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  89. // Register the frame rules receiver.
  90. mojo::AssociatedRemote<mojom::UrlRequestRulesReceiver> rules_receiver;
  91. render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface(
  92. &rules_receiver);
  93. auto iter = active_remotes_.emplace(render_frame_host->GetGlobalId(),
  94. std::move(rules_receiver));
  95. DCHECK(iter.second);
  96. if (cached_rules_) {
  97. // Send an initial set of rules.
  98. iter.first->second->OnRulesUpdated(mojo::Clone(cached_rules_->data));
  99. }
  100. }
  101. void UrlRequestRewriteRulesManager::Updater::RenderFrameDeleted(
  102. content::RenderFrameHost* render_frame_host) {
  103. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  104. size_t removed = active_remotes_.erase(render_frame_host->GetGlobalId());
  105. DCHECK_EQ(removed, 1u);
  106. }
  107. } // namespace url_rewrite