Commit 954f5804 authored by Clark DuVall's avatar Clark DuVall Committed by Commit Bot

[WebLayer] Fix crash when requesting system permissions

std::transform requires using something like std::back_inserter, and not
just .begin() to insert items (unless the container is already sized
correctly). std::transform is confusing, so better to just use a loop.

Bug: 1111405
Change-Id: I68080feeff23cee86a71df19838972f3b9b9d511
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2329919
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Auto-Submit: Clark DuVall <cduvall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#793510}
parent deaa740d
......@@ -84,6 +84,7 @@ android_library("weblayer_private_java_tests") {
"//base:base_java_test_support",
"//content/public/test/android:content_java_test_support",
"//net/android:net_java_test_support",
"//third_party/android_deps:android_support_v4_java",
"//third_party/android_deps:androidx_fragment_fragment_java",
"//third_party/android_deps:androidx_test_runner_java",
"//third_party/android_support_test_runner:rules_java",
......
......@@ -4,9 +4,17 @@
package org.chromium.weblayer.test;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.RemoteException;
import androidx.core.app.ActivityCompat;
import androidx.test.filters.MediumTest;
import org.hamcrest.Matchers;
......@@ -18,6 +26,9 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.InMemorySharedPreferencesContext;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
import org.chromium.content_public.browser.test.util.CriteriaNotSatisfiedException;
......@@ -40,6 +51,7 @@ public final class GeolocationTest {
private InstrumentationActivity mActivity;
private TestWebLayer mTestWebLayer;
private TestWebServer mTestServer;
private int mLocationPermission = PackageManager.PERMISSION_GRANTED;
private static final String RAW_JAVASCRIPT =
"var positionCount = 0;"
......@@ -59,10 +71,49 @@ public final class GeolocationTest {
+ " gotPos, errorCallback, {});"
+ "}";
@TargetApi(Build.VERSION_CODES.M)
private class PermissionCompatDelegate implements ActivityCompat.PermissionCompatDelegate {
private CallbackHelper mCallbackHelper = new CallbackHelper();
@Override
public boolean requestPermissions(
Activity activity, String[] permissions, int requestCode) {
mCallbackHelper.notifyCalled();
return false;
}
@Override
public boolean onActivityResult(
Activity activity, int requestCode, int resultCode, Intent data) {
return false;
}
public void waitForPermissionsRequest() throws Exception {
mCallbackHelper.waitForFirst();
}
}
@Before
public void setUp() throws Throwable {
mActivity = mActivityTestRule.launchShellWithUrl("about:blank");
Bundle extras = new Bundle();
// We need to override the context with which to create WebLayer.
extras.putBoolean(InstrumentationActivity.EXTRA_CREATE_WEBLAYER, false);
mActivity = mActivityTestRule.launchShell(extras);
Assert.assertNotNull(mActivity);
TestThreadUtils.runOnUiThreadBlocking(() -> {
mActivity.loadWebLayerSync(new InMemorySharedPreferencesContext(
mActivity.getApplication()) {
@Override
public int checkPermission(String permission, int pid, int uid) {
if (permission.equals(Manifest.permission.ACCESS_FINE_LOCATION)
|| permission.equals(Manifest.permission.ACCESS_COARSE_LOCATION)) {
return mLocationPermission;
}
return getBaseContext().checkPermission(permission, pid, uid);
}
});
});
mActivityTestRule.navigateAndWait("about:blank");
mTestWebLayer = TestWebLayer.getTestWebLayer(mActivity.getApplicationContext());
mTestWebLayer.setSystemLocationSettingEnabled(true);
......@@ -152,6 +203,25 @@ public final class GeolocationTest {
Assert.assertEquals(0, getCountFromJS("positionCount"));
}
@Test
@MediumTest
@MinAndroidSdkLevel(Build.VERSION_CODES.M)
public void testRequestSystemPermission() throws Throwable {
mActivityTestRule.executeScriptSync("initiate_watchPosition();", false);
waitForDialog();
mTestWebLayer.clickPermissionDialogButton(true);
// Reload and deny the system permission, so it is prompted on the next call to geolocation.
mActivityTestRule.navigateAndWait(mActivityTestRule.getTestDataURL("geolocation.html"));
PermissionCompatDelegate delegate = new PermissionCompatDelegate();
ActivityCompat.setPermissionCompatDelegate(delegate);
mLocationPermission = PackageManager.PERMISSION_DENIED;
mActivityTestRule.executeScriptSync("initiate_watchPosition();", false);
delegate.waitForPermissionsRequest();
}
// helper methods
private void waitForCountEqual(String variableName, int count) {
......
......@@ -30,10 +30,8 @@ void RequestAndroidPermissions(
}
std::vector<int> content_settings_ints;
std::transform(content_settings_types.begin(), content_settings_types.end(),
content_settings_ints.begin(), [](ContentSettingsType type) {
return static_cast<int>(type);
});
for (auto type : content_settings_types)
content_settings_ints.push_back(static_cast<int>(type));
// The callback allocated here will be deleted in the call to OnResult, which
// is guaranteed to be called.
......
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