popup_blocked_message_delegate.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright 2021 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/blocked_content/android/popup_blocked_message_delegate.h"
  5. #include "components/blocked_content/android/popup_blocked_helper.h"
  6. #include "components/content_settings/core/browser/host_content_settings_map.h"
  7. #include "components/content_settings/core/common/content_settings.h"
  8. #include "components/content_settings/core/common/content_settings_types.h"
  9. #include "components/messages/android/message_dispatcher_bridge.h"
  10. #include "components/prefs/pref_service.h"
  11. #include "components/resources/android/theme_resources.h"
  12. #include "components/strings/grit/components_strings.h"
  13. #include "ui/base/l10n/l10n_util.h"
  14. namespace blocked_content {
  15. bool PopupBlockedMessageDelegate::ShowMessage(
  16. int num_popups,
  17. HostContentSettingsMap* settings_map,
  18. base::OnceClosure on_show_popups_callback) {
  19. if (message_ != nullptr) { // update title only
  20. message_->SetTitle(l10n_util::GetPluralStringFUTF16(
  21. IDS_POPUPS_BLOCKED_INFOBAR_TEXT, num_popups));
  22. return false;
  23. }
  24. on_show_popups_callback_ = std::move(on_show_popups_callback);
  25. url_ = GetWebContents().GetLastCommittedURL();
  26. // Unretained is safe because |this| will always outlive |message_| which owns
  27. // the callback.
  28. auto message = std::make_unique<messages::MessageWrapper>(
  29. messages::MessageIdentifier::POPUP_BLOCKED,
  30. base::BindOnce(&PopupBlockedMessageDelegate::HandleClick,
  31. base::Unretained(this)),
  32. base::BindOnce(&PopupBlockedMessageDelegate::HandleDismissCallback,
  33. base::Unretained(this)));
  34. message->SetTitle(l10n_util::GetPluralStringFUTF16(
  35. IDS_POPUPS_BLOCKED_INFOBAR_TEXT, num_popups));
  36. map_ = settings_map;
  37. allow_settings_changes_ = !PopupSettingManagedByPolicy(map_, url_);
  38. // Don't allow the user to configure the setting in the UI if the setting
  39. // is managed by policy.
  40. int button_text_id =
  41. allow_settings_changes_ ? IDS_POPUPS_BLOCKED_INFOBAR_BUTTON_SHOW : IDS_OK;
  42. message->SetPrimaryButtonText(l10n_util::GetStringUTF16(button_text_id));
  43. messages::MessageDispatcherBridge* message_dispatcher_bridge =
  44. messages::MessageDispatcherBridge::Get();
  45. DCHECK(message_dispatcher_bridge->IsMessagesEnabledForEmbedder());
  46. message->SetIconResourceId(message_dispatcher_bridge->MapToJavaDrawableId(
  47. IDR_ANDROID_INFOBAR_BLOCKED_POPUPS));
  48. // On rare occasions, such as the moment when activity is being recreated
  49. // or destroyed, popup blocked message will not be displayed and the
  50. // method will return false.
  51. if (!message_dispatcher_bridge->EnqueueMessage(
  52. message.get(), &GetWebContents(),
  53. messages::MessageScopeType::NAVIGATION,
  54. messages::MessagePriority::kNormal)) {
  55. return false;
  56. }
  57. message_ = std::move(message);
  58. return true;
  59. }
  60. PopupBlockedMessageDelegate::~PopupBlockedMessageDelegate() {
  61. if (message_ != nullptr) {
  62. messages::MessageDispatcherBridge::Get()->DismissMessage(
  63. message_.get(), messages::DismissReason::UNKNOWN);
  64. }
  65. }
  66. PopupBlockedMessageDelegate::PopupBlockedMessageDelegate(
  67. content::WebContents* web_contents)
  68. : content::WebContentsUserData<PopupBlockedMessageDelegate>(*web_contents) {
  69. }
  70. void PopupBlockedMessageDelegate::HandleDismissCallback(
  71. messages::DismissReason dismiss_reason) {
  72. message_.reset();
  73. map_ = nullptr;
  74. }
  75. void PopupBlockedMessageDelegate::HandleClick() {
  76. if (!allow_settings_changes_) {
  77. return;
  78. }
  79. // Create exceptions.
  80. map_->SetNarrowestContentSetting(url_, url_, ContentSettingsType::POPUPS,
  81. CONTENT_SETTING_ALLOW);
  82. // Launch popups.
  83. ShowBlockedPopups(&GetWebContents());
  84. if (on_show_popups_callback_)
  85. std::move(on_show_popups_callback_).Run();
  86. }
  87. WEB_CONTENTS_USER_DATA_KEY_IMPL(PopupBlockedMessageDelegate);
  88. } // namespace blocked_content