Commit e969fd5e authored by Clark DuVall's avatar Clark DuVall Committed by Chromium LUCI CQ

Add SplitCompatContentProvider and convert ChromeBrowserProvider

This will also allow converting the remaining providers in //clank.
Moving providers to the base module gives more time for the chrome split
preload to work, see http://crrev.com/c/2577546 for more info.

Note I removed the onCreate method from ChromeBrowserProvider, because
it just calls ensureNativeSideInitialized(). Every method which uses
native already calls canHandleContentProviderApiCall() which internally
will call ensureNativeSideInitialized(), so it seems unnecessary to call
from onCreate. This simplifies things a bit.

Review from Patchset 1 on for better diffs, Patchset 1 just moves
ChromeBrowserProvider.java to ChromeBrowserProviderImpl.java.

Bug: 1150600
Change-Id: I98134425b32173211293a4306f7e962934ed47c1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2591879
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Reviewed-by: default avatarAndrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/master@{#837129}
parent 492bb819
......@@ -2144,6 +2144,7 @@ android_library("base_module_java") {
"java/src/org/chromium/chrome/browser/base/SplitCompatAppComponentFactory.java",
"java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java",
"java/src/org/chromium/chrome/browser/base/SplitCompatBackupAgent.java",
"java/src/org/chromium/chrome/browser/base/SplitCompatContentProvider.java",
"java/src/org/chromium/chrome/browser/base/SplitCompatCustomTabsService.java",
"java/src/org/chromium/chrome/browser/base/SplitCompatGcmListenerService.java",
"java/src/org/chromium/chrome/browser/base/SplitCompatGcmTaskService.java",
......@@ -2174,6 +2175,7 @@ android_library("base_module_java") {
"java/src/org/chromium/chrome/browser/omaha/OmahaClient.java",
"java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java",
"java/src/org/chromium/chrome/browser/prerender/ChromePrerenderService.java",
"java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java",
"java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java",
"java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundService.java",
"java/src/org/chromium/chrome/browser/services/gcm/InvalidationGcmUpstreamSender.java",
......@@ -3400,7 +3402,7 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/previews/PreviewsAndroidBridge.java",
"java/src/org/chromium/chrome/browser/printing/TabPrinter.java",
"java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl.java",
"java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java",
"java/src/org/chromium/chrome/browser/provider/ChromeBrowserProviderImpl.java",
"java/src/org/chromium/chrome/browser/push_messaging/PushMessagingServiceObserver.java",
"java/src/org/chromium/chrome/browser/query_tiles/TileProviderFactory.java",
"java/src/org/chromium/chrome/browser/rappor/RapporServiceBridge.java",
......
......@@ -1191,7 +1191,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java",
"java/src/org/chromium/chrome/browser/provider/BaseColumns.java",
"java/src/org/chromium/chrome/browser/provider/BookmarkColumns.java",
"java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java",
"java/src/org/chromium/chrome/browser/provider/ChromeBrowserProviderImpl.java",
"java/src/org/chromium/chrome/browser/provider/ChromeBrowserProviderSuggestionsCursor.java",
"java/src/org/chromium/chrome/browser/provider/SearchColumns.java",
"java/src/org/chromium/chrome/browser/push_messaging/PushMessagingServiceObserver.java",
......
......@@ -853,6 +853,7 @@
<provider # DIFF-ANCHOR: 2215b9cd
android:authorities="$PACKAGE.ChromeBrowserProvider;$PACKAGE.browser;$PACKAGE"
android:exported="true"
android:initOrder="10000"
android:name="org.chromium.chrome.browser.provider.ChromeBrowserProvider">
<path-permission android:path="/bookmarks/search_suggest_query" android:readPermission="android.permission.GLOBAL_SEARCH"/>
</provider> # DIFF-ANCHOR: 2215b9cd
......
......@@ -791,6 +791,7 @@
<provider # DIFF-ANCHOR: 2215b9cd
android:authorities="$PACKAGE.ChromeBrowserProvider;$PACKAGE.browser;$PACKAGE"
android:exported="true"
android:initOrder="10000"
android:name="org.chromium.chrome.browser.provider.ChromeBrowserProvider">
<path-permission android:path="/bookmarks/search_suggest_query" android:readPermission="android.permission.GLOBAL_SEARCH"/>
</provider> # DIFF-ANCHOR: 2215b9cd
......
......@@ -869,14 +869,6 @@ by a child template that "extends" this file.
android:isolatedProcess="true"
android:process=":decoder_service" />
<!-- Providers for chrome data. -->
<provider android:name="org.chromium.chrome.browser.provider.ChromeBrowserProvider"
android:authorities="{{ manifest_package }}.ChromeBrowserProvider;{{ manifest_package }}.browser;{{ manifest_package }}"
android:exported="true">
<path-permission android:path="/bookmarks/search_suggest_query"
android:readPermission="android.permission.GLOBAL_SEARCH" />
</provider>
<!-- Broadcast receiver that will be notified of account changes -->
<receiver android:name="org.chromium.chrome.browser.services.AccountsChangedReceiver"
android:exported="true">
......@@ -1246,6 +1238,15 @@ by a child template that "extends" this file.
android:resource="@xml/file_paths" />
</provider>
<!-- Provider for chrome data. -->
<provider android:name="org.chromium.chrome.browser.provider.ChromeBrowserProvider"
android:authorities="{{ manifest_package }}.ChromeBrowserProvider;{{ manifest_package }}.browser;{{ manifest_package }}"
android:initOrder="10000"
android:exported="true">
<path-permission android:path="/bookmarks/search_suggest_query"
android:readPermission="android.permission.GLOBAL_SEARCH" />
</provider>
{% block base_application_definitions %}
{% endblock %}
{% block extra_application_definitions_for_test %}
......
// Copyright 2020 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.chrome.browser.base;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import java.io.FileDescriptor;
import java.io.PrintWriter;
/**
* ContentProvider base class which will call through to the given {@link Impl}. This class must be
* present in the base module, while the Impl can be in the chrome module.
*/
public class SplitCompatContentProvider extends ContentProvider {
private final Object mImplLock = new Object();
private Impl mImpl;
private String mContentProviderClassName;
public SplitCompatContentProvider(String contentProviderClassName) {
mContentProviderClassName = contentProviderClassName;
}
private Impl getImpl() {
// Content provider methods can be called on multiple threads, so make sure mImpl is locked
// when it is created.
synchronized (mImplLock) {
if (mImpl == null) {
Context context = SplitCompatUtils.createChromeContext(getContext());
mImpl = (Impl) SplitCompatUtils.newInstance(context, mContentProviderClassName);
mImpl.setContentProvider(this);
}
return mImpl;
}
}
@Override
public boolean onCreate() {
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
return getImpl().query(uri, projection, selection, selectionArgs, sortOrder);
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return getImpl().insert(uri, values);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return getImpl().delete(uri, selection, selectionArgs);
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return getImpl().update(uri, values, selection, selectionArgs);
}
@Override
public String getType(Uri uri) {
return getImpl().getType(uri);
}
@Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
getImpl().dump(fd, writer, args);
}
/**
* Holds the implementation of ContentProvider logic. Will be called by {@link
* SplitCompatContentProvider}.
*/
public abstract static class Impl {
private SplitCompatContentProvider mContentProvider;
protected void setContentProvider(SplitCompatContentProvider contentProvider) {
mContentProvider = contentProvider;
}
protected final Context getContext() {
return mContentProvider.getContext();
}
public abstract Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder);
public abstract Uri insert(Uri uri, ContentValues values);
public abstract int delete(Uri uri, String selection, String[] selectionArgs);
public abstract int update(
Uri uri, ContentValues values, String selection, String[] selectionArgs);
public abstract String getType(Uri uri);
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {}
}
}
......@@ -15,8 +15,8 @@ import org.junit.runner.RunWith;
import org.chromium.base.test.BaseJUnit4ClassRunner;
import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.provider.ChromeBrowserProvider.BookmarkNode;
import org.chromium.chrome.browser.provider.ChromeBrowserProvider.Type;
import org.chromium.chrome.browser.provider.ChromeBrowserProviderImpl.BookmarkNode;
import org.chromium.chrome.browser.provider.ChromeBrowserProviderImpl.Type;
import java.util.Random;
......
......@@ -41,7 +41,8 @@ public class ProviderBookmarksUriTest {
@Before
public void setUp() {
mBookmarksUri = ChromeBrowserProvider.getBookmarksApiUri(mProviderTestRule.getActivity());
mBookmarksUri =
ChromeBrowserProviderImpl.getBookmarksApiUri(mProviderTestRule.getActivity());
mProviderTestRule.getContentResolver().delete(mBookmarksUri, null, null);
}
......
......@@ -37,7 +37,7 @@ public class ProviderSearchesUriTest {
@Before
public void setUp() {
mSearchesUri = ChromeBrowserProvider.getSearchesApiUri(mProviderTestRule.getActivity());
mSearchesUri = ChromeBrowserProviderImpl.getSearchesApiUri(mProviderTestRule.getActivity());
mProviderTestRule.getContentResolver().delete(mSearchesUri, null, null);
}
......@@ -176,15 +176,15 @@ public class ProviderSearchesUriTest {
Uri insertUri = mProviderTestRule.getContentResolver().insert(mSearchesUri, value);
Cursor cursor = mProviderTestRule.getContentResolver().query(mSearchesUri,
ChromeBrowserProvider.SEARCHES_PROJECTION, SearchColumns.SEARCH + " = ?",
ChromeBrowserProviderImpl.SEARCHES_PROJECTION, SearchColumns.SEARCH + " = ?",
new String[] {insertSearch}, null);
int id;
try {
Assert.assertTrue(cursor.moveToNext());
Assert.assertEquals(insertSearch,
cursor.getString(ChromeBrowserProvider.SEARCHES_PROJECTION_SEARCH_INDEX));
cursor.getString(ChromeBrowserProviderImpl.SEARCHES_PROJECTION_SEARCH_INDEX));
Assert.assertEquals(createDate,
cursor.getLong(ChromeBrowserProvider.SEARCHES_PROJECTION_DATE_INDEX));
cursor.getLong(ChromeBrowserProviderImpl.SEARCHES_PROJECTION_DATE_INDEX));
id = cursor.getInt(idIndex);
} finally {
cursor.close();
......@@ -199,14 +199,14 @@ public class ProviderSearchesUriTest {
mProviderTestRule.getContentResolver().update(
mSearchesUri, value, SearchColumns.ID + " = " + id, null);
cursor = mProviderTestRule.getContentResolver().query(mSearchesUri,
ChromeBrowserProvider.SEARCHES_PROJECTION, SearchColumns.ID + " = " + id, null,
ChromeBrowserProviderImpl.SEARCHES_PROJECTION, SearchColumns.ID + " = " + id, null,
null);
try {
Assert.assertTrue(cursor.moveToNext());
Assert.assertEquals(updateSearch,
cursor.getString(ChromeBrowserProvider.SEARCHES_PROJECTION_SEARCH_INDEX));
cursor.getString(ChromeBrowserProviderImpl.SEARCHES_PROJECTION_SEARCH_INDEX));
Assert.assertEquals(updateDate,
cursor.getLong(ChromeBrowserProvider.SEARCHES_PROJECTION_DATE_INDEX));
cursor.getLong(ChromeBrowserProviderImpl.SEARCHES_PROJECTION_DATE_INDEX));
Assert.assertEquals(id, cursor.getInt(idIndex));
} finally {
cursor.close();
......@@ -214,7 +214,7 @@ public class ProviderSearchesUriTest {
// Test: delete
mProviderTestRule.getContentResolver().delete(insertUri, null, null);
cursor = mProviderTestRule.getContentResolver().query(mSearchesUri,
ChromeBrowserProvider.SEARCHES_PROJECTION, SearchColumns.ID + " = " + id, null,
ChromeBrowserProviderImpl.SEARCHES_PROJECTION, SearchColumns.ID + " = " + id, null,
null);
try {
Assert.assertEquals(0, cursor.getCount());
......
......@@ -47,12 +47,12 @@ public class ProviderTestRule extends ChromeTabbedActivityTestRule {
final ContentProvider provider = new ChromeBrowserProvider();
TestThreadUtils.runOnUiThreadBlocking(() -> {
ProviderInfo providerInfo = new ProviderInfo();
providerInfo.authority = ChromeBrowserProvider.getApiAuthority(activity);
providerInfo.authority = ChromeBrowserProviderImpl.getApiAuthority(activity);
provider.attachInfo(activity, providerInfo);
});
MockContentResolver resolver = new MockContentResolver();
resolver.addProvider(ChromeBrowserProvider.getApiAuthority(activity), provider);
resolver.addProvider(ChromeBrowserProviderImpl.getApiAuthority(activity), provider);
mContext = new IsolatedContext(resolver, activity);
Assert.assertTrue(getContentResolver() instanceof MockContentResolver);
......
......@@ -20,7 +20,7 @@
#include "base/strings/utf_string_conversions.h"
#include "base/task/cancelable_task_tracker.h"
#include "base/time/time.h"
#include "chrome/android/chrome_jni_headers/ChromeBrowserProvider_jni.h"
#include "chrome/android/chrome_jni_headers/ChromeBrowserProviderImpl_jni.h"
#include "chrome/browser/android/provider/blocking_ui_thread_async_request.h"
#include "chrome/browser/android/provider/bookmark_model_task.h"
#include "chrome/browser/android/provider/run_on_ui_thread_blocking.h"
......@@ -99,7 +99,7 @@ const int64_t kInvalidBookmarkId = -1;
// ------------- Java-related utility methods ------------- //
jlong JNI_ChromeBrowserProvider_ConvertJLongObjectToPrimitive(
jlong JNI_ChromeBrowserProviderImpl_ConvertJLongObjectToPrimitive(
JNIEnv* env,
const JavaRef<jobject>& long_obj) {
ScopedJavaLocalRef<jclass> jlong_clazz = GetClass(env, "java/lang/Long");
......@@ -108,7 +108,7 @@ jlong JNI_ChromeBrowserProvider_ConvertJLongObjectToPrimitive(
return env->CallLongMethod(long_obj.obj(), long_value, nullptr);
}
jboolean JNI_ChromeBrowserProvider_ConvertJBooleanObjectToPrimitive(
jboolean JNI_ChromeBrowserProviderImpl_ConvertJBooleanObjectToPrimitive(
JNIEnv* env,
const JavaRef<jobject>& boolean_object) {
ScopedJavaLocalRef<jclass> jboolean_clazz =
......@@ -123,7 +123,7 @@ base::Time ConvertJlongToTime(jlong value) {
base::TimeDelta::FromMilliseconds((int64_t)value);
}
jint JNI_ChromeBrowserProvider_ConvertJIntegerToJint(
jint JNI_ChromeBrowserProviderImpl_ConvertJIntegerToJint(
JNIEnv* env,
const JavaRef<jobject>& integer_obj) {
ScopedJavaLocalRef<jclass> jinteger_clazz =
......@@ -712,7 +712,7 @@ class RemoveSearchTermsFromAPITask : public SearchTermTask {
// ------------- Other utility methods (may use tasks) ------------- //
// Fills the bookmark |row| with the given java objects.
void JNI_ChromeBrowserProvider_FillBookmarkRow(
void JNI_ChromeBrowserProviderImpl_FillBookmarkRow(
JNIEnv* env,
const JavaRef<jobject>& obj,
const JavaRef<jstring>& url,
......@@ -742,16 +742,18 @@ void JNI_ChromeBrowserProvider_FillBookmarkRow(
if (!created.is_null())
row->set_created(ConvertJlongToTime(
JNI_ChromeBrowserProvider_ConvertJLongObjectToPrimitive(env, created)));
JNI_ChromeBrowserProviderImpl_ConvertJLongObjectToPrimitive(env,
created)));
if (!isBookmark.is_null())
row->set_is_bookmark(
JNI_ChromeBrowserProvider_ConvertJBooleanObjectToPrimitive(env,
isBookmark));
JNI_ChromeBrowserProviderImpl_ConvertJBooleanObjectToPrimitive(
env, isBookmark));
if (!date.is_null())
row->set_last_visit_time(ConvertJlongToTime(
JNI_ChromeBrowserProvider_ConvertJLongObjectToPrimitive(env, date)));
JNI_ChromeBrowserProviderImpl_ConvertJLongObjectToPrimitive(env,
date)));
if (!favicon.is_null()) {
std::vector<uint8_t> bytes;
......@@ -764,7 +766,7 @@ void JNI_ChromeBrowserProvider_FillBookmarkRow(
if (!visits.is_null())
row->set_visit_count(
JNI_ChromeBrowserProvider_ConvertJIntegerToJint(env, visits));
JNI_ChromeBrowserProviderImpl_ConvertJIntegerToJint(env, visits));
// Make sure parent_id is always in the mobile_node branch.
IsInMobileBookmarksBranchTask task(model, model_loader);
......@@ -773,7 +775,7 @@ void JNI_ChromeBrowserProvider_FillBookmarkRow(
}
// Fills the bookmark |row| with the given java objects if it is not null.
void JNI_ChromeBrowserProvider_FillSearchRow(
void JNI_ChromeBrowserProviderImpl_FillSearchRow(
JNIEnv* env,
const JavaRef<jobject>& obj,
const JavaRef<jstring>& search_term,
......@@ -784,15 +786,17 @@ void JNI_ChromeBrowserProvider_FillSearchRow(
if (!date.is_null())
row->set_search_time(ConvertJlongToTime(
JNI_ChromeBrowserProvider_ConvertJLongObjectToPrimitive(env, date)));
JNI_ChromeBrowserProviderImpl_ConvertJLongObjectToPrimitive(env,
date)));
}
} // namespace
// ------------- Native initialization and destruction ------------- //
static jlong JNI_ChromeBrowserProvider_Init(JNIEnv* env,
const JavaParamRef<jobject>& obj) {
static jlong JNI_ChromeBrowserProviderImpl_Init(
JNIEnv* env,
const JavaParamRef<jobject>& obj) {
ChromeBrowserProvider* provider = new ChromeBrowserProvider(env, obj);
return reinterpret_cast<intptr_t>(provider);
}
......@@ -877,7 +881,7 @@ jlong ChromeBrowserProvider::AddBookmarkFromAPI(
DCHECK(url);
history::HistoryAndBookmarkRow row;
JNI_ChromeBrowserProvider_FillBookmarkRow(
JNI_ChromeBrowserProviderImpl_FillBookmarkRow(
env, obj, url, created, isBookmark, date, favicon, title, visits,
parent_id, &row, bookmark_model_, bookmark_model_loader_);
......@@ -959,7 +963,7 @@ jint ChromeBrowserProvider::UpdateBookmarkFromAPI(
const JavaParamRef<jstring>& selections,
const JavaParamRef<jobjectArray>& selection_args) {
history::HistoryAndBookmarkRow row;
JNI_ChromeBrowserProvider_FillBookmarkRow(
JNI_ChromeBrowserProviderImpl_FillBookmarkRow(
env, obj, url, created, isBookmark, date, favicon, title, visits,
parent_id, &row, bookmark_model_, bookmark_model_loader_);
......@@ -1016,7 +1020,8 @@ jlong ChromeBrowserProvider::AddSearchTermFromAPI(
DCHECK(search_term);
history::SearchRow row;
JNI_ChromeBrowserProvider_FillSearchRow(env, obj, search_term, date, &row);
JNI_ChromeBrowserProviderImpl_FillSearchRow(env, obj, search_term, date,
&row);
// URL must be valid.
if (row.search_term().empty()) {
......@@ -1092,7 +1097,8 @@ jint ChromeBrowserProvider::UpdateSearchTermFromAPI(
const JavaParamRef<jstring>& selections,
const JavaParamRef<jobjectArray>& selection_args) {
history::SearchRow row;
JNI_ChromeBrowserProvider_FillSearchRow(env, obj, search_term, date, &row);
JNI_ChromeBrowserProviderImpl_FillSearchRow(env, obj, search_term, date,
&row);
std::vector<base::string16> where_args;
AppendJavaStringArrayToStringVector(env, selection_args, &where_args);
......@@ -1145,14 +1151,14 @@ void ChromeBrowserProvider::BookmarkModelChanged() {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj;
if (GetJavaProviderOrDeleteSelf(&obj, env))
Java_ChromeBrowserProvider_onBookmarkChanged(env, obj);
Java_ChromeBrowserProviderImpl_onBookmarkChanged(env, obj);
}
void ChromeBrowserProvider::OnHistoryChanged() {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj;
if (GetJavaProviderOrDeleteSelf(&obj, env))
Java_ChromeBrowserProvider_onHistoryChanged(env, obj);
Java_ChromeBrowserProviderImpl_onHistoryChanged(env, obj);
}
void ChromeBrowserProvider::OnURLVisited(
......@@ -1178,7 +1184,7 @@ void ChromeBrowserProvider::OnKeywordSearchTermUpdated(
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj;
if (GetJavaProviderOrDeleteSelf(&obj, env))
Java_ChromeBrowserProvider_onSearchTermChanged(env, obj);
Java_ChromeBrowserProviderImpl_onSearchTermChanged(env, obj);
}
void ChromeBrowserProvider::OnKeywordSearchTermDeleted(
......
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