Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 |
| OLD | NEW |