| Index: components/web_restrictions/browser/web_restrictions_client.cc
 | 
| diff --git a/components/web_restrictions/browser/web_restrictions_client.cc b/components/web_restrictions/browser/web_restrictions_client.cc
 | 
| index 3818c532793cad3eb107dd4241b99a66215602ec..f263743b2992fb79fbbf72d125184cb77d25a167 100644
 | 
| --- a/components/web_restrictions/browser/web_restrictions_client.cc
 | 
| +++ b/components/web_restrictions/browser/web_restrictions_client.cc
 | 
| @@ -5,13 +5,14 @@
 | 
|  #include "components/web_restrictions/browser/web_restrictions_client.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 "content/public/browser/browser_thread.h"
 | 
|  #include "jni/WebRestrictionsClient_jni.h"
 | 
|  
 | 
| +using base::android::ScopedJavaGlobalRef;
 | 
| +
 | 
|  namespace web_restrictions {
 | 
|  
 | 
|  namespace {
 | 
| @@ -95,10 +96,13 @@ UrlAccess WebRestrictionsClient::ShouldProceed(
 | 
|    DCHECK(single_thread_task_runner_->BelongsToCurrentThread());
 | 
|    if (!initialized_)
 | 
|      return ALLOW;
 | 
| -  auto iter = url_access_cache_.find(url);
 | 
| -  if (iter != url_access_cache_.end()) {
 | 
| +  auto iter = cache_.find(url);
 | 
| +  if (iter != cache_.end()) {
 | 
|      RecordURLAccess(url);
 | 
| -    return iter->second ? ALLOW : DISALLOW;
 | 
| +    JNIEnv* env = base::android::AttachCurrentThread();
 | 
| +    return Java_ShouldProceedResult_shouldProceed(env, iter->second.obj())
 | 
| +               ? ALLOW
 | 
| +               : DISALLOW;
 | 
|    }
 | 
|    base::PostTaskAndReplyWithResult(
 | 
|        background_task_runner_.get(), FROM_HERE,
 | 
| @@ -114,16 +118,58 @@ bool WebRestrictionsClient::SupportsRequest() const {
 | 
|    return initialized_ && supports_request_;
 | 
|  }
 | 
|  
 | 
| -bool WebRestrictionsClient::GetErrorHtml(const GURL& url,
 | 
| -                                         std::string* error_page) const {
 | 
| +int WebRestrictionsClient::GetResultColumnCount(const GURL& url) const {
 | 
|    DCHECK(single_thread_task_runner_->BelongsToCurrentThread());
 | 
|    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;
 | 
| +    return 0;
 | 
| +  auto iter = cache_.find(url);
 | 
| +  if (iter == cache_.end())
 | 
| +    return 0;
 | 
| +  return Java_ShouldProceedResult_getColumnCount(
 | 
| +      base::android::AttachCurrentThread(), iter->second.obj());
 | 
| +}
 | 
| +
 | 
| +std::string WebRestrictionsClient::GetResultColumnName(const GURL& url,
 | 
| +                                                       int column) const {
 | 
| +  DCHECK(single_thread_task_runner_->BelongsToCurrentThread());
 | 
| +  if (!initialized_)
 | 
| +    return std::string();
 | 
| +  auto iter = cache_.find(url);
 | 
| +  if (iter == cache_.end())
 | 
| +    return std::string();
 | 
| +
 | 
| +  JNIEnv* env = base::android::AttachCurrentThread();
 | 
| +  return base::android::ConvertJavaStringToUTF8(
 | 
| +      env,
 | 
| +      Java_ShouldProceedResult_getColumnName(env, iter->second.obj(), column)
 | 
| +          .obj());
 | 
| +}
 | 
| +
 | 
| +int WebRestrictionsClient::GetResultIntValue(const GURL& url,
 | 
| +                                             int column) const {
 | 
| +  DCHECK(single_thread_task_runner_->BelongsToCurrentThread());
 | 
| +  if (!initialized_)
 | 
| +    return 0;
 | 
| +  auto iter = cache_.find(url);
 | 
| +  if (iter == cache_.end())
 | 
| +    return 0;
 | 
| +  return Java_ShouldProceedResult_getInt(base::android::AttachCurrentThread(),
 | 
| +                                         iter->second.obj(), column);
 | 
| +}
 | 
| +
 | 
| +std::string WebRestrictionsClient::GetResultStringValue(const GURL& url,
 | 
| +                                                        int column) const {
 | 
| +  DCHECK(single_thread_task_runner_->BelongsToCurrentThread());
 | 
| +  if (!initialized_)
 | 
| +    return std::string();
 | 
| +  auto iter = cache_.find(url);
 | 
| +  if (iter == cache_.end())
 | 
| +    return std::string();
 | 
| +
 | 
| +  JNIEnv* env = base::android::AttachCurrentThread();
 | 
| +  return base::android::ConvertJavaStringToUTF8(
 | 
| +      env, Java_ShouldProceedResult_getString(env, iter->second.obj(), column)
 | 
| +               .obj());
 | 
|  }
 | 
|  
 | 
|  void WebRestrictionsClient::RequestPermission(
 | 
| @@ -153,8 +199,7 @@ void WebRestrictionsClient::RecordURLAccess(const GURL& url) {
 | 
|  
 | 
|  void WebRestrictionsClient::UpdateCache(std::string provider_authority,
 | 
|                                          GURL url,
 | 
| -                                        bool should_proceed,
 | 
| -                                        std::string error_page) {
 | 
| +                                        ScopedJavaGlobalRef<jobject> result) {
 | 
|    DCHECK(single_thread_task_runner_->BelongsToCurrentThread());
 | 
|    // If the webrestrictions provider changed when the old one was being queried,
 | 
|    // do not update the cache for the new provider.
 | 
| @@ -162,16 +207,10 @@ void WebRestrictionsClient::UpdateCache(std::string provider_authority,
 | 
|      return;
 | 
|    RecordURLAccess(url);
 | 
|    if (recent_urls_.size() >= kMaxCacheSize) {
 | 
| -    url_access_cache_.erase(recent_urls_.back());
 | 
| -    error_page_cache_.erase(recent_urls_.back());
 | 
| +    cache_.erase(recent_urls_.back());
 | 
|      recent_urls_.pop_back();
 | 
|    }
 | 
| -  url_access_cache_[url] = should_proceed;
 | 
| -  if (!error_page.empty()) {
 | 
| -    error_page_cache_[url] = error_page;
 | 
| -  } else {
 | 
| -    error_page_cache_.erase(url);
 | 
| -  }
 | 
| +  cache_[url] = result;
 | 
|  }
 | 
|  
 | 
|  void WebRestrictionsClient::RequestSupportKnown(std::string provider_authority,
 | 
| @@ -190,37 +229,27 @@ void WebRestrictionsClient::OnShouldProceedComplete(
 | 
|      std::string provider_authority,
 | 
|      const GURL& url,
 | 
|      const base::Callback<void(bool)>& callback,
 | 
| -    const ShouldProceedResult& result) {
 | 
| -  UpdateCache(provider_authority, url, result.ok_to_proceed, result.error_page);
 | 
| -  callback.Run(result.ok_to_proceed);
 | 
| +    const ScopedJavaGlobalRef<jobject>& result) {
 | 
| +  UpdateCache(provider_authority, url, result);
 | 
| +  JNIEnv* env = base::android::AttachCurrentThread();
 | 
| +  callback.Run(Java_ShouldProceedResult_shouldProceed(env, result.obj()));
 | 
|  }
 | 
|  
 | 
|  void WebRestrictionsClient::ClearCache() {
 | 
|    DCHECK(single_thread_task_runner_->BelongsToCurrentThread());
 | 
| -  error_page_cache_.clear();
 | 
| -  url_access_cache_.clear();
 | 
| +  cache_.clear();
 | 
|    recent_urls_.clear();
 | 
|  }
 | 
|  
 | 
|  // static
 | 
| -WebRestrictionsClient::ShouldProceedResult
 | 
| -WebRestrictionsClient::ShouldProceedTask(
 | 
| +ScopedJavaGlobalRef<jobject> WebRestrictionsClient::ShouldProceedTask(
 | 
|      const GURL& url,
 | 
|      const base::android::JavaRef<jobject>& java_provider) {
 | 
| -  WebRestrictionsClient::ShouldProceedResult result;
 | 
|    JNIEnv* env = base::android::AttachCurrentThread();
 | 
| -  base::android::ScopedJavaLocalRef<jobject> j_result =
 | 
| +  base::android::ScopedJavaGlobalRef<jobject> result(
 | 
|        Java_WebRestrictionsClient_shouldProceed(
 | 
|            env, java_provider.obj(),
 | 
| -          base::android::ConvertUTF8ToJavaString(env, url.spec()).obj());
 | 
| -  result.ok_to_proceed =
 | 
| -      Java_ShouldProceedResult_shouldProceed(env, j_result.obj());
 | 
| -  base::android::ScopedJavaLocalRef<jstring> j_error_page =
 | 
| -      Java_ShouldProceedResult_getErrorPage(env, j_result.obj());
 | 
| -  if (!j_error_page.is_null()) {
 | 
| -    base::android::ConvertJavaStringToUTF8(env, j_error_page.obj(),
 | 
| -                                           &result.error_page);
 | 
| -  }
 | 
| +          base::android::ConvertUTF8ToJavaString(env, url.spec()).obj()));
 | 
|    return result;
 | 
|  }
 | 
|  
 | 
| 
 |