Commit a255db1d authored by Tobias Sargeant's avatar Tobias Sargeant Committed by Commit Bot

[aw] Provide the means to terminate a webview renderer.

AwRenderProcess holds a child process identity, obtained via AwContents,
which can be used to shut down the associated renderer service. The
AwContents getter and the AwRenderProcess terminate method are exposed
via the webview support library glue.

Bug: 865062
Change-Id: Icdf59beb53e4b9afb1a213dc861bd158f3a41af8
Reviewed-on: https://chromium-review.googlesource.com/1143900Reviewed-by: default avatarBo <boliu@chromium.org>
Reviewed-by: default avatarNate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Commit-Queue: Tobias Sargeant <tobiasjs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#579005}
parent 7ec7b146
...@@ -54,6 +54,7 @@ generate_jni("native_jni") { ...@@ -54,6 +54,7 @@ generate_jni("native_jni") {
"java/src/org/chromium/android_webview/AwPdfExporter.java", "java/src/org/chromium/android_webview/AwPdfExporter.java",
"java/src/org/chromium/android_webview/AwPicture.java", "java/src/org/chromium/android_webview/AwPicture.java",
"java/src/org/chromium/android_webview/AwQuotaManagerBridge.java", "java/src/org/chromium/android_webview/AwQuotaManagerBridge.java",
"java/src/org/chromium/android_webview/AwRenderProcess.java",
"java/src/org/chromium/android_webview/AwResource.java", "java/src/org/chromium/android_webview/AwResource.java",
"java/src/org/chromium/android_webview/AwSettings.java", "java/src/org/chromium/android_webview/AwSettings.java",
"java/src/org/chromium/android_webview/AwTokenBindingManager.java", "java/src/org/chromium/android_webview/AwTokenBindingManager.java",
...@@ -517,6 +518,8 @@ source_set("common") { ...@@ -517,6 +518,8 @@ source_set("common") {
"browser/aw_quota_manager_bridge.h", "browser/aw_quota_manager_bridge.h",
"browser/aw_quota_permission_context.cc", "browser/aw_quota_permission_context.cc",
"browser/aw_quota_permission_context.h", "browser/aw_quota_permission_context.h",
"browser/aw_render_process.cc",
"browser/aw_render_process.h",
"browser/aw_render_process_gone_delegate.h", "browser/aw_render_process_gone_delegate.h",
"browser/aw_render_thread_context_provider.cc", "browser/aw_render_thread_context_provider.cc",
"browser/aw_render_thread_context_provider.h", "browser/aw_render_thread_context_provider.h",
...@@ -840,6 +843,7 @@ android_library("android_webview_java") { ...@@ -840,6 +843,7 @@ android_library("android_webview_java") {
"java/src/org/chromium/android_webview/AwQuotaManagerBridge.java", "java/src/org/chromium/android_webview/AwQuotaManagerBridge.java",
"java/src/org/chromium/android_webview/AwRenderProcessGoneDetail.java", "java/src/org/chromium/android_webview/AwRenderProcessGoneDetail.java",
"java/src/org/chromium/android_webview/AwResource.java", "java/src/org/chromium/android_webview/AwResource.java",
"java/src/org/chromium/android_webview/AwRenderProcess.java",
"java/src/org/chromium/android_webview/AwSafeBrowsingConversionHelper.java", "java/src/org/chromium/android_webview/AwSafeBrowsingConversionHelper.java",
"java/src/org/chromium/android_webview/AwScrollOffsetManager.java", "java/src/org/chromium/android_webview/AwScrollOffsetManager.java",
"java/src/org/chromium/android_webview/AwServiceWorkerClient.java", "java/src/org/chromium/android_webview/AwServiceWorkerClient.java",
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "android_webview/browser/aw_gl_functor.h" #include "android_webview/browser/aw_gl_functor.h"
#include "android_webview/browser/aw_pdf_exporter.h" #include "android_webview/browser/aw_pdf_exporter.h"
#include "android_webview/browser/aw_picture.h" #include "android_webview/browser/aw_picture.h"
#include "android_webview/browser/aw_render_process.h"
#include "android_webview/browser/aw_renderer_priority.h" #include "android_webview/browser/aw_renderer_priority.h"
#include "android_webview/browser/aw_resource_context.h" #include "android_webview/browser/aw_resource_context.h"
#include "android_webview/browser/aw_web_contents_delegate.h" #include "android_webview/browser/aw_web_contents_delegate.h"
...@@ -409,6 +410,20 @@ void AwContents::SetAwGLFunctor(JNIEnv* env, ...@@ -409,6 +410,20 @@ void AwContents::SetAwGLFunctor(JNIEnv* env,
SetAwGLFunctor(reinterpret_cast<AwGLFunctor*>(gl_functor)); SetAwGLFunctor(reinterpret_cast<AwGLFunctor*>(gl_functor));
} }
ScopedJavaLocalRef<jobject> AwContents::GetRenderProcess(
JNIEnv* env,
const JavaParamRef<jobject>& obj) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
content::RenderProcessHost* host =
web_contents_->GetMainFrame()->GetProcess();
if (host->run_renderer_in_process()) {
return ScopedJavaLocalRef<jobject>();
}
AwRenderProcess* render_process =
AwRenderProcess::GetInstanceForRenderProcessHost(host);
return render_process->GetJavaObject();
}
void AwContents::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { void AwContents::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
java_ref_.reset(); java_ref_.reset();
delete this; delete this;
......
...@@ -114,6 +114,10 @@ class AwContents : public FindHelper::Listener, ...@@ -114,6 +114,10 @@ class AwContents : public FindHelper::Listener,
const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& obj,
jlong gl_functor); jlong gl_functor);
base::android::ScopedJavaLocalRef<jobject> GetRenderProcess(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
void DocumentHasImages(JNIEnv* env, void DocumentHasImages(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& obj,
......
// Copyright 2018 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.
#include "android_webview/browser/aw_render_process.h"
#include "base/android/jni_android.h"
#include "base/android/scoped_java_ref.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h"
#include "jni/AwRenderProcess_jni.h"
using base::android::AttachCurrentThread;
using content::BrowserThread;
using content::ChildProcessTerminationInfo;
using content::RenderProcessHost;
namespace android_webview {
const void* const kAwRenderProcessKey = &kAwRenderProcessKey;
// static
AwRenderProcess* AwRenderProcess::GetInstanceForRenderProcessHost(
RenderProcessHost* host) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
AwRenderProcess* render_process =
static_cast<AwRenderProcess*>(host->GetUserData(kAwRenderProcessKey));
if (!render_process) {
std::unique_ptr<AwRenderProcess> created_render_process =
std::make_unique<AwRenderProcess>(host);
render_process = created_render_process.get();
host->SetUserData(kAwRenderProcessKey, std::move(created_render_process));
}
return render_process;
}
AwRenderProcess::AwRenderProcess(RenderProcessHost* render_process_host)
: render_process_host_(render_process_host), weak_factory_(this) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
java_obj_.Reset(Java_AwRenderProcess_create(AttachCurrentThread()));
CHECK(!java_obj_.is_null());
if (render_process_host_->IsReady()) {
Ready();
}
render_process_host->AddObserver(this);
}
AwRenderProcess::~AwRenderProcess() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
Java_AwRenderProcess_setNative(AttachCurrentThread(), java_obj_, 0);
java_obj_.Reset();
}
void AwRenderProcess::Ready() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
Java_AwRenderProcess_setNative(AttachCurrentThread(), java_obj_,
reinterpret_cast<jlong>(this));
}
void AwRenderProcess::Cleanup() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
render_process_host_->RemoveObserver(this);
render_process_host_->RemoveUserData(kAwRenderProcessKey);
// |this| is now deleted.
}
bool AwRenderProcess::TerminateChildProcess(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
return render_process_host_->Shutdown(0);
}
base::android::ScopedJavaLocalRef<jobject> AwRenderProcess::GetJavaObject() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
return base::android::ScopedJavaLocalRef<jobject>(java_obj_);
}
void AwRenderProcess::RenderProcessReady(RenderProcessHost* host) {
DCHECK(host == render_process_host_);
Ready();
}
void AwRenderProcess::RenderProcessExited(
RenderProcessHost* host,
const ChildProcessTerminationInfo& info) {
DCHECK(host == render_process_host_);
Cleanup();
}
} // namespace android_webview
// Copyright 2018 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.
#ifndef ANDROID_WEBVIEW_BROWSER_AW_RENDER_PROCESS_H_
#define ANDROID_WEBVIEW_BROWSER_AW_RENDER_PROCESS_H_
#include "base/android/scoped_java_ref.h"
#include "base/memory/weak_ptr.h"
#include "base/supports_user_data.h"
#include "content/public/browser/render_process_host_observer.h"
namespace android_webview {
class AwRenderProcess : public content::RenderProcessHostObserver,
public base::SupportsUserData::Data {
public:
static AwRenderProcess* GetInstanceForRenderProcessHost(
content::RenderProcessHost* host);
base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
bool TerminateChildProcess(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
explicit AwRenderProcess(content::RenderProcessHost* render_process_host);
~AwRenderProcess() override;
private:
void Ready();
void Cleanup();
// content::RenderProcessHostObserver implementation
void RenderProcessReady(content::RenderProcessHost* host) override;
void RenderProcessExited(
content::RenderProcessHost* host,
const content::ChildProcessTerminationInfo& info) override;
base::android::ScopedJavaGlobalRef<jobject> java_obj_;
content::RenderProcessHost* render_process_host_;
base::WeakPtrFactory<AwRenderProcess> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(AwRenderProcess);
};
} // namespace android_webview
#endif
...@@ -2865,6 +2865,13 @@ public class AwContents implements SmartClipProvider { ...@@ -2865,6 +2865,13 @@ public class AwContents implements SmartClipProvider {
return SelectionPopupController.fromWebContents(mWebContents).getTextClassifier(); return SelectionPopupController.fromWebContents(mWebContents).getTextClassifier();
} }
public AwRenderProcess getRenderProcess() {
if (isDestroyedOrNoOperation(WARN)) {
return null;
}
return nativeGetRenderProcess(mNativeAwContents);
}
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
// Methods called from native via JNI // Methods called from native via JNI
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
...@@ -3732,4 +3739,6 @@ public class AwContents implements SmartClipProvider { ...@@ -3732,4 +3739,6 @@ public class AwContents implements SmartClipProvider {
private native void nativeGrantFileSchemeAccesstoChildProcess(long nativeAwContents); private native void nativeGrantFileSchemeAccesstoChildProcess(long nativeAwContents);
private native void nativeResumeLoadingCreatedPopupWebContents(long nativeAwContents); private native void nativeResumeLoadingCreatedPopupWebContents(long nativeAwContents);
private native AwRenderProcess nativeGetRenderProcess(long nativeAwContents);
} }
// Copyright 2018 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.android_webview;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
/**
*/
@JNINamespace("android_webview")
public final class AwRenderProcess {
private long mNativeRenderProcess;
private AwRenderProcess() {}
public boolean terminate() {
if (mNativeRenderProcess == 0) return false;
return nativeTerminateChildProcess(mNativeRenderProcess);
}
@CalledByNative
private static AwRenderProcess create() {
return new AwRenderProcess();
}
@CalledByNative
private void setNative(long nativeRenderProcess) {
mNativeRenderProcess = nativeRenderProcess;
}
private native boolean nativeTerminateChildProcess(long nativeAwRenderProcess);
}
...@@ -12,14 +12,17 @@ import org.junit.Test; ...@@ -12,14 +12,17 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.chromium.android_webview.AwContents; import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwRenderProcess;
import org.chromium.android_webview.AwRenderProcessGoneDetail; import org.chromium.android_webview.AwRenderProcessGoneDetail;
import org.chromium.android_webview.AwSwitches; import org.chromium.android_webview.AwSwitches;
import org.chromium.android_webview.renderer_priority.RendererPriority; import org.chromium.android_webview.renderer_priority.RendererPriority;
import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.DisabledTest;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.parameter.SkipCommandLineParameterization; import org.chromium.base.test.util.parameter.SkipCommandLineParameterization;
import org.chromium.content_public.common.ContentUrlConstants;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
...@@ -65,27 +68,50 @@ public class AwContentsClientOnRenderProcessGoneTest { ...@@ -65,27 +68,50 @@ public class AwContentsClientOnRenderProcessGoneTest {
} }
} }
@Test interface Terminator {
@DisabledTest // http://crbug.com/689292 void terminate(AwContents awContents);
@Feature({"AndroidWebView"}) }
@SmallTest
@CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) private AwRenderProcess createAndTerminateRenderProcess(
@SkipCommandLineParameterization Terminator terminator, boolean expectCrash) throws Throwable {
public void testOnRenderProcessCrash() throws Throwable {
RenderProcessGoneTestAwContentsClient contentsClient = RenderProcessGoneTestAwContentsClient contentsClient =
new RenderProcessGoneTestAwContentsClient(); new RenderProcessGoneTestAwContentsClient();
AwTestContainerView testView = AwTestContainerView testView =
mActivityTestRule.createAwTestContainerViewOnMainSync(contentsClient); mActivityTestRule.createAwTestContainerViewOnMainSync(contentsClient);
AwContents awContents = testView.getAwContents(); final AwContents awContents = testView.getAwContents();
GetRenderProcessGoneHelper helper = contentsClient.getGetRenderProcessGoneHelper(); GetRenderProcessGoneHelper helper = contentsClient.getGetRenderProcessGoneHelper();
mActivityTestRule.loadUrlAsync(awContents, "chrome://crash");
final AwRenderProcess renderProcess =
ThreadUtils.runOnUiThreadBlocking(() -> awContents.getRenderProcess());
// Ensure that the renderer has started.
mActivityTestRule.loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(),
ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
// Terminate the renderer.
ThreadUtils.runOnUiThread(() -> terminator.terminate(awContents));
// Assert that onRenderProcessGone is called once.
int callCount = helper.getCallCount(); int callCount = helper.getCallCount();
helper.waitForCallback(callCount, 1, CallbackHelper.WAIT_TIMEOUT_SECONDS * 5, helper.waitForCallback(callCount, 1, CallbackHelper.WAIT_TIMEOUT_SECONDS * 5,
TimeUnit.SECONDS); TimeUnit.SECONDS);
Assert.assertEquals(callCount + 1, helper.getCallCount()); Assert.assertEquals(callCount + 1, helper.getCallCount());
Assert.assertTrue(helper.getAwRenderProcessGoneDetail().didCrash()); Assert.assertEquals(helper.getAwRenderProcessGoneDetail().didCrash(), expectCrash);
Assert.assertEquals( Assert.assertEquals(
RendererPriority.HIGH, helper.getAwRenderProcessGoneDetail().rendererPriority()); RendererPriority.HIGH, helper.getAwRenderProcessGoneDetail().rendererPriority());
return renderProcess;
}
@Test
@DisabledTest // http://crbug.com/689292
@Feature({"AndroidWebView"})
@SmallTest
@CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
@SkipCommandLineParameterization
public void testOnRenderProcessCrash() throws Throwable {
createAndTerminateRenderProcess(
(AwContents awContents) -> { awContents.loadUrl("chrome://crash"); }, true);
} }
@Test @Test
...@@ -94,19 +120,74 @@ public class AwContentsClientOnRenderProcessGoneTest { ...@@ -94,19 +120,74 @@ public class AwContentsClientOnRenderProcessGoneTest {
@CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
@SkipCommandLineParameterization @SkipCommandLineParameterization
public void testOnRenderProcessKill() throws Throwable { public void testOnRenderProcessKill() throws Throwable {
createAndTerminateRenderProcess(
(AwContents awContents) -> { awContents.loadUrl("chrome://kill"); }, false);
}
@Test
@Feature({"AndroidWebView"})
@SmallTest
@CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
@SkipCommandLineParameterization
public void testRenderProcessTermination() throws Throwable {
createAndTerminateRenderProcess((AwContents awContents) -> {
awContents.evaluateJavaScript("0", (String result) -> {
Assert.assertTrue(awContents.getRenderProcess().terminate());
});
}, false);
}
@Test
@Feature({"AndroidWebView"})
@SmallTest
@CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
@SkipCommandLineParameterization
public void testRenderProcessDifferentAfterRestart() throws Throwable {
AwRenderProcess renderProcess1 = createAndTerminateRenderProcess(
(AwContents awContents) -> { awContents.getRenderProcess().terminate(); }, false);
AwRenderProcess renderProcess2 = createAndTerminateRenderProcess(
(AwContents awContents) -> { awContents.getRenderProcess().terminate(); }, false);
Assert.assertNotEquals(renderProcess1, renderProcess2);
}
@Test
@Feature({"AndroidWebView"})
@SmallTest
@CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
@SkipCommandLineParameterization
public void testRenderProcessCanNotTerminateBeforeStart() throws Throwable {
RenderProcessGoneTestAwContentsClient contentsClient = RenderProcessGoneTestAwContentsClient contentsClient =
new RenderProcessGoneTestAwContentsClient(); new RenderProcessGoneTestAwContentsClient();
AwTestContainerView testView = AwTestContainerView testView =
mActivityTestRule.createAwTestContainerViewOnMainSync(contentsClient); mActivityTestRule.createAwTestContainerViewOnMainSync(contentsClient);
AwContents awContents = testView.getAwContents(); final AwContents awContents = testView.getAwContents();
GetRenderProcessGoneHelper helper = contentsClient.getGetRenderProcessGoneHelper();
mActivityTestRule.loadUrlAsync(awContents, "chrome://kill");
int callCount = helper.getCallCount();
helper.waitForCallback(callCount);
Assert.assertEquals(callCount + 1, helper.getCallCount()); Assert.assertFalse(
Assert.assertFalse(helper.getAwRenderProcessGoneDetail().didCrash()); ThreadUtils.runOnUiThreadBlocking(() -> awContents.getRenderProcess().terminate()));
Assert.assertEquals( }
RendererPriority.HIGH, helper.getAwRenderProcessGoneDetail().rendererPriority());
@Test
@Feature({"AndroidWebView"})
@SmallTest
@CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
@SkipCommandLineParameterization
public void testRenderProcessSameBeforeAndAfterStart() throws Throwable {
RenderProcessGoneTestAwContentsClient contentsClient =
new RenderProcessGoneTestAwContentsClient();
AwTestContainerView testView =
mActivityTestRule.createAwTestContainerViewOnMainSync(contentsClient);
final AwContents awContents = testView.getAwContents();
AwRenderProcess renderProcessBeforeStart =
ThreadUtils.runOnUiThreadBlocking(() -> awContents.getRenderProcess());
// Ensure that the renderer has started.
mActivityTestRule.loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(),
ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
AwRenderProcess renderProcessAfterStart =
ThreadUtils.runOnUiThreadBlocking(() -> awContents.getRenderProcess());
Assert.assertEquals(renderProcessBeforeStart, renderProcessAfterStart);
} }
} }
...@@ -26,6 +26,7 @@ import org.junit.Test; ...@@ -26,6 +26,7 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.chromium.android_webview.AwContents; import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwRenderProcess;
import org.chromium.android_webview.AwSettings; import org.chromium.android_webview.AwSettings;
import org.chromium.android_webview.AwSwitches; import org.chromium.android_webview.AwSwitches;
import org.chromium.android_webview.renderer_priority.RendererPriority; import org.chromium.android_webview.renderer_priority.RendererPriority;
...@@ -720,6 +721,47 @@ public class AwContentsTest { ...@@ -720,6 +721,47 @@ public class AwContentsTest {
}); });
} }
private AwRenderProcess getRenderProcessOnUiThread(final AwContents awContents)
throws Exception {
return ThreadUtils.runOnUiThreadBlocking(() -> awContents.getRenderProcess());
}
@Test
@Feature({"AndroidWebView"})
@SmallTest
@CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
@SkipCommandLineParameterization
public void testRenderProcessInMultiProcessMode() throws Throwable {
AwTestContainerView testView =
mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
final AwContents awContents = testView.getAwContents();
final AwRenderProcess preLoadRenderProcess = getRenderProcessOnUiThread(awContents);
Assert.assertNotNull(preLoadRenderProcess);
mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
final AwRenderProcess postLoadRenderProcess = getRenderProcessOnUiThread(awContents);
Assert.assertEquals(preLoadRenderProcess, postLoadRenderProcess);
}
@Test
@Feature({"AndroidWebView"})
@SmallTest
@SkipCommandLineParameterization
public void testNoRenderProcessInSingleProcessMode() throws Throwable {
AwTestContainerView testView =
mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
final AwContents awContents = testView.getAwContents();
mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
final AwRenderProcess renderProcess = getRenderProcessOnUiThread(awContents);
Assert.assertEquals(renderProcess, null);
}
/** Regression test for https://crbug.com/732976. Load a data URL, then immediately /** Regression test for https://crbug.com/732976. Load a data URL, then immediately
* after that load a javascript URL. The data URL navigation shouldn't be blocked. * after that load a javascript URL. The data URL navigation shouldn't be blocked.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment