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

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

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
Index: chrome/browser/installable/installable_manager.h
diff --git a/chrome/browser/installable/installable_manager.h b/chrome/browser/installable/installable_manager.h
index 6f9204374150287a5b6ec8964a87d575f8b8d5e1..1a53d37bc7cb1580e30d07f5ac2a1acda24a3283 100644
--- a/chrome/browser/installable/installable_manager.h
+++ b/chrome/browser/installable/installable_manager.h
@@ -18,6 +18,7 @@
#include "chrome/browser/installable/installable_logging.h"
#include "chrome/browser/installable/installable_metrics.h"
#include "content/public/browser/service_worker_context.h"
+#include "content/public/browser/service_worker_context_observer.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
#include "content/public/common/manifest.h"
@@ -44,11 +45,6 @@ struct InstallableParams {
// |fetch_valid_badge_icon| is true.
int minimum_badge_icon_size_in_px = -1;
- // Check whether the site is installable. That is, it has a manifest valid for
- // a web app and a service worker controlling the manifest start URL and the
- // current URL.
- bool check_installable = false;
-
// Check whether there is a fetchable, non-empty icon in the manifest
// conforming to the primary icon size parameters.
bool fetch_valid_primary_icon = false;
@@ -56,6 +52,16 @@ struct InstallableParams {
// Check whether there is a fetchable, non-empty icon in the manifest
// conforming to the badge icon size parameters.
bool fetch_valid_badge_icon = false;
+
+ // Check whether the site is installable. That is, it has a manifest valid for
+ // a web app and a service worker controlling the manifest start URL and the
+ // current URL.
+ bool check_installable = false;
+
+ // Whether or not to wait indefinitely for a service worker. If this is set to
+ // false, the worker status will not be cached and will be re-checked if
+ // GetData() is called again for the current page.
+ bool wait_for_worker = true;
};
// This struct is passed to an InstallableCallback when the InstallableManager
@@ -104,7 +110,8 @@ using InstallableCallback = base::Callback<void(const InstallableData&)>;
// This class is responsible for fetching the resources required to check and
// install a site.
class InstallableManager
- : public content::WebContentsObserver,
+ : public content::ServiceWorkerContextObserver,
+ public content::WebContentsObserver,
public content::WebContentsUserData<InstallableManager> {
public:
explicit InstallableManager(content::WebContents* web_contents);
@@ -124,10 +131,14 @@ class InstallableManager
// when the data is ready; the synchronous execution ensures that the
// references |callback| receives in its InstallableData argument are valid.
//
+ // Clients must be prepared for |callback| to not ever be invoked. For
+ // instance, if installability checking is requested, this method will wait
+ // until the site registers a service worker (and hence not invoke |callback|
+ // at all if a service worker is never registered).
+ //
// Calls requesting data that is already fetched will return the cached data.
- // This method is marked virtual so clients may mock this object in tests.
- virtual void GetData(const InstallableParams& params,
- const InstallableCallback& callback);
+ void GetData(const InstallableParams& params,
+ const InstallableCallback& callback);
// Called via AppBannerManagerAndroid to record metrics on how often the
// installable check is completed when the menu or add to homescreen menu item
@@ -137,18 +148,27 @@ class InstallableManager
void RecordQueuedMetricsOnTaskCompletion(const InstallableParams& params,
bool check_passed);
+ protected:
+ // For mocking in tests.
+ virtual void OnWaitingForServiceWorker() {}
+
private:
friend class InstallableManagerBrowserTest;
friend class InstallableManagerUnitTest;
FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest,
ManagerBeginsInEmptyState);
FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest, CheckWebapp);
+ FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest,
+ CheckLazyServiceWorkerPassesWhenWaiting);
+ FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest,
+ CheckLazyServiceWorkerNoFetchHandlerFails);
using Task = std::pair<InstallableParams, InstallableCallback>;
using IconParams = std::tuple<int, int, content::Manifest::Icon::IconPurpose>;
struct ManifestProperty;
- struct InstallableProperty;
+ struct ValidManifestProperty;
+ struct ServiceWorkerProperty;
struct IconProperty;
// Returns an IconParams object that queries for a primary icon conforming to
@@ -171,8 +191,10 @@ class InstallableManager
// Gets/sets parts of particular properties. Exposed for testing.
InstallableStatusCode manifest_error() const;
- InstallableStatusCode installable_error() const;
- void set_installable_error(InstallableStatusCode error_code);
+ InstallableStatusCode valid_manifest_error() const;
+ void set_valid_manifest_error(InstallableStatusCode error_code);
+ InstallableStatusCode worker_error() const;
+ bool worker_waiting() const;
InstallableStatusCode icon_error(const IconParams& icon_params);
GURL& icon_url(const IconParams& icon_params);
const SkBitmap* icon(const IconParams& icon);
@@ -209,8 +231,12 @@ class InstallableManager
void OnDidCheckHasServiceWorker(content::ServiceWorkerCapability capability);
void CheckAndFetchBestIcon(const IconParams& params);
- void OnIconFetched(
- const GURL icon_url, const IconParams& params, const SkBitmap& bitmap);
+ void OnIconFetched(const GURL icon_url,
+ const IconParams& params,
+ const SkBitmap& bitmap);
+
+ // content::ServiceWorkerContextObserver overrides
+ void OnRegistrationStored(const GURL& pattern) override;
// content::WebContentsObserver overrides
void DidFinishNavigation(content::NavigationHandle* handle) override;
@@ -225,9 +251,14 @@ class InstallableManager
// Installable properties cached on this object.
std::unique_ptr<ManifestProperty> manifest_;
- std::unique_ptr<InstallableProperty> installable_;
+ std::unique_ptr<ValidManifestProperty> valid_manifest_;
+ std::unique_ptr<ServiceWorkerProperty> worker_;
std::map<IconParams, IconProperty> icons_;
+ // Owned by the storage partition attached to the content::WebContents which
+ // this object is scoped to.
+ content::ServiceWorkerContext* service_worker_context_;
+
// Whether or not the current page is a PWA. This is reset per navigation and
// is independent of the caching mechanism, i.e. if a PWA check is run
// multiple times for one page, this will be set on the first check.
« no previous file with comments | « chrome/browser/installable/installable_logging.cc ('k') | chrome/browser/installable/installable_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698