OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.customtabs; | 5 package org.chromium.chrome.browser.customtabs; |
6 | 6 |
7 import android.app.ActivityManager; | 7 import android.app.ActivityManager; |
8 import android.app.Application; | 8 import android.app.Application; |
9 import android.content.ComponentName; | 9 import android.content.ComponentName; |
10 import android.content.Context; | 10 import android.content.Context; |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
82 | 82 |
83 private static AtomicReference<CustomTabsConnection> sInstance = | 83 private static AtomicReference<CustomTabsConnection> sInstance = |
84 new AtomicReference<CustomTabsConnection>(); | 84 new AtomicReference<CustomTabsConnection>(); |
85 | 85 |
86 private static final class PrerenderedUrlParams { | 86 private static final class PrerenderedUrlParams { |
87 public final IBinder mSession; | 87 public final IBinder mSession; |
88 public final WebContents mWebContents; | 88 public final WebContents mWebContents; |
89 public final String mUrl; | 89 public final String mUrl; |
90 public final String mReferrer; | 90 public final String mReferrer; |
91 public final Bundle mExtras; | 91 public final Bundle mExtras; |
92 public final Point mSize; | |
92 | 93 |
93 PrerenderedUrlParams(IBinder session, WebContents webContents, String ur l, String referrer, | 94 PrerenderedUrlParams(IBinder session, WebContents webContents, String ur l, String referrer, |
94 Bundle extras) { | 95 Point size, Bundle extras) { |
95 mSession = session; | 96 mSession = session; |
96 mWebContents = webContents; | 97 mWebContents = webContents; |
97 mUrl = url; | 98 mUrl = url; |
98 mReferrer = referrer; | 99 mReferrer = referrer; |
100 mSize = size; | |
99 mExtras = extras; | 101 mExtras = extras; |
100 } | 102 } |
101 } | 103 } |
102 | 104 |
103 private static final class PredictionStats { | 105 private static final class PredictionStats { |
104 private static final long MIN_DELAY = 100; | 106 private static final long MIN_DELAY = 100; |
105 private static final long MAX_DELAY = 10000; | 107 private static final long MAX_DELAY = 10000; |
106 private long mLastRequestTimestamp = -1; | 108 private long mLastRequestTimestamp = -1; |
107 private long mDelayMs = MIN_DELAY; | 109 private long mDelayMs = MIN_DELAY; |
108 | 110 |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
427 * hand, not cancelling the previous prerender leads to wasted resources, as | 429 * hand, not cancelling the previous prerender leads to wasted resources, as |
428 * a WebContents is lingering. This can be solved by requiring applications | 430 * a WebContents is lingering. This can be solved by requiring applications |
429 * to call mayLaunchUrl(null) to cancel a current prerender before 2, that | 431 * to call mayLaunchUrl(null) to cancel a current prerender before 2, that |
430 * is for a mispredict. | 432 * is for a mispredict. |
431 * | 433 * |
432 * @param session The Binder object identifying a session. | 434 * @param session The Binder object identifying a session. |
433 * @param url The URL the WebContents is for. | 435 * @param url The URL the WebContents is for. |
434 * @param referrer The referrer to use for |url|. | 436 * @param referrer The referrer to use for |url|. |
435 * @return The prerendered WebContents, or null. | 437 * @return The prerendered WebContents, or null. |
436 */ | 438 */ |
437 WebContents takePrerenderedUrl(IBinder session, String url, String referrer) { | 439 WebContents takePrerenderedUrl(IBinder session, String url, String referrer, Point size) { |
438 ThreadUtils.assertOnUiThread(); | 440 ThreadUtils.assertOnUiThread(); |
439 if (mPrerender == null || session == null || !session.equals(mPrerender. mSession)) { | 441 if (mPrerender == null || session == null || !session.equals(mPrerender. mSession)) { |
440 return null; | 442 return null; |
441 } | 443 } |
442 WebContents webContents = mPrerender.mWebContents; | 444 WebContents webContents = mPrerender.mWebContents; |
443 String prerenderedUrl = mPrerender.mUrl; | 445 String prerenderedUrl = mPrerender.mUrl; |
444 String prerenderReferrer = mPrerender.mReferrer; | 446 String prerenderReferrer = mPrerender.mReferrer; |
447 size.x = mPrerender.mSize.x; | |
448 size.y = mPrerender.mSize.y; | |
445 if (referrer == null) referrer = ""; | 449 if (referrer == null) referrer = ""; |
446 mPrerender = null; | 450 mPrerender = null; |
447 if (TextUtils.equals(prerenderedUrl, url) | 451 if (TextUtils.equals(prerenderedUrl, url) |
448 && TextUtils.equals(prerenderReferrer, referrer)) { | 452 && TextUtils.equals(prerenderReferrer, referrer)) { |
449 return webContents; | 453 return webContents; |
450 } | 454 } |
451 mExternalPrerenderHandler.cancelCurrentPrerender(); | 455 mExternalPrerenderHandler.cancelCurrentPrerender(); |
452 webContents.destroy(); | 456 webContents.destroy(); |
453 return null; | 457 return null; |
454 } | 458 } |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
666 mPrerender.mWebContents.destroy(); | 670 mPrerender.mWebContents.destroy(); |
667 mPrerender = null; | 671 mPrerender = null; |
668 } | 672 } |
669 if (TextUtils.isEmpty(url)) return; | 673 if (TextUtils.isEmpty(url)) return; |
670 Intent extrasIntent = new Intent(); | 674 Intent extrasIntent = new Intent(); |
671 if (extras != null) extrasIntent.putExtras(extras); | 675 if (extras != null) extrasIntent.putExtras(extras); |
672 if (IntentHandler.getExtraHeadersFromIntent(extrasIntent) != null) retur n; | 676 if (IntentHandler.getExtraHeadersFromIntent(extrasIntent) != null) retur n; |
673 if (mExternalPrerenderHandler == null) { | 677 if (mExternalPrerenderHandler == null) { |
674 mExternalPrerenderHandler = new ExternalPrerenderHandler(); | 678 mExternalPrerenderHandler = new ExternalPrerenderHandler(); |
675 } | 679 } |
676 Point contentSize = estimateContentSize(); | |
677 Context context = mApplication.getApplicationContext(); | 680 Context context = mApplication.getApplicationContext(); |
678 String referrer = IntentHandler.getReferrerUrlIncludingExtraHeaders(extr asIntent, context); | 681 String referrer = IntentHandler.getReferrerUrlIncludingExtraHeaders(extr asIntent, context); |
679 if (referrer == null && getReferrerForSession(session) != null) { | 682 if (referrer == null && getReferrerForSession(session) != null) { |
680 referrer = getReferrerForSession(session).getUrl(); | 683 referrer = getReferrerForSession(session).getUrl(); |
681 } | 684 } |
682 if (referrer == null) referrer = ""; | 685 if (referrer == null) referrer = ""; |
686 Point contentSize = estimateContentSize(true); | |
683 WebContents webContents = mExternalPrerenderHandler.addPrerender( | 687 WebContents webContents = mExternalPrerenderHandler.addPrerender( |
684 Profile.getLastUsedProfile(), url, referrer, contentSize.x, cont entSize.y); | 688 Profile.getLastUsedProfile(), url, referrer, contentSize.x, cont entSize.y); |
685 if (webContents != null) { | 689 if (webContents != null) { |
686 mPrerender = new PrerenderedUrlParams(session, webContents, url, ref errer, extras); | 690 mPrerender = new PrerenderedUrlParams( |
691 session, webContents, url, referrer, estimateContentSize(fal se), extras); | |
Ted C
2015/09/16 18:12:47
why is this false? Isn't this for prerendered con
| |
687 } | 692 } |
688 } | 693 } |
689 | 694 |
690 /** | 695 /** |
691 * Provides an estimate of the contents size. | 696 * Provides an estimate of the contents size. |
692 * | 697 * |
693 * The estimate is likely to be incorrect. This is not a problem, as the aim | 698 * The estimate is likely to be incorrect. This is not a problem, as the aim |
694 * is to avoid getting a different layout and resources than needed at | 699 * is to avoid getting a different layout and resources than needed at |
695 * render time. | 700 * render time. |
701 * @param forPrerenderedContents Whether the size returned should be for pre rendered web | |
702 * contents or for ContentViewCore. The former takes the web | |
703 * content size that doesn't include control c onatiner height | |
704 * in dp, the latter includes the control cont ainer height and | |
705 * is in pixels. | |
696 */ | 706 */ |
697 private Point estimateContentSize() { | 707 private Point estimateContentSize(boolean forPrerenderedContents) { |
698 // The size is estimated as: | 708 // The size is estimated as: |
699 // X = screenSizeX | 709 // X = screenSizeX |
700 // Y = screenSizeY - top bar - bottom bar - custom tabs bar | 710 // Y = screenSizeY - top bar - bottom bar - custom tabs bar |
701 Point screenSize = new Point(); | 711 Point screenSize = new Point(); |
702 WindowManager wm = (WindowManager) mApplication.getSystemService(Context .WINDOW_SERVICE); | 712 WindowManager wm = (WindowManager) mApplication.getSystemService(Context .WINDOW_SERVICE); |
703 wm.getDefaultDisplay().getSize(screenSize); | 713 wm.getDefaultDisplay().getSize(screenSize); |
704 Resources resources = mApplication.getResources(); | 714 Resources resources = mApplication.getResources(); |
705 int statusBarId = resources.getIdentifier("status_bar_height", "dimen", "android"); | 715 int statusBarId = resources.getIdentifier("status_bar_height", "dimen", "android"); |
706 int navigationBarId = resources.getIdentifier("navigation_bar_height", " dimen", "android"); | |
707 try { | 716 try { |
708 screenSize.y -= | 717 if (forPrerenderedContents) { |
709 resources.getDimensionPixelSize(R.dimen.custom_tabs_control_ container_height); | 718 screenSize.y -= resources.getDimensionPixelSize( |
719 R.dimen.custom_tabs_control_container_height); | |
720 } | |
710 screenSize.y -= resources.getDimensionPixelSize(statusBarId); | 721 screenSize.y -= resources.getDimensionPixelSize(statusBarId); |
711 screenSize.y -= resources.getDimensionPixelSize(navigationBarId); | |
712 } catch (Resources.NotFoundException e) { | 722 } catch (Resources.NotFoundException e) { |
713 // Nothing, this is just a best effort estimate. | 723 // Nothing, this is just a best effort estimate. |
714 } | 724 } |
725 if (forPrerenderedContents) { | |
726 float density = resources.getDisplayMetrics().density; | |
727 screenSize.x /= density; | |
728 screenSize.y /= density; | |
729 } | |
715 return screenSize; | 730 return screenSize; |
716 } | 731 } |
717 | 732 |
718 @VisibleForTesting | 733 @VisibleForTesting |
719 void resetThrottling(int uid) { | 734 void resetThrottling(int uid) { |
720 synchronized (mLock) { | 735 synchronized (mLock) { |
721 mUidToPredictionsStats.put(uid, new PredictionStats()); | 736 mUidToPredictionsStats.put(uid, new PredictionStats()); |
722 } | 737 } |
723 } | 738 } |
724 } | 739 } |
OLD | NEW |