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

Side by Side Diff: chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc

Issue 2413663003: Expose GlobalRequestID in NavigationHandle and ResourceRequestInfo. (Closed)
Patch Set: Add frame map Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "chrome/browser/data_use_measurement/chrome_data_use_ascriber.h" 5 #include "chrome/browser/data_use_measurement/chrome_data_use_ascriber.h"
6 6
7 #include "base/memory/ptr_util.h"
8 #include "components/data_use_measurement/core/data_use_recorder.h"
9 #include "components/data_use_measurement/core/data_use_user_data.h"
7 #include "content/public/browser/browser_thread.h" 10 #include "content/public/browser/browser_thread.h"
8 #include "content/public/browser/navigation_handle.h" 11 #include "content/public/browser/navigation_handle.h"
9 #include "content/public/browser/render_frame_host.h" 12 #include "content/public/browser/render_frame_host.h"
13 #include "content/public/browser/resource_request_info.h"
14 #include "net/url_request/url_request.h"
10 15
11 namespace data_use_measurement { 16 namespace data_use_measurement {
12 17
18 // static
19 const void* ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::
20 kUserDataKey = static_cast<void*>(
21 &ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::kUserDataKey);
22
23 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::
24 DataUseRecorderEntryAsUserData(DataUseRecorderEntry entry)
25 : entry_(entry) {}
26
27 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::
28 ~DataUseRecorderEntryAsUserData() {}
29
13 ChromeDataUseAscriber::ChromeDataUseAscriber() { 30 ChromeDataUseAscriber::ChromeDataUseAscriber() {
14 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 31 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
15 } 32 }
16 33
17 ChromeDataUseAscriber::~ChromeDataUseAscriber() { 34 ChromeDataUseAscriber::~ChromeDataUseAscriber() {
18 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 35 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
36
37 DCHECK_EQ(0u, data_use_recorders_.size());
19 } 38 }
20 39
21 DataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( 40 DataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder(
22 net::URLRequest* request) { 41 net::URLRequest* request) {
23 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 42 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
24 return nullptr; 43 return nullptr;
25 } 44 }
26 45
46 void ChromeDataUseAscriber::OnBeforeUrlRequest(net::URLRequest* request) {
47 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
48
49 if (!request->url().SchemeIsHTTPOrHTTPS())
50 return;
51
52 DataUseUserData* service = static_cast<DataUseUserData*>(
53 request->GetUserData(DataUseUserData::kUserDataKey));
54 if (service)
55 return;
56
57 const content::ResourceRequestInfo* request_info =
58 content::ResourceRequestInfo::ForRequest(request);
59 content::ResourceType resource_type = request_info
60 ? request_info->GetResourceType()
61 : content::RESOURCE_TYPE_LAST_TYPE;
62
63 if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) {
64 int render_process_id = -1;
65 int render_frame_id = -1;
66 bool has_valid_render_frame_id_ =
67 content::ResourceRequestInfo::GetRenderFrameForRequest(
68 request, &render_process_id, &render_frame_id);
69 DCHECK(has_valid_render_frame_id_);
70 // Browser tests may not set up DataUseWebContentsObservers in which case
71 // this class never sees navigation and frame events so DataUseRecorders
72 // will never be destroyed. To avoid this, we ignore requests whose
73 // render frames don't have a record. However, this can also be caused by
74 // URLRequests racing the frame create events.
75 // TODO(kundaji): Add UMA.
76 if (render_frame_data_use_map_.find(
77 RenderFrameHostID(render_process_id, render_frame_id)) ==
78 render_frame_data_use_map_.end()) {
79 return;
80 }
81
82 auto user_data = static_cast<DataUseRecorderEntryAsUserData*>(
RyanSturm 2016/10/27 22:41:21 nit: Can you either change auto to DataUseRecorder
Not at Google. Contact bengr 2016/10/28 18:43:33 Done.
83 request->GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey));
84 if (user_data)
85 return;
86
87 DataUseRecorderEntry entry = data_use_recorders_.insert(
88 data_use_recorders_.end(), base::MakeUnique<DataUseRecorder>());
89 request->SetUserData(DataUseRecorderEntryAsUserData::kUserDataKey,
90 new DataUseRecorderEntryAsUserData(entry));
91
92 pending_navigation_data_use_map_.insert(
93 std::make_pair(request_info->GetGlobalRequestID(), entry));
94 }
95 }
96
97 void ChromeDataUseAscriber::OnUrlRequestCompleted(net::URLRequest* request,
98 bool started) {
99 const content::ResourceRequestInfo* request_info =
100 content::ResourceRequestInfo::ForRequest(request);
101 content::ResourceType resource_type = request_info
102 ? request_info->GetResourceType()
103 : content::RESOURCE_TYPE_LAST_TYPE;
104
105 if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) {
106 // If request was not successful, then NavigationHandle in
107 // DidFinishMainFrameNavigation will not have GlobalRequestID. So we erase
108 // the DataUseRecorderEntry here.
109 if (!request->status().is_success()) {
110 auto navigation_iter = pending_navigation_data_use_map_.find(
Raj 2016/10/27 20:33:56 nit: This seems to be common code. Maybe wrap it i
Not at Google. Contact bengr 2016/10/28 18:43:33 Done.
111 request_info->GetGlobalRequestID());
112 // Pending navigation entry will not be found if finish navigation
113 // raced this request completed event.
114 if (navigation_iter != pending_navigation_data_use_map_.end()) {
115 auto entry = navigation_iter->second;
116 pending_navigation_data_use_map_.erase(navigation_iter);
117 data_use_recorders_.erase(entry);
118 }
119 }
120 }
121 }
122
27 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id, 123 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id,
28 int render_frame_id, 124 int render_frame_id,
29 int parent_render_process_id, 125 int parent_render_process_id,
30 int parent_render_frame_id) { 126 int parent_render_frame_id) {
31 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 127 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
128
129 // TODO(kundaji): Point child render frames to the same DataUseRecorder as
130 // parent render frame.
131 DataUseRecorderEntry entry = data_use_recorders_.insert(
132 data_use_recorders_.end(), base::MakeUnique<DataUseRecorder>());
133 render_frame_data_use_map_.insert(std::make_pair(
134 RenderFrameHostID(render_process_id, render_frame_id), entry));
32 } 135 }
33 136
34 void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id, 137 void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id,
35 int render_frame_id, 138 int render_frame_id,
36 int parent_render_process_id, 139 int parent_render_process_id,
37 int parent_render_frame_id) { 140 int parent_render_frame_id) {
38 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 141 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
142 RenderFrameHostID key(render_process_id, render_frame_id);
143 auto frame_iter = render_frame_data_use_map_.find(key);
144 DCHECK(frame_iter != render_frame_data_use_map_.end());
145 DataUseRecorderEntry entry = frame_iter->second;
146 render_frame_data_use_map_.erase(frame_iter);
147 data_use_recorders_.erase(entry);
39 } 148 }
40 149
41 void ChromeDataUseAscriber::DidStartMainFrameNavigation( 150 void ChromeDataUseAscriber::DidStartMainFrameNavigation(
42 GURL gurl, 151 GURL gurl,
43 int render_process_id, 152 int render_process_id,
44 int render_frame_id, 153 int render_frame_id,
45 void* navigation_handle) { 154 void* navigation_handle) {
46 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 155 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
47 } 156 }
48 157
49 void ChromeDataUseAscriber::DidFinishMainFrameNavigation( 158 void ChromeDataUseAscriber::DidFinishMainFrameNavigation(
50 GURL gurl, 159 GURL gurl,
160 content::GlobalRequestID global_request_id,
51 int render_process_id, 161 int render_process_id,
52 int render_frame_id, 162 int render_frame_id,
53 bool is_same_page_navigation, 163 bool is_same_page_navigation,
54 void* navigation_handle) { 164 void* navigation_handle) {
55 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 165 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
166
167 auto navigation_iter =
168 pending_navigation_data_use_map_.find(global_request_id);
169 if (navigation_iter != pending_navigation_data_use_map_.end()) {
170 auto entry = navigation_iter->second;
171 pending_navigation_data_use_map_.erase(navigation_iter);
172 data_use_recorders_.erase(entry);
173 }
56 } 174 }
57 175
58 void ChromeDataUseAscriber::DidRedirectMainFrameNavigation( 176 void ChromeDataUseAscriber::DidRedirectMainFrameNavigation(
59 GURL gurl, 177 GURL gurl,
60 int render_process_id, 178 int render_process_id,
61 int render_frame_id, 179 int render_frame_id,
62 void* navigation_handle) { 180 void* navigation_handle) {
63 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 181 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
64 } 182 }
65 183
66 } // namespace data_use_measurement 184 } // namespace data_use_measurement
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698