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

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

Issue 1968593002: PrerenderingLoader initial integration with PrerenderManager/PrerenderHandle (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changes per pasko feedback 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..d57c2c282cc5b225ee5a142a1b5e4cd7ecff91af 100644
--- a/chrome/browser/android/offline_pages/prerendering_loader.h
+++ b/chrome/browser/android/offline_pages/prerendering_loader.h
@@ -5,7 +5,12 @@
#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 "chrome/browser/prerender/prerender_handle.h"
+#include "chrome/browser/prerender/prerender_manager.h"
#include "components/offline_pages/background/offliner.h"
class GURL;
@@ -23,29 +28,80 @@ 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.
+class PrerenderingLoader : public prerender::PrerenderHandle::Observer {
gabadie 2016/05/13 07:55:38 I think the inheritance can be private here.
dougarnett 2016/05/13 16:49:46 Done, thanks
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 is still in progress it must be stopped before a new
// request will be accepted.
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 called).
// 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.
+ bool CanPrerender();
+
+ // Returns whether the loader is idle and able to accept new LoadPage
+ // request.
+ bool IsIdle();
+
+ // Overrides the prerender stack adapter for unit testing.
+ void SetAdapterForTesting(PrerenderAdapter* prerender_adapter);
+
+ // PrerenderHandle::Observer overrides:
+ void OnPrerenderStart(prerender::PrerenderHandle* handle) override;
+ void OnPrerenderStopLoading(prerender::PrerenderHandle* handle) override;
+ void OnPrerenderDomContentLoaded(prerender::PrerenderHandle* handle) override;
+ void OnPrerenderStop(prerender::PrerenderHandle* handle) override;
gabadie 2016/05/13 07:55:38 I think PrerenderHandle should not be exposed to t
dougarnett 2016/05/13 16:49:46 Done.
dougarnett 2016/05/13 23:48:48 Actually, doesn't work to make private with using
dougarnett 2016/05/16 23:51:39 Done - achieved hiding these methods with composit
+
+ private:
+ // Returns the session storage namespace to use for the
+ // prerendering request obtained from [session_contents|.
+ content::SessionStorageNamespace* GetSessionStorageNamespace(
+ content::WebContents* session_contents);
+
+ // Returns the window size to render from |session_contents|.
+ const gfx::Size GetSize(content::WebContents* session_contents);
+
+ // Reports the load result to the LoadPageCallback.
+ void ReportLoaded();
+
+ // Reports a load failure to the LoadPageCallback.
+ void ReportLoadFailed();
+
+ // Cancels any current prerender and moves loader to idle state.
+ void CancelPrerender();
+
+ // State of the loader (only one request may be active at a time).
+ enum class State {
+ IDLE, // No active request.
+ PENDING, // Request pending the start of prerendering.
+ LOADING, // Loading in progress.
+ LOADED, // Loaded and now waiting for requestor to StopLoading().
+ };
+ State state_;
+
+ content::BrowserContext* browser_context_; // Not owned.
+ std::unique_ptr<PrerenderAdapter> adapter_;
+ std::unique_ptr<content::WebContents> session_contents_;
+ LoadPageCallback callback_;
};
} // namespace offline_pages

Powered by Google App Engine
This is Rietveld 408576698