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 |