Commit 0b5a963c authored by Livvie Lin's avatar Livvie Lin Committed by Commit Bot

[iOS] Rename IOSSSLErrorTabHelper and move to interstitials directory

Since we're adding lookalike interstitials, which also need the tab
helper, IOSSSLErrorTabHelper should live in a common folder and
be renamed to something more general.

Bug: 1058898
Change-Id: Ia27eca489a0f62ce3584ca7d25ca13126810f973
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2089149Reviewed-by: default avatarRohit Rao <rohitrao@chromium.org>
Commit-Queue: Livvie Lin <livvielin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#747720}
parent 6ce0cbe1
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
source_set("interstitials") { source_set("interstitials") {
configs += [ "//build/config/compiler:enable_arc" ] configs += [ "//build/config/compiler:enable_arc" ]
sources = [ sources = [
"ios_blocking_page_tab_helper.h",
"ios_blocking_page_tab_helper.mm",
"ios_chrome_controller_client.h", "ios_chrome_controller_client.h",
"ios_chrome_controller_client.mm", "ios_chrome_controller_client.mm",
"ios_chrome_metrics_helper.h", "ios_chrome_metrics_helper.h",
...@@ -32,3 +34,15 @@ source_set("interstitials") { ...@@ -32,3 +34,15 @@ source_set("interstitials") {
"//url", "//url",
] ]
} }
source_set("unit_tests") {
configs += [ "//build/config/compiler:enable_arc" ]
testonly = true
sources = [ "ios_blocking_page_tab_helper_unittest.mm" ]
deps = [
":interstitials",
"//ios/chrome/browser/interstitials",
"//ios/web",
"//ios/web/public/test",
]
}
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_SSL_IOS_SSL_ERROR_TAB_HELPER_H_ #ifndef IOS_CHROME_BROWSER_INTERSTITIALS_IOS_BLOCKING_PAGE_TAB_HELPER_H_
#define IOS_CHROME_BROWSER_SSL_IOS_SSL_ERROR_TAB_HELPER_H_ #define IOS_CHROME_BROWSER_INTERSTITIALS_IOS_BLOCKING_PAGE_TAB_HELPER_H_
#include "ios/chrome/browser/interstitials/ios_security_interstitial_page.h" #include "ios/chrome/browser/interstitials/ios_security_interstitial_page.h"
#include "ios/web/public/web_state_observer.h" #include "ios/web/public/web_state_observer.h"
...@@ -17,13 +17,13 @@ class WebState; ...@@ -17,13 +17,13 @@ class WebState;
// interstitial code. Stores an IOSSecurityInterstitialPage while an SSL error // interstitial code. Stores an IOSSecurityInterstitialPage while an SSL error
// is currently being shown, then cleans it up when the user navigates away // is currently being shown, then cleans it up when the user navigates away
// from the SSL error. // from the SSL error.
class IOSSSLErrorTabHelper class IOSBlockingPageTabHelper
: public web::WebStateObserver, : public web::WebStateObserver,
public web::WebStateUserData<IOSSSLErrorTabHelper> { public web::WebStateUserData<IOSBlockingPageTabHelper> {
public: public:
~IOSSSLErrorTabHelper() override; ~IOSBlockingPageTabHelper() override;
// Associates |blocking_page| with an IOSSSLErrorTabHelper to manage the // Associates |blocking_page| with an IOSBlockingPageTabHelper to manage the
// |blocking_page|'s lifetime. // |blocking_page|'s lifetime.
static void AssociateBlockingPage( static void AssociateBlockingPage(
web::WebState* web_state, web::WebState* web_state,
...@@ -38,10 +38,10 @@ class IOSSSLErrorTabHelper ...@@ -38,10 +38,10 @@ class IOSSSLErrorTabHelper
private: private:
WEB_STATE_USER_DATA_KEY_DECL(); WEB_STATE_USER_DATA_KEY_DECL();
explicit IOSSSLErrorTabHelper(web::WebState* web_state); explicit IOSBlockingPageTabHelper(web::WebState* web_state);
DISALLOW_COPY_AND_ASSIGN(IOSSSLErrorTabHelper); DISALLOW_COPY_AND_ASSIGN(IOSBlockingPageTabHelper);
friend class web::WebStateUserData<IOSSSLErrorTabHelper>; friend class web::WebStateUserData<IOSBlockingPageTabHelper>;
void SetBlockingPage( void SetBlockingPage(
int64_t navigation_id, int64_t navigation_id,
...@@ -72,7 +72,7 @@ class IOSSSLErrorTabHelper ...@@ -72,7 +72,7 @@ class IOSSSLErrorTabHelper
// Subscription for JS messages. // Subscription for JS messages.
std::unique_ptr<web::WebState::ScriptCommandSubscription> subscription_; std::unique_ptr<web::WebState::ScriptCommandSubscription> subscription_;
base::WeakPtrFactory<IOSSSLErrorTabHelper> weak_factory_{this}; base::WeakPtrFactory<IOSBlockingPageTabHelper> weak_factory_{this};
}; };
#endif // IOS_CHROME_BROWSER_SSL_IOS_SSL_ERROR_TAB_HELPER_H_ #endif // IOS_CHROME_BROWSER_INTERSTITIALS_IOS_BLOCKING_PAGE_TAB_HELPER_H_
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#import "ios/chrome/browser/ssl/ios_ssl_error_tab_helper.h" #import "ios/chrome/browser/interstitials/ios_blocking_page_tab_helper.h"
#include "base/values.h" #include "base/values.h"
#include "ios/chrome/browser/interstitials/ios_security_interstitial_page.h" #include "ios/chrome/browser/interstitials/ios_security_interstitial_page.h"
...@@ -19,27 +19,29 @@ namespace { ...@@ -19,27 +19,29 @@ namespace {
const char kCommandPrefix[] = "blockingPage"; const char kCommandPrefix[] = "blockingPage";
} // namespace } // namespace
IOSSSLErrorTabHelper::IOSSSLErrorTabHelper(web::WebState* web_state) IOSBlockingPageTabHelper::IOSBlockingPageTabHelper(web::WebState* web_state)
: web_state_(web_state), subscription_(nullptr), weak_factory_(this) { : web_state_(web_state), subscription_(nullptr), weak_factory_(this) {
web_state_->AddObserver(this); web_state_->AddObserver(this);
auto command_callback = base::Bind( auto command_callback =
&IOSSSLErrorTabHelper::OnBlockingPageCommand, weak_factory_.GetWeakPtr()); base::Bind(&IOSBlockingPageTabHelper::OnBlockingPageCommand,
weak_factory_.GetWeakPtr());
subscription_ = subscription_ =
web_state->AddScriptCommandCallback(command_callback, kCommandPrefix); web_state->AddScriptCommandCallback(command_callback, kCommandPrefix);
} }
IOSSSLErrorTabHelper::~IOSSSLErrorTabHelper() = default; IOSBlockingPageTabHelper::~IOSBlockingPageTabHelper() = default;
// static // static
void IOSSSLErrorTabHelper::AssociateBlockingPage( void IOSBlockingPageTabHelper::AssociateBlockingPage(
web::WebState* web_state, web::WebState* web_state,
int64_t navigation_id, int64_t navigation_id,
std::unique_ptr<IOSSecurityInterstitialPage> blocking_page) { std::unique_ptr<IOSSecurityInterstitialPage> blocking_page) {
// CreateForWebState() creates a tab helper if it doesn't exist for // CreateForWebState() creates a tab helper if it doesn't exist for
// |web_state| yet. // |web_state| yet.
IOSSSLErrorTabHelper::CreateForWebState(web_state); IOSBlockingPageTabHelper::CreateForWebState(web_state);
IOSSSLErrorTabHelper* helper = IOSSSLErrorTabHelper::FromWebState(web_state); IOSBlockingPageTabHelper* helper =
IOSBlockingPageTabHelper::FromWebState(web_state);
helper->SetBlockingPage(navigation_id, std::move(blocking_page)); helper->SetBlockingPage(navigation_id, std::move(blocking_page));
} }
...@@ -47,7 +49,7 @@ void IOSSSLErrorTabHelper::AssociateBlockingPage( ...@@ -47,7 +49,7 @@ void IOSSSLErrorTabHelper::AssociateBlockingPage(
// IOSSecurityInterstitialPage in a member variable so that it can handle // IOSSecurityInterstitialPage in a member variable so that it can handle
// commands. Clean up the member variable when a subsequent navigation commits, // commands. Clean up the member variable when a subsequent navigation commits,
// since the IOSSecurityInterstitialPage is no longer needed. // since the IOSSecurityInterstitialPage is no longer needed.
void IOSSSLErrorTabHelper::DidFinishNavigation( void IOSBlockingPageTabHelper::DidFinishNavigation(
web::WebState* web_state, web::WebState* web_state,
web::NavigationContext* navigation_context) { web::NavigationContext* navigation_context) {
DCHECK_EQ(web_state_, web_state); DCHECK_EQ(web_state_, web_state);
...@@ -74,19 +76,19 @@ void IOSSSLErrorTabHelper::DidFinishNavigation( ...@@ -74,19 +76,19 @@ void IOSSSLErrorTabHelper::DidFinishNavigation(
web_state_->DidChangeVisibleSecurityState(); web_state_->DidChangeVisibleSecurityState();
} }
void IOSSSLErrorTabHelper::WebStateDestroyed(web::WebState* web_state) { void IOSBlockingPageTabHelper::WebStateDestroyed(web::WebState* web_state) {
DCHECK_EQ(web_state_, web_state); DCHECK_EQ(web_state_, web_state);
web_state_->RemoveObserver(this); web_state_->RemoveObserver(this);
web_state_ = nullptr; web_state_ = nullptr;
} }
void IOSSSLErrorTabHelper::SetBlockingPage( void IOSBlockingPageTabHelper::SetBlockingPage(
int64_t navigation_id, int64_t navigation_id,
std::unique_ptr<IOSSecurityInterstitialPage> blocking_page) { std::unique_ptr<IOSSecurityInterstitialPage> blocking_page) {
blocking_pages_for_navigations_[navigation_id] = std::move(blocking_page); blocking_pages_for_navigations_[navigation_id] = std::move(blocking_page);
} }
void IOSSSLErrorTabHelper::OnBlockingPageCommand( void IOSBlockingPageTabHelper::OnBlockingPageCommand(
const base::DictionaryValue& message, const base::DictionaryValue& message,
const GURL& url, const GURL& url,
bool user_is_interacting, bool user_is_interacting,
...@@ -102,4 +104,4 @@ void IOSSSLErrorTabHelper::OnBlockingPageCommand( ...@@ -102,4 +104,4 @@ void IOSSSLErrorTabHelper::OnBlockingPageCommand(
} }
} }
WEB_STATE_USER_DATA_KEY_IMPL(IOSSSLErrorTabHelper) WEB_STATE_USER_DATA_KEY_IMPL(IOSBlockingPageTabHelper)
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#import "ios/chrome/browser/ssl/ios_ssl_error_tab_helper.h" #import "ios/chrome/browser/interstitials/ios_blocking_page_tab_helper.h"
#include "ios/chrome/browser/interstitials/ios_security_interstitial_page.h" #include "ios/chrome/browser/interstitials/ios_security_interstitial_page.h"
#import "ios/web/public/test/fakes/fake_navigation_context.h" #import "ios/web/public/test/fakes/fake_navigation_context.h"
...@@ -42,11 +42,11 @@ class TestInterstitialPage : public IOSSecurityInterstitialPage { ...@@ -42,11 +42,11 @@ class TestInterstitialPage : public IOSSecurityInterstitialPage {
bool* destroyed_tracker_; bool* destroyed_tracker_;
}; };
class IOSSSLErrorTabHelperTest : public web::WebTestWithWebState { class IOSBlockingPageTabHelperTest : public web::WebTestWithWebState {
protected: protected:
void SetUp() override { void SetUp() override {
web::WebTestWithWebState::SetUp(); web::WebTestWithWebState::SetUp();
IOSSSLErrorTabHelper::CreateForWebState(web_state()); IOSBlockingPageTabHelper::CreateForWebState(web_state());
} }
std::unique_ptr<web::NavigationContext> CreateContext(bool committed, std::unique_ptr<web::NavigationContext> CreateContext(bool committed,
...@@ -59,12 +59,12 @@ class IOSSSLErrorTabHelperTest : public web::WebTestWithWebState { ...@@ -59,12 +59,12 @@ class IOSSSLErrorTabHelperTest : public web::WebTestWithWebState {
} }
// The lifetime of the blocking page is managed by the // The lifetime of the blocking page is managed by the
// IOSSSLErrorTabHelper for the test's web_state. // IOSBlockingPageTabHelper for the test's web_state.
// |destroyed_tracker| will be set to true when the corresponding blocking // |destroyed_tracker| will be set to true when the corresponding blocking
// page is destroyed. // page is destroyed.
void CreateAssociatedBlockingPage(web::NavigationContext* context, void CreateAssociatedBlockingPage(web::NavigationContext* context,
bool* destroyed_tracker) { bool* destroyed_tracker) {
IOSSSLErrorTabHelper::AssociateBlockingPage( IOSBlockingPageTabHelper::AssociateBlockingPage(
web_state(), context->GetNavigationId(), web_state(), context->GetNavigationId(),
std::make_unique<TestInterstitialPage>(web_state(), GURL(), std::make_unique<TestInterstitialPage>(web_state(), GURL(),
destroyed_tracker)); destroyed_tracker));
...@@ -73,14 +73,14 @@ class IOSSSLErrorTabHelperTest : public web::WebTestWithWebState { ...@@ -73,14 +73,14 @@ class IOSSSLErrorTabHelperTest : public web::WebTestWithWebState {
// Tests that the helper properly handles the lifetime of a single blocking // Tests that the helper properly handles the lifetime of a single blocking
// page, interleaved with other navigations. // page, interleaved with other navigations.
TEST_F(IOSSSLErrorTabHelperTest, SingleBlockingPage) { TEST_F(IOSBlockingPageTabHelperTest, SingleBlockingPage) {
std::unique_ptr<web::NavigationContext> blocking_page_context = std::unique_ptr<web::NavigationContext> blocking_page_context =
CreateContext(true, false); CreateContext(true, false);
bool blocking_page_destroyed = false; bool blocking_page_destroyed = false;
CreateAssociatedBlockingPage(blocking_page_context.get(), CreateAssociatedBlockingPage(blocking_page_context.get(),
&blocking_page_destroyed); &blocking_page_destroyed);
IOSSSLErrorTabHelper* helper = IOSBlockingPageTabHelper* helper =
IOSSSLErrorTabHelper::FromWebState(web_state()); IOSBlockingPageTabHelper::FromWebState(web_state());
// Test that a same-document navigation doesn't destroy the blocking page if // Test that a same-document navigation doesn't destroy the blocking page if
// its navigation hasn't committed yet. // its navigation hasn't committed yet.
...@@ -110,7 +110,7 @@ TEST_F(IOSSSLErrorTabHelperTest, SingleBlockingPage) { ...@@ -110,7 +110,7 @@ TEST_F(IOSSSLErrorTabHelperTest, SingleBlockingPage) {
// Tests that the helper properly handles the lifetime of multiple blocking // Tests that the helper properly handles the lifetime of multiple blocking
// pages, committed in a different order than they are created. // pages, committed in a different order than they are created.
TEST_F(IOSSSLErrorTabHelperTest, MultipleBlockingPage) { TEST_F(IOSBlockingPageTabHelperTest, MultipleBlockingPage) {
// Simulate associating the first interstitial. // Simulate associating the first interstitial.
std::unique_ptr<web::NavigationContext> context1 = CreateContext(true, false); std::unique_ptr<web::NavigationContext> context1 = CreateContext(true, false);
bool blocking_page1_destroyed = false; bool blocking_page1_destroyed = false;
...@@ -118,8 +118,8 @@ TEST_F(IOSSSLErrorTabHelperTest, MultipleBlockingPage) { ...@@ -118,8 +118,8 @@ TEST_F(IOSSSLErrorTabHelperTest, MultipleBlockingPage) {
// We can directly retrieve the helper for testing once // We can directly retrieve the helper for testing once
// CreateAssociatedBlockingPage() was called. // CreateAssociatedBlockingPage() was called.
IOSSSLErrorTabHelper* helper = IOSBlockingPageTabHelper* helper =
IOSSSLErrorTabHelper::FromWebState(web_state()); IOSBlockingPageTabHelper::FromWebState(web_state());
// Simulate commiting the first interstitial. // Simulate commiting the first interstitial.
helper->DidFinishNavigation(web_state(), context1.get()); helper->DidFinishNavigation(web_state(), context1.get());
...@@ -162,14 +162,14 @@ TEST_F(IOSSSLErrorTabHelperTest, MultipleBlockingPage) { ...@@ -162,14 +162,14 @@ TEST_F(IOSSSLErrorTabHelperTest, MultipleBlockingPage) {
// Tests that the helper properly handles a navigation that finishes without // Tests that the helper properly handles a navigation that finishes without
// committing. // committing.
TEST_F(IOSSSLErrorTabHelperTest, NavigationDoesNotCommit) { TEST_F(IOSBlockingPageTabHelperTest, NavigationDoesNotCommit) {
std::unique_ptr<web::NavigationContext> committed_context = std::unique_ptr<web::NavigationContext> committed_context =
CreateContext(true, false); CreateContext(true, false);
bool committed_blocking_page_destroyed = false; bool committed_blocking_page_destroyed = false;
CreateAssociatedBlockingPage(committed_context.get(), CreateAssociatedBlockingPage(committed_context.get(),
&committed_blocking_page_destroyed); &committed_blocking_page_destroyed);
IOSSSLErrorTabHelper* helper = IOSBlockingPageTabHelper* helper =
IOSSSLErrorTabHelper::FromWebState(web_state()); IOSBlockingPageTabHelper::FromWebState(web_state());
helper->DidFinishNavigation(web_state(), committed_context.get()); helper->DidFinishNavigation(web_state(), committed_context.get());
EXPECT_FALSE(committed_blocking_page_destroyed); EXPECT_FALSE(committed_blocking_page_destroyed);
......
...@@ -17,8 +17,6 @@ source_set("ssl") { ...@@ -17,8 +17,6 @@ source_set("ssl") {
"ios_ssl_blocking_page.mm", "ios_ssl_blocking_page.mm",
"ios_ssl_error_handler.h", "ios_ssl_error_handler.h",
"ios_ssl_error_handler.mm", "ios_ssl_error_handler.mm",
"ios_ssl_error_tab_helper.h",
"ios_ssl_error_tab_helper.mm",
] ]
deps = [ deps = [
":feature_flags", ":feature_flags",
...@@ -62,7 +60,6 @@ source_set("unit_tests") { ...@@ -62,7 +60,6 @@ source_set("unit_tests") {
sources = [ sources = [
"ios_captive_portal_blocking_page_unittest.mm", "ios_captive_portal_blocking_page_unittest.mm",
"ios_ssl_error_handler_unittest.mm", "ios_ssl_error_handler_unittest.mm",
"ios_ssl_error_tab_helper_unittest.mm",
] ]
deps = [ deps = [
":feature_flags", ":feature_flags",
...@@ -70,7 +67,6 @@ source_set("unit_tests") { ...@@ -70,7 +67,6 @@ source_set("unit_tests") {
"//base/test:test_support", "//base/test:test_support",
"//components/security_state/core", "//components/security_state/core",
"//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/interstitials",
"//ios/chrome/browser/web:test_support", "//ios/chrome/browser/web:test_support",
"//ios/web", "//ios/web",
"//ios/web/public/security", "//ios/web/public/security",
......
...@@ -13,12 +13,12 @@ ...@@ -13,12 +13,12 @@
#include "components/captive_portal/core/captive_portal_detector.h" #include "components/captive_portal/core/captive_portal_detector.h"
#include "components/security_interstitials/core/ssl_error_options_mask.h" #include "components/security_interstitials/core/ssl_error_options_mask.h"
#include "components/security_interstitials/core/ssl_error_ui.h" #include "components/security_interstitials/core/ssl_error_ui.h"
#import "ios/chrome/browser/interstitials/ios_blocking_page_tab_helper.h"
#include "ios/chrome/browser/ssl/captive_portal_detector_tab_helper.h" #include "ios/chrome/browser/ssl/captive_portal_detector_tab_helper.h"
#include "ios/chrome/browser/ssl/captive_portal_features.h" #include "ios/chrome/browser/ssl/captive_portal_features.h"
#include "ios/chrome/browser/ssl/captive_portal_metrics.h" #include "ios/chrome/browser/ssl/captive_portal_metrics.h"
#include "ios/chrome/browser/ssl/ios_captive_portal_blocking_page.h" #include "ios/chrome/browser/ssl/ios_captive_portal_blocking_page.h"
#include "ios/chrome/browser/ssl/ios_ssl_blocking_page.h" #include "ios/chrome/browser/ssl/ios_ssl_blocking_page.h"
#import "ios/chrome/browser/ssl/ios_ssl_error_tab_helper.h"
#include "ios/web/public/browser_state.h" #include "ios/web/public/browser_state.h"
#import "ios/web/public/web_state.h" #import "ios/web/public/web_state.h"
#include "net/ssl/ssl_info.h" #include "net/ssl/ssl_info.h"
...@@ -138,8 +138,8 @@ void IOSSSLErrorHandler::ShowSSLInterstitial() { ...@@ -138,8 +138,8 @@ void IOSSSLErrorHandler::ShowSSLInterstitial() {
web_state_, cert_error_, ssl_info_, request_url_, options_mask, web_state_, cert_error_, ssl_info_, request_url_, options_mask,
base::Time::NowFromSystemTime(), std::move(callback_)); base::Time::NowFromSystemTime(), std::move(callback_));
std::string error_html = page->GetHtmlContents(); std::string error_html = page->GetHtmlContents();
IOSSSLErrorTabHelper::AssociateBlockingPage(web_state_, navigation_id_, IOSBlockingPageTabHelper::AssociateBlockingPage(web_state_, navigation_id_,
std::move(page)); std::move(page));
std::move(blocking_page_callback_).Run(base::SysUTF8ToNSString(error_html)); std::move(blocking_page_callback_).Run(base::SysUTF8ToNSString(error_html));
} else { } else {
// SSLBlockingPage deletes itself when it's dismissed. // SSLBlockingPage deletes itself when it's dismissed.
...@@ -159,8 +159,8 @@ void IOSSSLErrorHandler::ShowCaptivePortalInterstitial( ...@@ -159,8 +159,8 @@ void IOSSSLErrorHandler::ShowCaptivePortalInterstitial(
auto page = std::make_unique<IOSCaptivePortalBlockingPage>( auto page = std::make_unique<IOSCaptivePortalBlockingPage>(
web_state_, request_url_, landing_url, std::move(callback_)); web_state_, request_url_, landing_url, std::move(callback_));
std::string error_html = page->GetHtmlContents(); std::string error_html = page->GetHtmlContents();
IOSSSLErrorTabHelper::AssociateBlockingPage(web_state_, navigation_id_, IOSBlockingPageTabHelper::AssociateBlockingPage(web_state_, navigation_id_,
std::move(page)); std::move(page));
std::move(blocking_page_callback_).Run(base::SysUTF8ToNSString(error_html)); std::move(blocking_page_callback_).Run(base::SysUTF8ToNSString(error_html));
} else { } else {
// IOSCaptivePortalBlockingPage deletes itself when it's dismissed. // IOSCaptivePortalBlockingPage deletes itself when it's dismissed.
......
...@@ -189,6 +189,7 @@ test("ios_chrome_unittests") { ...@@ -189,6 +189,7 @@ test("ios_chrome_unittests") {
"//ios/chrome/browser/infobars/overlays/browser_agent:unit_tests", "//ios/chrome/browser/infobars/overlays/browser_agent:unit_tests",
"//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common:unit_tests", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common:unit_tests",
"//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords:unit_tests", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords:unit_tests",
"//ios/chrome/browser/interstitials:unit_tests",
"//ios/chrome/browser/itunes_urls:unit_tests", "//ios/chrome/browser/itunes_urls:unit_tests",
"//ios/chrome/browser/json_parser:unit_tests", "//ios/chrome/browser/json_parser:unit_tests",
"//ios/chrome/browser/language:unit_tests", "//ios/chrome/browser/language:unit_tests",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment