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); |
+} |