| 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 <list> | 7 #include <list> |
| 8 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| 11 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
| 12 #include "components/data_use_measurement/core/data_use_recorder.h" | 12 #include "components/data_use_measurement/core/data_use_recorder.h" |
| 13 #include "content/public/browser/resource_request_info.h" | 13 #include "content/public/browser/resource_request_info.h" |
| 14 #include "content/public/common/browser_side_navigation_policy.h" | 14 #include "content/public/common/browser_side_navigation_policy.h" |
| 15 #include "content/public/common/previews_state.h" | 15 #include "content/public/common/previews_state.h" |
| 16 #include "content/public/common/process_type.h" | 16 #include "content/public/common/process_type.h" |
| 17 #include "content/public/test/mock_resource_context.h" | 17 #include "content/public/test/mock_resource_context.h" |
| 18 #include "content/public/test/test_browser_thread_bundle.h" | 18 #include "content/public/test/test_browser_thread_bundle.h" |
| 19 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" | 19 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" |
| 20 #include "net/url_request/url_request_test_util.h" | 20 #include "net/url_request/url_request_test_util.h" |
| 21 #include "testing/gmock/include/gmock/gmock.h" | 21 #include "testing/gmock/include/gmock/gmock.h" |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 23 | 23 |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 int kRenderProcessId = 1; | 26 int kRenderProcessId = 1; |
| 27 int kRenderFrameId = 2; | 27 int kRenderFrameId = 2; |
| 28 int kRequestId = 3; | 28 int kRequestId = 3; |
| 29 uint32_t kPageTransition = 1; | 29 uint32_t kPageTransition = 5; |
| 30 void* kNavigationHandle = &kNavigationHandle; | 30 void* kNavigationHandle = &kNavigationHandle; |
| 31 | 31 |
| 32 class MockPageLoadObserver | 32 class MockPageLoadObserver |
| 33 : public data_use_measurement::DataUseAscriber::PageLoadObserver { | 33 : public data_use_measurement::DataUseAscriber::PageLoadObserver { |
| 34 public: | 34 public: |
| 35 MOCK_METHOD1(OnPageLoadCommit, void(data_use_measurement::DataUse* data_use)); | 35 MOCK_METHOD1(OnPageLoadCommit, void(data_use_measurement::DataUse* data_use)); |
| 36 MOCK_METHOD2(OnPageResourceLoad, | 36 MOCK_METHOD2(OnPageResourceLoad, |
| 37 void(const net::URLRequest& request, | 37 void(const net::URLRequest& request, |
| 38 data_use_measurement::DataUse* data_use)); | 38 data_use_measurement::DataUse* data_use)); |
| 39 MOCK_METHOD1(OnPageLoadComplete, | 39 MOCK_METHOD1(OnPageLoadComplete, |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 TEST_F(ChromeDataUseAscriberTest, RenderFrameShownAndHidden) { | 117 TEST_F(ChromeDataUseAscriberTest, RenderFrameShownAndHidden) { |
| 118 if (content::IsBrowserSideNavigationEnabled()) | 118 if (content::IsBrowserSideNavigationEnabled()) |
| 119 return; | 119 return; |
| 120 | 120 |
| 121 std::unique_ptr<net::URLRequest> request = CreateNewRequest( | 121 std::unique_ptr<net::URLRequest> request = CreateNewRequest( |
| 122 "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); | 122 "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); |
| 123 | 123 |
| 124 ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); | 124 ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); |
| 125 ascriber()->OnBeforeUrlRequest(request.get()); | 125 ascriber()->OnBeforeUrlRequest(request.get()); |
| 126 ascriber()->ReadyToCommitMainFrameNavigation( | 126 ascriber()->ReadyToCommitMainFrameNavigation( |
| 127 GURL("http://test.com"), content::GlobalRequestID(kRenderProcessId, 0), | 127 content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, |
| 128 kRenderProcessId, kRenderFrameId, true, (void*)request.get()); | 128 kRenderFrameId); |
| 129 ascriber()->DidFinishNavigation(kRenderProcessId, kRenderFrameId, |
| 130 GURL("http://test.com"), true, |
| 131 kPageTransition); |
| 129 ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, true); | 132 ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, true); |
| 130 | 133 |
| 131 EXPECT_TRUE(ascriber()->GetDataUseRecorder(*request)->is_visible()); | 134 EXPECT_TRUE(ascriber()->GetDataUseRecorder(*request)->is_visible()); |
| 132 | 135 |
| 133 // Hide the frame, and the visibility should be updated. | 136 // Hide the frame, and the visibility should be updated. |
| 134 ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, false); | 137 ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, false); |
| 135 EXPECT_FALSE(ascriber()->GetDataUseRecorder(*request)->is_visible()); | 138 EXPECT_FALSE(ascriber()->GetDataUseRecorder(*request)->is_visible()); |
| 136 | 139 |
| 137 ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); | 140 ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); |
| 138 } | 141 } |
| 139 | 142 |
| 140 TEST_F(ChromeDataUseAscriberTest, RenderFrameHiddenAndShown) { | 143 TEST_F(ChromeDataUseAscriberTest, RenderFrameHiddenAndShown) { |
| 141 if (content::IsBrowserSideNavigationEnabled()) | 144 if (content::IsBrowserSideNavigationEnabled()) |
| 142 return; | 145 return; |
| 143 | 146 |
| 144 std::unique_ptr<net::URLRequest> request = CreateNewRequest( | 147 std::unique_ptr<net::URLRequest> request = CreateNewRequest( |
| 145 "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); | 148 "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); |
| 146 | 149 |
| 147 ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); | 150 ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); |
| 148 ascriber()->OnBeforeUrlRequest(request.get()); | 151 ascriber()->OnBeforeUrlRequest(request.get()); |
| 149 ascriber()->ReadyToCommitMainFrameNavigation( | 152 ascriber()->ReadyToCommitMainFrameNavigation( |
| 150 GURL("http://test.com"), content::GlobalRequestID(kRenderProcessId, 0), | 153 content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, |
| 151 kRenderProcessId, kRenderFrameId, true, (void*)request.get()); | 154 kRenderFrameId); |
| 155 ascriber()->DidFinishNavigation(kRenderProcessId, kRenderFrameId, |
| 156 GURL("http://test.com"), true, |
| 157 kPageTransition); |
| 152 ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, false); | 158 ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, false); |
| 153 | 159 |
| 154 EXPECT_FALSE(ascriber()->GetDataUseRecorder(*request)->is_visible()); | 160 EXPECT_FALSE(ascriber()->GetDataUseRecorder(*request)->is_visible()); |
| 155 | 161 |
| 156 // Show the frame, and the visibility should be updated. | 162 // Show the frame, and the visibility should be updated. |
| 157 ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, true); | 163 ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, true); |
| 158 EXPECT_TRUE(ascriber()->GetDataUseRecorder(*request)->is_visible()); | 164 EXPECT_TRUE(ascriber()->GetDataUseRecorder(*request)->is_visible()); |
| 159 | 165 |
| 160 ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); | 166 ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); |
| 161 } | 167 } |
| 162 | 168 |
| 163 TEST_F(ChromeDataUseAscriberTest, RenderFrameHostChanged) { | 169 TEST_F(ChromeDataUseAscriberTest, RenderFrameHostChanged) { |
| 164 if (content::IsBrowserSideNavigationEnabled()) | 170 if (content::IsBrowserSideNavigationEnabled()) |
| 165 return; | 171 return; |
| 166 | 172 |
| 167 std::unique_ptr<net::URLRequest> request = CreateNewRequest( | 173 std::unique_ptr<net::URLRequest> request = CreateNewRequest( |
| 168 "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); | 174 "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); |
| 169 | 175 |
| 170 ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); | 176 ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); |
| 171 ascriber()->OnBeforeUrlRequest(request.get()); | 177 ascriber()->OnBeforeUrlRequest(request.get()); |
| 172 ascriber()->ReadyToCommitMainFrameNavigation( | 178 ascriber()->ReadyToCommitMainFrameNavigation( |
| 173 GURL("http://test.com"), content::GlobalRequestID(kRenderProcessId, 0), | 179 content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, |
| 174 kRenderProcessId, kRenderFrameId, true, (void*)request.get()); | 180 kRenderFrameId); |
| 181 ascriber()->DidFinishNavigation(kRenderProcessId, kRenderFrameId, |
| 182 GURL("http://test.com"), true, |
| 183 kPageTransition); |
| 175 ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, true); | 184 ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, true); |
| 176 EXPECT_TRUE(ascriber()->GetDataUseRecorder(*request)->is_visible()); | 185 EXPECT_TRUE(ascriber()->GetDataUseRecorder(*request)->is_visible()); |
| 177 | 186 |
| 178 // Create a new render frame and swap it. | 187 // Create a new render frame and swap it. |
| 179 ascriber()->RenderFrameCreated(kRenderProcessId + 1, kRenderFrameId + 1, -1, | 188 ascriber()->RenderFrameCreated(kRenderProcessId + 1, kRenderFrameId + 1, -1, |
| 180 -1); | 189 -1); |
| 181 ascriber()->RenderFrameHostChanged(kRenderProcessId, kRenderFrameId, | 190 ascriber()->RenderFrameHostChanged(kRenderProcessId, kRenderFrameId, |
| 182 kRenderProcessId + 1, kRenderFrameId + 1); | 191 kRenderProcessId + 1, kRenderFrameId + 1); |
| 183 ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); | 192 ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); |
| 184 | 193 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 201 // Request should cause a recorder to be created. | 210 // Request should cause a recorder to be created. |
| 202 ascriber()->OnBeforeUrlRequest(request.get()); | 211 ascriber()->OnBeforeUrlRequest(request.get()); |
| 203 EXPECT_EQ(2u, recorders().size()); | 212 EXPECT_EQ(2u, recorders().size()); |
| 204 | 213 |
| 205 // Navigation starts. | 214 // Navigation starts. |
| 206 ascriber()->DidStartMainFrameNavigation(GURL("http://test.com"), | 215 ascriber()->DidStartMainFrameNavigation(GURL("http://test.com"), |
| 207 kRenderProcessId, kRenderFrameId, | 216 kRenderProcessId, kRenderFrameId, |
| 208 kNavigationHandle); | 217 kNavigationHandle); |
| 209 | 218 |
| 210 ascriber()->ReadyToCommitMainFrameNavigation( | 219 ascriber()->ReadyToCommitMainFrameNavigation( |
| 211 GURL("http://mobile.test.com"), | |
| 212 content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, | 220 content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, |
| 213 kRenderFrameId, false, kNavigationHandle); | 221 kRenderFrameId); |
| 222 ascriber()->DidFinishNavigation(kRenderProcessId, kRenderFrameId, |
| 223 GURL("http://mobile.test.com"), false, |
| 224 kPageTransition); |
| 214 | 225 |
| 215 // Navigation commit should merge the two data use recorder entries. | 226 // Navigation commit should merge the two data use recorder entries. |
| 216 EXPECT_EQ(1u, recorders().size()); | 227 EXPECT_EQ(1u, recorders().size()); |
| 217 auto& recorder_entry = recorders().front(); | 228 auto& recorder_entry = recorders().front(); |
| 218 EXPECT_EQ(RenderFrameHostID(kRenderProcessId, kRenderFrameId), | 229 EXPECT_EQ(RenderFrameHostID(kRenderProcessId, kRenderFrameId), |
| 219 recorder_entry.main_frame_id()); | 230 recorder_entry.main_frame_id()); |
| 220 EXPECT_EQ(content::GlobalRequestID(kRenderProcessId, 0), | 231 EXPECT_EQ(content::GlobalRequestID(kRenderProcessId, 0), |
| 221 recorder_entry.main_frame_request_id()); | 232 recorder_entry.main_frame_request_id()); |
| 222 EXPECT_EQ(GURL("http://mobile.test.com"), recorder_entry.data_use().url()); | 233 EXPECT_EQ(GURL("http://mobile.test.com"), recorder_entry.data_use().url()); |
| 223 EXPECT_EQ(DataUse::TrafficType::USER_TRAFFIC, | 234 EXPECT_EQ(DataUse::TrafficType::USER_TRAFFIC, |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 EXPECT_EQ(1u, recorders().size()); | 281 EXPECT_EQ(1u, recorders().size()); |
| 271 | 282 |
| 272 ascriber()->OnBeforeUrlRequest(request.get()); | 283 ascriber()->OnBeforeUrlRequest(request.get()); |
| 273 | 284 |
| 274 // Navigation starts. | 285 // Navigation starts. |
| 275 ascriber()->DidStartMainFrameNavigation(GURL("http://test.com"), | 286 ascriber()->DidStartMainFrameNavigation(GURL("http://test.com"), |
| 276 kRenderProcessId, kRenderFrameId, | 287 kRenderProcessId, kRenderFrameId, |
| 277 kNavigationHandle); | 288 kNavigationHandle); |
| 278 | 289 |
| 279 ascriber()->ReadyToCommitMainFrameNavigation( | 290 ascriber()->ReadyToCommitMainFrameNavigation( |
| 280 GURL("http://mobile.test.com"), | |
| 281 content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, | 291 content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, |
| 282 kRenderFrameId, false, kNavigationHandle); | 292 kRenderFrameId); |
| 293 |
| 294 EXPECT_EQ(2u, recorders().size()); |
| 295 DataUse* data_use = &recorders().front().data_use(); |
| 296 |
| 297 EXPECT_CALL(mock_observer, |
| 298 OnPageResourceLoad(testing::_, &recorders().back().data_use())) |
| 299 .Times(1); |
| 300 ascriber()->OnUrlRequestCompleted(*request, false); |
| 301 |
| 302 EXPECT_CALL(mock_observer, OnPageLoadCommit(data_use)).Times(1); |
| 303 EXPECT_CALL(mock_observer, OnPageLoadComplete(testing::_)).Times(1); |
| 304 ascriber()->DidFinishNavigation(kRenderProcessId, kRenderFrameId, |
| 305 GURL("http://mobile.test.com"), false, |
| 306 kPageTransition); |
| 283 | 307 |
| 284 EXPECT_EQ(1u, recorders().size()); | 308 EXPECT_EQ(1u, recorders().size()); |
| 285 auto& recorder_entry = recorders().front(); | 309 auto& recorder_entry = recorders().front(); |
| 286 DataUse* data_use = &recorder_entry.data_use(); | |
| 287 EXPECT_EQ(RenderFrameHostID(kRenderProcessId, kRenderFrameId), | 310 EXPECT_EQ(RenderFrameHostID(kRenderProcessId, kRenderFrameId), |
| 288 recorder_entry.main_frame_id()); | 311 recorder_entry.main_frame_id()); |
| 289 EXPECT_EQ(content::GlobalRequestID(kRenderProcessId, 0), | 312 EXPECT_EQ(content::GlobalRequestID(kRenderProcessId, 0), |
| 290 recorder_entry.main_frame_request_id()); | 313 recorder_entry.main_frame_request_id()); |
| 291 EXPECT_EQ(GURL("http://mobile.test.com"), recorder_entry.data_use().url()); | 314 EXPECT_EQ(GURL("http://mobile.test.com"), recorder_entry.data_use().url()); |
| 292 | 315 EXPECT_CALL(mock_observer, OnPageLoadComplete(&recorder_entry.data_use())) |
| 293 EXPECT_CALL(mock_observer, OnPageLoadCommit(data_use)).Times(1); | 316 .Times(1); |
| 294 ascriber()->DidFinishNavigation(kRenderProcessId, kRenderFrameId, | |
| 295 kPageTransition); | |
| 296 | |
| 297 EXPECT_CALL(mock_observer, OnPageLoadComplete(data_use)).Times(1); | |
| 298 EXPECT_CALL(mock_observer, OnPageResourceLoad(testing::_, data_use)).Times(1); | |
| 299 | 317 |
| 300 ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); | 318 ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); |
| 301 ascriber()->OnUrlRequestDestroyed(request.get()); | 319 ascriber()->OnUrlRequestDestroyed(request.get()); |
| 302 | 320 |
| 303 EXPECT_EQ(0u, recorders().size()); | 321 EXPECT_EQ(0u, recorders().size()); |
| 304 } | 322 } |
| 305 | 323 |
| 306 } // namespace data_use_measurement | 324 } // namespace data_use_measurement |
| OLD | NEW |