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

Unified Diff: android_webview/browser/aw_contents_io_thread_client_impl.cc

Issue 2889193004: [WebView] Replace AwContentsIoThreadClient, InputStream and AwWebResourceResponse (Closed)
Patch Set: fix test crash Created 3 years, 7 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: android_webview/browser/aw_contents_io_thread_client_impl.cc
diff --git a/android_webview/browser/aw_contents_io_thread_client_impl.cc b/android_webview/browser/aw_contents_io_thread_client_impl.cc
deleted file mode 100644
index c85a803491a4826cfd76bcd7c4cabc909825f28b..0000000000000000000000000000000000000000
--- a/android_webview/browser/aw_contents_io_thread_client_impl.cc
+++ /dev/null
@@ -1,413 +0,0 @@
-// Copyright (c) 2012 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 "android_webview/browser/aw_contents_io_thread_client_impl.h"
-
-#include <map>
-#include <memory>
-#include <utility>
-
-#include "android_webview/browser/aw_contents_background_thread_client.h"
-#include "android_webview/browser/aw_web_resource_response_impl.h"
-#include "android_webview/browser/net/aw_web_resource_request.h"
-#include "android_webview/common/devtools_instrumentation.h"
-#include "base/android/jni_array.h"
-#include "base/android/jni_string.h"
-#include "base/android/jni_weak_ref.h"
-#include "base/lazy_instance.h"
-#include "base/synchronization/lock.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/render_frame_host.h"
-#include "content/public/browser/render_process_host.h"
-#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/resource_request_info.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_contents_observer.h"
-#include "jni/AwContentsIoThreadClient_jni.h"
-#include "net/url_request/url_request.h"
-
-using base::android::AttachCurrentThread;
-using base::android::ConvertUTF8ToJavaString;
-using base::android::JavaRef;
-using base::android::ScopedJavaLocalRef;
-using base::android::ToJavaArrayOfStrings;
-using base::LazyInstance;
-using content::BrowserThread;
-using content::RenderFrameHost;
-using content::ResourceType;
-using content::WebContents;
-using std::map;
-using std::pair;
-using std::string;
-
-namespace android_webview {
-
-namespace {
-
-struct IoThreadClientData {
- bool pending_association;
- JavaObjectWeakGlobalRef io_thread_client;
-
- IoThreadClientData();
-};
-
-IoThreadClientData::IoThreadClientData() : pending_association(false) {}
-
-typedef map<pair<int, int>, IoThreadClientData>
- RenderFrameHostToIoThreadClientType;
-
-// When browser side navigation is enabled, RenderFrameIDs do not have
-// valid render process host and render frame ids for frame navigations.
-// We need to identify these by using Frame Tree Node ids.
-typedef map<int, IoThreadClientData> FrameTreeNodeToIoThreadClientType;
-
-static pair<int, int> GetRenderFrameHostIdPair(RenderFrameHost* rfh) {
- return pair<int, int>(rfh->GetProcess()->GetID(), rfh->GetRoutingID());
-}
-
-// RfhToIoThreadClientMap -----------------------------------------------------
-class RfhToIoThreadClientMap {
- public:
- static RfhToIoThreadClientMap* GetInstance();
- void Set(pair<int, int> rfh_id, const IoThreadClientData& client);
- bool Get(pair<int, int> rfh_id, IoThreadClientData* client);
- void Erase(pair<int, int> rfh_id);
-
- void Set(int frame_tree_node_id, const IoThreadClientData& client);
- bool Get(int frame_tree_node_id, IoThreadClientData* client);
- void Erase(int frame_tree_node_id);
-
- private:
- base::Lock map_lock_;
- RenderFrameHostToIoThreadClientType rfh_to_io_thread_client_;
- FrameTreeNodeToIoThreadClientType frame_tree_node_to_io_thread_client_;
-};
-
-// static
-LazyInstance<RfhToIoThreadClientMap>::DestructorAtExit g_instance_ =
- LAZY_INSTANCE_INITIALIZER;
-
-// static
-LazyInstance<JavaObjectWeakGlobalRef>::DestructorAtExit g_sw_instance_ =
- LAZY_INSTANCE_INITIALIZER;
-
-// static
-RfhToIoThreadClientMap* RfhToIoThreadClientMap::GetInstance() {
- return g_instance_.Pointer();
-}
-
-void RfhToIoThreadClientMap::Set(pair<int, int> rfh_id,
- const IoThreadClientData& client) {
- base::AutoLock lock(map_lock_);
- rfh_to_io_thread_client_[rfh_id] = client;
-}
-
-bool RfhToIoThreadClientMap::Get(pair<int, int> rfh_id,
- IoThreadClientData* client) {
- base::AutoLock lock(map_lock_);
- RenderFrameHostToIoThreadClientType::iterator iterator =
- rfh_to_io_thread_client_.find(rfh_id);
- if (iterator == rfh_to_io_thread_client_.end())
- return false;
-
- *client = iterator->second;
- return true;
-}
-
-void RfhToIoThreadClientMap::Erase(pair<int, int> rfh_id) {
- base::AutoLock lock(map_lock_);
- rfh_to_io_thread_client_.erase(rfh_id);
-}
-
-void RfhToIoThreadClientMap::Set(int frame_tree_node_id,
- const IoThreadClientData& client) {
- base::AutoLock lock(map_lock_);
- frame_tree_node_to_io_thread_client_[frame_tree_node_id] = client;
-}
-
-bool RfhToIoThreadClientMap::Get(int frame_tree_node_id,
- IoThreadClientData* client) {
- base::AutoLock lock(map_lock_);
- FrameTreeNodeToIoThreadClientType::iterator iterator =
- frame_tree_node_to_io_thread_client_.find(frame_tree_node_id);
- if (iterator == frame_tree_node_to_io_thread_client_.end())
- return false;
-
- *client = iterator->second;
- return true;
-}
-
-void RfhToIoThreadClientMap::Erase(int frame_tree_node_id) {
- base::AutoLock lock(map_lock_);
- frame_tree_node_to_io_thread_client_.erase(frame_tree_node_id);
-}
-
-// ClientMapEntryUpdater ------------------------------------------------------
-
-class ClientMapEntryUpdater : public content::WebContentsObserver {
- public:
- ClientMapEntryUpdater(JNIEnv* env,
- WebContents* web_contents,
- jobject jdelegate);
-
- void RenderFrameCreated(RenderFrameHost* render_frame_host) override;
- void RenderFrameDeleted(RenderFrameHost* render_frame_host) override;
- void WebContentsDestroyed() override;
-
- private:
- JavaObjectWeakGlobalRef jdelegate_;
-};
-
-ClientMapEntryUpdater::ClientMapEntryUpdater(JNIEnv* env,
- WebContents* web_contents,
- jobject jdelegate)
- : content::WebContentsObserver(web_contents), jdelegate_(env, jdelegate) {
- DCHECK(web_contents);
- DCHECK(jdelegate);
-
- if (web_contents->GetMainFrame())
- RenderFrameCreated(web_contents->GetMainFrame());
-}
-
-void ClientMapEntryUpdater::RenderFrameCreated(RenderFrameHost* rfh) {
- IoThreadClientData client_data;
- client_data.io_thread_client = jdelegate_;
- client_data.pending_association = false;
- RfhToIoThreadClientMap::GetInstance()->Set(GetRenderFrameHostIdPair(rfh),
- client_data);
- RfhToIoThreadClientMap::GetInstance()->Set(rfh->GetFrameTreeNodeId(),
- client_data);
-}
-
-void ClientMapEntryUpdater::RenderFrameDeleted(RenderFrameHost* rfh) {
- RfhToIoThreadClientMap::GetInstance()->Erase(GetRenderFrameHostIdPair(rfh));
- RfhToIoThreadClientMap::GetInstance()->Erase(rfh->GetFrameTreeNodeId());
-}
-
-void ClientMapEntryUpdater::WebContentsDestroyed() {
- delete this;
-}
-
-} // namespace
-
-// AwContentsIoThreadClientImpl -----------------------------------------------
-
-// static
-std::unique_ptr<AwContentsIoThreadClient> AwContentsIoThreadClient::FromID(
- int render_process_id,
- int render_frame_id) {
- pair<int, int> rfh_id(render_process_id, render_frame_id);
- IoThreadClientData client_data;
- if (!RfhToIoThreadClientMap::GetInstance()->Get(rfh_id, &client_data))
- return std::unique_ptr<AwContentsIoThreadClient>();
-
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> java_delegate =
- client_data.io_thread_client.get(env);
- DCHECK(!client_data.pending_association || java_delegate.is_null());
- return std::unique_ptr<AwContentsIoThreadClient>(
- new AwContentsIoThreadClientImpl(client_data.pending_association,
- java_delegate));
-}
-
-std::unique_ptr<AwContentsIoThreadClient> AwContentsIoThreadClient::FromID(
- int frame_tree_node_id) {
- IoThreadClientData client_data;
- if (!RfhToIoThreadClientMap::GetInstance()->Get(frame_tree_node_id,
- &client_data))
- return std::unique_ptr<AwContentsIoThreadClient>();
-
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> java_delegate =
- client_data.io_thread_client.get(env);
- DCHECK(!client_data.pending_association || java_delegate.is_null());
- return std::unique_ptr<AwContentsIoThreadClient>(
- new AwContentsIoThreadClientImpl(client_data.pending_association,
- java_delegate));
-}
-
-// static
-void AwContentsIoThreadClient::SubFrameCreated(int render_process_id,
- int parent_render_frame_id,
- int child_render_frame_id) {
- pair<int, int> parent_rfh_id(render_process_id, parent_render_frame_id);
- pair<int, int> child_rfh_id(render_process_id, child_render_frame_id);
- IoThreadClientData client_data;
- if (!RfhToIoThreadClientMap::GetInstance()->Get(parent_rfh_id,
- &client_data)) {
- NOTREACHED();
- return;
- }
-
- RfhToIoThreadClientMap::GetInstance()->Set(child_rfh_id, client_data);
-}
-
-// static
-void AwContentsIoThreadClientImpl::RegisterPendingContents(
- WebContents* web_contents) {
- IoThreadClientData client_data;
- client_data.pending_association = true;
- RfhToIoThreadClientMap::GetInstance()->Set(
- GetRenderFrameHostIdPair(web_contents->GetMainFrame()), client_data);
-}
-
-// static
-void AwContentsIoThreadClientImpl::Associate(WebContents* web_contents,
- const JavaRef<jobject>& jclient) {
- JNIEnv* env = AttachCurrentThread();
- // The ClientMapEntryUpdater lifespan is tied to the WebContents.
- new ClientMapEntryUpdater(env, web_contents, jclient.obj());
-}
-
-// static
-void AwContentsIoThreadClientImpl::SetServiceWorkerIoThreadClient(
- const base::android::JavaRef<jobject>& jclient,
- const base::android::JavaRef<jobject>& browser_context) {
- // TODO: currently there is only one browser context so it is ok to
- // store in a global variable, in the future use browser_context to
- // obtain the correct instance.
- JavaObjectWeakGlobalRef temp(AttachCurrentThread(), jclient.obj());
- g_sw_instance_.Get() = temp;
-}
-
-// static
-std::unique_ptr<AwContentsIoThreadClient>
-AwContentsIoThreadClient::GetServiceWorkerIoThreadClient() {
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> java_delegate = g_sw_instance_.Get().get(env);
-
- if (java_delegate.is_null())
- return std::unique_ptr<AwContentsIoThreadClient>();
-
- return std::unique_ptr<AwContentsIoThreadClient>(
- new AwContentsIoThreadClientImpl(false, java_delegate));
-}
-
-AwContentsIoThreadClientImpl::AwContentsIoThreadClientImpl(
- bool pending_association,
- const JavaRef<jobject>& obj)
- : pending_association_(pending_association), java_object_(obj) {}
-
-AwContentsIoThreadClientImpl::~AwContentsIoThreadClientImpl() {
- // explict, out-of-line destructor.
-}
-
-bool AwContentsIoThreadClientImpl::PendingAssociation() const {
- return pending_association_;
-}
-
-AwContentsIoThreadClient::CacheMode AwContentsIoThreadClientImpl::GetCacheMode()
- const {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (java_object_.is_null())
- return AwContentsIoThreadClient::LOAD_DEFAULT;
-
- JNIEnv* env = AttachCurrentThread();
- return static_cast<AwContentsIoThreadClient::CacheMode>(
- Java_AwContentsIoThreadClient_getCacheMode(env, java_object_));
-}
-
-namespace {
-
-std::unique_ptr<AwWebResourceResponse> RunShouldInterceptRequest(
- const AwWebResourceRequest& request,
- JavaObjectWeakGlobalRef ref) {
- DCHECK_CURRENTLY_ON(BrowserThread::FILE);
- JNIEnv* env = AttachCurrentThread();
- base::android::ScopedJavaLocalRef<jobject> obj = ref.get(env);
- if (obj.is_null())
- return nullptr;
-
- AwWebResourceRequest::AwJavaWebResourceRequest java_web_resource_request;
- AwWebResourceRequest::ConvertToJava(env, request, &java_web_resource_request);
-
- devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback(
- "shouldInterceptRequest");
- ScopedJavaLocalRef<jobject> ret =
- AwContentsBackgroundThreadClient::shouldInterceptRequest(
- env, obj, java_web_resource_request.jurl, request.is_main_frame,
- request.has_user_gesture, java_web_resource_request.jmethod,
- java_web_resource_request.jheader_names,
- java_web_resource_request.jheader_values);
- return std::unique_ptr<AwWebResourceResponse>(
- ret.is_null() ? nullptr : new AwWebResourceResponseImpl(ret));
-}
-
-std::unique_ptr<AwWebResourceResponse> ReturnNull() {
- return std::unique_ptr<AwWebResourceResponse>();
-}
-
-} // namespace
-
-void AwContentsIoThreadClientImpl::ShouldInterceptRequestAsync(
- const net::URLRequest* request,
- const ShouldInterceptRequestResultCallback callback) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- base::Callback<std::unique_ptr<AwWebResourceResponse>()> get_response =
- base::Bind(&ReturnNull);
- JNIEnv* env = AttachCurrentThread();
- if (bg_thread_client_object_.is_null() && !java_object_.is_null()) {
- bg_thread_client_object_.Reset(
- Java_AwContentsIoThreadClient_getBackgroundThreadClient(env,
- java_object_));
- }
- if (!bg_thread_client_object_.is_null()) {
- get_response = base::Bind(
- &RunShouldInterceptRequest, AwWebResourceRequest(*request),
- JavaObjectWeakGlobalRef(env, bg_thread_client_object_.obj()));
- }
- BrowserThread::PostTaskAndReplyWithResult(BrowserThread::FILE, FROM_HERE,
- get_response, callback);
-}
-
-bool AwContentsIoThreadClientImpl::ShouldBlockContentUrls() const {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (java_object_.is_null())
- return false;
-
- JNIEnv* env = AttachCurrentThread();
- return Java_AwContentsIoThreadClient_shouldBlockContentUrls(env,
- java_object_);
-}
-
-bool AwContentsIoThreadClientImpl::ShouldBlockFileUrls() const {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (java_object_.is_null())
- return false;
-
- JNIEnv* env = AttachCurrentThread();
- return Java_AwContentsIoThreadClient_shouldBlockFileUrls(env, java_object_);
-}
-
-bool AwContentsIoThreadClientImpl::ShouldAcceptThirdPartyCookies() const {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (java_object_.is_null())
- return false;
-
- JNIEnv* env = AttachCurrentThread();
- return Java_AwContentsIoThreadClient_shouldAcceptThirdPartyCookies(
- env, java_object_);
-}
-
-bool AwContentsIoThreadClientImpl::GetSafeBrowsingEnabled() const {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (java_object_.is_null())
- return false;
-
- JNIEnv* env = AttachCurrentThread();
- return Java_AwContentsIoThreadClient_getSafeBrowsingEnabled(env,
- java_object_);
-}
-
-bool AwContentsIoThreadClientImpl::ShouldBlockNetworkLoads() const {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (java_object_.is_null())
- return false;
-
- JNIEnv* env = AttachCurrentThread();
- return Java_AwContentsIoThreadClient_shouldBlockNetworkLoads(env,
- java_object_);
-}
-
-} // namespace android_webview

Powered by Google App Engine
This is Rietveld 408576698