Chromium Code Reviews| 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(); |