Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1569)

Unified Diff: chrome/browser/installable/installable_manager.cc

Issue 2778983005: Allow the app banner installability check to run on page load. (Closed)
Patch Set: Fix enum in test + minor improvements Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/installable/installable_manager.cc
diff --git a/chrome/browser/installable/installable_manager.cc b/chrome/browser/installable/installable_manager.cc
index b0bf4496513b77bdd42977cfe2e53435a498d2dc..d3758791ace9c7e285b0c65575050e0814fbdbff 100644
--- a/chrome/browser/installable/installable_manager.cc
+++ b/chrome/browser/installable/installable_manager.cc
@@ -61,6 +61,11 @@ bool DoesManifestContainRequiredIcon(const content::Manifest& manifest) {
return false;
}
+// Returns true if |params| specifies a full PWA check.
+bool IsParamsForPwaCheck(const InstallableParams& params) {
+ return params.check_installable && params.fetch_valid_primary_icon;
+}
+
} // namespace
DEFINE_WEB_CONTENTS_USER_DATA_KEY(InstallableManager);
@@ -94,13 +99,16 @@ struct InstallableManager::IconProperty {
DISALLOW_COPY_AND_ASSIGN(IconProperty);
};
-
InstallableManager::InstallableManager(content::WebContents* web_contents)
: content::WebContentsObserver(web_contents),
manifest_(new ManifestProperty()),
installable_(new InstallableProperty()),
+ page_status_(InstallableMetrics::NOT_STARTED),
+ menu_open_count_(0),
+ menu_item_count_(0),
is_active_(false),
- weak_factory_(this) { }
+ is_pwa_check_complete_(false),
+ weak_factory_(this) {}
InstallableManager::~InstallableManager() = default;
@@ -140,6 +148,49 @@ void InstallableManager::GetData(const InstallableParams& params,
StartNextTask();
}
+void InstallableManager::RecordMenuOpenHistogram() {
+ if (is_pwa_check_complete_)
+ InstallableMetrics::RecordMenuOpenHistogram(page_status_);
+ else
+ ++menu_open_count_;
+}
+
+void InstallableManager::RecordMenuItemAddToHomescreenHistogram() {
+ if (is_pwa_check_complete_)
+ InstallableMetrics::RecordMenuItemAddToHomescreenHistogram(page_status_);
+ else
+ ++menu_item_count_;
+}
+
+void InstallableManager::RecordQueuedMetricsOnTaskCompletion(
+ const InstallableParams& params,
+ bool check_passed) {
+ // Don't do anything if we've already finished the PWA check or if this check
+ // was not for the full PWA params. Once a full check is completed, metrics
+ // will be directly recorded in Record*Histogram since
+ // |is_pwa_check_complete_| will be true.
+ if (is_pwa_check_complete_ || !IsParamsForPwaCheck(params))
+ return;
+
+ is_pwa_check_complete_ = true;
+ page_status_ = check_passed ? InstallableMetrics::COMPLETE_PWA
+ : InstallableMetrics::COMPLETE_NON_PWA;
+
+ // Compute what the status would have been for any queued calls to
+ // Record*Histogram, and record appropriately.
+ InstallableMetrics::InstallabilityCheckStatus prev_status =
+ check_passed ? InstallableMetrics::IN_PROGRESS_PWA
+ : InstallableMetrics::IN_PROGRESS_NON_PWA;
+ for (; menu_open_count_ > 0; --menu_open_count_)
+ InstallableMetrics::RecordMenuOpenHistogram(prev_status);
+
+ for (; menu_item_count_ > 0; --menu_item_count_)
+ InstallableMetrics::RecordMenuItemAddToHomescreenHistogram(prev_status);
+
+ DCHECK_EQ(0, menu_open_count_);
+ DCHECK_EQ(0, menu_item_count_);
pkotwicz 2017/03/31 05:07:44 Personally, I would remove the DCHECKs. In my expe
benwells 2017/03/31 05:35:28 +1, these DCHECKS don't add much value.
dominickn 2017/04/03 00:06:46 Done.
+}
+
InstallableManager::IconParams InstallableManager::ParamsForPrimaryIcon(
const InstallableParams& params) const {
return std::make_tuple(params.ideal_primary_icon_size_in_px,
@@ -232,6 +283,25 @@ void InstallableManager::Reset() {
tasks_.clear();
icons_.clear();
+ // We may have reset prior to completion, in which case menu_open_count_ or
pkotwicz 2017/03/31 05:07:44 Nit: |menu_open_count_| and |menu_item_count_| wit
dominickn 2017/04/03 00:06:46 Done.
+ // menu_item_count_ will be nonzero. If we completed, then
+ // these values cannot be anything except 0.
+ page_status_ = InstallableMetrics::NOT_STARTED;
+ is_pwa_check_complete_ = false;
+
+ for (; menu_open_count_ > 0; --menu_open_count_) {
+ InstallableMetrics::RecordMenuOpenHistogram(
+ InstallableMetrics::STOPPED_BEFORE_COMPLETION);
+ }
+
+ for (; menu_item_count_ > 0; --menu_item_count_) {
+ InstallableMetrics::RecordMenuItemAddToHomescreenHistogram(
+ InstallableMetrics::STOPPED_BEFORE_COMPLETION);
+ }
+
+ DCHECK_EQ(0, menu_open_count_);
+ DCHECK_EQ(0, menu_item_count_);
+
manifest_.reset(new ManifestProperty());
installable_.reset(new InstallableProperty());
@@ -292,7 +362,9 @@ void InstallableManager::WorkOnTask() {
const InstallableParams& params = task.first;
InstallableStatusCode code = GetErrorCode(params);
- if (code != NO_ERROR_DETECTED || IsComplete(params)) {
+ bool check_passed = (code == NO_ERROR_DETECTED);
+ if (!check_passed || IsComplete(params)) {
+ RecordQueuedMetricsOnTaskCompletion(params, check_passed);
RunCallback(task, code);
tasks_.erase(tasks_.begin());
StartNextTask();

Powered by Google App Engine
This is Rietveld 408576698