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") { ...@@ -23,6 +23,8 @@ source_set("breadcrumbs") {
"//ios/chrome/browser/browser_state", "//ios/chrome/browser/browser_state",
"//ios/chrome/browser/infobars", "//ios/chrome/browser/infobars",
"//ios/chrome/browser/main:public", "//ios/chrome/browser/main:public",
"//ios/chrome/browser/overlays",
"//ios/chrome/browser/overlays/public/web_content_area",
"//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list",
"//ios/net", "//ios/net",
"//ios/web/public", "//ios/web/public",
...@@ -81,9 +83,13 @@ source_set("unit_tests") { ...@@ -81,9 +83,13 @@ source_set("unit_tests") {
"//base/test:test_support", "//base/test:test_support",
"//ios/chrome/browser:chrome_url_constants", "//ios/chrome/browser:chrome_url_constants",
"//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/download",
"//ios/chrome/browser/infobars", "//ios/chrome/browser/infobars",
"//ios/chrome/browser/infobars/test", "//ios/chrome/browser/infobars/test",
"//ios/chrome/browser/main:test_support", "//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/commands",
"//ios/chrome/browser/ui/infobars/test", "//ios/chrome/browser/ui/infobars/test",
"//ios/chrome/browser/web:test_support", "//ios/chrome/browser/web:test_support",
......
...@@ -7,16 +7,45 @@ ...@@ -7,16 +7,45 @@
#include <string> #include <string>
#include "base/scoped_observer.h"
#include "ios/chrome/browser/main/browser_observer.h" #include "ios/chrome/browser/main/browser_observer.h"
#include "ios/chrome/browser/main/browser_user_data.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" #include "ios/chrome/browser/web_state_list/web_state_list_observer.h"
class Browser; class Browser;
class WebStateList; 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 // Logs activity for the associated Browser's underlying WebStateList based on
// callbacks from WebStateListObserver. Event logs are sent to the // callbacks from various observers. Event logs are sent to the BrowserState's
// BrowserState's BreadcrumbManagerKeyedService. // BreadcrumbManagerKeyedService.
// For example: // For example:
// Browser1 Insert active WebState2 at 0 // Browser1 Insert active WebState2 at 0
// which indicates that a WebState with identifier 2 (from // which indicates that a WebState with identifier 2 (from
...@@ -24,6 +53,7 @@ class WebStateList; ...@@ -24,6 +53,7 @@ class WebStateList;
// (from BreadcrumbManagerBrowserAgent) // (from BreadcrumbManagerBrowserAgent)
class BreadcrumbManagerBrowserAgent class BreadcrumbManagerBrowserAgent
: BrowserObserver, : BrowserObserver,
public OverlayPresenterObserver,
public BrowserUserData<BreadcrumbManagerBrowserAgent>, public BrowserUserData<BreadcrumbManagerBrowserAgent>,
WebStateListObserver { WebStateListObserver {
public: public:
...@@ -78,6 +108,12 @@ class BreadcrumbManagerBrowserAgent ...@@ -78,6 +108,12 @@ class BreadcrumbManagerBrowserAgent
void WillBeginBatchOperation(WebStateList* web_state_list) override; void WillBeginBatchOperation(WebStateList* web_state_list) override;
void BatchOperationEnded(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 // Unique (across this application run only) identifier for logs associated
// with |browser_| instance. Used to differentiate logs associated with the // with |browser_| instance. Used to differentiate logs associated with the
// same underlying BrowserState. // same underlying BrowserState.
...@@ -98,6 +134,9 @@ class BreadcrumbManagerBrowserAgent ...@@ -98,6 +134,9 @@ class BreadcrumbManagerBrowserAgent
int close_count = 0; int close_count = 0;
}; };
std::unique_ptr<BatchOperation> batch_operation_; 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_ #endif // IOS_CHROME_BROWSER_CRASH_REPORT_BREADCRUMBS_BREADCRUMB_MANAGER_BROWSER_AGENT_H_
...@@ -12,21 +12,39 @@ ...@@ -12,21 +12,39 @@
#include "ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_keyed_service_factory.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/crash_report/breadcrumbs/breadcrumb_manager_tab_helper.h"
#import "ios/chrome/browser/main/browser.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" #include "ios/chrome/browser/web_state_list/web_state_list.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #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) BROWSER_USER_DATA_KEY_IMPL(BreadcrumbManagerBrowserAgent)
BreadcrumbManagerBrowserAgent::BreadcrumbManagerBrowserAgent(Browser* browser) BreadcrumbManagerBrowserAgent::BreadcrumbManagerBrowserAgent(Browser* browser)
: browser_(browser) { : browser_(browser), overlay_observer_(this) {
static int next_unique_id = 1; static int next_unique_id = 1;
unique_id_ = next_unique_id++; unique_id_ = next_unique_id++;
browser_->AddObserver(this); browser_->AddObserver(this);
browser_->GetWebStateList()->AddObserver(this); browser_->GetWebStateList()->AddObserver(this);
overlay_observer_.Add(
OverlayPresenter::FromBrowser(browser, OverlayModality::kWebContentArea));
} }
BreadcrumbManagerBrowserAgent::~BreadcrumbManagerBrowserAgent() = default; BreadcrumbManagerBrowserAgent::~BreadcrumbManagerBrowserAgent() = default;
...@@ -152,3 +170,42 @@ void BreadcrumbManagerBrowserAgent::BatchOperationEnded( ...@@ -152,3 +170,42 @@ void BreadcrumbManagerBrowserAgent::BatchOperationEnded(
} }
batch_operation_.reset(); 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);
}
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