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 "content/renderer/render_frame_impl.h" | 5 #include "content/renderer/render_frame_impl.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 11 matching lines...) Expand all Loading... |
22 #include "base/memory/shared_memory.h" | 22 #include "base/memory/shared_memory.h" |
23 #include "base/memory/weak_ptr.h" | 23 #include "base/memory/weak_ptr.h" |
24 #include "base/metrics/field_trial.h" | 24 #include "base/metrics/field_trial.h" |
25 #include "base/metrics/histogram.h" | 25 #include "base/metrics/histogram.h" |
26 #include "base/process/process.h" | 26 #include "base/process/process.h" |
27 #include "base/stl_util.h" | 27 #include "base/stl_util.h" |
28 #include "base/strings/string16.h" | 28 #include "base/strings/string16.h" |
29 #include "base/strings/utf_string_conversions.h" | 29 #include "base/strings/utf_string_conversions.h" |
30 #include "base/thread_task_runner_handle.h" | 30 #include "base/thread_task_runner_handle.h" |
31 #include "base/time/time.h" | 31 #include "base/time/time.h" |
| 32 #include "base/trace_event/trace_event_argument.h" |
32 #include "build/build_config.h" | 33 #include "build/build_config.h" |
33 #include "cc/base/switches.h" | 34 #include "cc/base/switches.h" |
34 #include "components/scheduler/renderer/renderer_scheduler.h" | 35 #include "components/scheduler/renderer/renderer_scheduler.h" |
35 #include "content/child/appcache/appcache_dispatcher.h" | 36 #include "content/child/appcache/appcache_dispatcher.h" |
36 #include "content/child/permissions/permission_dispatcher.h" | 37 #include "content/child/permissions/permission_dispatcher.h" |
37 #include "content/child/plugin_messages.h" | 38 #include "content/child/plugin_messages.h" |
38 #include "content/child/quota_dispatcher.h" | 39 #include "content/child/quota_dispatcher.h" |
39 #include "content/child/request_extra_data.h" | 40 #include "content/child/request_extra_data.h" |
40 #include "content/child/service_worker/service_worker_handle_reference.h" | 41 #include "content/child/service_worker/service_worker_handle_reference.h" |
41 #include "content/child/service_worker/service_worker_network_provider.h" | 42 #include "content/child/service_worker/service_worker_network_provider.h" |
(...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 geolocation_dispatcher_(NULL), | 1015 geolocation_dispatcher_(NULL), |
1015 push_messaging_dispatcher_(NULL), | 1016 push_messaging_dispatcher_(NULL), |
1016 presentation_dispatcher_(NULL), | 1017 presentation_dispatcher_(NULL), |
1017 screen_orientation_dispatcher_(NULL), | 1018 screen_orientation_dispatcher_(NULL), |
1018 manifest_manager_(NULL), | 1019 manifest_manager_(NULL), |
1019 accessibility_mode_(AccessibilityModeOff), | 1020 accessibility_mode_(AccessibilityModeOff), |
1020 renderer_accessibility_(NULL), | 1021 renderer_accessibility_(NULL), |
1021 media_player_delegate_(NULL), | 1022 media_player_delegate_(NULL), |
1022 is_using_lofi_(false), | 1023 is_using_lofi_(false), |
1023 is_pasting_(false), | 1024 is_pasting_(false), |
| 1025 trace_object_("blink", |
| 1026 "RenderFrameImpl", |
| 1027 TRACE_ID_WITH_SCOPE("RenderFrameImpl", params.routing_id)), |
1024 weak_factory_(this) { | 1028 weak_factory_(this) { |
1025 std::pair<RoutingIDFrameMap::iterator, bool> result = | 1029 std::pair<RoutingIDFrameMap::iterator, bool> result = |
1026 g_routing_id_frame_map.Get().insert(std::make_pair(routing_id_, this)); | 1030 g_routing_id_frame_map.Get().insert(std::make_pair(routing_id_, this)); |
1027 CHECK(result.second) << "Inserting a duplicate item."; | 1031 CHECK(result.second) << "Inserting a duplicate item."; |
1028 | 1032 |
1029 RenderThread::Get()->AddRoute(routing_id_, this); | 1033 RenderThread::Get()->AddRoute(routing_id_, this); |
1030 | 1034 |
1031 render_view_->RegisterRenderFrame(this); | 1035 render_view_->RegisterRenderFrame(this); |
1032 | 1036 |
1033 // Everything below subclasses RenderFrameObserver and is automatically | 1037 // Everything below subclasses RenderFrameObserver and is automatically |
1034 // deleted when the RenderFrame gets deleted. | 1038 // deleted when the RenderFrame gets deleted. |
1035 #if defined(OS_ANDROID) | 1039 #if defined(OS_ANDROID) |
1036 new GinJavaBridgeDispatcher(this); | 1040 new GinJavaBridgeDispatcher(this); |
1037 #endif | 1041 #endif |
1038 | 1042 |
1039 #if defined(ENABLE_PLUGINS) | 1043 #if defined(ENABLE_PLUGINS) |
1040 // Manages its own lifetime. | 1044 // Manages its own lifetime. |
1041 plugin_power_saver_helper_ = new PluginPowerSaverHelper(this); | 1045 plugin_power_saver_helper_ = new PluginPowerSaverHelper(this); |
1042 #endif | 1046 #endif |
1043 | 1047 |
1044 manifest_manager_ = new ManifestManager(this); | 1048 manifest_manager_ = new ManifestManager(this); |
| 1049 |
| 1050 base::trace_event::TraceLog::GetInstance()->AddEnabledStateObserver(this); |
1045 } | 1051 } |
1046 | 1052 |
1047 RenderFrameImpl::~RenderFrameImpl() { | 1053 RenderFrameImpl::~RenderFrameImpl() { |
1048 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); | 1054 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); |
1049 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); | 1055 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); |
1050 | 1056 |
1051 base::trace_event::TraceLog::GetInstance()->RemoveProcessLabel(routing_id_); | 1057 base::trace_event::TraceLog::GetInstance()->RemoveProcessLabel(routing_id_); |
| 1058 base::trace_event::TraceLog::GetInstance()->RemoveEnabledStateObserver(this); |
1052 | 1059 |
1053 #if defined(VIDEO_HOLE) | 1060 #if defined(VIDEO_HOLE) |
1054 if (contains_media_player_) | 1061 if (contains_media_player_) |
1055 render_view_->UnregisterVideoHoleFrame(this); | 1062 render_view_->UnregisterVideoHoleFrame(this); |
1056 #endif | 1063 #endif |
1057 | 1064 |
1058 if (is_main_frame_) { | 1065 if (is_main_frame_) { |
1059 // When using swapped out frames, RenderFrameProxy is owned by | 1066 // When using swapped out frames, RenderFrameProxy is owned by |
1060 // RenderFrameImpl in the case it is the main frame. Ensure it is deleted | 1067 // RenderFrameImpl in the case it is the main frame. Ensure it is deleted |
1061 // along with this object. | 1068 // along with this object. |
(...skipping 25 matching lines...) Expand all Loading... |
1087 CHECK(result.second) << "Inserting a duplicate item."; | 1094 CHECK(result.second) << "Inserting a duplicate item."; |
1088 | 1095 |
1089 frame_ = web_frame; | 1096 frame_ = web_frame; |
1090 } | 1097 } |
1091 | 1098 |
1092 void RenderFrameImpl::Initialize() { | 1099 void RenderFrameImpl::Initialize() { |
1093 is_main_frame_ = !frame_->parent(); | 1100 is_main_frame_ = !frame_->parent(); |
1094 | 1101 |
1095 RenderFrameImpl* parent_frame = RenderFrameImpl::FromWebFrame( | 1102 RenderFrameImpl* parent_frame = RenderFrameImpl::FromWebFrame( |
1096 frame_->parent()); | 1103 frame_->parent()); |
1097 if (parent_frame) | 1104 if (parent_frame) { |
1098 is_using_lofi_ = parent_frame->IsUsingLoFi(); | 1105 is_using_lofi_ = parent_frame->IsUsingLoFi(); |
| 1106 blame_context_ = make_scoped_ptr(new RenderFrameBlameContext( |
| 1107 routing_id_, *parent_frame->blame_context_)); |
| 1108 } else { |
| 1109 blame_context_ = make_scoped_ptr(new RenderFrameBlameContext( |
| 1110 routing_id_, *RenderThreadImpl::current()->blame_context())); |
| 1111 } |
| 1112 web_blame_context_ = |
| 1113 make_scoped_ptr(new WebBlameContextImpl(blame_context_.get())); |
| 1114 blame_context_->TakeSnapshot(); |
1099 | 1115 |
1100 bool is_tracing = false; | 1116 bool is_tracing = false; |
1101 TRACE_EVENT_CATEGORY_GROUP_ENABLED("navigation", &is_tracing); | 1117 TRACE_EVENT_CATEGORY_GROUP_ENABLED("navigation", &is_tracing); |
1102 if (is_tracing) { | 1118 if (is_tracing) { |
1103 int parent_id = GetRoutingIdForFrameOrProxy(frame_->parent()); | 1119 int parent_id = GetRoutingIdForFrameOrProxy(frame_->parent()); |
1104 TRACE_EVENT2("navigation", "RenderFrameImpl::Initialize", | 1120 TRACE_EVENT2("navigation", "RenderFrameImpl::Initialize", |
1105 "id", routing_id_, | 1121 "id", routing_id_, |
1106 "parent", parent_id); | 1122 "parent", parent_id); |
1107 } | 1123 } |
1108 | 1124 |
1109 if (IsMainFrame() && | 1125 if (IsMainFrame() && |
1110 RenderProcess::current()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI) { | 1126 RenderProcess::current()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI) { |
1111 EnableMojoBindings(false /* for_layout_tests */); | 1127 EnableMojoBindings(false /* for_layout_tests */); |
1112 } | 1128 } |
1113 | 1129 |
1114 #if defined(ENABLE_PLUGINS) | 1130 #if defined(ENABLE_PLUGINS) |
1115 new PepperBrowserConnection(this); | 1131 new PepperBrowserConnection(this); |
1116 #endif | 1132 #endif |
1117 new SharedWorkerRepository(this); | 1133 new SharedWorkerRepository(this); |
1118 | 1134 |
1119 if (IsLocalRoot() && !is_swapped_out_) { | 1135 if (IsLocalRoot() && !is_swapped_out_) { |
1120 // DevToolsAgent is a RenderFrameObserver, and will destruct itself | 1136 // DevToolsAgent is a RenderFrameObserver, and will destruct itself |
1121 // when |this| is deleted. | 1137 // when |this| is deleted. |
1122 devtools_agent_ = new DevToolsAgent(this); | 1138 devtools_agent_ = new DevToolsAgent(this); |
1123 } | 1139 } |
1124 | 1140 |
1125 RegisterMojoServices(); | 1141 RegisterMojoServices(); |
| 1142 TraceSnapshot(); |
1126 | 1143 |
1127 // We delay calling this until we have the WebFrame so that any observer or | 1144 // We delay calling this until we have the WebFrame so that any observer or |
1128 // embedder can call GetWebFrame on any RenderFrame. | 1145 // embedder can call GetWebFrame on any RenderFrame. |
1129 GetContentClient()->renderer()->RenderFrameCreated(this); | 1146 GetContentClient()->renderer()->RenderFrameCreated(this); |
1130 } | 1147 } |
1131 | 1148 |
1132 RenderWidget* RenderFrameImpl::GetRenderWidget() { | 1149 RenderWidget* RenderFrameImpl::GetRenderWidget() { |
1133 RenderFrameImpl* local_root = | 1150 RenderFrameImpl* local_root = |
1134 RenderFrameImpl::FromWebFrame(frame_->localRoot()); | 1151 RenderFrameImpl::FromWebFrame(frame_->localRoot()); |
1135 return local_root->render_widget_.get(); | 1152 return local_root->render_widget_.get(); |
(...skipping 1443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2579 return external_popup_menu_.get(); | 2596 return external_popup_menu_.get(); |
2580 #else | 2597 #else |
2581 return NULL; | 2598 return NULL; |
2582 #endif | 2599 #endif |
2583 } | 2600 } |
2584 | 2601 |
2585 blink::WebCookieJar* RenderFrameImpl::cookieJar() { | 2602 blink::WebCookieJar* RenderFrameImpl::cookieJar() { |
2586 return &cookie_jar_; | 2603 return &cookie_jar_; |
2587 } | 2604 } |
2588 | 2605 |
| 2606 blink::WebBlameContext* RenderFrameImpl::frameBlameContext() { |
| 2607 return web_blame_context_.get(); |
| 2608 } |
| 2609 |
2589 blink::WebServiceWorkerProvider* | 2610 blink::WebServiceWorkerProvider* |
2590 RenderFrameImpl::createServiceWorkerProvider() { | 2611 RenderFrameImpl::createServiceWorkerProvider() { |
2591 // At this point we should have non-null data source. | 2612 // At this point we should have non-null data source. |
2592 DCHECK(frame_->dataSource()); | 2613 DCHECK(frame_->dataSource()); |
2593 if (!ChildThreadImpl::current()) | 2614 if (!ChildThreadImpl::current()) |
2594 return nullptr; // May be null in some tests. | 2615 return nullptr; // May be null in some tests. |
2595 ServiceWorkerNetworkProvider* provider = | 2616 ServiceWorkerNetworkProvider* provider = |
2596 ServiceWorkerNetworkProvider::FromDocumentState( | 2617 ServiceWorkerNetworkProvider::FromDocumentState( |
2597 DocumentState::FromDataSource(frame_->dataSource())); | 2618 DocumentState::FromDataSource(frame_->dataSource())); |
2598 DCHECK(provider); | 2619 DCHECK(provider); |
(...skipping 3517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6116 void RenderFrameImpl::SendFindReply(int request_id, | 6137 void RenderFrameImpl::SendFindReply(int request_id, |
6117 int match_count, | 6138 int match_count, |
6118 int ordinal, | 6139 int ordinal, |
6119 const WebRect& selection_rect, | 6140 const WebRect& selection_rect, |
6120 bool final_status_update) { | 6141 bool final_status_update) { |
6121 Send(new FrameHostMsg_Find_Reply(routing_id_, request_id, match_count, | 6142 Send(new FrameHostMsg_Find_Reply(routing_id_, request_id, match_count, |
6122 selection_rect, ordinal, | 6143 selection_rect, ordinal, |
6123 final_status_update)); | 6144 final_status_update)); |
6124 } | 6145 } |
6125 | 6146 |
| 6147 void RenderFrameImpl::OnTraceLogEnabled() { |
| 6148 TraceSnapshot(); |
| 6149 } |
| 6150 |
| 6151 void RenderFrameImpl::OnTraceLogDisabled() {} |
| 6152 |
| 6153 void RenderFrameImpl::TraceSnapshot() const { |
| 6154 bool is_tracing = false; |
| 6155 TRACE_EVENT_CATEGORY_GROUP_ENABLED("blink", &is_tracing); |
| 6156 if (!is_tracing || !frame_) |
| 6157 return; |
| 6158 |
| 6159 scoped_refptr<base::trace_event::TracedValue> state = |
| 6160 new base::trace_event::TracedValue(); |
| 6161 state->BeginDictionary("frame"); |
| 6162 state->SetString("id_ref", |
| 6163 base::StringPrintf("0x%" PRIx64, frame_->frameID())); |
| 6164 state->SetString("scope", "blink::Frame"); |
| 6165 state->EndDictionary(); |
| 6166 state->SetInteger("routing_id", routing_id_); |
| 6167 scoped_refptr<base::trace_event::ConvertableToTraceFormat> snapshot_data( |
| 6168 state); |
| 6169 trace_object_.Snapshot(snapshot_data); |
| 6170 } |
| 6171 |
6126 } // namespace content | 6172 } // namespace content |
OLD | NEW |