| 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.tab; | 5 package org.chromium.chrome.browser.tab; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.graphics.Color; | 8 import android.graphics.Color; |
| 9 import android.support.annotation.IntDef; | |
| 10 import android.view.View; | 9 import android.view.View; |
| 11 | 10 |
| 12 import org.chromium.base.ActivityState; | 11 import org.chromium.base.ActivityState; |
| 13 import org.chromium.base.ApplicationState; | 12 import org.chromium.base.ApplicationState; |
| 14 import org.chromium.base.ApplicationStatus; | 13 import org.chromium.base.ApplicationStatus; |
| 15 import org.chromium.base.Log; | 14 import org.chromium.base.Log; |
| 16 import org.chromium.base.ObserverList.RewindableIterator; | 15 import org.chromium.base.ObserverList.RewindableIterator; |
| 17 import org.chromium.base.metrics.RecordHistogram; | 16 import org.chromium.base.metrics.RecordHistogram; |
| 18 import org.chromium.chrome.browser.ChromeApplication; | 17 import org.chromium.chrome.browser.ChromeApplication; |
| 19 import org.chromium.chrome.browser.fullscreen.FullscreenManager; | 18 import org.chromium.chrome.browser.fullscreen.FullscreenManager; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 38 | 37 |
| 39 /** Used for logging. */ | 38 /** Used for logging. */ |
| 40 private static final String TAG = "TabWebContentsObs"; | 39 private static final String TAG = "TabWebContentsObs"; |
| 41 | 40 |
| 42 // TabRendererCrashStatus defined in tools/metrics/histograms/histograms.xml
. | 41 // TabRendererCrashStatus defined in tools/metrics/histograms/histograms.xml
. |
| 43 private static final int TAB_RENDERER_CRASH_STATUS_SHOWN_IN_FOREGROUND_APP =
0; | 42 private static final int TAB_RENDERER_CRASH_STATUS_SHOWN_IN_FOREGROUND_APP =
0; |
| 44 private static final int TAB_RENDERER_CRASH_STATUS_HIDDEN_IN_FOREGROUND_APP
= 1; | 43 private static final int TAB_RENDERER_CRASH_STATUS_HIDDEN_IN_FOREGROUND_APP
= 1; |
| 45 private static final int TAB_RENDERER_CRASH_STATUS_HIDDEN_IN_BACKGROUND_APP
= 2; | 44 private static final int TAB_RENDERER_CRASH_STATUS_HIDDEN_IN_BACKGROUND_APP
= 2; |
| 46 private static final int TAB_RENDERER_CRASH_STATUS_MAX = 3; | 45 private static final int TAB_RENDERER_CRASH_STATUS_MAX = 3; |
| 47 | 46 |
| 48 // TabRendererExitStatus defined in tools/metrics/histograms/histograms.xml. | |
| 49 // Designed to replace TabRendererCrashStatus if numbers line up. | |
| 50 @IntDef({TAB_RENDERER_EXIT_STATUS_OOM_PROTECTED_IN_RUNNING_APP, | |
| 51 TAB_RENDERER_EXIT_STATUS_OOM_PROTECTED_IN_PAUSED_APP, | |
| 52 TAB_RENDERER_EXIT_STATUS_OOM_PROTECTED_IN_BACKGROUND_APP, | |
| 53 TAB_RENDERER_EXIT_STATUS_NOT_PROTECTED_IN_RUNNING_APP, | |
| 54 TAB_RENDERER_EXIT_STATUS_NOT_PROTECTED_IN_PAUSED_APP, | |
| 55 TAB_RENDERER_EXIT_STATUS_NOT_PROTECTED_IN_BACKGROUND_APP, | |
| 56 TAB_RENDERER_EXIT_STATUS_MAX}) | |
| 57 private @interface TabRendererExitStatus {} | |
| 58 private static final int TAB_RENDERER_EXIT_STATUS_OOM_PROTECTED_IN_RUNNING_A
PP = 0; | |
| 59 private static final int TAB_RENDERER_EXIT_STATUS_OOM_PROTECTED_IN_PAUSED_AP
P = 1; | |
| 60 private static final int TAB_RENDERER_EXIT_STATUS_OOM_PROTECTED_IN_BACKGROUN
D_APP = 2; | |
| 61 private static final int TAB_RENDERER_EXIT_STATUS_NOT_PROTECTED_IN_RUNNING_A
PP = 3; | |
| 62 private static final int TAB_RENDERER_EXIT_STATUS_NOT_PROTECTED_IN_PAUSED_AP
P = 4; | |
| 63 private static final int TAB_RENDERER_EXIT_STATUS_NOT_PROTECTED_IN_BACKGROUN
D_APP = 5; | |
| 64 private static final int TAB_RENDERER_EXIT_STATUS_MAX = 6; | |
| 65 | |
| 66 private final Tab mTab; | 47 private final Tab mTab; |
| 67 private int mThemeColor; | 48 private int mThemeColor; |
| 68 | 49 |
| 69 public TabWebContentsObserver(WebContents webContents, Tab tab) { | 50 public TabWebContentsObserver(WebContents webContents, Tab tab) { |
| 70 super(webContents); | 51 super(webContents); |
| 71 mTab = tab; | 52 mTab = tab; |
| 72 mThemeColor = mTab.getDefaultThemeColor(); | 53 mThemeColor = mTab.getDefaultThemeColor(); |
| 73 } | 54 } |
| 74 | 55 |
| 75 @Override | 56 @Override |
| 76 public void renderProcessGone(boolean processWasOomProtected) { | 57 public void renderProcessGone(boolean processWasOomProtected) { |
| 77 Log.i(TAG, "renderProcessGone() for tab id: " + mTab.getId() | 58 Log.i(TAG, "renderProcessGone() for tab id: " + mTab.getId() |
| 78 + ", oom protected: " + Boolean.toString(processWasOomProtected) | 59 + ", oom protected: " + Boolean.toString(processWasOomProtected) |
| 79 + ", already needs reload: " + Boolean.toString(mTab.needsReload
())); | 60 + ", already needs reload: " + Boolean.toString(mTab.needsReload
())); |
| 80 // Do nothing for subsequent calls that happen while the tab remains cra
shed. This | 61 // Do nothing for subsequent calls that happen while the tab remains cra
shed. This |
| 81 // can occur when the tab is in the background and it shares the rendere
r with other | 62 // can occur when the tab is in the background and it shares the rendere
r with other |
| 82 // tabs. After the renderer crashes, the WebContents of its tabs are sti
ll around | 63 // tabs. After the renderer crashes, the WebContents of its tabs are sti
ll around |
| 83 // and they still share the RenderProcessHost. When one of the tabs relo
ads spawning | 64 // and they still share the RenderProcessHost. When one of the tabs relo
ads spawning |
| 84 // a new renderer for the shared RenderProcessHost and the new renderer
crashes | 65 // a new renderer for the shared RenderProcessHost and the new renderer
crashes |
| 85 // again, all tabs sharing this renderer will be notified about the cras
h (including | 66 // again, all tabs sharing this renderer will be notified about the cras
h (including |
| 86 // potential background tabs that did not reload yet). | 67 // potential background tabs that did not reload yet). |
| 87 if (mTab.needsReload() || mTab.isShowingSadTab()) return; | 68 if (mTab.needsReload() || mTab.isShowingSadTab()) return; |
| 88 | 69 |
| 89 // This will replace TabRendererCrashStatus if numbers line up. | |
| 90 int appState = ApplicationStatus.getStateForApplication(); | |
| 91 boolean applicationRunning = (appState == ApplicationState.HAS_RUNNING_A
CTIVITIES); | |
| 92 boolean applicationPaused = (appState == ApplicationState.HAS_PAUSED_ACT
IVITIES); | |
| 93 @TabRendererExitStatus int rendererExitStatus = TAB_RENDERER_EXIT_STATUS
_MAX; | |
| 94 if (processWasOomProtected) { | |
| 95 if (applicationRunning) { | |
| 96 rendererExitStatus = TAB_RENDERER_EXIT_STATUS_OOM_PROTECTED_IN_R
UNNING_APP; | |
| 97 } else if (applicationPaused) { | |
| 98 rendererExitStatus = TAB_RENDERER_EXIT_STATUS_OOM_PROTECTED_IN_P
AUSED_APP; | |
| 99 } else { | |
| 100 rendererExitStatus = TAB_RENDERER_EXIT_STATUS_OOM_PROTECTED_IN_B
ACKGROUND_APP; | |
| 101 } | |
| 102 } else { | |
| 103 if (applicationRunning) { | |
| 104 rendererExitStatus = TAB_RENDERER_EXIT_STATUS_NOT_PROTECTED_IN_R
UNNING_APP; | |
| 105 } else if (applicationPaused) { | |
| 106 rendererExitStatus = TAB_RENDERER_EXIT_STATUS_NOT_PROTECTED_IN_P
AUSED_APP; | |
| 107 } else { | |
| 108 rendererExitStatus = TAB_RENDERER_EXIT_STATUS_NOT_PROTECTED_IN_B
ACKGROUND_APP; | |
| 109 } | |
| 110 } | |
| 111 RecordHistogram.recordEnumeratedHistogram( | |
| 112 "Tab.RendererExitStatus", rendererExitStatus, TAB_RENDERER_EXIT_
STATUS_MAX); | |
| 113 | |
| 114 int activityState = ApplicationStatus.getStateForActivity( | 70 int activityState = ApplicationStatus.getStateForActivity( |
| 115 mTab.getWindowAndroid().getActivity().get()); | 71 mTab.getWindowAndroid().getActivity().get()); |
| 116 int rendererCrashStatus = TAB_RENDERER_CRASH_STATUS_MAX; | 72 int rendererCrashStatus = TAB_RENDERER_CRASH_STATUS_MAX; |
| 117 if (!processWasOomProtected | 73 if (!processWasOomProtected |
| 118 || activityState == ActivityState.PAUSED | 74 || activityState == ActivityState.PAUSED |
| 119 || activityState == ActivityState.STOPPED | 75 || activityState == ActivityState.STOPPED |
| 120 || activityState == ActivityState.DESTROYED) { | 76 || activityState == ActivityState.DESTROYED) { |
| 121 // The tab crashed in background or was killed by the OS out-of-memo
ry killer. | 77 // The tab crashed in background or was killed by the OS out-of-memo
ry killer. |
| 122 //setNeedsReload(true); | 78 //setNeedsReload(true); |
| 123 mTab.setNeedsReload(true); | 79 mTab.setNeedsReload(true); |
| 124 if (applicationRunning) { | 80 if (ApplicationStatus.getStateForApplication() |
| 81 == ApplicationState.HAS_RUNNING_ACTIVITIES) { |
| 125 rendererCrashStatus = TAB_RENDERER_CRASH_STATUS_HIDDEN_IN_FOREGR
OUND_APP; | 82 rendererCrashStatus = TAB_RENDERER_CRASH_STATUS_HIDDEN_IN_FOREGR
OUND_APP; |
| 126 } else { | 83 } else { |
| 127 rendererCrashStatus = TAB_RENDERER_CRASH_STATUS_HIDDEN_IN_BACKGR
OUND_APP; | 84 rendererCrashStatus = TAB_RENDERER_CRASH_STATUS_HIDDEN_IN_BACKGR
OUND_APP; |
| 128 } | 85 } |
| 129 } else { | 86 } else { |
| 130 rendererCrashStatus = TAB_RENDERER_CRASH_STATUS_SHOWN_IN_FOREGROUND_
APP; | 87 rendererCrashStatus = TAB_RENDERER_CRASH_STATUS_SHOWN_IN_FOREGROUND_
APP; |
| 131 mTab.showSadTab(); | 88 mTab.showSadTab(); |
| 132 // This is necessary to correlate histogram data with stability coun
ts. | 89 // This is necessary to correlate histogram data with stability coun
ts. |
| 133 UmaSessionStats.logRendererCrash(); | 90 UmaSessionStats.logRendererCrash(); |
| 134 } | 91 } |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 * @return The theme-color for this web contents. | 294 * @return The theme-color for this web contents. |
| 338 */ | 295 */ |
| 339 int getThemeColor() { | 296 int getThemeColor() { |
| 340 return mThemeColor; | 297 return mThemeColor; |
| 341 } | 298 } |
| 342 | 299 |
| 343 private static boolean isThemeColorEnabled(Context context) { | 300 private static boolean isThemeColorEnabled(Context context) { |
| 344 return !DeviceFormFactor.isTablet(context); | 301 return !DeviceFormFactor.isTablet(context); |
| 345 } | 302 } |
| 346 } | 303 } |
| OLD | NEW |