| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "android_webview/native/aw_contents_io_thread_client_impl.h" | 5 #include "android_webview/native/aw_contents_io_thread_client_impl.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 JavaObjectWeakGlobalRef io_thread_client; | 50 JavaObjectWeakGlobalRef io_thread_client; |
| 51 | 51 |
| 52 IoThreadClientData(); | 52 IoThreadClientData(); |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 IoThreadClientData::IoThreadClientData() : pending_association(false) {} | 55 IoThreadClientData::IoThreadClientData() : pending_association(false) {} |
| 56 | 56 |
| 57 typedef map<pair<int, int>, IoThreadClientData> | 57 typedef map<pair<int, int>, IoThreadClientData> |
| 58 RenderFrameHostToIoThreadClientType; | 58 RenderFrameHostToIoThreadClientType; |
| 59 | 59 |
| 60 // When browser side navigation is enabled, RenderFrameIDs do not have |
| 61 // valid render process host and render frame ids for frame navigations. |
| 62 // We need to identify these by using Frame Tree Node ids. |
| 63 typedef map<int, IoThreadClientData> FrameTreeNodeToIoThreadClientType; |
| 64 |
| 60 static pair<int, int> GetRenderFrameHostIdPair(RenderFrameHost* rfh) { | 65 static pair<int, int> GetRenderFrameHostIdPair(RenderFrameHost* rfh) { |
| 61 return pair<int, int>(rfh->GetProcess()->GetID(), rfh->GetRoutingID()); | 66 return pair<int, int>(rfh->GetProcess()->GetID(), rfh->GetRoutingID()); |
| 62 } | 67 } |
| 63 | 68 |
| 64 // RfhToIoThreadClientMap ----------------------------------------------------- | 69 // RfhToIoThreadClientMap ----------------------------------------------------- |
| 65 class RfhToIoThreadClientMap { | 70 class RfhToIoThreadClientMap { |
| 66 public: | 71 public: |
| 67 static RfhToIoThreadClientMap* GetInstance(); | 72 static RfhToIoThreadClientMap* GetInstance(); |
| 68 void Set(pair<int, int> rfh_id, const IoThreadClientData& client); | 73 void Set(pair<int, int> rfh_id, const IoThreadClientData& client); |
| 69 bool Get(pair<int, int> rfh_id, IoThreadClientData* client); | 74 bool Get(pair<int, int> rfh_id, IoThreadClientData* client); |
| 70 void Erase(pair<int, int> rfh_id); | 75 void Erase(pair<int, int> rfh_id); |
| 71 | 76 |
| 77 void Set(int frame_tree_node_id, const IoThreadClientData& client); |
| 78 bool Get(int frame_tree_node_id, IoThreadClientData* client); |
| 79 void Erase(int frame_tree_node_id); |
| 80 |
| 72 private: | 81 private: |
| 73 base::Lock map_lock_; | 82 base::Lock map_lock_; |
| 74 RenderFrameHostToIoThreadClientType rfh_to_io_thread_client_; | 83 RenderFrameHostToIoThreadClientType rfh_to_io_thread_client_; |
| 84 FrameTreeNodeToIoThreadClientType frame_tree_node_to_io_thread_client_; |
| 75 }; | 85 }; |
| 76 | 86 |
| 77 // static | 87 // static |
| 78 LazyInstance<RfhToIoThreadClientMap>::DestructorAtExit g_instance_ = | 88 LazyInstance<RfhToIoThreadClientMap>::DestructorAtExit g_instance_ = |
| 79 LAZY_INSTANCE_INITIALIZER; | 89 LAZY_INSTANCE_INITIALIZER; |
| 80 | 90 |
| 81 // static | 91 // static |
| 82 LazyInstance<JavaObjectWeakGlobalRef>::DestructorAtExit g_sw_instance_ = | 92 LazyInstance<JavaObjectWeakGlobalRef>::DestructorAtExit g_sw_instance_ = |
| 83 LAZY_INSTANCE_INITIALIZER; | 93 LAZY_INSTANCE_INITIALIZER; |
| 84 | 94 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 103 | 113 |
| 104 *client = iterator->second; | 114 *client = iterator->second; |
| 105 return true; | 115 return true; |
| 106 } | 116 } |
| 107 | 117 |
| 108 void RfhToIoThreadClientMap::Erase(pair<int, int> rfh_id) { | 118 void RfhToIoThreadClientMap::Erase(pair<int, int> rfh_id) { |
| 109 base::AutoLock lock(map_lock_); | 119 base::AutoLock lock(map_lock_); |
| 110 rfh_to_io_thread_client_.erase(rfh_id); | 120 rfh_to_io_thread_client_.erase(rfh_id); |
| 111 } | 121 } |
| 112 | 122 |
| 123 void RfhToIoThreadClientMap::Set(int frame_tree_node_id, |
| 124 const IoThreadClientData& client) { |
| 125 base::AutoLock lock(map_lock_); |
| 126 frame_tree_node_to_io_thread_client_[frame_tree_node_id] = client; |
| 127 } |
| 128 |
| 129 bool RfhToIoThreadClientMap::Get(int frame_tree_node_id, |
| 130 IoThreadClientData* client) { |
| 131 base::AutoLock lock(map_lock_); |
| 132 FrameTreeNodeToIoThreadClientType::iterator iterator = |
| 133 frame_tree_node_to_io_thread_client_.find(frame_tree_node_id); |
| 134 if (iterator == frame_tree_node_to_io_thread_client_.end()) |
| 135 return false; |
| 136 |
| 137 *client = iterator->second; |
| 138 return true; |
| 139 } |
| 140 |
| 141 void RfhToIoThreadClientMap::Erase(int frame_tree_node_id) { |
| 142 base::AutoLock lock(map_lock_); |
| 143 frame_tree_node_to_io_thread_client_.erase(frame_tree_node_id); |
| 144 } |
| 145 |
| 113 // ClientMapEntryUpdater ------------------------------------------------------ | 146 // ClientMapEntryUpdater ------------------------------------------------------ |
| 114 | 147 |
| 115 class ClientMapEntryUpdater : public content::WebContentsObserver { | 148 class ClientMapEntryUpdater : public content::WebContentsObserver { |
| 116 public: | 149 public: |
| 117 ClientMapEntryUpdater(JNIEnv* env, WebContents* web_contents, | 150 ClientMapEntryUpdater(JNIEnv* env, WebContents* web_contents, |
| 118 jobject jdelegate); | 151 jobject jdelegate); |
| 119 | 152 |
| 120 void RenderFrameCreated(RenderFrameHost* render_frame_host) override; | 153 void RenderFrameCreated(RenderFrameHost* render_frame_host) override; |
| 121 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; | 154 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; |
| 122 void WebContentsDestroyed() override; | 155 void WebContentsDestroyed() override; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 134 DCHECK(jdelegate); | 167 DCHECK(jdelegate); |
| 135 | 168 |
| 136 if (web_contents->GetMainFrame()) | 169 if (web_contents->GetMainFrame()) |
| 137 RenderFrameCreated(web_contents->GetMainFrame()); | 170 RenderFrameCreated(web_contents->GetMainFrame()); |
| 138 } | 171 } |
| 139 | 172 |
| 140 void ClientMapEntryUpdater::RenderFrameCreated(RenderFrameHost* rfh) { | 173 void ClientMapEntryUpdater::RenderFrameCreated(RenderFrameHost* rfh) { |
| 141 IoThreadClientData client_data; | 174 IoThreadClientData client_data; |
| 142 client_data.io_thread_client = jdelegate_; | 175 client_data.io_thread_client = jdelegate_; |
| 143 client_data.pending_association = false; | 176 client_data.pending_association = false; |
| 144 RfhToIoThreadClientMap::GetInstance()->Set( | 177 RfhToIoThreadClientMap::GetInstance()->Set(GetRenderFrameHostIdPair(rfh), |
| 145 GetRenderFrameHostIdPair(rfh), client_data); | 178 client_data); |
| 179 RfhToIoThreadClientMap::GetInstance()->Set(rfh->GetFrameTreeNodeId(), |
| 180 client_data); |
| 146 } | 181 } |
| 147 | 182 |
| 148 void ClientMapEntryUpdater::RenderFrameDeleted(RenderFrameHost* rfh) { | 183 void ClientMapEntryUpdater::RenderFrameDeleted(RenderFrameHost* rfh) { |
| 149 RfhToIoThreadClientMap::GetInstance()->Erase(GetRenderFrameHostIdPair(rfh)); | 184 RfhToIoThreadClientMap::GetInstance()->Erase(GetRenderFrameHostIdPair(rfh)); |
| 185 RfhToIoThreadClientMap::GetInstance()->Erase(rfh->GetFrameTreeNodeId()); |
| 150 } | 186 } |
| 151 | 187 |
| 152 void ClientMapEntryUpdater::WebContentsDestroyed() { | 188 void ClientMapEntryUpdater::WebContentsDestroyed() { |
| 153 delete this; | 189 delete this; |
| 154 } | 190 } |
| 155 | 191 |
| 156 } // namespace | 192 } // namespace |
| 157 | 193 |
| 158 // AwContentsIoThreadClientImpl ----------------------------------------------- | 194 // AwContentsIoThreadClientImpl ----------------------------------------------- |
| 159 | 195 |
| 160 // static | 196 // static |
| 161 std::unique_ptr<AwContentsIoThreadClient> AwContentsIoThreadClient::FromID( | 197 std::unique_ptr<AwContentsIoThreadClient> AwContentsIoThreadClient::FromID( |
| 162 int render_process_id, | 198 int render_process_id, |
| 163 int render_frame_id) { | 199 int render_frame_id) { |
| 164 pair<int, int> rfh_id(render_process_id, render_frame_id); | 200 pair<int, int> rfh_id(render_process_id, render_frame_id); |
| 165 IoThreadClientData client_data; | 201 IoThreadClientData client_data; |
| 166 if (!RfhToIoThreadClientMap::GetInstance()->Get(rfh_id, &client_data)) | 202 if (!RfhToIoThreadClientMap::GetInstance()->Get(rfh_id, &client_data)) |
| 167 return std::unique_ptr<AwContentsIoThreadClient>(); | 203 return std::unique_ptr<AwContentsIoThreadClient>(); |
| 168 | 204 |
| 169 JNIEnv* env = AttachCurrentThread(); | 205 JNIEnv* env = AttachCurrentThread(); |
| 170 ScopedJavaLocalRef<jobject> java_delegate = | 206 ScopedJavaLocalRef<jobject> java_delegate = |
| 171 client_data.io_thread_client.get(env); | 207 client_data.io_thread_client.get(env); |
| 172 DCHECK(!client_data.pending_association || java_delegate.is_null()); | 208 DCHECK(!client_data.pending_association || java_delegate.is_null()); |
| 173 return std::unique_ptr<AwContentsIoThreadClient>( | 209 return std::unique_ptr<AwContentsIoThreadClient>( |
| 174 new AwContentsIoThreadClientImpl(client_data.pending_association, | 210 new AwContentsIoThreadClientImpl(client_data.pending_association, |
| 175 java_delegate)); | 211 java_delegate)); |
| 176 } | 212 } |
| 177 | 213 |
| 214 std::unique_ptr<AwContentsIoThreadClient> AwContentsIoThreadClient::FromID( |
| 215 int frame_tree_node_id) { |
| 216 IoThreadClientData client_data; |
| 217 if (!RfhToIoThreadClientMap::GetInstance()->Get(frame_tree_node_id, |
| 218 &client_data)) |
| 219 return std::unique_ptr<AwContentsIoThreadClient>(); |
| 220 |
| 221 JNIEnv* env = AttachCurrentThread(); |
| 222 ScopedJavaLocalRef<jobject> java_delegate = |
| 223 client_data.io_thread_client.get(env); |
| 224 DCHECK(!client_data.pending_association || java_delegate.is_null()); |
| 225 return std::unique_ptr<AwContentsIoThreadClient>( |
| 226 new AwContentsIoThreadClientImpl(client_data.pending_association, |
| 227 java_delegate)); |
| 228 } |
| 229 |
| 178 // static | 230 // static |
| 179 void AwContentsIoThreadClient::SubFrameCreated(int render_process_id, | 231 void AwContentsIoThreadClient::SubFrameCreated(int render_process_id, |
| 180 int parent_render_frame_id, | 232 int parent_render_frame_id, |
| 181 int child_render_frame_id) { | 233 int child_render_frame_id) { |
| 182 pair<int, int> parent_rfh_id(render_process_id, parent_render_frame_id); | 234 pair<int, int> parent_rfh_id(render_process_id, parent_render_frame_id); |
| 183 pair<int, int> child_rfh_id(render_process_id, child_render_frame_id); | 235 pair<int, int> child_rfh_id(render_process_id, child_render_frame_id); |
| 184 IoThreadClientData client_data; | 236 IoThreadClientData client_data; |
| 185 if (!RfhToIoThreadClientMap::GetInstance()->Get(parent_rfh_id, | 237 if (!RfhToIoThreadClientMap::GetInstance()->Get(parent_rfh_id, |
| 186 &client_data)) { | 238 &client_data)) { |
| 187 NOTREACHED(); | 239 NOTREACHED(); |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 398 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 347 if (java_object_.is_null()) | 399 if (java_object_.is_null()) |
| 348 return false; | 400 return false; |
| 349 | 401 |
| 350 JNIEnv* env = AttachCurrentThread(); | 402 JNIEnv* env = AttachCurrentThread(); |
| 351 return Java_AwContentsIoThreadClient_shouldBlockNetworkLoads(env, | 403 return Java_AwContentsIoThreadClient_shouldBlockNetworkLoads(env, |
| 352 java_object_); | 404 java_object_); |
| 353 } | 405 } |
| 354 | 406 |
| 355 } // namespace android_webview | 407 } // namespace android_webview |
| OLD | NEW |