Miscellaneous permissions cleanup.

This patch:
* Introduces a new method PermissionRequest::IsDuplicateOf, rather than
  relying on comparing the result of GetMessageTextFragment (which
  returns a human-readable string) to determine whether two requests are
  duplicates.
* Makes PermissionRequest::GetMessageTextFragment desktop-only, as it
  was only used elsewhere in the aforementioned duplicates logic.
* Uses std::u16string in MockPermissionRequest everywhere.
* And deletes a few bits of unused code.

Bug: 1110905
Change-Id: I39704d74d9456674a30c9483ed10423c84e998f6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2778492
Commit-Queue: Bret Sepulveda <[email protected]>
Reviewed-by: Xiaohan Wang <[email protected]>
Reviewed-by: Xing Liu <[email protected]>
Reviewed-by: Dana Fried <[email protected]>
Reviewed-by: Ben Wells <[email protected]>
Reviewed-by: Olesia Marukhno <[email protected]>
Reviewed-by: Kamila Hasanbega <[email protected]>
Reviewed-by: Ravjit Singh Uppal <[email protected]>
Cr-Commit-Position: refs/heads/master@{#874233}
diff --git a/components/permissions/contexts/geolocation_permission_context_unittest.cc b/components/permissions/contexts/geolocation_permission_context_unittest.cc
index c82e785..03c6f54 100644
--- a/components/permissions/contexts/geolocation_permission_context_unittest.cc
+++ b/components/permissions/contexts/geolocation_permission_context_unittest.cc
@@ -424,8 +424,12 @@
   PermissionRequestManager* manager =
       PermissionRequestManager::FromWebContents(web_contents());
   PermissionRequest* request = manager->Requests().front();
+#if defined(OS_ANDROID)
+  return request->GetMessageText();
+#else
   return base::ASCIIToUTF16(request->GetOrigin().spec()) +
          request->GetMessageTextFragment();
+#endif
 }
 
 // Tests ----------------------------------------------------------------------
diff --git a/components/permissions/permission_request.cc b/components/permissions/permission_request.cc
index c3766a1..699025e 100644
--- a/components/permissions/permission_request.cc
+++ b/components/permissions/permission_request.cc
@@ -10,6 +10,11 @@
 
 PermissionRequest::PermissionRequest() {}
 
+bool PermissionRequest::IsDuplicateOf(PermissionRequest* other_request) const {
+  return GetRequestType() == other_request->GetRequestType() &&
+         GetOrigin() == other_request->GetOrigin();
+}
+
 PermissionRequestGestureType PermissionRequest::GetGestureType() const {
   return PermissionRequestGestureType::UNKNOWN;
 }
@@ -24,14 +29,4 @@
 }
 #endif
 
-#if defined(OS_ANDROID)
-std::u16string PermissionRequest::GetQuietTitleText() const {
-  return std::u16string();
-}
-
-std::u16string PermissionRequest::GetQuietMessageText() const {
-  return GetMessageText();
-}
-#endif
-
 }  // namespace permissions
diff --git a/components/permissions/permission_request.h b/components/permissions/permission_request.h
index 65523f9..54f0fb4b 100644
--- a/components/permissions/permission_request.h
+++ b/components/permissions/permission_request.h
@@ -33,31 +33,25 @@
   // The type of this request.
   virtual RequestType GetRequestType() const = 0;
 
+  // Whether |this| and |other_request| are duplicates and therefore don't both
+  // need to be shown in the UI.
+  virtual bool IsDuplicateOf(PermissionRequest* other_request) const;
+
 #if defined(OS_ANDROID)
   // Returns the full prompt text for this permission. This is currently only
   // used on Android.
   virtual std::u16string GetMessageText() const = 0;
-
-  // Returns the title of this permission as text when the permission request is
-  // displayed as a quiet prompt. Only used on Android. By default it returns
-  // the same value as |GetTitleText| unless overridden.
-  virtual std::u16string GetQuietTitleText() const;
-
-  // Returns the full prompt text for this permission as text when the
-  // permission request is displayed as a quiet prompt. Only used on Android. By
-  // default it returns the same value as |GetMessageText| unless overridden.
-  virtual std::u16string GetQuietMessageText() const;
 #endif
 
 #if !defined(OS_ANDROID)
   // Returns the short text for the chip button related to this permission.
   virtual base::Optional<std::u16string> GetChipText() const;
-#endif
 
   // Returns the shortened prompt text for this permission. The permission
   // bubble may coalesce different requests, and if it does, this text will
   // be displayed next to an image and indicate the user grants the permission.
   virtual std::u16string GetMessageTextFragment() const = 0;
+#endif
 
   // Get the origin on whose behalf this permission request is being made.
   virtual GURL GetOrigin() const = 0;
diff --git a/components/permissions/permission_request_impl.cc b/components/permissions/permission_request_impl.cc
index c670f1be..918449e 100644
--- a/components/permissions/permission_request_impl.cc
+++ b/components/permissions/permission_request_impl.cc
@@ -91,30 +91,48 @@
       url_formatter::FormatUrlForSecurityDisplay(
           GetOrigin(), url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
 }
+#endif  // defined(OS_ANDROID)
 
-std::u16string PermissionRequestImpl::GetQuietTitleText() const {
-  if (content_settings_type_ == ContentSettingsType::NOTIFICATIONS) {
-    return l10n_util::GetStringFUTF16(
-        IDS_NOTIFICATION_QUIET_PERMISSION_PROMPT_TITLE,
-        url_formatter::FormatUrlForSecurityDisplay(
-            GetOrigin(), url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
+#if !defined(OS_ANDROID)
+base::Optional<std::u16string> PermissionRequestImpl::GetChipText() const {
+  int message_id;
+  switch (content_settings_type_) {
+    case ContentSettingsType::GEOLOCATION:
+      message_id = IDS_GEOLOCATION_PERMISSION_CHIP;
+      break;
+    case ContentSettingsType::NOTIFICATIONS:
+      message_id = IDS_NOTIFICATION_PERMISSIONS_CHIP;
+      break;
+    case ContentSettingsType::MIDI_SYSEX:
+      message_id = IDS_MIDI_SYSEX_PERMISSION_CHIP;
+      break;
+    case ContentSettingsType::MEDIASTREAM_MIC:
+      message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY_PERMISSION_CHIP;
+      break;
+    case ContentSettingsType::MEDIASTREAM_CAMERA:
+      message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY_PERMISSION_CHIP;
+      break;
+    case ContentSettingsType::CLIPBOARD_READ_WRITE:
+      message_id = IDS_CLIPBOARD_PERMISSION_CHIP;
+      break;
+    case ContentSettingsType::VR:
+      message_id = IDS_VR_PERMISSION_CHIP;
+      break;
+    case ContentSettingsType::AR:
+      message_id = IDS_AR_PERMISSION_CHIP;
+      break;
+    case ContentSettingsType::IDLE_DETECTION:
+      message_id = IDS_IDLE_DETECTION_PERMISSION_CHIP;
+      break;
+    default:
+      // TODO(bsep): We don't actually want to support having no string in the
+      // long term, but writing them takes time. In the meantime, we fall back
+      // to the existing UI when the string is missing.
+      return base::nullopt;
   }
-
-  NOTREACHED();
-  return std::u16string();
+  return l10n_util::GetStringUTF16(message_id);
 }
 
-std::u16string PermissionRequestImpl::GetQuietMessageText() const {
-  if (content_settings_type_ == ContentSettingsType::NOTIFICATIONS) {
-    return l10n_util::GetStringUTF16(
-        IDS_NOTIFICATION_QUIET_PERMISSION_PROMPT_MESSAGE);
-  }
-
-  NOTREACHED();
-  return GetMessageText();
-}
-#endif
-
 std::u16string PermissionRequestImpl::GetMessageTextFragment() const {
   int message_id;
   switch (content_settings_type_) {
@@ -127,7 +145,7 @@
     case ContentSettingsType::MIDI_SYSEX:
       message_id = IDS_MIDI_SYSEX_PERMISSION_FRAGMENT;
       break;
-#if defined(OS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH)
     case ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER:
       message_id = IDS_PROTECTED_MEDIA_IDENTIFIER_PERMISSION_FRAGMENT;
       break;
@@ -177,47 +195,7 @@
   }
   return l10n_util::GetStringUTF16(message_id);
 }
-
-#if !defined(OS_ANDROID)
-base::Optional<std::u16string> PermissionRequestImpl::GetChipText() const {
-  int message_id;
-  switch (content_settings_type_) {
-    case ContentSettingsType::GEOLOCATION:
-      message_id = IDS_GEOLOCATION_PERMISSION_CHIP;
-      break;
-    case ContentSettingsType::NOTIFICATIONS:
-      message_id = IDS_NOTIFICATION_PERMISSIONS_CHIP;
-      break;
-    case ContentSettingsType::MIDI_SYSEX:
-      message_id = IDS_MIDI_SYSEX_PERMISSION_CHIP;
-      break;
-    case ContentSettingsType::MEDIASTREAM_MIC:
-      message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY_PERMISSION_CHIP;
-      break;
-    case ContentSettingsType::MEDIASTREAM_CAMERA:
-      message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY_PERMISSION_CHIP;
-      break;
-    case ContentSettingsType::CLIPBOARD_READ_WRITE:
-      message_id = IDS_CLIPBOARD_PERMISSION_CHIP;
-      break;
-    case ContentSettingsType::VR:
-      message_id = IDS_VR_PERMISSION_CHIP;
-      break;
-    case ContentSettingsType::AR:
-      message_id = IDS_AR_PERMISSION_CHIP;
-      break;
-    case ContentSettingsType::IDLE_DETECTION:
-      message_id = IDS_IDLE_DETECTION_PERMISSION_CHIP;
-      break;
-    default:
-      // TODO(bsep): We don't actually want to support having no string in the
-      // long term, but writing them takes time. In the meantime, we fall back
-      // to the existing UI when the string is missing.
-      return base::nullopt;
-  }
-  return l10n_util::GetStringUTF16(message_id);
-}
-#endif
+#endif  // !defined(OS_ANDROID)
 
 GURL PermissionRequestImpl::GetOrigin() const {
   return request_origin_;
diff --git a/components/permissions/permission_request_impl.h b/components/permissions/permission_request_impl.h
index 6695a45..2195d6f 100644
--- a/components/permissions/permission_request_impl.h
+++ b/components/permissions/permission_request_impl.h
@@ -40,13 +40,10 @@
   RequestType GetRequestType() const override;
 #if defined(OS_ANDROID)
   std::u16string GetMessageText() const override;
-  std::u16string GetQuietTitleText() const override;
-  std::u16string GetQuietMessageText() const override;
-#endif
-#if !defined(OS_ANDROID)
+#else
   base::Optional<std::u16string> GetChipText() const override;
-#endif
   std::u16string GetMessageTextFragment() const override;
+#endif
   GURL GetOrigin() const override;
   void PermissionGranted(bool is_one_time) override;
   void PermissionDenied() override;
diff --git a/components/permissions/permission_request_manager.cc b/components/permissions/permission_request_manager.cc
index c4c308f..f4bf8be5 100644
--- a/components/permissions/permission_request_manager.cc
+++ b/components/permissions/permission_request_manager.cc
@@ -69,16 +69,6 @@
 
 namespace {
 
-bool IsMessageTextEqual(PermissionRequest* a, PermissionRequest* b) {
-  if (a == b)
-    return true;
-  if (a->GetMessageTextFragment() == b->GetMessageTextFragment() &&
-      a->GetOrigin() == b->GetOrigin()) {
-    return true;
-  }
-  return false;
-}
-
 bool IsMediaRequest(RequestType type) {
 #if !defined(OS_ANDROID)
   if (type == RequestType::kCameraPanTiltZoom)
@@ -704,11 +694,11 @@
 PermissionRequest* PermissionRequestManager::GetExistingRequest(
     PermissionRequest* request) {
   for (PermissionRequest* existing_request : requests_) {
-    if (IsMessageTextEqual(existing_request, request))
+    if (request->IsDuplicateOf(existing_request))
       return existing_request;
   }
   for (PermissionRequest* queued_request : queued_requests_) {
-    if (IsMessageTextEqual(queued_request, request))
+    if (request->IsDuplicateOf(queued_request))
       return queued_request;
   }
   return nullptr;
diff --git a/components/permissions/permission_request_manager_unittest.cc b/components/permissions/permission_request_manager_unittest.cc
index 8a36803..a8a146ef 100644
--- a/components/permissions/permission_request_manager_unittest.cc
+++ b/components/permissions/permission_request_manager_unittest.cc
@@ -37,34 +37,33 @@
       public ::testing::WithParamInterface<bool> {
  public:
   PermissionRequestManagerTest()
-      : content::RenderViewHostTestHarness(),
-        request1_("test1",
+      : request1_(u"test1",
                   RequestType::kDiskQuota,
                   PermissionRequestGestureType::GESTURE),
-        request2_("test2",
+        request2_(u"test2",
                   RequestType::kMultipleDownloads,
                   PermissionRequestGestureType::NO_GESTURE),
-        request_mic_("mic",
+        request_mic_(u"mic",
                      RequestType::kMicStream,
                      PermissionRequestGestureType::NO_GESTURE),
-        request_camera_("cam",
+        request_camera_(u"cam",
                         RequestType::kCameraStream,
                         PermissionRequestGestureType::NO_GESTURE),
 #if !defined(OS_ANDROID)
-        request_ptz_("ptz",
+        request_ptz_(u"ptz",
                      RequestType::kCameraPanTiltZoom,
                      PermissionRequestGestureType::NO_GESTURE),
 #endif
-        iframe_request_same_domain_("iframe",
+        iframe_request_same_domain_(u"iframe",
                                     RequestType::kNotifications,
                                     GURL("http://www.google.com/some/url")),
-        iframe_request_other_domain_("iframe",
+        iframe_request_other_domain_(u"iframe",
                                      RequestType::kGeolocation,
                                      GURL("http://www.youtube.com")),
-        iframe_request_camera_other_domain_("iframe",
+        iframe_request_camera_other_domain_(u"iframe",
                                             RequestType::kCameraStream,
                                             GURL("http://www.youtube.com")),
-        iframe_request_mic_other_domain_("iframe",
+        iframe_request_mic_other_domain_(u"iframe",
                                          RequestType::kMicStream,
                                          GURL("http://www.youtube.com")) {
     feature_list_.InitWithFeatureState(permissions::features::kPermissionChip,
@@ -483,33 +482,33 @@
   WaitForBubbleToBeShown();
   manager_->AddRequest(web_contents()->GetMainFrame(), &request2_);
 
-  MockPermissionRequest dupe_request("test1");
-  manager_->AddRequest(web_contents()->GetMainFrame(), &dupe_request);
-  EXPECT_FALSE(dupe_request.finished());
+  auto dupe_request = request1_.CreateDuplicateRequest();
+  manager_->AddRequest(web_contents()->GetMainFrame(), dupe_request.get());
+  EXPECT_FALSE(dupe_request->finished());
   EXPECT_FALSE(request1_.finished());
 
-  MockPermissionRequest dupe_request2("test2");
-  manager_->AddRequest(web_contents()->GetMainFrame(), &dupe_request2);
-  EXPECT_FALSE(dupe_request2.finished());
+  auto dupe_request2 = request2_.CreateDuplicateRequest();
+  manager_->AddRequest(web_contents()->GetMainFrame(), dupe_request2.get());
+  EXPECT_FALSE(dupe_request2->finished());
   EXPECT_FALSE(request2_.finished());
 
   WaitForBubbleToBeShown();
   Accept();
   if (GetParam()) {
-    EXPECT_TRUE(dupe_request2.finished());
+    EXPECT_TRUE(dupe_request2->finished());
     EXPECT_TRUE(request2_.finished());
   } else {
-    EXPECT_TRUE(dupe_request.finished());
+    EXPECT_TRUE(dupe_request->finished());
     EXPECT_TRUE(request1_.finished());
   }
 
   WaitForBubbleToBeShown();
   Accept();
   if (GetParam()) {
-    EXPECT_TRUE(dupe_request.finished());
+    EXPECT_TRUE(dupe_request->finished());
     EXPECT_TRUE(request1_.finished());
   } else {
-    EXPECT_TRUE(dupe_request2.finished());
+    EXPECT_TRUE(dupe_request2->finished());
     EXPECT_TRUE(request2_.finished());
   }
 }
@@ -765,7 +764,7 @@
     MockNotificationPermissionUiSelector::CreateForManager(
         manager_, test.quiet_ui_reason, test.async);
 
-    MockPermissionRequest request("foo", RequestType::kNotifications,
+    MockPermissionRequest request(u"foo", RequestType::kNotifications,
                                   PermissionRequestGestureType::GESTURE);
 
     manager_->AddRequest(web_contents()->GetMainFrame(), &request);
@@ -787,14 +786,14 @@
   manager_->clear_notification_permission_ui_selector_for_testing();
   MockNotificationPermissionUiSelector::CreateForManager(
       manager_, QuietUiReason::kEnabledInPrefs, true);
-  MockPermissionRequest request1("request1", RequestType::kNotifications,
+  MockPermissionRequest request1(u"request1", RequestType::kNotifications,
                                  PermissionRequestGestureType::GESTURE);
   manager_->AddRequest(web_contents()->GetMainFrame(), &request1);
   WaitForBubbleToBeShown();
   EXPECT_TRUE(manager_->ShouldCurrentRequestUseQuietUI());
   Accept();
 
-  MockPermissionRequest request2("request2", RequestType::kNotifications,
+  MockPermissionRequest request2(u"request2", RequestType::kNotifications,
                                  PermissionRequestGestureType::GESTURE);
   manager_->clear_notification_permission_ui_selector_for_testing();
   MockNotificationPermissionUiSelector::CreateForManager(
@@ -860,7 +859,7 @@
           test.simulate_delayed_decision[i]);
     }
 
-    MockPermissionRequest request("foo", RequestType::kNotifications,
+    MockPermissionRequest request(u"foo", RequestType::kNotifications,
                                   PermissionRequestGestureType::GESTURE);
 
     manager_->AddRequest(web_contents()->GetMainFrame(), &request);
@@ -918,7 +917,7 @@
           false /* async */, test.prediction_likelihoods[i]);
     }
 
-    MockPermissionRequest request("foo", RequestType::kNotifications,
+    MockPermissionRequest request(u"foo", RequestType::kNotifications,
                                   PermissionRequestGestureType::GESTURE);
 
     manager_->AddRequest(web_contents()->GetMainFrame(), &request);
diff --git a/components/permissions/quota_permission_context_impl.cc b/components/permissions/quota_permission_context_impl.cc
index eb1b6447a..d2acc7e 100644
--- a/components/permissions/quota_permission_context_impl.cc
+++ b/components/permissions/quota_permission_context_impl.cc
@@ -54,10 +54,12 @@
  private:
   // PermissionRequest:
   RequestType GetRequestType() const override;
+  bool IsDuplicateOf(PermissionRequest* other_request) const override;
 #if defined(OS_ANDROID)
   std::u16string GetMessageText() const override;
-#endif
+#else
   std::u16string GetMessageTextFragment() const override;
+#endif
   GURL GetOrigin() const override;
   void PermissionGranted(bool is_one_time) override;
   void PermissionDenied() override;
@@ -91,6 +93,16 @@
   return RequestType::kDiskQuota;
 }
 
+bool QuotaPermissionRequest::IsDuplicateOf(
+    PermissionRequest* other_request) const {
+  // The downcast here is safe because PermissionRequest::IsDuplicateOf ensures
+  // that both requests are of type kDiskQuota.
+  return permissions::PermissionRequest::IsDuplicateOf(other_request) &&
+         is_large_quota_request_ ==
+             static_cast<QuotaPermissionRequest*>(other_request)
+                 ->is_large_quota_request_;
+}
+
 #if defined(OS_ANDROID)
 std::u16string QuotaPermissionRequest::GetMessageText() const {
   // If the site requested larger quota than this threshold, show a different
@@ -100,11 +112,11 @@
                                : IDS_REQUEST_QUOTA_INFOBAR_TEXT),
       url_formatter::FormatUrlForSecurityDisplay(origin_url_));
 }
-#endif
-
+#else
 std::u16string QuotaPermissionRequest::GetMessageTextFragment() const {
   return l10n_util::GetStringUTF16(IDS_REQUEST_QUOTA_PERMISSION_FRAGMENT);
 }
+#endif  // !defined(OS_ANDROID)
 
 GURL QuotaPermissionRequest::GetOrigin() const {
   return origin_url_;
diff --git a/components/permissions/test/mock_permission_prompt.cc b/components/permissions/test/mock_permission_prompt.cc
index 427ca23..5f4c8c73 100644
--- a/components/permissions/test/mock_permission_prompt.cc
+++ b/components/permissions/test/mock_permission_prompt.cc
@@ -46,15 +46,15 @@
                                            Delegate* delegate)
     : factory_(factory), delegate_(delegate) {
   for (const PermissionRequest* request : delegate_->Requests()) {
-    // The actual prompt will call these, so test they're sane.
-    EXPECT_FALSE(request->GetMessageTextFragment().empty());
     RequestType request_type = request->GetRequestType();
+    // The actual prompt will call these, so test they're sane.
 #if defined(OS_ANDROID)
     // For kStorageAccess, the prompt itself calculates the message text.
     if (request_type != permissions::RequestType::kStorageAccess)
       EXPECT_FALSE(request->GetMessageText().empty());
     EXPECT_NE(0, permissions::GetIconId(request_type));
 #else
+    EXPECT_FALSE(request->GetMessageTextFragment().empty());
     EXPECT_FALSE(permissions::GetIconId(request_type).is_empty());
 #endif
   }
diff --git a/components/permissions/test/mock_permission_request.cc b/components/permissions/test/mock_permission_request.cc
index d844a2c..3cdcf2b 100644
--- a/components/permissions/test/mock_permission_request.cc
+++ b/components/permissions/test/mock_permission_request.cc
@@ -6,7 +6,6 @@
 
 #include <string>
 
-#include "base/strings/utf_string_conversions.h"
 #include "components/permissions/request_type.h"
 
 #if defined(OS_ANDROID)
@@ -18,69 +17,63 @@
 namespace permissions {
 
 MockPermissionRequest::MockPermissionRequest()
-    : MockPermissionRequest("test",
-                            "button",
-                            "button",
+    : MockPermissionRequest(u"test",
                             GURL("http://www.google.com"),
                             RequestType::kNotifications,
                             PermissionRequestGestureType::UNKNOWN,
                             ContentSettingsType::NOTIFICATIONS) {}
 
-MockPermissionRequest::MockPermissionRequest(const std::string& text)
+MockPermissionRequest::MockPermissionRequest(const std::u16string& text)
     : MockPermissionRequest(text,
-                            "button",
-                            "button",
                             GURL("http://www.google.com"),
                             RequestType::kNotifications,
                             PermissionRequestGestureType::UNKNOWN,
                             ContentSettingsType::NOTIFICATIONS) {}
 
 MockPermissionRequest::MockPermissionRequest(
-    const std::string& text,
+    const std::u16string& text,
     RequestType request_type,
     PermissionRequestGestureType gesture_type)
     : MockPermissionRequest(text,
-                            "button",
-                            "button",
                             GURL("http://www.google.com"),
                             request_type,
                             gesture_type,
                             ContentSettingsType::NOTIFICATIONS) {}
 
-MockPermissionRequest::MockPermissionRequest(const std::string& text,
+MockPermissionRequest::MockPermissionRequest(const std::u16string& text,
                                              RequestType request_type,
                                              const GURL& url)
     : MockPermissionRequest(text,
-                            "button",
-                            "button",
                             url,
                             request_type,
                             PermissionRequestGestureType::UNKNOWN,
                             ContentSettingsType::NOTIFICATIONS) {}
 
-MockPermissionRequest::MockPermissionRequest(const std::string& text,
-                                             const std::string& accept_label,
-                                             const std::string& deny_label)
-    : MockPermissionRequest(text,
-                            accept_label,
-                            deny_label,
-                            GURL("http://www.google.com"),
-                            RequestType::kNotifications,
-                            PermissionRequestGestureType::UNKNOWN,
-                            ContentSettingsType::NOTIFICATIONS) {}
-
 MockPermissionRequest::MockPermissionRequest(
-    const std::string& text,
+    const std::u16string& text,
     ContentSettingsType content_settings_type)
     : MockPermissionRequest(
           text,
-          "button",
-          "button",
           GURL("http://www.google.com"),
           permissions::ContentSettingsTypeToRequestType(content_settings_type),
           PermissionRequestGestureType::UNKNOWN,
           content_settings_type) {}
 
+MockPermissionRequest::MockPermissionRequest(
+    const std::u16string& text,
+    const GURL& origin,
+    RequestType request_type,
+    PermissionRequestGestureType gesture_type,
+    ContentSettingsType content_settings_type)
+    : granted_(false),
+      cancelled_(false),
+      finished_(false),
+      request_type_(request_type),
+      gesture_type_(gesture_type),
+      content_settings_type_(content_settings_type),
+      text_(text),
+      origin_(origin.GetOrigin()) {}
+
 MockPermissionRequest::~MockPermissionRequest() = default;
 
 RequestType MockPermissionRequest::GetRequestType() const {
@@ -91,11 +84,11 @@
 std::u16string MockPermissionRequest::GetMessageText() const {
   return text_;
 }
-#endif
-
+#else
 std::u16string MockPermissionRequest::GetMessageTextFragment() const {
   return text_;
 }
+#endif
 
 GURL MockPermissionRequest::GetOrigin() const {
   return origin_;
@@ -138,24 +131,10 @@
   return finished_;
 }
 
-MockPermissionRequest::MockPermissionRequest(
-    const std::string& text,
-    const std::string& accept_label,
-    const std::string& deny_label,
-    const GURL& origin,
-    RequestType request_type,
-    PermissionRequestGestureType gesture_type,
-    ContentSettingsType content_settings_type)
-    : granted_(false),
-      cancelled_(false),
-      finished_(false),
-      request_type_(request_type),
-      gesture_type_(gesture_type),
-      content_settings_type_(content_settings_type) {
-  text_ = base::UTF8ToUTF16(text);
-  accept_label_ = base::UTF8ToUTF16(accept_label);
-  deny_label_ = base::UTF8ToUTF16(deny_label);
-  origin_ = origin.GetOrigin();
+std::unique_ptr<MockPermissionRequest>
+MockPermissionRequest::CreateDuplicateRequest() const {
+  return std::make_unique<MockPermissionRequest>(
+      text_, origin_, request_type_, gesture_type_, content_settings_type_);
 }
 
 }  // namespace permissions
diff --git a/components/permissions/test/mock_permission_request.h b/components/permissions/test/mock_permission_request.h
index 36a73f3..8478da6 100644
--- a/components/permissions/test/mock_permission_request.h
+++ b/components/permissions/test/mock_permission_request.h
@@ -17,18 +17,20 @@
 class MockPermissionRequest : public PermissionRequest {
  public:
   MockPermissionRequest();
-  explicit MockPermissionRequest(const std::string& text);
-  MockPermissionRequest(const std::string& text,
+  explicit MockPermissionRequest(const std::u16string& text);
+  MockPermissionRequest(const std::u16string& text,
                         RequestType request_type,
                         PermissionRequestGestureType gesture_type);
-  MockPermissionRequest(const std::string& text,
+  MockPermissionRequest(const std::u16string& text,
                         RequestType request_type,
                         const GURL& url);
-  MockPermissionRequest(const std::string& text,
-                        const std::string& accept_label,
-                        const std::string& deny_label);
-  MockPermissionRequest(const std::string& text,
+  MockPermissionRequest(const std::u16string& text,
                         ContentSettingsType content_settings_type_);
+  MockPermissionRequest(const std::u16string& text,
+                        const GURL& url,
+                        RequestType request_type,
+                        PermissionRequestGestureType gesture_type,
+                        ContentSettingsType content_settings_type);
 
   ~MockPermissionRequest() override;
 
@@ -36,8 +38,9 @@
 
 #if defined(OS_ANDROID)
   std::u16string GetMessageText() const override;
-#endif
+#else
   std::u16string GetMessageTextFragment() const override;
+#endif
   GURL GetOrigin() const override;
 
   void PermissionGranted(bool is_one_time) override;
@@ -51,14 +54,9 @@
   bool cancelled();
   bool finished();
 
+  std::unique_ptr<MockPermissionRequest> CreateDuplicateRequest() const;
+
  private:
-  MockPermissionRequest(const std::string& text,
-                        const std::string& accept_label,
-                        const std::string& deny_label,
-                        const GURL& url,
-                        RequestType request_type,
-                        PermissionRequestGestureType gesture_type,
-                        ContentSettingsType content_settings_type);
   bool granted_;
   bool cancelled_;
   bool finished_;
@@ -67,8 +65,6 @@
   ContentSettingsType content_settings_type_;
 
   std::u16string text_;
-  std::u16string accept_label_;
-  std::u16string deny_label_;
   GURL origin_;
 };