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

Side by Side Diff: chrome/browser/site_details_browsertest.cc

Issue 1313863006: Add SiteIsolation.IsolateExtensions metrics and tests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix "not not" Created 5 years, 3 months 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/site_details.h" 5 #include "chrome/browser/site_details.h"
6 6
7 #include "base/bind_helpers.h" 7 #include "base/bind_helpers.h"
8 #include "base/files/file_path.h"
8 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
9 #include "base/path_service.h" 10 #include "base/path_service.h"
10 #include "base/test/histogram_tester.h" 11 #include "base/test/histogram_tester.h"
12 #include "chrome/browser/extensions/extension_browsertest.h"
13 #include "chrome/browser/extensions/test_extension_dir.h"
11 #include "chrome/browser/metrics/metrics_memory_details.h" 14 #include "chrome/browser/metrics/metrics_memory_details.h"
12 #include "chrome/browser/ui/browser.h" 15 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/tabs/tab_strip_model.h" 16 #include "chrome/browser/ui/tabs/tab_strip_model.h"
17 #include "chrome/common/url_constants.h"
14 #include "chrome/test/base/in_process_browser_test.h" 18 #include "chrome/test/base/in_process_browser_test.h"
15 #include "chrome/test/base/ui_test_utils.h" 19 #include "chrome/test/base/ui_test_utils.h"
16 #include "content/public/browser/notification_service.h" 20 #include "content/public/browser/notification_service.h"
17 #include "content/public/test/browser_test_utils.h" 21 #include "content/public/test/browser_test_utils.h"
18 #include "content/public/test/test_utils.h" 22 #include "content/public/test/test_utils.h"
23 #include "extensions/common/value_builder.h"
19 #include "net/dns/mock_host_resolver.h" 24 #include "net/dns/mock_host_resolver.h"
20 #include "net/test/embedded_test_server/embedded_test_server.h" 25 #include "net/test/embedded_test_server/embedded_test_server.h"
21 #include "testing/gmock/include/gmock/gmock.h" 26 #include "testing/gmock/include/gmock/gmock.h"
27 #include "testing/gtest/include/gtest/gtest.h"
22 28
23 using base::Bucket; 29 using base::Bucket;
30 using content::WebContents;
31 using extensions::DictionaryBuilder;
32 using extensions::Extension;
33 using extensions::ListBuilder;
34 using extensions::TestExtensionDir;
24 using testing::ContainerEq; 35 using testing::ContainerEq;
25 using testing::ElementsAre; 36 using testing::ElementsAre;
26 37
27 namespace { 38 namespace {
28 39
29 class TestMemoryDetails : public MetricsMemoryDetails { 40 class TestMemoryDetails : public MetricsMemoryDetails {
30 public: 41 public:
31 TestMemoryDetails() 42 TestMemoryDetails()
32 : MetricsMemoryDetails(base::Bind(&base::DoNothing), nullptr) {} 43 : MetricsMemoryDetails(base::Bind(&base::DoNothing), nullptr) {}
33 44
(...skipping 16 matching lines...) Expand all
50 base::MessageLoop::current()->Quit(); 61 base::MessageLoop::current()->Quit();
51 } 62 }
52 63
53 scoped_ptr<base::HistogramTester> uma_; 64 scoped_ptr<base::HistogramTester> uma_;
54 65
55 DISALLOW_COPY_AND_ASSIGN(TestMemoryDetails); 66 DISALLOW_COPY_AND_ASSIGN(TestMemoryDetails);
56 }; 67 };
57 68
58 } // namespace 69 } // namespace
59 70
60 class SiteDetailsBrowserTest : public InProcessBrowserTest { 71 class SiteDetailsBrowserTest : public ExtensionBrowserTest {
61 public: 72 public:
62 SiteDetailsBrowserTest() {} 73 SiteDetailsBrowserTest() {}
63 ~SiteDetailsBrowserTest() override {} 74 ~SiteDetailsBrowserTest() override {}
64 75
65 void SetUpOnMainThread() override { 76 void SetUpOnMainThread() override {
66 host_resolver()->AddRule("*", "127.0.0.1"); 77 host_resolver()->AddRule("*", "127.0.0.1");
67 78
68 // Add content/test/data so we can use cross_site_iframe_factory.html 79 // Add content/test/data so we can use cross_site_iframe_factory.html
69 base::FilePath test_data_dir; 80 base::FilePath test_data_dir;
70 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir)); 81 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
71 embedded_test_server()->ServeFilesFromDirectory( 82 embedded_test_server()->ServeFilesFromDirectory(
72 test_data_dir.AppendASCII("content/test/data/")); 83 test_data_dir.AppendASCII("content/test/data/"));
73 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 84 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
74 } 85 }
75 86
87 // Create and install an extension that has a couple of web-accessible
88 // resources and, optionally, a background process.
89 const Extension* CreateExtension(const std::string& name,
90 bool has_background_process) {
91 scoped_ptr<TestExtensionDir> dir(new TestExtensionDir);
92
93 DictionaryBuilder manifest;
94 manifest.Set("name", name)
95 .Set("version", "1.0")
96 .Set("manifest_version", 2)
97 .Set("web_accessible_resources", ListBuilder()
98 .Append("blank_iframe.html")
99 .Append("http_iframe.html"));
100
101 if (has_background_process) {
102 manifest.Set("background",
103 DictionaryBuilder().Set("scripts",
104 ListBuilder().Append("script.js")));
105 dir->WriteFile(FILE_PATH_LITERAL("script.js"),
106 "console.log('" + name + " running');");
107 }
108
109 dir->WriteFile(FILE_PATH_LITERAL("blank_iframe.html"),
110 "<html><body>" + name +
111 ", blank iframe: "
112 "<iframe width=40 height=40></iframe></body></html>");
113 GURL iframe_url = embedded_test_server()->GetURL("w.com", "/title1.html");
114 dir->WriteFile(FILE_PATH_LITERAL("http_iframe.html"),
115 "<html><body>" + name +
116 ", http:// iframe: "
117 "<iframe width=40 height=40 src='" +
118 iframe_url.spec() + "'></iframe></body></html>");
119 dir->WriteManifest(manifest.ToJSON());
120
121 const Extension* extension = LoadExtension(dir->unpacked_path());
122 EXPECT_TRUE(extension);
123 temp_dirs_.push_back(dir.release());
124 return extension;
125 }
126
76 private: 127 private:
128 ScopedVector<TestExtensionDir> temp_dirs_;
77 DISALLOW_COPY_AND_ASSIGN(SiteDetailsBrowserTest); 129 DISALLOW_COPY_AND_ASSIGN(SiteDetailsBrowserTest);
78 }; 130 };
79 131
80 // Test the accuracy of SiteDetails process estimation, in the presence of 132 // Test the accuracy of SiteDetails process estimation, in the presence of
81 // multiple iframes, navigation, multiple BrowsingInstances, and multiple tabs 133 // multiple iframes, navigation, multiple BrowsingInstances, and multiple tabs
82 // in the same BrowsingInstance. 134 // in the same BrowsingInstance.
83 IN_PROC_BROWSER_TEST_F(SiteDetailsBrowserTest, ManyCrossSiteIframes) { 135 IN_PROC_BROWSER_TEST_F(SiteDetailsBrowserTest, ManyIframes) {
84 // Page with 14 nested oopifs across 9 sites (a.com through i.com). 136 // Page with 14 nested oopifs across 9 sites (a.com through i.com).
85 // None of these are https. 137 // None of these are https.
86 GURL abcdefghi_url = embedded_test_server()->GetURL( 138 GURL abcdefghi_url = embedded_test_server()->GetURL(
87 "a.com", 139 "a.com",
88 "/cross_site_iframe_factory.html?a(b(a(b,c,d,e,f,g,h)),c,d,e,i(f))"); 140 "/cross_site_iframe_factory.html?a(b(a(b,c,d,e,f,g,h)),c,d,e,i(f))");
89 ui_test_utils::NavigateToURL(browser(), abcdefghi_url); 141 ui_test_utils::NavigateToURL(browser(), abcdefghi_url);
90 142
91 // Get the metrics. 143 // Get the metrics.
92 scoped_refptr<TestMemoryDetails> details = new TestMemoryDetails(); 144 scoped_refptr<TestMemoryDetails> details = new TestMemoryDetails();
93 details->StartFetchAndWait(); 145 details->StartFetchAndWait();
(...skipping 15 matching lines...) Expand all
109 ElementsAre(Bucket(9, 1))); 161 ElementsAre(Bucket(9, 1)));
110 EXPECT_THAT(details->uma()->GetAllSamples( 162 EXPECT_THAT(details->uma()->GetAllSamples(
111 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"), 163 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"),
112 ElementsAre(Bucket(1, 1))); 164 ElementsAre(Bucket(1, 1)));
113 EXPECT_THAT(details->uma()->GetAllSamples( 165 EXPECT_THAT(details->uma()->GetAllSamples(
114 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"), 166 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"),
115 ElementsAre(Bucket(1, 1))); 167 ElementsAre(Bucket(1, 1)));
116 EXPECT_THAT(details->uma()->GetAllSamples( 168 EXPECT_THAT(details->uma()->GetAllSamples(
117 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"), 169 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"),
118 ElementsAre(Bucket(1, 1))); 170 ElementsAre(Bucket(1, 1)));
171 EXPECT_THAT(details->uma()->GetAllSamples(
172 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
173 ElementsAre(Bucket(1, 1)));
174 EXPECT_THAT(details->uma()->GetAllSamples(
175 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
176 ElementsAre(Bucket(1, 1)));
177 EXPECT_THAT(details->uma()->GetAllSamples(
178 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
179 ElementsAre(Bucket(1, 1)));
119 180
120 // Navigate to a different, disjoint set of 7 sites. 181 // Navigate to a different, disjoint set of 7 sites.
121 GURL pqrstuv_url = embedded_test_server()->GetURL( 182 GURL pqrstuv_url = embedded_test_server()->GetURL(
122 "p.com", 183 "p.com",
123 "/cross_site_iframe_factory.html?p(q(r),r(s),s(t),t(q),u(u),v(p))"); 184 "/cross_site_iframe_factory.html?p(q(r),r(s),s(t),t(q),u(u),v(p))");
124 ui_test_utils::NavigateToURL(browser(), pqrstuv_url); 185 ui_test_utils::NavigateToURL(browser(), pqrstuv_url);
125 186
126 details = new TestMemoryDetails(); 187 details = new TestMemoryDetails();
127 details->StartFetchAndWait(); 188 details->StartFetchAndWait();
128 189
(...skipping 14 matching lines...) Expand all
143 ElementsAre(Bucket(7, 1))); 204 ElementsAre(Bucket(7, 1)));
144 EXPECT_THAT(details->uma()->GetAllSamples( 205 EXPECT_THAT(details->uma()->GetAllSamples(
145 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"), 206 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"),
146 ElementsAre(Bucket(1, 1))); 207 ElementsAre(Bucket(1, 1)));
147 EXPECT_THAT(details->uma()->GetAllSamples( 208 EXPECT_THAT(details->uma()->GetAllSamples(
148 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"), 209 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"),
149 ElementsAre(Bucket(1, 1))); 210 ElementsAre(Bucket(1, 1)));
150 EXPECT_THAT(details->uma()->GetAllSamples( 211 EXPECT_THAT(details->uma()->GetAllSamples(
151 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"), 212 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"),
152 ElementsAre(Bucket(1, 1))); 213 ElementsAre(Bucket(1, 1)));
214 EXPECT_THAT(details->uma()->GetAllSamples(
215 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
216 ElementsAre(Bucket(1, 1)));
217 EXPECT_THAT(details->uma()->GetAllSamples(
218 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
219 ElementsAre(Bucket(1, 1)));
220 EXPECT_THAT(details->uma()->GetAllSamples(
221 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
222 ElementsAre(Bucket(1, 1)));
153 223
154 // Open a second tab (different BrowsingInstance) with 4 sites (a through d). 224 // Open a second tab (different BrowsingInstance) with 4 sites (a through d).
155 GURL abcd_url = embedded_test_server()->GetURL( 225 GURL abcd_url = embedded_test_server()->GetURL(
156 "a.com", "/cross_site_iframe_factory.html?a(b(c(d())))"); 226 "a.com", "/cross_site_iframe_factory.html?a(b(c(d())))");
157 AddTabAtIndex(1, abcd_url, ui::PAGE_TRANSITION_TYPED); 227 AddTabAtIndex(1, abcd_url, ui::PAGE_TRANSITION_TYPED);
158 228
159 details = new TestMemoryDetails(); 229 details = new TestMemoryDetails();
160 details->StartFetchAndWait(); 230 details->StartFetchAndWait();
161 231
162 EXPECT_THAT( 232 EXPECT_THAT(
(...skipping 13 matching lines...) Expand all
176 ElementsAre(Bucket(11, 1))); 246 ElementsAre(Bucket(11, 1)));
177 EXPECT_THAT(details->uma()->GetAllSamples( 247 EXPECT_THAT(details->uma()->GetAllSamples(
178 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"), 248 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"),
179 ElementsAre(Bucket(2, 1))); 249 ElementsAre(Bucket(2, 1)));
180 EXPECT_THAT(details->uma()->GetAllSamples( 250 EXPECT_THAT(details->uma()->GetAllSamples(
181 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"), 251 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"),
182 ElementsAre(Bucket(1, 1))); // TODO(nick): This should be 2. 252 ElementsAre(Bucket(1, 1))); // TODO(nick): This should be 2.
183 EXPECT_THAT(details->uma()->GetAllSamples( 253 EXPECT_THAT(details->uma()->GetAllSamples(
184 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"), 254 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"),
185 ElementsAre(Bucket(2, 1))); 255 ElementsAre(Bucket(2, 1)));
256 EXPECT_THAT(details->uma()->GetAllSamples(
257 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
258 ElementsAre(Bucket(2, 1)));
259 EXPECT_THAT(details->uma()->GetAllSamples(
260 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
261 ElementsAre(Bucket(1, 1)));
262 EXPECT_THAT(details->uma()->GetAllSamples(
263 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
264 ElementsAre(Bucket(2, 1)));
186 265
187 // Open a third tab (different BrowsingInstance) with the same 4 sites. 266 // Open a third tab (different BrowsingInstance) with the same 4 sites.
188 AddTabAtIndex(2, abcd_url, ui::PAGE_TRANSITION_TYPED); 267 AddTabAtIndex(2, abcd_url, ui::PAGE_TRANSITION_TYPED);
189 268
190 details = new TestMemoryDetails(); 269 details = new TestMemoryDetails();
191 details->StartFetchAndWait(); 270 details->StartFetchAndWait();
192 271
193 EXPECT_THAT( 272 EXPECT_THAT(
194 details->uma()->GetAllSamples("SiteIsolation.BrowsingInstanceCount"), 273 details->uma()->GetAllSamples("SiteIsolation.BrowsingInstanceCount"),
195 ElementsAre(Bucket(3, 1))); 274 ElementsAre(Bucket(3, 1)));
(...skipping 12 matching lines...) Expand all
208 ElementsAre(Bucket(15, 1))); 287 ElementsAre(Bucket(15, 1)));
209 EXPECT_THAT(details->uma()->GetAllSamples( 288 EXPECT_THAT(details->uma()->GetAllSamples(
210 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"), 289 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"),
211 ElementsAre(Bucket(3, 1))); 290 ElementsAre(Bucket(3, 1)));
212 EXPECT_THAT(details->uma()->GetAllSamples( 291 EXPECT_THAT(details->uma()->GetAllSamples(
213 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"), 292 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"),
214 ElementsAre(Bucket(1, 1))); // TODO(nick): This should be 3. 293 ElementsAre(Bucket(1, 1))); // TODO(nick): This should be 3.
215 EXPECT_THAT(details->uma()->GetAllSamples( 294 EXPECT_THAT(details->uma()->GetAllSamples(
216 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"), 295 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"),
217 ElementsAre(Bucket(3, 1))); 296 ElementsAre(Bucket(3, 1)));
297 EXPECT_THAT(details->uma()->GetAllSamples(
298 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
299 ElementsAre(Bucket(3, 1)));
300 EXPECT_THAT(details->uma()->GetAllSamples(
301 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
302 ElementsAre(Bucket(1, 1)));
303 EXPECT_THAT(details->uma()->GetAllSamples(
304 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
305 ElementsAre(Bucket(3, 1)));
218 306
219 // Do a window.open() to obtain a fourth tab in the same BrowsingInstance as 307 // From the third tab, window.open() a fourth tab in the same
220 // the third tab. The new page uses the same four sites "a-d" as third tab, 308 // BrowsingInstance, to a page using the same four sites "a-d" as third tab,
221 // plus an additional site "e". The estimated process counts should increase 309 // plus an additional site "e". The estimated process counts should increase
222 // by one (not five) from the previous result, since the new tab can reuse the 310 // by one (not five) from the previous scenario, as the new tab can reuse the
223 // four processes already in the BrowsingInstance. 311 // four processes already in the BrowsingInstance.
224 GURL dcbae_url = embedded_test_server()->GetURL( 312 GURL dcbae_url = embedded_test_server()->GetURL(
225 "a.com", "/cross_site_iframe_factory.html?d(c(b(a(e))))"); 313 "a.com", "/cross_site_iframe_factory.html?d(c(b(a(e))))");
226 ui_test_utils::UrlLoadObserver load_complete( 314 ui_test_utils::UrlLoadObserver load_complete(
227 dcbae_url, content::NotificationService::AllSources()); 315 dcbae_url, content::NotificationService::AllSources());
228 ASSERT_EQ(3, browser()->tab_strip_model()->count()); 316 ASSERT_EQ(3, browser()->tab_strip_model()->count());
229 ASSERT_TRUE(content::ExecuteScript( 317 ASSERT_TRUE(content::ExecuteScript(
230 browser()->tab_strip_model()->GetActiveWebContents(), 318 browser()->tab_strip_model()->GetActiveWebContents(),
231 "window.open('" + dcbae_url.spec() + "');")); 319 "window.open('" + dcbae_url.spec() + "');"));
232 ASSERT_EQ(4, browser()->tab_strip_model()->count()); 320 ASSERT_EQ(4, browser()->tab_strip_model()->count());
(...skipping 20 matching lines...) Expand all
253 ElementsAre(Bucket(16, 1))); 341 ElementsAre(Bucket(16, 1)));
254 EXPECT_THAT(details->uma()->GetAllSamples( 342 EXPECT_THAT(details->uma()->GetAllSamples(
255 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"), 343 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"),
256 ElementsAre(Bucket(3, 1))); 344 ElementsAre(Bucket(3, 1)));
257 EXPECT_THAT(details->uma()->GetAllSamples( 345 EXPECT_THAT(details->uma()->GetAllSamples(
258 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"), 346 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"),
259 ElementsAre(Bucket(1, 1))); // TODO(nick): This should be 3. 347 ElementsAre(Bucket(1, 1))); // TODO(nick): This should be 3.
260 EXPECT_THAT(details->uma()->GetAllSamples( 348 EXPECT_THAT(details->uma()->GetAllSamples(
261 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"), 349 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"),
262 ElementsAre(Bucket(3, 1))); 350 ElementsAre(Bucket(3, 1)));
351 EXPECT_THAT(details->uma()->GetAllSamples(
352 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
353 ElementsAre(Bucket(3, 1)));
354 EXPECT_THAT(details->uma()->GetAllSamples(
355 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
356 ElementsAre(Bucket(1, 1)));
357 EXPECT_THAT(details->uma()->GetAllSamples(
358 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
359 ElementsAre(Bucket(3, 1)));
263 } 360 }
361
362 IN_PROC_BROWSER_TEST_F(SiteDetailsBrowserTest, IsolateExtensions) {
363 // We start on "about:blank", which should be credited with a process in this
364 // case.
365 scoped_refptr<TestMemoryDetails> details = new TestMemoryDetails();
366 details->StartFetchAndWait();
367 EXPECT_THAT(details->uma()->GetAllSamples(
368 "SiteIsolation.CurrentRendererProcessCount"),
369 ElementsAre(Bucket(1, 1)));
370 EXPECT_THAT(details->uma()->GetAllSamples(
371 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
372 ElementsAre(Bucket(1, 1)));
373 EXPECT_THAT(details->uma()->GetAllSamples(
374 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
375 ElementsAre(Bucket(1, 1)));
376 EXPECT_THAT(details->uma()->GetAllSamples(
377 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
378 ElementsAre(Bucket(1, 1)));
379
380 // Install one script-injecting extension with background page, and an
381 // extension with web accessible resources.
382 const Extension* extension1 = CreateExtension("Extension One", true);
383 const Extension* extension2 = CreateExtension("Extension Two", false);
384
385 // Open two a.com tabs (with cross site http iframes). IsolateExtensions mode
386 // should have no effect so far, since there are no frames straddling the
387 // extension/web boundary.
388 GURL tab1_url = embedded_test_server()->GetURL(
389 "a.com", "/cross_site_iframe_factory.html?a(b,c)");
390 ui_test_utils::NavigateToURL(browser(), tab1_url);
391 WebContents* tab1 = browser()->tab_strip_model()->GetWebContentsAt(0);
392 GURL tab2_url = embedded_test_server()->GetURL(
393 "a.com", "/cross_site_iframe_factory.html?a(d,e)");
394 AddTabAtIndex(1, tab2_url, ui::PAGE_TRANSITION_TYPED);
395 WebContents* tab2 = browser()->tab_strip_model()->GetWebContentsAt(1);
396
397 details = new TestMemoryDetails();
398 details->StartFetchAndWait();
399 EXPECT_THAT(details->uma()->GetAllSamples(
400 "SiteIsolation.CurrentRendererProcessCount"),
401 ElementsAre(Bucket(3, 1)));
402 EXPECT_THAT(details->uma()->GetAllSamples(
403 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
404 ElementsAre(Bucket(3, 1)));
405 EXPECT_THAT(details->uma()->GetAllSamples(
406 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
407 ElementsAre(Bucket(2, 1)));
408 EXPECT_THAT(details->uma()->GetAllSamples(
409 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
410 ElementsAre(Bucket(3, 1)));
411
412 // Test that "one process per extension" applies even when web content has an
413 // extension iframe.
414
415 // Tab1 navigates its first iframe to a resource of extension1. This shouldn't
416 // result in a new extension process (it should share with extension1's
417 // background page).
418 content::NavigateIframeToURL(
419 tab1, "child-0", extension1->GetResourceURL("/blank_iframe.html"));
420 details = new TestMemoryDetails();
421 details->StartFetchAndWait();
422 EXPECT_THAT(details->uma()->GetAllSamples(
423 "SiteIsolation.CurrentRendererProcessCount"),
424 ElementsAre(Bucket(3, 1)));
425 EXPECT_THAT(details->uma()->GetAllSamples(
426 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
427 ElementsAre(Bucket(3, 1)));
428 EXPECT_THAT(details->uma()->GetAllSamples(
429 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
430 ElementsAre(Bucket(2, 1)));
431 EXPECT_THAT(details->uma()->GetAllSamples(
432 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
433 ElementsAre(Bucket(3, 1)));
434
435 // Tab2 navigates its first iframe to a resource of extension1. This also
436 // shouldn't result in a new extension process (it should share with the
437 // background page and the other iframe).
438 content::NavigateIframeToURL(
439 tab2, "child-0", extension1->GetResourceURL("/blank_iframe.html"));
440 details = new TestMemoryDetails();
441 details->StartFetchAndWait();
442 EXPECT_THAT(details->uma()->GetAllSamples(
443 "SiteIsolation.CurrentRendererProcessCount"),
444 ElementsAre(Bucket(3, 1)));
445 EXPECT_THAT(details->uma()->GetAllSamples(
446 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
447 ElementsAre(Bucket(3, 1)));
448 EXPECT_THAT(details->uma()->GetAllSamples(
449 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
450 ElementsAre(Bucket(2, 1)));
451 EXPECT_THAT(details->uma()->GetAllSamples(
452 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
453 ElementsAre(Bucket(3, 1)));
454
455 // Tab1 navigates its second iframe to a resource of extension2. This SHOULD
456 // result in a new process since extension2 had no existing process.
457 content::NavigateIframeToURL(
458 tab1, "child-1", extension2->GetResourceURL("/blank_iframe.html"));
459 details = new TestMemoryDetails();
460 details->StartFetchAndWait();
461 EXPECT_THAT(details->uma()->GetAllSamples(
462 "SiteIsolation.CurrentRendererProcessCount"),
463 ElementsAre(Bucket(3, 1)));
464 EXPECT_THAT(details->uma()->GetAllSamples(
465 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
466 ElementsAre(Bucket(4, 1)));
467 EXPECT_THAT(details->uma()->GetAllSamples(
468 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
469 ElementsAre(Bucket(3, 1)));
470 EXPECT_THAT(details->uma()->GetAllSamples(
471 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
472 ElementsAre(Bucket(4, 1)));
473
474 // Tab2 navigates its second iframe to a resource of extension2. This should
475 // share the existing extension2 process.
476 content::NavigateIframeToURL(
477 tab2, "child-1", extension2->GetResourceURL("/blank_iframe.html"));
478 details = new TestMemoryDetails();
479 details->StartFetchAndWait();
480 EXPECT_THAT(details->uma()->GetAllSamples(
481 "SiteIsolation.CurrentRendererProcessCount"),
482 ElementsAre(Bucket(3, 1)));
483 EXPECT_THAT(details->uma()->GetAllSamples(
484 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
485 ElementsAre(Bucket(4, 1)));
486 EXPECT_THAT(details->uma()->GetAllSamples(
487 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
488 ElementsAre(Bucket(3, 1)));
489 EXPECT_THAT(details->uma()->GetAllSamples(
490 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
491 ElementsAre(Bucket(4, 1)));
492
493 // Install extension3 (identical config to extension2)
494 const Extension* extension3 = CreateExtension("Extension Three", false);
495
496 // Navigate Tab2 to a top-level page from extension3. There are four processes
497 // now: one for tab1's main frame, and one for each of the extensions:
498 // extension1 has a process because it has a background page; extension2 is
499 // used as an iframe in tab1, and extension3 is the top-level frame in tab2.
500 ui_test_utils::NavigateToURL(browser(),
501 extension3->GetResourceURL("blank_iframe.html"));
502 details = new TestMemoryDetails();
503 details->StartFetchAndWait();
504 EXPECT_THAT(details->uma()->GetAllSamples(
505 "SiteIsolation.CurrentRendererProcessCount"),
506 ElementsAre(Bucket(3, 1)));
507 EXPECT_THAT(details->uma()->GetAllSamples(
508 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
509 ElementsAre(Bucket(4, 1)));
510 EXPECT_THAT(details->uma()->GetAllSamples(
511 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
512 ElementsAre(Bucket(4, 1)));
513 EXPECT_THAT(details->uma()->GetAllSamples(
514 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
515 ElementsAre(Bucket(4, 1)));
516
517 // Navigate tab2 to a different extension3 page containing a web iframe. The
518 // iframe should get its own process. The lower bound number indicates that,
519 // in theory, the iframe could share a process with tab1's main frame.
520 ui_test_utils::NavigateToURL(browser(),
521 extension3->GetResourceURL("http_iframe.html"));
522 details = new TestMemoryDetails();
523 details->StartFetchAndWait();
524 EXPECT_THAT(details->uma()->GetAllSamples(
525 "SiteIsolation.CurrentRendererProcessCount"),
526 ElementsAre(Bucket(3, 1)));
527 EXPECT_THAT(details->uma()->GetAllSamples(
528 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
529 ElementsAre(Bucket(5, 1)));
530 EXPECT_THAT(details->uma()->GetAllSamples(
531 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
532 ElementsAre(Bucket(4, 1)));
533 EXPECT_THAT(details->uma()->GetAllSamples(
534 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
535 ElementsAre(Bucket(5, 1)));
536
537 // Navigate tab1 to an extension3 page with an extension3 iframe. There should
538 // be three processes estimated by IsolateExtensions: one for extension3, one
539 // for extension1's background page, and one for the web iframe in tab2.
540 browser()->tab_strip_model()->ActivateTabAt(0, true);
541 ui_test_utils::NavigateToURL(browser(),
542 extension3->GetResourceURL("blank_iframe.html"));
543 details = new TestMemoryDetails();
544 details->StartFetchAndWait();
545 EXPECT_THAT(details->uma()->GetAllSamples(
546 "SiteIsolation.CurrentRendererProcessCount"),
547 ElementsAre(Bucket(2, 1)));
548 EXPECT_THAT(details->uma()->GetAllSamples(
549 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
550 ElementsAre(Bucket(3, 1)));
551 EXPECT_THAT(details->uma()->GetAllSamples(
552 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
553 ElementsAre(Bucket(3, 1)));
554 EXPECT_THAT(details->uma()->GetAllSamples(
555 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
556 ElementsAre(Bucket(3, 1)));
557
558 // Now navigate tab1 to an extension3 page with a web iframe. This could share
559 // a process with tab2's iframe (the LowerBound number), or it could get its
560 // own process (the Estimate number).
561 ui_test_utils::NavigateToURL(browser(),
562 extension3->GetResourceURL("http_iframe.html"));
563 details = new TestMemoryDetails();
564 details->StartFetchAndWait();
565 EXPECT_THAT(details->uma()->GetAllSamples(
566 "SiteIsolation.CurrentRendererProcessCount"),
567 ElementsAre(Bucket(2, 1)));
568 EXPECT_THAT(details->uma()->GetAllSamples(
569 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
570 ElementsAre(Bucket(4, 1)));
571 EXPECT_THAT(details->uma()->GetAllSamples(
572 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
573 ElementsAre(Bucket(3, 1)));
574 EXPECT_THAT(details->uma()->GetAllSamples(
575 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
576 ElementsAre(Bucket(4, 1)));
577 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698