| Index: chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a0b751553e38a4e22ce2639a2539a909f8fbdf56
|
| --- /dev/null
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
|
| @@ -0,0 +1,158 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.chrome.browser;
|
| +
|
| +import android.content.Context;
|
| +import android.view.ContextThemeWrapper;
|
| +import android.view.LayoutInflater;
|
| +import android.view.View;
|
| +import android.view.ViewGroup;
|
| +import android.widget.FrameLayout;
|
| +
|
| +import org.chromium.base.ThreadUtils;
|
| +import org.chromium.chrome.browser.prerender.ExternalPrerenderHandler;
|
| +import org.chromium.chrome.browser.profiles.Profile;
|
| +import org.chromium.content_public.browser.WebContents;
|
| +
|
| +/**
|
| + * This class is a singleton that holds utilities for warming up Chrome and prerendering urls
|
| + * without creating the Activity.
|
| + */
|
| +public final class WarmupManager {
|
| + private static WarmupManager sWarmupManager;
|
| +
|
| + private WebContents mPrerenderedWebContents;
|
| + private boolean mPrerendered;
|
| + private ViewGroup mMainView;
|
| + private ExternalPrerenderHandler mExternalPrerenderHandler;
|
| +
|
| + /**
|
| + * @return The singleton instance for the WarmupManager, creating one if necessary.
|
| + */
|
| + public static WarmupManager getInstance() {
|
| + ThreadUtils.assertOnUiThread();
|
| + if (sWarmupManager == null) sWarmupManager = new WarmupManager();
|
| + return sWarmupManager;
|
| + }
|
| +
|
| + private WarmupManager() {
|
| + }
|
| +
|
| + /**
|
| + * Check whether prerender manager has the given url prerendered. This also works with
|
| + * redirected urls.
|
| + *
|
| + * Uses the last used profile.
|
| + *
|
| + * @param url The url to check.
|
| + * @return Whether the given url has been prerendered.
|
| + */
|
| + public boolean hasPrerenderedUrl(String url) {
|
| + return hasAnyPrerenderedUrl() && ExternalPrerenderHandler.hasPrerenderedUrl(
|
| + Profile.getLastUsedProfile(), url, mPrerenderedWebContents);
|
| + }
|
| +
|
| + /**
|
| + * @return Whether any url has been prerendered.
|
| + */
|
| + public boolean hasAnyPrerenderedUrl() {
|
| + return mPrerendered;
|
| + }
|
| +
|
| + /**
|
| + * @return The prerendered {@link WebContents} clearing out the reference WarmupManager owns.
|
| + */
|
| + public WebContents takePrerenderedWebContents() {
|
| + WebContents prerenderedWebContents = mPrerenderedWebContents;
|
| + assert (mPrerenderedWebContents != null);
|
| + mPrerenderedWebContents = null;
|
| + return prerenderedWebContents;
|
| + }
|
| +
|
| + /**
|
| + * Prerenders the given url using the prerender_manager.
|
| + *
|
| + * Uses the last used profile.
|
| + *
|
| + * @param url The url to prerender.
|
| + * @param referrer The referrer url to be used while prerendering
|
| + * @param widthPix The width in pixels to which the page should be prerendered.
|
| + * @param heightPix The height in pixels to which the page should be prerendered.
|
| + */
|
| + public void prerenderUrl(final String url, final String referrer,
|
| + final int widthPix, final int heightPix) {
|
| + clearWebContentsIfNecessary();
|
| + if (mExternalPrerenderHandler == null) {
|
| + mExternalPrerenderHandler = new ExternalPrerenderHandler();
|
| + }
|
| +
|
| + mPrerenderedWebContents = mExternalPrerenderHandler.addPrerender(
|
| + Profile.getLastUsedProfile(), url, referrer, widthPix, heightPix);
|
| + if (mPrerenderedWebContents != null) mPrerendered = true;
|
| + }
|
| +
|
| + /**
|
| + * Inflates and constructs the view hierarchy that the app will use.
|
| + * @param baseContext The base context to use for creating the ContextWrapper.
|
| + * @param themeId Id of the main theme to use in the inflated views.
|
| + * @param layoutId Id of the layout to inflate.
|
| + */
|
| + public void initializeViewHierarchy(Context baseContext, int themeId, int layoutId) {
|
| + ContextThemeWrapper context = new ContextThemeWrapper(baseContext, themeId);
|
| + FrameLayout contentHolder = new FrameLayout(context);
|
| + mMainView = (ViewGroup) LayoutInflater.from(context).inflate(layoutId, contentHolder);
|
| + }
|
| +
|
| + /**
|
| + * Transfers all the children in the view hierarchy to the giving ViewGroup as child.
|
| + * @param contentView The parent ViewGroup to use for the transfer.
|
| + */
|
| + public void transferViewHierarchyTo(ViewGroup contentView) {
|
| + ViewGroup viewHierarchy = takeMainView();
|
| + if (viewHierarchy == null) return;
|
| + while (viewHierarchy.getChildCount() > 0) {
|
| + View currentChild = viewHierarchy.getChildAt(0);
|
| + viewHierarchy.removeView(currentChild);
|
| + contentView.addView(currentChild);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Destroys the native WebContents instance the WarmupManager currently holds onto.
|
| + */
|
| + public void clearWebContentsIfNecessary() {
|
| + mPrerendered = false;
|
| + if (mPrerenderedWebContents == null) return;
|
| +
|
| + mPrerenderedWebContents.destroy();
|
| + mPrerenderedWebContents = null;
|
| + }
|
| +
|
| + /**
|
| + * Cancel the current prerender.
|
| + */
|
| + public void cancelCurrentPrerender() {
|
| + clearWebContentsIfNecessary();
|
| + if (mExternalPrerenderHandler == null) return;
|
| +
|
| + mExternalPrerenderHandler.cancelCurrentPrerender();
|
| + }
|
| +
|
| + /**
|
| + * @return Whether the view hierarchy has been prebuilt.
|
| + */
|
| + public boolean hasBuiltViewHierarchy() {
|
| + return mMainView != null;
|
| + }
|
| +
|
| + /**
|
| + * @return The prebuilt view hierarchy and clears the reference WarmupManager owns.
|
| + */
|
| + private ViewGroup takeMainView() {
|
| + ViewGroup mainView = mMainView;
|
| + mMainView = null;
|
| + return mainView;
|
| + }
|
| +}
|
|
|