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

Unified Diff: chrome/browser/banners/app_banner_manager.cc

Issue 2942513002: Allow banners to trigger on sites which don't register a service worker onload. (Closed)
Patch Set: Don't cache NO_MATCHING_SERVICE_WORKER Created 3 years, 6 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
« no previous file with comments | « chrome/browser/banners/app_banner_manager.h ('k') | chrome/browser/installable/installable_logging.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/banners/app_banner_manager.cc
diff --git a/chrome/browser/banners/app_banner_manager.cc b/chrome/browser/banners/app_banner_manager.cc
index 9524f7eff2093ecb1489a53631f279852a4d1392..d60e013bc216402d065ec97ab526b5f66640a69c 100644
--- a/chrome/browser/banners/app_banner_manager.cc
+++ b/chrome/browser/banners/app_banner_manager.cc
@@ -78,7 +78,7 @@ void AppBannerManager::RequestAppBanner(const GURL& validated_url,
}
UpdateState(State::ACTIVE);
- is_debug_mode_ = is_debug_mode;
+ triggered_by_devtools_ = is_debug_mode;
page_requested_prompt_ = false;
// We only need to call ReportStatus if we aren't in debug mode (this avoids
@@ -110,6 +110,7 @@ void AppBannerManager::RequestAppBanner(const GURL& validated_url,
if (binding_.is_bound())
binding_.Close();
+ UpdateState(State::PENDING_MANIFEST);
manager_->GetData(
ParamsToGetManifest(),
base::Bind(&AppBannerManager::OnDidGetManifest, GetWeakPtr()));
@@ -154,7 +155,7 @@ AppBannerManager::AppBannerManager(content::WebContents* web_contents)
has_sufficient_engagement_(false),
load_finished_(false),
page_requested_prompt_(false),
- is_debug_mode_(false),
+ triggered_by_devtools_(false),
need_to_log_status_(false),
weak_factory_(this) {
// Ensure the InstallableManager exists since we have a hard dependency on it.
@@ -193,7 +194,7 @@ int AppBannerManager::GetMinimumPrimaryIconSizeInPx() {
}
bool AppBannerManager::IsDebugMode() const {
- return is_debug_mode_ ||
+ return triggered_by_devtools_ ||
base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kBypassAppBannerEngagementChecks);
}
@@ -206,6 +207,7 @@ bool AppBannerManager::IsWebAppInstalled(
}
void AppBannerManager::OnDidGetManifest(const InstallableData& data) {
+ UpdateState(State::ACTIVE);
if (data.error_code != NO_ERROR_DETECTED) {
ReportStatus(web_contents(), data.error_code);
Stop();
@@ -237,6 +239,9 @@ InstallableParams AppBannerManager::ParamsToPerformInstallableCheck() {
params.check_installable = true;
params.fetch_valid_primary_icon = true;
+ // Don't wait for the service worker if this was triggered from devtools.
+ params.wait_for_worker = !triggered_by_devtools_;
+
return params;
}
@@ -245,6 +250,7 @@ void AppBannerManager::PerformInstallableCheck() {
return;
// Fetch and verify the other required information.
+ UpdateState(State::PENDING_INSTALLABLE_CHECK);
manager_->GetData(ParamsToPerformInstallableCheck(),
base::Bind(&AppBannerManager::OnDidPerformInstallableCheck,
GetWeakPtr()));
@@ -252,6 +258,7 @@ void AppBannerManager::PerformInstallableCheck() {
void AppBannerManager::OnDidPerformInstallableCheck(
const InstallableData& data) {
+ UpdateState(State::ACTIVE);
if (data.is_installable)
TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_REQUESTED);
@@ -319,21 +326,41 @@ void AppBannerManager::ResetCurrentPageData() {
}
void AppBannerManager::Stop() {
- if (state_ == State::PENDING_EVENT && !page_requested_prompt_) {
- TrackBeforeInstallEvent(
- BEFORE_INSTALL_EVENT_PROMPT_NOT_CALLED_AFTER_PREVENT_DEFAULT);
- ReportStatus(web_contents(), RENDERER_CANCELLED);
- } else if (state_ == State::PENDING_ENGAGEMENT &&
- !has_sufficient_engagement_) {
- TrackDisplayEvent(DISPLAY_EVENT_NOT_VISITED_ENOUGH);
- ReportStatus(web_contents(), INSUFFICIENT_ENGAGEMENT);
+ // Record the status if we are currently waiting for data.
+ InstallableStatusCode code = NO_ERROR_DETECTED;
+ switch (state_) {
+ case State::PENDING_EVENT:
+ if (!page_requested_prompt_) {
+ TrackBeforeInstallEvent(
+ BEFORE_INSTALL_EVENT_PROMPT_NOT_CALLED_AFTER_PREVENT_DEFAULT);
+ code = RENDERER_CANCELLED;
+ }
+ break;
+ case State::PENDING_ENGAGEMENT:
+ if (!has_sufficient_engagement_) {
+ TrackDisplayEvent(DISPLAY_EVENT_NOT_VISITED_ENOUGH);
+ code = INSUFFICIENT_ENGAGEMENT;
+ }
+ break;
+ case State::PENDING_MANIFEST:
+ code = WAITING_FOR_MANIFEST;
+ break;
+ case State::PENDING_INSTALLABLE_CHECK:
+ code = WAITING_FOR_INSTALLABLE_CHECK;
+ break;
+ case State::ACTIVE:
+ case State::INACTIVE:
+ case State::COMPLETE:
+ break;
}
+ if (code != NO_ERROR_DETECTED)
+ ReportStatus(web_contents(), code);
+
// In every non-debug run through the banner pipeline, we should have called
// ReportStatus() and set need_to_log_status_ to false. The only case where
- // we don't is if we're still active and waiting for a callback from the
- // InstallableManager (e.g. the renderer crashes or the browser is shutting
- // down). These situations are explicitly not logged.
+ // we don't is if we're still active and waiting for native app data, which is
+ // explicitly not logged.
DCHECK(!need_to_log_status_ || is_active());
weak_factory_.InvalidateWeakPtrs();
« no previous file with comments | « chrome/browser/banners/app_banner_manager.h ('k') | chrome/browser/installable/installable_logging.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698