| Index: components/web_restrictions/java/src/org/chromium/components/webrestrictions/ContentResolverWebRestrictionsProvider.java
|
| diff --git a/components/web_restrictions/java/src/org/chromium/components/webrestrictions/ContentResolverWebRestrictionsProvider.java b/components/web_restrictions/java/src/org/chromium/components/webrestrictions/ContentResolverWebRestrictionsProvider.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e82484a3d545829f7433e615bfc1874a635d5626
|
| --- /dev/null
|
| +++ b/components/web_restrictions/java/src/org/chromium/components/webrestrictions/ContentResolverWebRestrictionsProvider.java
|
| @@ -0,0 +1,111 @@
|
| +// Copyright 2015 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.components.webrestrictions;
|
| +
|
| +import android.content.ContentResolver;
|
| +import android.content.ContentValues;
|
| +import android.database.ContentObserver;
|
| +import android.database.Cursor;
|
| +import android.net.Uri;
|
| +import android.text.TextUtils;
|
| +
|
| +import org.chromium.base.ContextUtils;
|
| +import org.chromium.base.annotations.CalledByNative;
|
| +import org.chromium.base.annotations.JNINamespace;
|
| +
|
| +/**
|
| + * This class acts as an interface that talks to the content provider which actually implements the
|
| + * web restriction provider.
|
| + */
|
| +@JNINamespace("web_restrictions")
|
| +public class ContentResolverWebRestrictionsProvider {
|
| + private final Uri mQueryUri;
|
| + private final Uri mRequestUri;
|
| + private final ContentObserver mContentObserver;
|
| + private final ContentResolver mContentResolver;
|
| +
|
| + /**
|
| + * Start the web restriction provider and setup the content resolver.
|
| + */
|
| + private ContentResolverWebRestrictionsProvider(String authority, final long nativeProvider) {
|
| + assert !TextUtils.isEmpty(authority);
|
| + Uri baseUri = new Uri.Builder().scheme("content").authority(authority).build();
|
| + mQueryUri = Uri.withAppendedPath(baseUri, "authorized");
|
| + mRequestUri = Uri.withAppendedPath(baseUri, "requested");
|
| + mContentResolver = ContextUtils.getApplicationContext().getContentResolver();
|
| + mContentObserver = new ContentObserver(null) {
|
| + @Override
|
| + public void onChange(boolean selfChange) {
|
| + onChange(selfChange, null);
|
| + }
|
| +
|
| + @Override
|
| + public void onChange(boolean selfChange, Uri uri) {
|
| + nativeNotifyWebRestrictionsChanged(nativeProvider);
|
| + }
|
| + };
|
| + mContentResolver.registerContentObserver(baseUri, true, mContentObserver);
|
| + }
|
| +
|
| + /**
|
| + * Simple helper method to expose the constructor over JNI.
|
| + */
|
| + @CalledByNative
|
| + private static ContentResolverWebRestrictionsProvider create(
|
| + String authority, long nativeProvider) {
|
| + return new ContentResolverWebRestrictionsProvider(authority, nativeProvider);
|
| + }
|
| +
|
| + /**
|
| + * @return whether the web restriction provider supports requesting access for a blocked url.
|
| + */
|
| + @CalledByNative
|
| + private boolean supportsRequest() {
|
| + return mContentResolver != null && mContentResolver.getType(mRequestUri) != null;
|
| + }
|
| +
|
| + /**
|
| + * Called when the ContentResolverWebRestrictionsProvider is about to be destroyed.
|
| + */
|
| + @CalledByNative
|
| + private void onDestroy() {
|
| + mContentResolver.unregisterContentObserver(mContentObserver);
|
| + }
|
| +
|
| + /**
|
| + * Whether we can proceed with loading the {@code url}.
|
| + * In case the url is not to be loaded, the web restriction provider can return an optional
|
| + * error page to show instead.
|
| + */
|
| + @CalledByNative
|
| + private void shouldProceed(final long nativeCallback, final String url) {
|
| + String select = String.format("url = '%s'", url);
|
| + Cursor result = mContentResolver.query(mQueryUri, null, select, null, null);
|
| + boolean shouldProceed = result == null || result.getInt(0) > 0;
|
| + String errorPage = shouldProceed ? null : result.getString(1);
|
| + nativeShouldProceed(nativeCallback, shouldProceed, errorPage);
|
| + }
|
| +
|
| + /**
|
| + * Request permission to load the {@code url}.
|
| + * The web restriction provider returns a {@code boolean} variable indicating whether it was
|
| + * able to forward the request to the appropriate authority who can approve it.
|
| + */
|
| + @CalledByNative
|
| + private void requestPermission(final long nativeCallback, final String url) {
|
| + ContentValues values = new ContentValues(1);
|
| + values.put("url", url);
|
| + boolean requestSuccess = mContentResolver.insert(mRequestUri, values) != null;
|
| + nativeRequestSuccess(nativeCallback, requestSuccess);
|
| + }
|
| +
|
| + private static native void nativeShouldProceed(
|
| + long ptrSelfDeletingCallback, boolean shouldProceed, String errorPage);
|
| +
|
| + private static native void nativeRequestSuccess(
|
| + long ptrSelfDeletingCallback, boolean requestSuccess);
|
| +
|
| + private static native void nativeNotifyWebRestrictionsChanged(long ptrProvider);
|
| +}
|
|
|