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 3 // found in the LICENSE file. 4 5 #include "base/metrics/histogram.h" 6 #include "base/strings/stringprintf.h" 7 #include "chrome/browser/extensions/activity_log/uma_policy.h" 8 #include "chrome/browser/extensions/extension_apitest.h" 9 #include "chrome/browser/extensions/extension_browsertest.h" 10 #include "chrome/browser/extensions/extension_service.h" 11 #include "chrome/browser/extensions/test_extension_dir.h" 12 #include "chrome/browser/ui/browser_window.h" 13 #include "chrome/test/base/ui_test_utils.h" 14 #include "extensions/common/manifest_constants.h" 15 #include "net/dns/mock_host_resolver.h" 16 17 using extensions::UmaPolicy; 18 19 const char* kGooglePrefix = "ExtensionActivity.Google"; 20 const char* kNonGooglePrefix = "ExtensionActivity"; 21 22 // These tests need to ensure that all of the extension JavaScript completes 23 // before the histograms are checked. To accomplish this, the test relies on 24 // some JavaScript in chrome/test/data/extensions/api_test/uma_policy/: 25 // * When the test navigates to opener.com, opener.js will use window.open() to 26 // pop open a new window with the appropriate URL for the test case. This 27 // ensures that the testing framework never reuses a window that's still 28 // running a previous test case. 29 // * The test extension code in content_script.js tells background.js when it's 30 // done. When it's finished, background.js closes the blocker.com window. So 31 // blocker.com will remain open (and block) until the tests complete. 32 class ActivityLogUmaPolicyTest : public ExtensionApiTest { 33 }; 34 35 std::string ConcatNames(const char* prefix, int status_num) { 36 return base::StringPrintf( 37 "%s.%s", 38 prefix, 39 extensions::UmaPolicy::GetHistogramName( 40 static_cast<extensions::UmaPolicy::PageStatus>(status_num))); 41 } 42 43 // TODO(felt): These are disabled due to crbug.com/294500, since they fail 44 // due to a blink bug. The fix went in to Blink on Thursday and should roll 45 // on Monday 9/23. 46 // These are all sequential navigations, so they should each be logged 47 // independently. 48 IN_PROC_BROWSER_TEST_F(ActivityLogUmaPolicyTest, DISABLED_SequentialNavs) { 49 host_resolver()->AddRule("*", "127.0.0.1"); 50 StartEmbeddedTestServer(); 51 52 const extensions::Extension* ext = 53 LoadExtension(test_data_dir_.AppendASCII("uma_policy")); 54 ASSERT_TRUE(ext); 55 56 ui_test_utils::NavigateToURLWithDisposition( 57 browser(), GURL("http://www.opener.com/#google"), NEW_WINDOW, 58 ui_test_utils::BROWSER_TEST_NONE); 59 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 60 browser(), GURL("http://www.blocker.com"), 2); 61 ui_test_utils::NavigateToURLWithDisposition( 62 browser(), GURL("http://www.opener.com/#google?q=a"), NEW_WINDOW, 63 ui_test_utils::BROWSER_TEST_NONE); 64 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 65 browser(), GURL("http://www.blocker.com"), 2); 66 ui_test_utils::NavigateToURLWithDisposition( 67 browser(), GURL("http://www.opener.com/#google?q=b"), NEW_WINDOW, 68 ui_test_utils::BROWSER_TEST_NONE); 69 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 70 browser(), GURL("http://www.blocker.com"), 2); 71 ui_test_utils::NavigateToURLWithDisposition( 72 browser(), GURL("http://www.opener.com/#cnn?q=a"), NEW_WINDOW, 73 ui_test_utils::BROWSER_TEST_NONE); 74 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 75 browser(), GURL("http://www.blocker.com"), 2); 76 ui_test_utils::NavigateToURLWithDisposition( 77 browser(), GURL("http://www.opener.com/#cnn?q=b"), NEW_WINDOW, 78 ui_test_utils::BROWSER_TEST_NONE); 79 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 80 browser(), GURL("http://www.blocker.com"), 2); 81 82 for (int i = UmaPolicy::NONE + 1; i < UmaPolicy::MAX_STATUS - 2; ++i) { 83 base::HistogramBase* google_histogram = base::Histogram::FactoryGet( 84 ConcatNames(kGooglePrefix, i), 85 1, 100, 50, base::HistogramBase::kNoFlags); 86 scoped_ptr<base::HistogramSamples> google_samples = 87 google_histogram->SnapshotSamples(); 88 EXPECT_EQ(3, google_samples->TotalCount()); 89 EXPECT_EQ(3, google_samples->GetCount(1)); 90 91 base::HistogramBase* cnn_histogram = base::Histogram::FactoryGet( 92 ConcatNames(kNonGooglePrefix, i), 93 1, 100, 50, base::HistogramBase::kNoFlags); 94 scoped_ptr<base::HistogramSamples> cnn_samples = 95 cnn_histogram->SnapshotSamples(); 96 if (ConcatNames(kNonGooglePrefix, i) != "ExtensionActivity.ContentScript" && 97 ConcatNames(kNonGooglePrefix, i) != "ExtensionActivity.ReadDom") { 98 // There's a content script on opener.com that checks the location. 99 // The test is not set up to accurately record opener.com histograms due 100 // to the possibility of race conditions in the testing framework, so we 101 // can't check those values. 102 EXPECT_EQ(2, cnn_samples->GetCount(1)); 103 } 104 } 105 } 106 107 // Two windows are open at once with the same google.com TLD. 108 // However, they should be treated separately because they have different URLs. 109 IN_PROC_BROWSER_TEST_F( 110 ActivityLogUmaPolicyTest, DISABLED_ParallelDistinctNavs) { 111 host_resolver()->AddRule("*", "127.0.0.1"); 112 StartEmbeddedTestServer(); 113 114 const extensions::Extension* ext = 115 LoadExtension(test_data_dir_.AppendASCII("uma_policy")); 116 ASSERT_TRUE(ext); 117 118 ui_test_utils::NavigateToURLWithDisposition( 119 browser(), GURL("http://www.opener.com/#google?p=a"), NEW_WINDOW, 120 ui_test_utils::BROWSER_TEST_NONE); 121 ui_test_utils::NavigateToURLWithDisposition( 122 browser(), GURL("http://www.opener.com/#google?p=b"), NEW_WINDOW, 123 ui_test_utils::BROWSER_TEST_NONE); 124 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 125 browser(), GURL("http://www.blocker.com"), 2); 126 127 for (int i = UmaPolicy::NONE + 1; i < UmaPolicy::MAX_STATUS - 2; ++i) { 128 base::HistogramBase* google_histogram = base::Histogram::FactoryGet( 129 ConcatNames(kGooglePrefix, i), 130 1, 100, 50, base::HistogramBase::kNoFlags); 131 scoped_ptr<base::HistogramSamples> google_samples = 132 google_histogram->SnapshotSamples(); 133 EXPECT_EQ(2, google_samples->GetCount(1)); 134 } 135 } 136 137 // Two windows are open at once with the same Google URLs. 138 // They should be treated the same. 139 IN_PROC_BROWSER_TEST_F(ActivityLogUmaPolicyTest, DISABLED_Google_ParallelSame) { 140 host_resolver()->AddRule("*", "127.0.0.1"); 141 StartEmbeddedTestServer(); 142 143 const extensions::Extension* ext = 144 LoadExtension(test_data_dir_.AppendASCII("uma_policy")); 145 ASSERT_TRUE(ext); 146 147 ui_test_utils::NavigateToURLWithDisposition( 148 browser(), GURL("http://www.opener.com/#googlea"), NEW_WINDOW, 149 ui_test_utils::BROWSER_TEST_NONE); 150 ui_test_utils::NavigateToURLWithDisposition( 151 browser(), GURL("http://www.opener.com/#googleb"), NEW_WINDOW, 152 ui_test_utils::BROWSER_TEST_NONE); 153 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 154 browser(), GURL("http://www.blocker.com"), 2); 155 156 for (int i = UmaPolicy::NONE + 1; i < UmaPolicy::MAX_STATUS - 2; ++i) { 157 base::HistogramBase* google_histogram = base::Histogram::FactoryGet( 158 ConcatNames(kGooglePrefix, i), 159 1, 100, 50, base::HistogramBase::kNoFlags); 160 scoped_ptr<base::HistogramSamples> google_samples = 161 google_histogram->SnapshotSamples(); 162 EXPECT_EQ(1, google_samples->GetCount(1)); 163 } 164 } 165 166 // Two windows are open at once with the same non-Google URLs. 167 // They should be treated the same. 168 IN_PROC_BROWSER_TEST_F(ActivityLogUmaPolicyTest, 169 DISABLED_NonGoogle_ParallelSame) { 170 host_resolver()->AddRule("*", "127.0.0.1"); 171 StartEmbeddedTestServer(); 172 173 const extensions::Extension* ext = 174 LoadExtension(test_data_dir_.AppendASCII("uma_policy")); 175 ASSERT_TRUE(ext); 176 177 ui_test_utils::NavigateToURLWithDisposition( 178 browser(), GURL("http://www.opener.com/#cnna"), NEW_WINDOW, 179 ui_test_utils::BROWSER_TEST_NONE); 180 ui_test_utils::NavigateToURLWithDisposition( 181 browser(), GURL("http://www.opener.com/#cnnb"), NEW_WINDOW, 182 ui_test_utils::BROWSER_TEST_NONE); 183 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 184 browser(), GURL("http://www.blocker.com"), 2); 185 186 for (int i = UmaPolicy::NONE + 1; i < UmaPolicy::MAX_STATUS - 2; ++i) { 187 base::HistogramBase* cnn_histogram = base::Histogram::FactoryGet( 188 ConcatNames(kNonGooglePrefix, i), 189 1, 100, 50, base::HistogramBase::kNoFlags); 190 scoped_ptr<base::HistogramSamples> cnn_samples = 191 cnn_histogram->SnapshotSamples(); 192 if (ConcatNames(kNonGooglePrefix, i) != "ExtensionActivity.ContentScript" && 193 ConcatNames(kNonGooglePrefix, i) != "ExtensionActivity.ReadDom") { 194 // There's a content script on opener.com that checks the location. 195 // The test is not set up to accurately record opener.com histograms due 196 // to the possibility of race conditions in the testing framework, so we 197 // can't check those values. 198 EXPECT_EQ(1, cnn_samples->GetCount(1)); 199 } 200 } 201 } 202 203 // This runs with multiple extensions installed. 204 IN_PROC_BROWSER_TEST_F(ActivityLogUmaPolicyTest, DISABLED_MultipleExtensions) { 205 host_resolver()->AddRule("*", "127.0.0.1"); 206 StartEmbeddedTestServer(); 207 208 const extensions::Extension* ext = 209 LoadExtension(test_data_dir_.AppendASCII("uma_policy")); 210 ASSERT_TRUE(ext); 211 212 const char* script2 = 213 "document.createElement('script');" 214 "document.createElement('iframe');" 215 "document.createElement('div');" 216 "document.createElement('embed');" 217 "document.createElement('object');"; 218 219 const char* manifest = 220 "{" 221 " \"name\": \"Activity Log UMA Policy Test Extension\"," 222 " \"version\": \"0.%s\"," 223 " \"description\": \"Testing the histogramming\"," 224 " \"content_scripts\": [" 225 " {" 226 " \"matches\": " 227 " [\"http://www.google.com/*\"," 228 " \"http://www.cnn.com/*\"]," 229 " \"js\": [\"content_script.js\"]" 230 " }" 231 " ]," 232 " \"manifest_version\": 2" 233 "}"; 234 235 extensions::TestExtensionDir dir2; 236 dir2.WriteManifest(base::StringPrintf(manifest, "2")); 237 dir2.WriteFile(FILE_PATH_LITERAL("content_script.js"), script2); 238 LoadExtension(dir2.unpacked_path()); 239 240 ui_test_utils::NavigateToURLWithDisposition( 241 browser(), GURL("http://www.opener.com/#google"), NEW_WINDOW, 242 ui_test_utils::BROWSER_TEST_NONE); 243 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 244 browser(), GURL("http://www.blocker.com"), 2); 245 ui_test_utils::NavigateToURLWithDisposition( 246 browser(), GURL("http://www.opener.com/#cnn?q=b"), NEW_WINDOW, 247 ui_test_utils::BROWSER_TEST_NONE); 248 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 249 browser(), GURL("http://www.blocker.com"), 2); 250 251 const char* subset_one[] = { 252 "CreatedLink", 253 "InnerHtml", 254 "DocumentWrite" 255 }; 256 257 const char* subset_two[] = { 258 "ContentScript", 259 "CreatedScript", 260 "CreatedIframe", 261 "CreatedDiv", 262 "CreatedEmbed", 263 "CreatedObject", 264 "InvokedDomMethod" 265 }; 266 267 // These were only touched by one of the scripts. 268 for (size_t i = 0; i < arraysize(subset_one); ++i) { 269 base::HistogramBase* google_histogram = base::Histogram::FactoryGet( 270 std::string(kGooglePrefix) + "." + std::string(subset_one[i]), 271 1, 100, 50, base::HistogramBase::kNoFlags); 272 scoped_ptr<base::HistogramSamples> google_samples = 273 google_histogram->SnapshotSamples(); 274 EXPECT_EQ(1, google_samples->GetCount(1)); 275 276 base::HistogramBase* cnn_histogram = base::Histogram::FactoryGet( 277 std::string(kNonGooglePrefix) + "." + std::string(subset_one[i]), 278 1, 100, 50, base::HistogramBase::kNoFlags); 279 scoped_ptr<base::HistogramSamples> cnn_samples = 280 cnn_histogram->SnapshotSamples(); 281 EXPECT_EQ(1, cnn_samples->GetCount(1)); 282 } 283 284 // These were touched by both scripts. 285 for (size_t i = 0; i < arraysize(subset_two); ++i) { 286 base::HistogramBase* google_histogram = base::Histogram::FactoryGet( 287 std::string(kGooglePrefix) + "." + std::string(subset_two[i]), 288 1, 100, 50, base::HistogramBase::kNoFlags); 289 scoped_ptr<base::HistogramSamples> google_samples = 290 google_histogram->SnapshotSamples(); 291 EXPECT_EQ(1, google_samples->GetCount(2)); 292 293 base::HistogramBase* cnn_histogram = base::Histogram::FactoryGet( 294 std::string(kNonGooglePrefix) + "." + std::string(subset_two[i]), 295 1, 100, 50, base::HistogramBase::kNoFlags); 296 scoped_ptr<base::HistogramSamples> cnn_samples = 297 cnn_histogram->SnapshotSamples(); 298 EXPECT_EQ(1, cnn_samples->GetCount(2)); 299 } 300 301 } 302