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

Side by Side Diff: content/public/android/java/src/org/chromium/content/browser/BrowserStartupController.java

Issue 356453003: Don't share renderers between unrelated tabs on Android. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address Grace's and John's comments. Created 6 years, 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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.content.browser; 5 package org.chromium.content.browser;
6 6
7 import android.content.Context; 7 import android.content.Context;
8 import android.os.Handler; 8 import android.os.Handler;
9 import android.util.Log; 9 import android.util.Log;
10 10
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 // initialization has been started, since it is not needed anymore. This is to ensure the 87 // initialization has been started, since it is not needed anymore. This is to ensure the
88 // context is not leaked. 88 // context is not leaked.
89 private final Context mContext; 89 private final Context mContext;
90 90
91 // Whether the async startup of the browser process has started. 91 // Whether the async startup of the browser process has started.
92 private boolean mHasStartedInitializingBrowserProcess; 92 private boolean mHasStartedInitializingBrowserProcess;
93 93
94 // Whether the async startup of the browser process is complete. 94 // Whether the async startup of the browser process is complete.
95 private boolean mStartupDone; 95 private boolean mStartupDone;
96 96
97 // Use single-process mode that runs the renderer on a separate thread in
98 // the main application.
99 public static final int MAX_RENDERERS_SINGLE_PROCESS = 0;
100
101 // Cap on the maximum number of renderer processes that can be requested.
102 // This is currently set to account for:
103 // 13: The maximum number of sandboxed processes we have available
104 // - 1: The regular New Tab Page
105 // - 1: The incognito New Tab Page
106 // - 1: A regular incognito tab
107 // - 1: Safety buffer (http://crbug.com/251279)
108 public static final int MAX_RENDERERS_LIMIT =
109 ChildProcessLauncher.MAX_REGISTERED_SANDBOXED_SERVICES - 4;
110
111 // This field is set after startup has been completed based on whether the s tartup was a success 97 // This field is set after startup has been completed based on whether the s tartup was a success
112 // or not. It is used when later requests to startup come in that happen aft er the initial set 98 // or not. It is used when later requests to startup come in that happen aft er the initial set
113 // of enqueued callbacks have been executed. 99 // of enqueued callbacks have been executed.
114 private boolean mStartupSuccess; 100 private boolean mStartupSuccess;
115 101
116 BrowserStartupController(Context context) { 102 BrowserStartupController(Context context) {
117 mContext = context; 103 mContext = context;
118 mAsyncStartupCallbacks = new ArrayList<StartupCallback>(); 104 mAsyncStartupCallbacks = new ArrayList<StartupCallback>();
119 } 105 }
120 106
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 } 140 }
155 141
156 // Browser process has not been fully started yet, so we defer executing the callback. 142 // Browser process has not been fully started yet, so we defer executing the callback.
157 mAsyncStartupCallbacks.add(callback); 143 mAsyncStartupCallbacks.add(callback);
158 144
159 if (!mHasStartedInitializingBrowserProcess) { 145 if (!mHasStartedInitializingBrowserProcess) {
160 // This is the first time we have been asked to start the browser pr ocess. We set the 146 // This is the first time we have been asked to start the browser pr ocess. We set the
161 // flag that indicates that we have kicked off starting the browser process. 147 // flag that indicates that we have kicked off starting the browser process.
162 mHasStartedInitializingBrowserProcess = true; 148 mHasStartedInitializingBrowserProcess = true;
163 149
164 prepareToStartBrowserProcess(MAX_RENDERERS_LIMIT); 150 prepareToStartBrowserProcess(false);
165 151
166 setAsynchronousStartup(true); 152 setAsynchronousStartup(true);
167 if (contentStart() > 0) { 153 if (contentStart() > 0) {
168 // Failed. The callbacks may not have run, so run them. 154 // Failed. The callbacks may not have run, so run them.
169 enqueueCallbackExecution(STARTUP_FAILURE, NOT_ALREADY_STARTED); 155 enqueueCallbackExecution(STARTUP_FAILURE, NOT_ALREADY_STARTED);
170 } 156 }
171 } 157 }
172 } 158 }
173 159
174 /** 160 /**
175 * Start the browser process synchronously. If the browser is already being started 161 * Start the browser process synchronously. If the browser is already being started
176 * asynchronously then complete startup synchronously 162 * asynchronously then complete startup synchronously
177 * 163 *
178 * <p/> 164 * <p/>
179 * Note that this can only be called on the UI thread. 165 * Note that this can only be called on the UI thread.
180 * 166 *
181 * @param maxRenderers The maximum number of renderer processes the browser may 167 * @param inProcess true iff the browser should run single-process, ie. keep renderers in the
182 * create. Zero for single process mode. 168 * browser process
183 * @throws ProcessInitException 169 * @throws ProcessInitException
184 */ 170 */
185 public void startBrowserProcessesSync(int maxRenderers) throws ProcessInitEx ception { 171 public void startBrowserProcessesSync(boolean inProcess) throws ProcessInitE xception {
186 // If already started skip to checking the result 172 // If already started skip to checking the result
187 if (!mStartupDone) { 173 if (!mStartupDone) {
188 if (!mHasStartedInitializingBrowserProcess) { 174 if (!mHasStartedInitializingBrowserProcess) {
189 prepareToStartBrowserProcess(maxRenderers); 175 prepareToStartBrowserProcess(inProcess);
190 } 176 }
191 177
192 setAsynchronousStartup(false); 178 setAsynchronousStartup(false);
193 if (contentStart() > 0) { 179 if (contentStart() > 0) {
194 // Failed. The callbacks may not have run, so run them. 180 // Failed. The callbacks may not have run, so run them.
195 enqueueCallbackExecution(STARTUP_FAILURE, NOT_ALREADY_STARTED); 181 enqueueCallbackExecution(STARTUP_FAILURE, NOT_ALREADY_STARTED);
196 } 182 }
197 } 183 }
198 184
199 // Startup should now be complete 185 // Startup should now be complete
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 if (mStartupSuccess) { 239 if (mStartupSuccess) {
254 callback.onSuccess(ALREADY_STARTED); 240 callback.onSuccess(ALREADY_STARTED);
255 } else { 241 } else {
256 callback.onFailure(); 242 callback.onFailure();
257 } 243 }
258 } 244 }
259 }); 245 });
260 } 246 }
261 247
262 @VisibleForTesting 248 @VisibleForTesting
263 void prepareToStartBrowserProcess(int maxRendererProcesses) throws ProcessIn itException { 249 void prepareToStartBrowserProcess(boolean inProcess) throws ProcessInitExcep tion {
264 Log.i(TAG, "Initializing chromium process, renderers=" + maxRendererProc esses); 250 Log.i(TAG, "Initializing chromium process, inProcess=" + inProcess);
265 251
266 // Normally Main.java will have kicked this off asynchronously for Chrom e. But other 252 // Normally Main.java will have kicked this off asynchronously for Chrom e. But other
267 // ContentView apps like tests also need them so we make sure we've extr acted resources 253 // ContentView apps like tests also need them so we make sure we've extr acted resources
268 // here. We can still make it a little async (wait until the library is loaded). 254 // here. We can still make it a little async (wait until the library is loaded).
269 ResourceExtractor resourceExtractor = ResourceExtractor.get(mContext); 255 ResourceExtractor resourceExtractor = ResourceExtractor.get(mContext);
270 resourceExtractor.startExtractingResources(); 256 resourceExtractor.startExtractingResources();
271 257
272 // Normally Main.java will have already loaded the library asynchronousl y, we only need 258 // Normally Main.java will have already loaded the library asynchronousl y, we only need
273 // to load it here if we arrived via another flow, e.g. bookmark access & sync setup. 259 // to load it here if we arrived via another flow, e.g. bookmark access & sync setup.
274 LibraryLoader.ensureInitialized(mContext, true); 260 LibraryLoader.ensureInitialized(mContext, true);
275 261
276 // TODO(yfriedman): Remove dependency on a command line flag for this. 262 // TODO(yfriedman): Remove dependency on a command line flag for this.
277 DeviceUtils.addDeviceSpecificUserAgentSwitch(mContext); 263 DeviceUtils.addDeviceSpecificUserAgentSwitch(mContext);
278 264
279 Context appContext = mContext.getApplicationContext(); 265 Context appContext = mContext.getApplicationContext();
280 // Now we really need to have the resources ready. 266 // Now we really need to have the resources ready.
281 resourceExtractor.waitForCompletion(); 267 resourceExtractor.waitForCompletion();
282 268
283 nativeSetCommandLineFlags(maxRendererProcesses, 269 nativeSetCommandLineFlags(inProcess, nativeIsPluginEnabled() ? getPlugin s() : null);
284 nativeIsPluginEnabled() ? getPlugins() : null);
285 ContentMain.initApplicationContext(appContext); 270 ContentMain.initApplicationContext(appContext);
286 } 271 }
287 272
288 /** 273 /**
289 * Initialization needed for tests. Mainly used by content browsertests. 274 * Initialization needed for tests. Mainly used by content browsertests.
290 */ 275 */
291 public void initChromiumBrowserProcessForTests() { 276 public void initChromiumBrowserProcessForTests() {
292 ResourceExtractor resourceExtractor = ResourceExtractor.get(mContext); 277 ResourceExtractor resourceExtractor = ResourceExtractor.get(mContext);
293 resourceExtractor.startExtractingResources(); 278 resourceExtractor.startExtractingResources();
294 resourceExtractor.waitForCompletion(); 279 resourceExtractor.waitForCompletion();
295 280 nativeSetCommandLineFlags(false, null);
296 // Having a single renderer should be sufficient for tests. We can't hav e more than
297 // MAX_RENDERERS_LIMIT.
298 nativeSetCommandLineFlags(1 /* maxRenderers */, null);
299 } 281 }
300 282
301 private String getPlugins() { 283 private String getPlugins() {
302 return PepperPluginManager.getPlugins(mContext); 284 return PepperPluginManager.getPlugins(mContext);
303 } 285 }
304 286
305 private static native void nativeSetCommandLineFlags(int maxRenderProcesses, 287 private static native void nativeSetCommandLineFlags(
306 String pluginDescriptor); 288 boolean inProcess, String pluginDescriptor);
307 289
308 // Is this an official build of Chrome? Only native code knows for sure. Off icial build 290 // Is this an official build of Chrome? Only native code knows for sure. Off icial build
309 // knowledge is needed very early in process startup. 291 // knowledge is needed very early in process startup.
310 private static native boolean nativeIsOfficialBuild(); 292 private static native boolean nativeIsOfficialBuild();
311 293
312 private static native boolean nativeIsPluginEnabled(); 294 private static native boolean nativeIsPluginEnabled();
313 } 295 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698