| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "extensions/renderer/extension_frame_helper.h" | 5 #include "extensions/renderer/extension_frame_helper.h" |
| 6 | 6 |
| 7 #include "base/metrics/histogram_macros.h" | 7 #include "base/metrics/histogram_macros.h" |
| 8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
| 9 #include "base/timer/elapsed_timer.h" |
| 9 #include "content/public/renderer/render_frame.h" | 10 #include "content/public/renderer/render_frame.h" |
| 10 #include "extensions/common/api/messaging/message.h" | 11 #include "extensions/common/api/messaging/message.h" |
| 11 #include "extensions/common/constants.h" | 12 #include "extensions/common/constants.h" |
| 12 #include "extensions/common/extension_messages.h" | 13 #include "extensions/common/extension_messages.h" |
| 13 #include "extensions/common/manifest_handlers/background_info.h" | 14 #include "extensions/common/manifest_handlers/background_info.h" |
| 14 #include "extensions/renderer/console.h" | 15 #include "extensions/renderer/console.h" |
| 15 #include "extensions/renderer/content_watcher.h" | 16 #include "extensions/renderer/content_watcher.h" |
| 16 #include "extensions/renderer/dispatcher.h" | 17 #include "extensions/renderer/dispatcher.h" |
| 17 #include "extensions/renderer/messaging_bindings.h" | 18 #include "extensions/renderer/messaging_bindings.h" |
| 18 #include "extensions/renderer/script_context.h" | 19 #include "extensions/renderer/script_context.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 // callbacks that are added during the iteration. | 75 // callbacks that are added during the iteration. |
| 75 std::vector<base::Closure> callbacks; | 76 std::vector<base::Closure> callbacks; |
| 76 callbacks_to_be_run_and_cleared->swap(callbacks); | 77 callbacks_to_be_run_and_cleared->swap(callbacks); |
| 77 for (auto& callback : callbacks) { | 78 for (auto& callback : callbacks) { |
| 78 callback.Run(); | 79 callback.Run(); |
| 79 if (!frame_helper.get()) | 80 if (!frame_helper.get()) |
| 80 return; // Frame and ExtensionFrameHelper invalidated by callback. | 81 return; // Frame and ExtensionFrameHelper invalidated by callback. |
| 81 } | 82 } |
| 82 } | 83 } |
| 83 | 84 |
| 85 enum class PortType { |
| 86 EXTENSION, |
| 87 TAB, |
| 88 NATIVE_APP, |
| 89 }; |
| 90 |
| 84 } // namespace | 91 } // namespace |
| 85 | 92 |
| 93 struct ExtensionFrameHelper::PendingPortRequest { |
| 94 PendingPortRequest(PortType type, const base::Callback<void(int)>& callback) |
| 95 : type(type), callback(callback) {} |
| 96 ~PendingPortRequest() {} |
| 97 |
| 98 base::ElapsedTimer timer; |
| 99 PortType type; |
| 100 base::Callback<void(int)> callback; |
| 101 |
| 102 private: |
| 103 DISALLOW_COPY_AND_ASSIGN(PendingPortRequest); |
| 104 }; |
| 105 |
| 86 ExtensionFrameHelper::ExtensionFrameHelper(content::RenderFrame* render_frame, | 106 ExtensionFrameHelper::ExtensionFrameHelper(content::RenderFrame* render_frame, |
| 87 Dispatcher* extension_dispatcher) | 107 Dispatcher* extension_dispatcher) |
| 88 : content::RenderFrameObserver(render_frame), | 108 : content::RenderFrameObserver(render_frame), |
| 89 content::RenderFrameObserverTracker<ExtensionFrameHelper>(render_frame), | 109 content::RenderFrameObserverTracker<ExtensionFrameHelper>(render_frame), |
| 90 view_type_(VIEW_TYPE_INVALID), | 110 view_type_(VIEW_TYPE_INVALID), |
| 91 tab_id_(-1), | 111 tab_id_(-1), |
| 92 browser_window_id_(-1), | 112 browser_window_id_(-1), |
| 93 extension_dispatcher_(extension_dispatcher), | 113 extension_dispatcher_(extension_dispatcher), |
| 94 did_create_current_document_element_(false), | 114 did_create_current_document_element_(false), |
| 95 next_port_request_id_(0), | 115 next_port_request_id_(0), |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 const base::Closure& callback) { | 193 const base::Closure& callback) { |
| 174 document_load_finished_callbacks_.push_back(callback); | 194 document_load_finished_callbacks_.push_back(callback); |
| 175 } | 195 } |
| 176 | 196 |
| 177 void ExtensionFrameHelper::RequestPortId( | 197 void ExtensionFrameHelper::RequestPortId( |
| 178 const ExtensionMsg_ExternalConnectionInfo& info, | 198 const ExtensionMsg_ExternalConnectionInfo& info, |
| 179 const std::string& channel_name, | 199 const std::string& channel_name, |
| 180 bool include_tls_channel_id, | 200 bool include_tls_channel_id, |
| 181 const base::Callback<void(int)>& callback) { | 201 const base::Callback<void(int)>& callback) { |
| 182 int port_request_id = next_port_request_id_++; | 202 int port_request_id = next_port_request_id_++; |
| 183 pending_port_requests_[port_request_id] = callback; | 203 pending_port_requests_[port_request_id] = |
| 204 base::MakeUnique<PendingPortRequest>(PortType::EXTENSION, callback); |
| 184 { | 205 { |
| 185 SCOPED_UMA_HISTOGRAM_TIMER( | 206 SCOPED_UMA_HISTOGRAM_TIMER( |
| 186 "Extensions.Messaging.GetPortIdSyncTime.Extension"); | 207 "Extensions.Messaging.GetPortIdSyncTime.Extension"); |
| 187 render_frame()->Send(new ExtensionHostMsg_OpenChannelToExtension( | 208 render_frame()->Send(new ExtensionHostMsg_OpenChannelToExtension( |
| 188 render_frame()->GetRoutingID(), info, channel_name, | 209 render_frame()->GetRoutingID(), info, channel_name, |
| 189 include_tls_channel_id, port_request_id)); | 210 include_tls_channel_id, port_request_id)); |
| 190 } | 211 } |
| 191 } | 212 } |
| 192 | 213 |
| 193 void ExtensionFrameHelper::RequestTabPortId( | 214 void ExtensionFrameHelper::RequestTabPortId( |
| 194 const ExtensionMsg_TabTargetConnectionInfo& info, | 215 const ExtensionMsg_TabTargetConnectionInfo& info, |
| 195 const std::string& extension_id, | 216 const std::string& extension_id, |
| 196 const std::string& channel_name, | 217 const std::string& channel_name, |
| 197 const base::Callback<void(int)>& callback) { | 218 const base::Callback<void(int)>& callback) { |
| 198 int port_request_id = next_port_request_id_++; | 219 int port_request_id = next_port_request_id_++; |
| 199 pending_port_requests_[port_request_id] = callback; | 220 pending_port_requests_[port_request_id] = |
| 221 base::MakeUnique<PendingPortRequest>(PortType::TAB, callback); |
| 200 { | 222 { |
| 201 SCOPED_UMA_HISTOGRAM_TIMER("Extensions.Messaging.GetPortIdSyncTime.Tab"); | 223 SCOPED_UMA_HISTOGRAM_TIMER("Extensions.Messaging.GetPortIdSyncTime.Tab"); |
| 202 render_frame()->Send(new ExtensionHostMsg_OpenChannelToTab( | 224 render_frame()->Send(new ExtensionHostMsg_OpenChannelToTab( |
| 203 render_frame()->GetRoutingID(), info, extension_id, channel_name, | 225 render_frame()->GetRoutingID(), info, extension_id, channel_name, |
| 204 port_request_id)); | 226 port_request_id)); |
| 205 } | 227 } |
| 206 } | 228 } |
| 207 | 229 |
| 208 void ExtensionFrameHelper::RequestNativeAppPortId( | 230 void ExtensionFrameHelper::RequestNativeAppPortId( |
| 209 const std::string& native_app_name, | 231 const std::string& native_app_name, |
| 210 const base::Callback<void(int)>& callback) { | 232 const base::Callback<void(int)>& callback) { |
| 211 int port_request_id = next_port_request_id_++; | 233 int port_request_id = next_port_request_id_++; |
| 212 pending_port_requests_[port_request_id] = callback; | 234 pending_port_requests_[port_request_id] = |
| 235 base::MakeUnique<PendingPortRequest>(PortType::NATIVE_APP, callback); |
| 213 { | 236 { |
| 214 SCOPED_UMA_HISTOGRAM_TIMER( | 237 SCOPED_UMA_HISTOGRAM_TIMER( |
| 215 "Extensions.Messaging.GetPortIdSyncTime.NativeApp"); | 238 "Extensions.Messaging.GetPortIdSyncTime.NativeApp"); |
| 216 render_frame()->Send(new ExtensionHostMsg_OpenChannelToNativeApp( | 239 render_frame()->Send(new ExtensionHostMsg_OpenChannelToNativeApp( |
| 217 render_frame()->GetRoutingID(), native_app_name, port_request_id)); | 240 render_frame()->GetRoutingID(), native_app_name, port_request_id)); |
| 218 } | 241 } |
| 219 } | 242 } |
| 220 | 243 |
| 221 void ExtensionFrameHelper::DidMatchCSS( | 244 void ExtensionFrameHelper::DidMatchCSS( |
| 222 const blink::WebVector<blink::WebString>& newly_matching_selectors, | 245 const blink::WebVector<blink::WebString>& newly_matching_selectors, |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 const base::ListValue& args, | 357 const base::ListValue& args, |
| 335 bool user_gesture) { | 358 bool user_gesture) { |
| 336 extension_dispatcher_->InvokeModuleSystemMethod(render_frame(), extension_id, | 359 extension_dispatcher_->InvokeModuleSystemMethod(render_frame(), extension_id, |
| 337 module_name, function_name, | 360 module_name, function_name, |
| 338 args, user_gesture); | 361 args, user_gesture); |
| 339 } | 362 } |
| 340 | 363 |
| 341 void ExtensionFrameHelper::OnAssignPortId(int port_id, int request_id) { | 364 void ExtensionFrameHelper::OnAssignPortId(int port_id, int request_id) { |
| 342 auto iter = pending_port_requests_.find(request_id); | 365 auto iter = pending_port_requests_.find(request_id); |
| 343 DCHECK(iter != pending_port_requests_.end()); | 366 DCHECK(iter != pending_port_requests_.end()); |
| 344 iter->second.Run(port_id); | 367 PendingPortRequest& request = *iter->second; |
| 368 switch (request.type) { |
| 369 case PortType::EXTENSION: { |
| 370 UMA_HISTOGRAM_TIMES("Extensions.Messaging.GetPortIdAsyncTime.Extension", |
| 371 request.timer.Elapsed()); |
| 372 break; |
| 373 } |
| 374 case PortType::TAB: { |
| 375 UMA_HISTOGRAM_TIMES("Extensions.Messaging.GetPortIdAsyncTime.Tab", |
| 376 request.timer.Elapsed()); |
| 377 break; |
| 378 } |
| 379 case PortType::NATIVE_APP: { |
| 380 UMA_HISTOGRAM_TIMES("Extensions.Messaging.GetPortIdAsyncTime.NativeApp", |
| 381 request.timer.Elapsed()); |
| 382 break; |
| 383 } |
| 384 } |
| 385 request.callback.Run(port_id); |
| 345 pending_port_requests_.erase(iter); | 386 pending_port_requests_.erase(iter); |
| 346 } | 387 } |
| 347 | 388 |
| 348 void ExtensionFrameHelper::OnDestruct() { | 389 void ExtensionFrameHelper::OnDestruct() { |
| 349 delete this; | 390 delete this; |
| 350 } | 391 } |
| 351 | 392 |
| 352 } // namespace extensions | 393 } // namespace extensions |
| OLD | NEW |