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

Unified Diff: chrome/browser/android/offline_pages/prerendering_loader.h

Issue 2015603002: PrerenderingLoader initial integration with PrerenderManager/PrerenderHandle and make it unit-testa… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Adds mock adapter member initialization in constructor Created 4 years, 7 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/android/offline_pages/prerendering_loader.h
diff --git a/chrome/browser/android/offline_pages/prerendering_loader.h b/chrome/browser/android/offline_pages/prerendering_loader.h
index f4af6a2b7a2e0b37892acaf3ec965e59df8f1a2e..22659e96a3609d311ef21505beda494329244112 100644
--- a/chrome/browser/android/offline_pages/prerendering_loader.h
+++ b/chrome/browser/android/offline_pages/prerendering_loader.h
@@ -5,7 +5,10 @@
#ifndef CHROME_BROWSER_ANDROID_OFFLINE_PAGES_PRERENDERING_LOADER_H_
#define CHROME_BROWSER_ANDROID_OFFLINE_PAGES_PRERENDERING_LOADER_H_
+#include <memory>
+
#include "base/callback.h"
+#include "chrome/browser/android/offline_pages/prerender_adapter.h"
#include "components/offline_pages/background/offliner.h"
class GURL;
@@ -23,29 +26,99 @@ class Size;
namespace offline_pages {
// A client-side page loader that integrates with the PrerenderManager to do
-// the page loading in the background.
-class PrerenderingLoader {
+// the page loading in the background. It operates on a single thread and
+// needs to run on BrowserThread::UI to work with the PrerenderManager.
+// It supports a single load request at a time.
+class PrerenderingLoader : public PrerenderAdapter::Observer {
public:
// Reports status of a load page request with loaded contents if available.
- typedef base::Callback<void(Offliner::CompletionStatus,
- content::WebContents*)>
+ typedef base::Callback<void(Offliner::RequestStatus, content::WebContents*)>
LoadPageCallback;
explicit PrerenderingLoader(content::BrowserContext* browser_context);
- virtual ~PrerenderingLoader();
+ ~PrerenderingLoader() override;
// Loads a page in the background if possible and returns whether the
// request was accepted. If so, the LoadPageCallback will be informed
// of status. Only one load request may exist as a time. If a previous
- // request is still in progress it must be canceled before a new
- // request will be accepted.
+ // request is still in progress it must be stopped before a new
+ // request will be accepted. The callback may be called more than
+ // once - first for a successful load and then if canceled after the
+ // load (which may be from resources being reclaimed) at which point
+ // the retrieved WebContents should no longer be used.
virtual bool LoadPage(const GURL& url, const LoadPageCallback& callback);
// Stops (completes or cancels) the load request. Must be called when
- // LoadPageCallback is done with consuming the contents.
+ // LoadPageCallback is done with consuming the contents. May be called
+ // prior to LoadPageCallback in order to cancel the current request (in
+ // which case the callback will not be run).
// This loader should also be responsible for stopping offline
// prerenders when Chrome is transitioned to foreground.
virtual void StopLoading();
+
+ // Returns whether prerendering is possible for this device's configuration
+ // and the browser context.
+ virtual bool CanPrerender();
+
+ // Returns whether the loader is idle and able to accept new LoadPage
+ // request.
+ virtual bool IsIdle();
+
+ // Returns whether the loader has successfully loaded web contents.
+ // Note that |StopLoading()| should be used to clear this state once
+ // the loaded web contents are no longer needed.
+ virtual bool IsLoaded();
+
+ // Overrides the prerender stack adapter for unit testing.
+ void SetAdapterForTesting(
+ std::unique_ptr<PrerenderAdapter> prerender_adapter);
+
+ // PrerenderAdapter::Observer implementation:
+ void OnPrerenderStart() override;
+ void OnPrerenderStopLoading() override;
+ void OnPrerenderDomContentLoaded() override;
+ void OnPrerenderStop() override;
+
+ private:
+ // State of the loader (only one request may be active at a time).
+ enum class State {
+ IDLE, // No active load request.
+ PENDING, // Load request is pending the start of prerendering.
+ LOADING, // Loading in progress.
+ LOADED, // Loaded and now waiting for requestor to StopLoading().
+ };
+
+ // Handles some event/signal that the load request has succeeded or failed.
+ // It may be due to some asynchronous trigger that occurs after the request
+ // has completed for some other reason/event.
+ void HandleLoadEvent();
+
+ // Handles some event/signal that loading has stopped (whether due to a
+ // failure, cancel, or stop request). It may be due to some asynchronous
+ // trigger that occurs after the request has stopped for some other reason.
+ void HandleLoadingStopped();
+
+ // Cancels any current prerender and moves loader to idle state.
+ void CancelPrerender();
+
+ // Tracks loading state including whether the Loader is idle.
+ State state_;
+
+ // Not owned.
+ content::BrowserContext* browser_context_;
+
+ // Adapter for handling calls to the prerender stack.
+ std::unique_ptr<PrerenderAdapter> adapter_;
+
+ // A WebContents for the active load request that is used to hold the session
+ // storage namespace for rendering. This will NOT have the loaded page.
+ std::unique_ptr<content::WebContents> session_contents_;
+
+ // Callback to call when the active load request completes, fails, or is
+ // canceled.
+ LoadPageCallback callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(PrerenderingLoader);
};
} // namespace offline_pages
« no previous file with comments | « chrome/browser/android/offline_pages/prerender_adapter.cc ('k') | chrome/browser/android/offline_pages/prerendering_loader.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698