Commit b798658a authored by Eugene But's avatar Eugene But Committed by Commit Bot

[ios][breadcrumbs] Log Overlays initial presentations

Logs presentation of HttpAuth dialog, all JS dialogs, App Launching
dialog and generic alerts.

Also refactor breadcrumb_manager_browser_agent_unittest.mm
to have less repetitive code, since this CL adds a lot of new tests.

TBR: michaeldo@chromium.org
Bug: 1082915
Change-Id: I5727e65717c57cd48bac03922342f6b8eee9b286
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2240394
Commit-Queue: Eugene But <eugenebut@chromium.org>
Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Auto-Submit: Eugene But <eugenebut@chromium.org>
Cr-Commit-Position: refs/heads/master@{#779535}
parent 7e25f79b
......@@ -23,6 +23,8 @@ source_set("breadcrumbs") {
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/infobars",
"//ios/chrome/browser/main:public",
"//ios/chrome/browser/overlays",
"//ios/chrome/browser/overlays/public/web_content_area",
"//ios/chrome/browser/web_state_list",
"//ios/net",
"//ios/web/public",
......@@ -81,9 +83,13 @@ source_set("unit_tests") {
"//base/test:test_support",
"//ios/chrome/browser:chrome_url_constants",
"//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/download",
"//ios/chrome/browser/infobars",
"//ios/chrome/browser/infobars/test",
"//ios/chrome/browser/main:test_support",
"//ios/chrome/browser/overlays",
"//ios/chrome/browser/overlays/public/web_content_area",
"//ios/chrome/browser/overlays/test",
"//ios/chrome/browser/ui/commands",
"//ios/chrome/browser/ui/infobars/test",
"//ios/chrome/browser/web:test_support",
......
......@@ -7,16 +7,45 @@
#include <string>
#include "base/scoped_observer.h"
#include "ios/chrome/browser/main/browser_observer.h"
#include "ios/chrome/browser/main/browser_user_data.h"
#include "ios/chrome/browser/overlays/public/overlay_presenter.h"
#include "ios/chrome/browser/overlays/public/overlay_presenter_observer.h"
#include "ios/chrome/browser/web_state_list/web_state_list_observer.h"
class Browser;
class WebStateList;
// Name of Overlay initial presentation event.
extern const char kBreadcrumbOverlay[];
// Appended to |kBreadcrumbOverlay| event if overlay was re-activated rather
// than presented for the first time (f.e. the user has switched to a tab with
// an overlay).
extern const char kBreadcrumbOverlayActivated[];
// Appended to |kBreadcrumbOverlay| event if overlay is Http Authentication.
extern const char kBreadcrumbOverlayHttpAuth[];
// Appended to |kBreadcrumbOverlay| event if overlay is generic app dialog.
extern const char kBreadcrumbOverlayAlert[];
// Appended to |kBreadcrumbOverlay| event if overlay is app launch confirmation.
extern const char kBreadcrumbOverlayAppLaunch[];
// Appended to |kBreadcrumbOverlay| event if overlay is JavaScript alert.
extern const char kBreadcrumbOverlayJsAlert[];
// Appended to |kBreadcrumbOverlay| event if overlay is JavaScript confirm.
extern const char kBreadcrumbOverlayJsConfirm[];
// Appended to |kBreadcrumbOverlay| event if overlay is JavaScript prompt.
extern const char kBreadcrumbOverlayJsPrompt[];
// Logs activity for the associated Browser's underlying WebStateList based on
// callbacks from WebStateListObserver. Event logs are sent to the
// BrowserState's BreadcrumbManagerKeyedService.
// callbacks from various observers. Event logs are sent to the BrowserState's
// BreadcrumbManagerKeyedService.
// For example:
// Browser1 Insert active WebState2 at 0
// which indicates that a WebState with identifier 2 (from
......@@ -24,6 +53,7 @@ class WebStateList;
// (from BreadcrumbManagerBrowserAgent)
class BreadcrumbManagerBrowserAgent
: BrowserObserver,
public OverlayPresenterObserver,
public BrowserUserData<BreadcrumbManagerBrowserAgent>,
WebStateListObserver {
public:
......@@ -78,6 +108,12 @@ class BreadcrumbManagerBrowserAgent
void WillBeginBatchOperation(WebStateList* web_state_list) override;
void BatchOperationEnded(WebStateList* web_state_list) override;
// OverlayPresenterObservers overrides
void WillShowOverlay(OverlayPresenter* presenter,
OverlayRequest* request,
bool initial_presentation) override;
void OverlayPresenterDestroyed(OverlayPresenter* presenter) override;
// Unique (across this application run only) identifier for logs associated
// with |browser_| instance. Used to differentiate logs associated with the
// same underlying BrowserState.
......@@ -98,6 +134,9 @@ class BreadcrumbManagerBrowserAgent
int close_count = 0;
};
std::unique_ptr<BatchOperation> batch_operation_;
// Observes overlays presentation.
ScopedObserver<OverlayPresenter, OverlayPresenterObserver> overlay_observer_;
};
#endif // IOS_CHROME_BROWSER_CRASH_REPORT_BREADCRUMBS_BREADCRUMB_MANAGER_BROWSER_AGENT_H_
......@@ -12,21 +12,39 @@
#include "ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_keyed_service_factory.h"
#import "ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_tab_helper.h"
#import "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/overlays/public/web_content_area/alert_overlay.h"
#import "ios/chrome/browser/overlays/public/web_content_area/app_launcher_overlay.h"
#import "ios/chrome/browser/overlays/public/web_content_area/http_auth_overlay.h"
#import "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_overlay.h"
#include "ios/chrome/browser/web_state_list/web_state_list.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using java_script_dialog_overlays::JavaScriptDialogRequest;
const char kBreadcrumbOverlay[] = "Overlay";
const char kBreadcrumbOverlayActivated[] = "#activated";
const char kBreadcrumbOverlayHttpAuth[] = "#http-auth";
const char kBreadcrumbOverlayAlert[] = "#alert";
const char kBreadcrumbOverlayAppLaunch[] = "#app-launch";
const char kBreadcrumbOverlayJsAlert[] = "#js-alert";
const char kBreadcrumbOverlayJsConfirm[] = "#js-confirm";
const char kBreadcrumbOverlayJsPrompt[] = "#js-prompt";
BROWSER_USER_DATA_KEY_IMPL(BreadcrumbManagerBrowserAgent)
BreadcrumbManagerBrowserAgent::BreadcrumbManagerBrowserAgent(Browser* browser)
: browser_(browser) {
: browser_(browser), overlay_observer_(this) {
static int next_unique_id = 1;
unique_id_ = next_unique_id++;
browser_->AddObserver(this);
browser_->GetWebStateList()->AddObserver(this);
overlay_observer_.Add(
OverlayPresenter::FromBrowser(browser, OverlayModality::kWebContentArea));
}
BreadcrumbManagerBrowserAgent::~BreadcrumbManagerBrowserAgent() = default;
......@@ -152,3 +170,42 @@ void BreadcrumbManagerBrowserAgent::BatchOperationEnded(
}
batch_operation_.reset();
}
void BreadcrumbManagerBrowserAgent::WillShowOverlay(OverlayPresenter* presenter,
OverlayRequest* request,
bool initial_presentation) {
std::vector<std::string> event = {kBreadcrumbOverlay};
if (request->GetConfig<HTTPAuthOverlayRequestConfig>()) {
event.push_back(kBreadcrumbOverlayHttpAuth);
} else if (request->GetConfig<
app_launcher_overlays::AppLaunchConfirmationRequest>()) {
event.push_back(kBreadcrumbOverlayAppLaunch);
} else if (auto* js_dialog = request->GetConfig<JavaScriptDialogRequest>()) {
switch (js_dialog->type()) {
case web::JAVASCRIPT_DIALOG_TYPE_ALERT:
event.push_back(kBreadcrumbOverlayJsAlert);
break;
case web::JAVASCRIPT_DIALOG_TYPE_CONFIRM:
event.push_back(kBreadcrumbOverlayJsConfirm);
break;
case web::JAVASCRIPT_DIALOG_TYPE_PROMPT:
event.push_back(kBreadcrumbOverlayJsPrompt);
break;
}
} else if (request->GetConfig<alert_overlays::AlertRequest>()) {
event.push_back(kBreadcrumbOverlayAlert);
} else {
NOTREACHED(); // Missing breadcrumbs for the dialog.
}
if (!initial_presentation) {
event.push_back(kBreadcrumbOverlayActivated);
}
LogEvent(base::JoinString(event, " "));
}
void BreadcrumbManagerBrowserAgent::OverlayPresenterDestroyed(
OverlayPresenter* presenter) {
overlay_observer_.Remove(presenter);
}
......@@ -10,14 +10,23 @@
#include "ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_keyed_service.h"
#include "ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_keyed_service_factory.h"
#import "ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_tab_helper.h"
#import "ios/chrome/browser/download/confirm_download_replacing_overlay.h"
#include "ios/chrome/browser/infobars/infobar_manager_impl.h"
#import "ios/chrome/browser/main/test_browser.h"
#import "ios/chrome/browser/overlays/public/overlay_request.h"
#import "ios/chrome/browser/overlays/public/overlay_request_queue.h"
#import "ios/chrome/browser/overlays/public/web_content_area/app_launcher_overlay.h"
#import "ios/chrome/browser/overlays/public/web_content_area/http_auth_overlay.h"
#import "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_overlay.h"
#include "ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
#include "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
#include "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/chrome/browser/web_state_list/web_state_opener.h"
#include "ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_state_manager.h"
#import "ios/web/public/test/fakes/test_web_state.h"
#import "ios/web/public/test/web_task_environment.h"
#include "ios/web/public/ui/java_script_dialog_type.h"
#import "ios/web/public/web_state.h"
#include "testing/platform_test.h"
......@@ -25,16 +34,36 @@
#error "This file requires ARC support."
#endif
namespace {
// Creates test state, inserts it into WebState list and activates.
void InsertWebState(Browser* browser) {
auto web_state = std::make_unique<web::TestWebState>();
InfoBarManagerImpl::CreateForWebState(web_state.get());
BreadcrumbManagerTabHelper::CreateForWebState(web_state.get());
browser->GetWebStateList()->InsertWebState(
/*index=*/0, std::move(web_state), WebStateList::INSERT_ACTIVATE,
WebStateOpener());
}
} // namespace
// Test fixture for testing BreadcrumbManagerBrowserAgent class.
class BreadcrumbManagerBrowserAgentTest : public PlatformTest {
protected:
BreadcrumbManagerBrowserAgentTest() {
BreadcrumbManagerBrowserAgentTest()
: web_state_list_(&web_state_list_delegate_) {
TestChromeBrowserState::Builder test_cbs_builder;
browser_state_ = test_cbs_builder.Build();
breadcrumb_service_ = static_cast<BreadcrumbManagerKeyedService*>(
BreadcrumbManagerKeyedServiceFactory::GetForBrowserState(
browser_state_.get()));
browser_ =
std::make_unique<TestBrowser>(browser_state_.get(), &web_state_list_);
OverlayPresenter::FromBrowser(browser_.get(),
OverlayModality::kWebContentArea)
->SetPresentationContext(&presentation_context_);
}
web::WebTaskEnvironment task_env_{
......@@ -42,7 +71,10 @@ class BreadcrumbManagerBrowserAgentTest : public PlatformTest {
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
std::unique_ptr<TestChromeBrowserState> browser_state_;
FakeWebStateListDelegate web_state_list_delegate_;
WebStateList web_state_list_;
BreadcrumbManagerKeyedService* breadcrumb_service_;
FakeOverlayPresentationContext presentation_context_;
std::unique_ptr<Browser> browser_;
};
// Tests that an event logged by the BrowserAgent is returned with events for
......@@ -50,21 +82,9 @@ class BreadcrumbManagerBrowserAgentTest : public PlatformTest {
TEST_F(BreadcrumbManagerBrowserAgentTest, LogEvent) {
ASSERT_EQ(0ul, breadcrumb_service_->GetEvents(0).size());
// Create and setup Browser.
WebStateList web_state_list(&web_state_list_delegate_);
std::unique_ptr<Browser> browser =
std::make_unique<TestBrowser>(browser_state_.get(), &web_state_list);
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser.get());
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser_.get());
// Insert WebState into |browser|.
web::WebState::CreateParams createParams(browser_state_.get());
std::unique_ptr<web::WebState> web_state =
web::WebState::Create(createParams);
InfoBarManagerImpl::CreateForWebState(web_state.get());
BreadcrumbManagerTabHelper::CreateForWebState(web_state.get());
browser->GetWebStateList()->InsertWebState(
/*index=*/0, std::move(web_state),
WebStateList::InsertionFlags::INSERT_NO_FLAGS, WebStateOpener());
InsertWebState(browser_.get());
EXPECT_EQ(1ul, breadcrumb_service_->GetEvents(0).size());
}
......@@ -75,21 +95,10 @@ TEST_F(BreadcrumbManagerBrowserAgentTest, LogEvent) {
TEST_F(BreadcrumbManagerBrowserAgentTest, MultipleBrowsers) {
ASSERT_EQ(0ul, breadcrumb_service_->GetEvents(0).size());
// Create and setup Browser.
WebStateList web_state_list(&web_state_list_delegate_);
std::unique_ptr<Browser> browser =
std::make_unique<TestBrowser>(browser_state_.get(), &web_state_list);
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser.get());
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser_.get());
// Insert WebState into |browser|.
web::WebState::CreateParams createParams(browser_state_.get());
std::unique_ptr<web::WebState> web_state =
web::WebState::Create(createParams);
InfoBarManagerImpl::CreateForWebState(web_state.get());
BreadcrumbManagerTabHelper::CreateForWebState(web_state.get());
browser->GetWebStateList()->InsertWebState(
/*index=*/0, std::move(web_state),
WebStateList::InsertionFlags::INSERT_NO_FLAGS, WebStateOpener());
InsertWebState(browser_.get());
// Create and setup second Browser.
WebStateList web_state_list2(&web_state_list_delegate_);
......@@ -98,13 +107,7 @@ TEST_F(BreadcrumbManagerBrowserAgentTest, MultipleBrowsers) {
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser2.get());
// Insert WebState into |browser2|.
std::unique_ptr<web::WebState> web_state2 =
web::WebState::Create(createParams);
InfoBarManagerImpl::CreateForWebState(web_state2.get());
BreadcrumbManagerTabHelper::CreateForWebState(web_state2.get());
browser2->GetWebStateList()->InsertWebState(
/*index=*/0, std::move(web_state2),
WebStateList::InsertionFlags::INSERT_NO_FLAGS, WebStateOpener());
InsertWebState(browser2.get());
std::list<std::string> events = breadcrumb_service_->GetEvents(0);
EXPECT_EQ(2ul, events.size());
......@@ -131,20 +134,12 @@ TEST_F(BreadcrumbManagerBrowserAgentTest, MultipleBrowsers) {
// Tests WebStateList's batch insertion and closing.
TEST_F(BreadcrumbManagerBrowserAgentTest, BatchOperations) {
WebStateList web_state_list(&web_state_list_delegate_);
std::unique_ptr<Browser> browser =
std::make_unique<TestBrowser>(browser_state_.get(), &web_state_list);
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser.get());
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser_.get());
// Insert multiple WebStates.
web_state_list.PerformBatchOperation(base::BindOnce(^(WebStateList* list) {
web::WebState::CreateParams create_params(browser_state_.get());
list->InsertWebState(
/*index=*/0, web::WebState::Create(create_params),
WebStateList::InsertionFlags::INSERT_NO_FLAGS, WebStateOpener());
list->InsertWebState(
/*index=*/1, web::WebState::Create(create_params),
WebStateList::InsertionFlags::INSERT_NO_FLAGS, WebStateOpener());
web_state_list_.PerformBatchOperation(base::BindOnce(^(WebStateList* list) {
InsertWebState(browser_.get());
InsertWebState(browser_.get());
}));
std::list<std::string> events = breadcrumb_service_->GetEvents(0);
......@@ -153,7 +148,7 @@ TEST_F(BreadcrumbManagerBrowserAgentTest, BatchOperations) {
<< events.front();
// Close multiple WebStates.
web_state_list.PerformBatchOperation(base::BindOnce(^(WebStateList* list) {
web_state_list_.PerformBatchOperation(base::BindOnce(^(WebStateList* list) {
list->CloseWebStateAt(
/*index=*/0, WebStateList::ClosingFlags::CLOSE_NO_FLAGS);
list->CloseWebStateAt(
......@@ -165,3 +160,164 @@ TEST_F(BreadcrumbManagerBrowserAgentTest, BatchOperations) {
EXPECT_NE(std::string::npos, events.back().find("Closed 2 tabs"))
<< events.back();
}
// Tests logging kBreadcrumbOverlayJsAlert.
TEST_F(BreadcrumbManagerBrowserAgentTest, JavaScriptAlertOverlay) {
InsertWebState(browser_.get());
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser_.get());
OverlayRequestQueue* queue = OverlayRequestQueue::FromWebState(
web_state_list_.GetWebStateAt(0), OverlayModality::kWebContentArea);
queue->AddRequest(OverlayRequest::CreateWithConfig<
java_script_dialog_overlays::JavaScriptDialogRequest>(
web::JAVASCRIPT_DIALOG_TYPE_ALERT, web_state_list_.GetWebStateAt(0),
GURL::EmptyGURL(),
/*is_main_frame=*/true, @"message",
/*default_text_field_value=*/nil));
queue->CancelAllRequests();
std::list<std::string> events = breadcrumb_service_->GetEvents(0);
ASSERT_EQ(1ul, events.size());
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlay))
<< events.back();
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlayJsAlert))
<< events.back();
}
// Tests logging kBreadcrumbOverlayJsConfirm.
TEST_F(BreadcrumbManagerBrowserAgentTest, JavaScriptConfirmOverlay) {
InsertWebState(browser_.get());
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser_.get());
OverlayRequestQueue* queue = OverlayRequestQueue::FromWebState(
web_state_list_.GetWebStateAt(0), OverlayModality::kWebContentArea);
queue->AddRequest(OverlayRequest::CreateWithConfig<
java_script_dialog_overlays::JavaScriptDialogRequest>(
web::JAVASCRIPT_DIALOG_TYPE_CONFIRM, web_state_list_.GetWebStateAt(0),
GURL::EmptyGURL(),
/*is_main_frame=*/true, @"message",
/*default_text_field_value=*/nil));
queue->CancelAllRequests();
std::list<std::string> events = breadcrumb_service_->GetEvents(0);
ASSERT_EQ(1ul, events.size());
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlay))
<< events.back();
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlayJsConfirm))
<< events.back();
}
// Tests logging kBreadcrumbOverlayJsPrompt.
TEST_F(BreadcrumbManagerBrowserAgentTest, JavaScriptPromptOverlay) {
InsertWebState(browser_.get());
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser_.get());
OverlayRequestQueue* queue = OverlayRequestQueue::FromWebState(
web_state_list_.GetWebStateAt(0), OverlayModality::kWebContentArea);
queue->AddRequest(OverlayRequest::CreateWithConfig<
java_script_dialog_overlays::JavaScriptDialogRequest>(
web::JAVASCRIPT_DIALOG_TYPE_PROMPT, web_state_list_.GetWebStateAt(0),
GURL::EmptyGURL(),
/*is_main_frame=*/true, @"message",
/*default_text_field_value=*/nil));
queue->CancelAllRequests();
std::list<std::string> events = breadcrumb_service_->GetEvents(0);
ASSERT_EQ(1ul, events.size());
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlay))
<< events.back();
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlayJsPrompt))
<< events.back();
}
// Tests logging kBreadcrumbOverlayHttpAuth.
TEST_F(BreadcrumbManagerBrowserAgentTest, HttpAuthOverlay) {
InsertWebState(browser_.get());
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser_.get());
OverlayRequestQueue* queue = OverlayRequestQueue::FromWebState(
web_state_list_.GetWebStateAt(0), OverlayModality::kWebContentArea);
queue->AddRequest(
OverlayRequest::CreateWithConfig<HTTPAuthOverlayRequestConfig>(
GURL::EmptyGURL(), "message", "default text"));
queue->CancelAllRequests();
std::list<std::string> events = breadcrumb_service_->GetEvents(0);
ASSERT_EQ(1ul, events.size());
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlay))
<< events.back();
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlayHttpAuth))
<< events.back();
}
// Tests logging kBreadcrumbOverlayAppLaunch.
TEST_F(BreadcrumbManagerBrowserAgentTest, AppLaunchOverlay) {
InsertWebState(browser_.get());
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser_.get());
OverlayRequestQueue* queue = OverlayRequestQueue::FromWebState(
web_state_list_.GetWebStateAt(0), OverlayModality::kWebContentArea);
queue->AddRequest(OverlayRequest::CreateWithConfig<
app_launcher_overlays::AppLaunchConfirmationRequest>(
/*is_repeated_request=*/false));
queue->CancelAllRequests();
std::list<std::string> events = breadcrumb_service_->GetEvents(0);
ASSERT_EQ(1ul, events.size());
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlay))
<< events.back();
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlayAppLaunch))
<< events.back();
}
// Tests logging kBreadcrumbOverlayAlert with initial and repeated presentation.
TEST_F(BreadcrumbManagerBrowserAgentTest, AlertOverlay) {
InsertWebState(browser_.get());
BreadcrumbManagerBrowserAgent::CreateForBrowser(browser_.get());
OverlayRequestQueue* queue = OverlayRequestQueue::FromWebState(
web_state_list_.GetWebStateAt(0), OverlayModality::kWebContentArea);
// ConfirmDownloadReplacingRequest logged as generic alert.
queue->AddRequest(
OverlayRequest::CreateWithConfig<ConfirmDownloadReplacingRequest>());
std::list<std::string> events = breadcrumb_service_->GetEvents(0);
ASSERT_EQ(1ul, events.size());
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlay))
<< events.back();
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbOverlayAlert))
<< events.back();
EXPECT_EQ(std::string::npos, events.back().find(kBreadcrumbOverlayActivated))
<< events.back();
// Switching tabs should log new overlay presentations.
InsertWebState(browser_.get());
events = breadcrumb_service_->GetEvents(0);
ASSERT_EQ(2ul, events.size());
EXPECT_NE(std::string::npos, events.back().find("Insert active Tab"))
<< events.back();
web_state_list_.ActivateWebStateAt(0);
events = breadcrumb_service_->GetEvents(0);
ASSERT_EQ(4ul, events.size());
auto activation = std::next(events.begin(), 2);
EXPECT_NE(std::string::npos, activation->find(kBreadcrumbOverlay))
<< *activation;
EXPECT_NE(std::string::npos, activation->find(kBreadcrumbOverlayAlert))
<< *activation;
EXPECT_NE(std::string::npos, activation->find(kBreadcrumbOverlayActivated))
<< *activation;
queue->CancelAllRequests();
}
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