Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Unified Diff: components/web_restriction/content_resolver_web_restriction_provider.cc

Issue 1423713015: [WIP] WebRestrictions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: continue review in split cl Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/web_restriction/content_resolver_web_restriction_provider.cc
diff --git a/components/web_restriction/content_resolver_web_restriction_provider.cc b/components/web_restriction/content_resolver_web_restriction_provider.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2ba9ad6d21a5c2ca3b6545a786f4640c1c8f4328
--- /dev/null
+++ b/components/web_restriction/content_resolver_web_restriction_provider.cc
@@ -0,0 +1,156 @@
+// 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.
+
+#include "components/web_restriction/content_resolver_web_restriction_provider.h"
+
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/bind.h"
+#include "base/location.h"
+#include "base/thread_task_runner_handle.h"
+#include "jni/ContentResolverWebRestrictionProvider_jni.h"
+
+namespace {
+const size_t kMaxCacheSize = 100;
+} // namespace
+
+namespace web_restriction {
+namespace android {
+
+SelfDeletingCallback::SelfDeletingCallback(
+ const GURL& url,
+ const base::Callback<void(bool)>& callback,
+ const scoped_refptr<base::TaskRunner>& callback_runner,
+ ContentResolverWebRestrictionProvider* provider)
+ : url_(url),
+ callback_(callback),
+ callback_runner_(callback_runner),
+ provider_(provider) {}
+
+SelfDeletingCallback::~SelfDeletingCallback() {}
+
+void SelfDeletingCallback::ShouldProceed(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj,
+ jboolean should_proceed,
+ const base::android::JavaParamRef<jstring>& j_error_page) {
+ auto& url_access_cache = provider_->url_access_cache_;
+ auto& error_page_cache = provider_->error_page_cache_;
+ auto& recent_urls = provider_->recent_urls_;
+ url_access_cache.erase(url_);
+ error_page_cache.erase(url_);
+ recent_urls.remove(url_);
+ if (recent_urls.size() >= kMaxCacheSize) {
+ url_access_cache.erase(recent_urls.back());
+ error_page_cache.erase(recent_urls.back());
+ recent_urls.pop_back();
+ }
+ recent_urls.push_front(url_);
+ url_access_cache[url_] = should_proceed;
+ if (!j_error_page.is_null()) {
+ error_page_cache[url_] =
+ base::android::ConvertJavaStringToUTF8(j_error_page);
+ }
+ callback_runner_->PostTask(FROM_HERE, base::Bind(callback_, should_proceed));
+ delete this;
+}
+void SelfDeletingCallback::RequestSuccess(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj,
+ jboolean request_success) {
+ callback_runner_->PostTask(FROM_HERE, base::Bind(callback_, request_success));
+ delete this;
+}
+
+} // namespace android
+
+// static
+bool ContentResolverWebRestrictionProvider::Register(JNIEnv* env) {
+ return android::RegisterNativesImpl(env);
+}
+
+ContentResolverWebRestrictionProvider::ContentResolverWebRestrictionProvider() {
+ initialized_ = false;
+}
+
+ContentResolverWebRestrictionProvider::
+ ~ContentResolverWebRestrictionProvider() {}
+
+void ContentResolverWebRestrictionProvider::Initialize(
+ const std::string& content_provider_authority) {
+ DCHECK(!content_provider_authority.empty());
+ JNIEnv* env = base::android::AttachCurrentThread();
+ java_provider_.Reset(
+ android::Java_ContentResolverWebRestrictionProvider_create(
+ env, base::android::ConvertUTF8ToJavaString(
+ env, content_provider_authority)
+ .obj()));
+ supports_request_ =
+ android::Java_ContentResolverWebRestrictionProvider_supportsRequest(
+ env, java_provider_.obj());
+ error_page_cache_.clear();
+ url_access_cache_.clear();
+ recent_urls_.clear();
+ initialized_ = true;
+}
+
+UrlAccess ContentResolverWebRestrictionProvider::ShouldProceed(
+ bool is_main_frame,
+ const GURL& url,
+ const base::Callback<void(bool)>& callback) {
+ if (!initialized_)
+ return ALLOW;
+ auto iter = url_access_cache_.find(url);
+ if (iter != url_access_cache_.end()) {
+ // Move the url to the front of the cache.
+ recent_urls_.remove(url);
+ recent_urls_.push_front(url);
+ return iter->second ? ALLOW : DISALLOW;
+ }
+ scoped_refptr<base::SingleThreadTaskRunner> callback_runner =
+ base::ThreadTaskRunnerHandle::Get();
+ android::SelfDeletingCallback* wrapped_callback =
+ new android::SelfDeletingCallback(url, callback, callback_runner, this);
+ JNIEnv* env = base::android::AttachCurrentThread();
+ android::Java_ContentResolverWebRestrictionProvider_shouldProceed(
+ env, java_provider_.obj(), reinterpret_cast<jlong>(wrapped_callback),
+ base::android::ConvertUTF8ToJavaString(env, url.spec()).obj());
+ return PENDING;
+}
+
+bool ContentResolverWebRestrictionProvider::SupportsRequest() const {
+ return initialized_ && supports_request_;
+}
+
+bool ContentResolverWebRestrictionProvider::GetErrorHtml(
+ const GURL& url,
+ std::string* error_page) const {
+ if (!initialized_)
+ return false;
+ auto iter = error_page_cache_.find(url);
+ if (iter == error_page_cache_.end())
+ return false;
+ *error_page = iter->second;
+ return true;
+}
+
+void ContentResolverWebRestrictionProvider::RequestPermission(
+ const GURL& url,
+ const base::Callback<void(bool)>& request_success) {
+ if (!initialized_) {
+ request_success.Run(false);
+ return;
+ }
+ scoped_refptr<base::SingleThreadTaskRunner> callback_runner =
+ base::ThreadTaskRunnerHandle::Get();
+ android::SelfDeletingCallback* wrapped_callback =
+ new android::SelfDeletingCallback(url, request_success, callback_runner,
+ this);
+ JNIEnv* env = base::android::AttachCurrentThread();
+ android::Java_ContentResolverWebRestrictionProvider_requestPermission(
+ env, java_provider_.obj(), reinterpret_cast<jlong>(wrapped_callback),
+ base::android::ConvertUTF8ToJavaString(env, url.spec()).obj());
+}
+
+} // namespace web_restriction

Powered by Google App Engine
This is Rietveld 408576698