blob: edf43542caf9a72c1aa00bb7af595d9fd841a07f [file] [log] [blame]
nick8c3895b72015-08-13 00:04:021// Copyright 2015 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 "chrome/browser/site_details.h"
6
avi664c07b2015-12-26 02:18:317#include <stddef.h>
8#include <stdint.h>
9
limasdf3d102542015-12-09 03:58:4510#include <utility>
11
nick8c3895b72015-08-13 00:04:0212#include "base/bind_helpers.h"
nick37dfd9de2015-09-14 19:54:0313#include "base/files/file_path.h"
avi664c07b2015-12-26 02:18:3114#include "base/macros.h"
nick8c3895b72015-08-13 00:04:0215#include "base/message_loop/message_loop.h"
16#include "base/path_service.h"
nick3a8aa1f2015-09-24 17:00:1317#include "base/strings/stringprintf.h"
nick8c3895b72015-08-13 00:04:0218#include "base/test/histogram_tester.h"
nasko7d4c2cb2015-11-26 01:29:3519#include "chrome/browser/browser_process.h"
nick37dfd9de2015-09-14 19:54:0320#include "chrome/browser/extensions/extension_browsertest.h"
21#include "chrome/browser/extensions/test_extension_dir.h"
nick8c3895b72015-08-13 00:04:0222#include "chrome/browser/metrics/metrics_memory_details.h"
23#include "chrome/browser/ui/browser.h"
24#include "chrome/browser/ui/tabs/tab_strip_model.h"
nasko82f3b2012015-10-22 01:04:4725#include "chrome/common/extensions/extension_process_policy.h"
nick37dfd9de2015-09-14 19:54:0326#include "chrome/common/url_constants.h"
nick8c3895b72015-08-13 00:04:0227#include "chrome/test/base/in_process_browser_test.h"
28#include "chrome/test/base/ui_test_utils.h"
nasko7d4c2cb2015-11-26 01:29:3529#include "components/metrics/metrics_service.h"
30#include "components/variations/metrics_util.h"
nick8c3895b72015-08-13 00:04:0231#include "content/public/browser/notification_service.h"
nick3a8aa1f2015-09-24 17:00:1332#include "content/public/browser/render_process_host.h"
nasko7d4c2cb2015-11-26 01:29:3533#include "content/public/common/content_switches.h"
nick8c3895b72015-08-13 00:04:0234#include "content/public/test/browser_test_utils.h"
35#include "content/public/test/test_utils.h"
alexmos9d656a82015-12-02 02:03:0936#include "extensions/common/switches.h"
nick37dfd9de2015-09-14 19:54:0337#include "extensions/common/value_builder.h"
nick8c3895b72015-08-13 00:04:0238#include "net/dns/mock_host_resolver.h"
39#include "net/test/embedded_test_server/embedded_test_server.h"
40#include "testing/gmock/include/gmock/gmock.h"
nick37dfd9de2015-09-14 19:54:0341#include "testing/gtest/include/gtest/gtest.h"
nick8c3895b72015-08-13 00:04:0242
43using base::Bucket;
nick37dfd9de2015-09-14 19:54:0344using content::WebContents;
45using extensions::DictionaryBuilder;
46using extensions::Extension;
47using extensions::ListBuilder;
48using extensions::TestExtensionDir;
nick8c3895b72015-08-13 00:04:0249using testing::ElementsAre;
nick6c28ecc92016-02-09 21:30:1250using testing::PrintToString;
nick8c3895b72015-08-13 00:04:0251
52namespace {
53
54class TestMemoryDetails : public MetricsMemoryDetails {
55 public:
56 TestMemoryDetails()
57 : MetricsMemoryDetails(base::Bind(&base::DoNothing), nullptr) {}
58
59 void StartFetchAndWait() {
60 uma_.reset(new base::HistogramTester());
ellyjonescd6e449d2016-04-13 19:31:1561 StartFetch();
nick8c3895b72015-08-13 00:04:0262 content::RunMessageLoop();
63 }
64
65 // Returns a HistogramTester which observed the most recent call to
66 // StartFetchAndWait().
67 base::HistogramTester* uma() { return uma_.get(); }
68
naskoaab1a442015-11-19 02:10:3669 int GetOutOfProcessIframeCount() {
70 std::vector<Bucket> buckets =
71 uma_->GetAllSamples("SiteIsolation.OutOfProcessIframes");
72 CHECK_EQ(1U, buckets.size());
73 return buckets[0].min;
74 }
75
nickb2545f72015-10-30 20:05:1576 size_t CountPageTitles() {
77 size_t count = 0;
78 for (const ProcessMemoryInformation& process : ChromeBrowser()->processes) {
79 if (process.process_type == content::PROCESS_TYPE_RENDERER) {
80 count += process.titles.size();
81 }
82 }
83 return count;
84 }
85
nick8c3895b72015-08-13 00:04:0286 private:
87 ~TestMemoryDetails() override {}
88
89 void OnDetailsAvailable() override {
90 MetricsMemoryDetails::OnDetailsAvailable();
91 // Exit the loop initiated by StartFetchAndWait().
ki.stfuc4f8e242015-10-09 20:40:2092 base::MessageLoop::current()->QuitWhenIdle();
nick8c3895b72015-08-13 00:04:0293 }
94
dcheng4af48582016-04-19 00:29:3595 std::unique_ptr<base::HistogramTester> uma_;
nick8c3895b72015-08-13 00:04:0296
97 DISALLOW_COPY_AND_ASSIGN(TestMemoryDetails);
98};
99
nick6c28ecc92016-02-09 21:30:12100IsolationScenarioType GetCurrentPolicy() {
101 if (content::AreAllSitesIsolatedForTesting())
102 return ISOLATE_ALL_SITES;
103 if (extensions::IsIsolateExtensionsEnabled())
104 return ISOLATE_EXTENSIONS;
105 return ISOLATE_NOTHING;
106}
107
108// This matcher takes three other matchers as arguments, and applies one of them
109// depending on the current site isolation mode. The first applies if no site
110// isolation mode is active; the second applies under --isolate-extensions mode;
111// and the third applies under --site-per-process mode.
112MATCHER_P3(DependingOnPolicy,
113 isolate_nothing,
114 isolate_extensions,
115 isolate_all_sites,
116 GetCurrentPolicy() == ISOLATE_NOTHING
117 ? std::string("(with oopifs disabled) ") +
118 PrintToString(isolate_nothing)
119 : GetCurrentPolicy() == ISOLATE_EXTENSIONS
120 ? std::string("(under --isolate-extensions) ") +
121 PrintToString(isolate_extensions)
122 : std::string("(under --site-per-process) ") +
123 PrintToString(isolate_all_sites)) {
124 switch (GetCurrentPolicy()) {
125 case ISOLATE_NOTHING:
126 return ExplainMatchResult(isolate_nothing, arg, result_listener);
127 case ISOLATE_EXTENSIONS:
128 return ExplainMatchResult(isolate_extensions, arg, result_listener);
129 case ISOLATE_ALL_SITES:
130 return ExplainMatchResult(isolate_all_sites, arg, result_listener);
131 default:
132 return false;
133 }
134}
135
136// Matcher for base::Bucket objects that allows bucket_min to be a matcher.
137MATCHER_P2(Sample,
138 bucket_min,
139 count,
140 std::string("is a Bucket whose count is ") + PrintToString(count) +
141 std::string(" and whose value is ") +
142 PrintToString(bucket_min)) {
143 return ExplainMatchResult(count, arg.count, result_listener) &&
144 ExplainMatchResult(bucket_min, arg.min, result_listener);
145}
146
147// Allow matchers to be pretty-printed when passed to PrintToString() for the
148// cases we care about.
149template <typename P1, typename P2, typename P3>
150void PrintTo(const DependingOnPolicyMatcherP3<P1, P2, P3>& matcher,
151 std::ostream* os) {
152 testing::Matcher<int> matcherCast = matcher;
153 matcherCast.DescribeTo(os);
154}
155
156template <typename P1, typename P2>
157void PrintTo(const SampleMatcherP2<P1, P2>& matcher, std::ostream* os) {
158 testing::Matcher<Bucket> matcherCast = matcher;
159 matcherCast.DescribeTo(os);
160}
161
162// Matches a container of histogram samples, for the common case where the
163// histogram received just one sample.
164#define HasOneSample(x) ElementsAre(Sample(x, 1))
165
nick8c3895b72015-08-13 00:04:02166} // namespace
167
nickeac69982016-02-11 22:18:53168class SiteDetailsBrowserTest : public ExtensionBrowserTest {
nick8c3895b72015-08-13 00:04:02169 public:
170 SiteDetailsBrowserTest() {}
171 ~SiteDetailsBrowserTest() override {}
172
173 void SetUpOnMainThread() override {
174 host_resolver()->AddRule("*", "127.0.0.1");
175
176 // Add content/test/data so we can use cross_site_iframe_factory.html
177 base::FilePath test_data_dir;
178 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
179 embedded_test_server()->ServeFilesFromDirectory(
180 test_data_dir.AppendASCII("content/test/data/"));
svaldeza01f7d92015-11-18 17:47:56181 ASSERT_TRUE(embedded_test_server()->Start());
nick8c3895b72015-08-13 00:04:02182 }
183
nick37dfd9de2015-09-14 19:54:03184 // Create and install an extension that has a couple of web-accessible
185 // resources and, optionally, a background process.
186 const Extension* CreateExtension(const std::string& name,
187 bool has_background_process) {
dcheng4af48582016-04-19 00:29:35188 std::unique_ptr<TestExtensionDir> dir(new TestExtensionDir);
nick37dfd9de2015-09-14 19:54:03189
190 DictionaryBuilder manifest;
191 manifest.Set("name", name)
192 .Set("version", "1.0")
193 .Set("manifest_version", 2)
dcheng794d2bd2016-02-27 03:51:32194 .Set("web_accessible_resources", ListBuilder()
195 .Append("blank_iframe.html")
196 .Append("http_iframe.html")
197 .Append("two_http_iframes.html")
198 .Build());
nick37dfd9de2015-09-14 19:54:03199
200 if (has_background_process) {
limasdf3d102542015-12-09 03:58:45201 manifest.Set(
202 "background",
dcheng794d2bd2016-02-27 03:51:32203 DictionaryBuilder()
204 .Set("scripts", ListBuilder().Append("script.js").Build())
205 .Build());
nick37dfd9de2015-09-14 19:54:03206 dir->WriteFile(FILE_PATH_LITERAL("script.js"),
207 "console.log('" + name + " running');");
208 }
209
210 dir->WriteFile(FILE_PATH_LITERAL("blank_iframe.html"),
nick3a8aa1f2015-09-24 17:00:13211 base::StringPrintf("<html><body>%s, blank iframe:"
212 " <iframe width=80 height=80></iframe>"
213 "</body></html>",
214 name.c_str()));
215 std::string iframe_url =
216 embedded_test_server()
217 ->GetURL("w.com", "/cross_site_iframe_factory.html?w")
218 .spec();
219 std::string iframe_url2 =
220 embedded_test_server()
221 ->GetURL("x.com", "/cross_site_iframe_factory.html?x")
222 .spec();
223 dir->WriteFile(
224 FILE_PATH_LITERAL("http_iframe.html"),
225 base::StringPrintf("<html><body>%s, http:// iframe:"
226 " <iframe width=80 height=80 src='%s'></iframe>"
227 "</body></html>",
228 name.c_str(), iframe_url.c_str()));
229 dir->WriteFile(FILE_PATH_LITERAL("two_http_iframes.html"),
230 base::StringPrintf(
231 "<html><body>%s, two http:// iframes:"
232 " <iframe width=80 height=80 src='%s'></iframe>"
233 " <iframe width=80 height=80 src='%s'></iframe>"
234 "</body></html>",
235 name.c_str(), iframe_url.c_str(), iframe_url2.c_str()));
nick37dfd9de2015-09-14 19:54:03236 dir->WriteManifest(manifest.ToJSON());
237
238 const Extension* extension = LoadExtension(dir->unpacked_path());
239 EXPECT_TRUE(extension);
240 temp_dirs_.push_back(dir.release());
241 return extension;
242 }
243
lazyboy730669d2016-06-10 18:07:57244 // Creates a V2 platform app that loads a web iframe in the app's sandbox
245 // page.
246 // TODO(lazyboy): Deprecate this behavior in https://crbug.com/615585.
247 void CreateAppWithSandboxPage(const std::string& name) {
248 std::unique_ptr<TestExtensionDir> dir(new TestExtensionDir);
249
250 DictionaryBuilder manifest;
251 manifest.Set("name", name)
252 .Set("version", "1.0")
253 .Set("manifest_version", 2)
254 .Set("sandbox",
255 DictionaryBuilder()
256 .Set("pages", ListBuilder().Append("sandbox.html").Build())
257 .Build())
258 .Set("app",
259 DictionaryBuilder()
260 .Set("background",
261 DictionaryBuilder()
262 .Set("scripts",
263 ListBuilder().Append("background.js").Build())
264 .Build())
265 .Build());
266
267 dir->WriteFile(FILE_PATH_LITERAL("background.js"),
268 "var sandboxFrame = document.createElement('iframe');"
269 "sandboxFrame.src = 'sandbox.html';"
270 "document.body.appendChild(sandboxFrame);");
271
272 std::string iframe_url =
273 embedded_test_server()->GetURL("/title1.html").spec();
274 dir->WriteFile(
275 FILE_PATH_LITERAL("sandbox.html"),
276 base::StringPrintf("<html><body>%s, web iframe:"
277 " <iframe width=80 height=80 src=%s></iframe>"
278 "</body></html>",
279 name.c_str(), iframe_url.c_str()));
280 dir->WriteManifest(manifest.ToJSON());
281
282 const Extension* extension = LoadExtension(dir->unpacked_path());
283 EXPECT_TRUE(extension);
284 temp_dirs_.push_back(dir.release());
285 }
286
nick3a8aa1f2015-09-24 17:00:13287 const Extension* CreateHostedApp(const std::string& name,
288 const GURL& app_url) {
dcheng4af48582016-04-19 00:29:35289 std::unique_ptr<TestExtensionDir> dir(new TestExtensionDir);
nick3a8aa1f2015-09-24 17:00:13290
291 DictionaryBuilder manifest;
292 manifest.Set("name", name)
293 .Set("version", "1.0")
294 .Set("manifest_version", 2)
dcheng794d2bd2016-02-27 03:51:32295 .Set(
296 "app",
297 DictionaryBuilder()
298 .Set("urls", ListBuilder().Append(app_url.spec()).Build())
299 .Set("launch",
300 DictionaryBuilder().Set("web_url", app_url.spec()).Build())
301 .Build());
nick3a8aa1f2015-09-24 17:00:13302 dir->WriteManifest(manifest.ToJSON());
303
304 const Extension* extension = LoadExtension(dir->unpacked_path());
305 EXPECT_TRUE(extension);
306 temp_dirs_.push_back(dir.release());
307 return extension;
308 }
309
310 int GetRenderProcessCount() {
311 int count = 0;
312 for (content::RenderProcessHost::iterator it(
313 content::RenderProcessHost::AllHostsIterator());
314 !it.IsAtEnd(); it.Advance()) {
315 count++;
316 }
317 return count;
318 }
319
nasko7d4c2cb2015-11-26 01:29:35320 // Checks whether the test run is part of a field trial with |trial_name|.
321 bool IsInTrial(const std::string& trial_name) {
322 uint32_t trial = metrics::HashName(trial_name);
323
324 std::vector<variations::ActiveGroupId> synthetic_trials;
325 g_browser_process->metrics_service()
326 ->GetCurrentSyntheticFieldTrialsForTesting(&synthetic_trials);
327
328 for (const auto& entry : synthetic_trials) {
329 if (trial == entry.name)
330 return true;
331 }
332
333 return false;
334 }
335
336 // Similar to IsInTrial but checks that the correct group is present as well.
337 bool IsInTrialGroup(const std::string& trial_name,
338 const std::string& group_name) {
339 uint32_t trial = metrics::HashName(trial_name);
340 uint32_t group = metrics::HashName(group_name);
341
342 std::vector<variations::ActiveGroupId> synthetic_trials;
343 g_browser_process->metrics_service()
344 ->GetCurrentSyntheticFieldTrialsForTesting(&synthetic_trials);
345
346 for (const auto& entry : synthetic_trials) {
347 if (trial == entry.name && group == entry.group)
348 return true;
349 }
350
351 return false;
352 }
353
nick8c3895b72015-08-13 00:04:02354 private:
nick37dfd9de2015-09-14 19:54:03355 ScopedVector<TestExtensionDir> temp_dirs_;
nick8c3895b72015-08-13 00:04:02356 DISALLOW_COPY_AND_ASSIGN(SiteDetailsBrowserTest);
357};
358
nick3a8aa1f2015-09-24 17:00:13359
nick8c3895b72015-08-13 00:04:02360// Test the accuracy of SiteDetails process estimation, in the presence of
361// multiple iframes, navigation, multiple BrowsingInstances, and multiple tabs
362// in the same BrowsingInstance.
nickeac69982016-02-11 22:18:53363IN_PROC_BROWSER_TEST_F(SiteDetailsBrowserTest, ManyIframes) {
nick8c3895b72015-08-13 00:04:02364 // Page with 14 nested oopifs across 9 sites (a.com through i.com).
365 // None of these are https.
366 GURL abcdefghi_url = embedded_test_server()->GetURL(
367 "a.com",
368 "/cross_site_iframe_factory.html?a(b(a(b,c,d,e,f,g,h)),c,d,e,i(f))");
369 ui_test_utils::NavigateToURL(browser(), abcdefghi_url);
370
371 // Get the metrics.
372 scoped_refptr<TestMemoryDetails> details = new TestMemoryDetails();
373 details->StartFetchAndWait();
374
nickb2545f72015-10-30 20:05:15375 EXPECT_EQ(1U, details->CountPageTitles());
nick8c3895b72015-08-13 00:04:02376 EXPECT_THAT(
377 details->uma()->GetAllSamples("SiteIsolation.BrowsingInstanceCount"),
nick6c28ecc92016-02-09 21:30:12378 HasOneSample(1));
nick8c3895b72015-08-13 00:04:02379 EXPECT_THAT(details->uma()->GetAllSamples(
380 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12381 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15382 EXPECT_THAT(details->uma()->GetAllSamples(
383 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12384 HasOneSample(1));
nick8c3895b72015-08-13 00:04:02385 EXPECT_THAT(details->uma()->GetAllSamples(
386 "SiteIsolation.IsolateAllSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12387 HasOneSample(9));
nick8c3895b72015-08-13 00:04:02388 EXPECT_THAT(details->uma()->GetAllSamples(
389 "SiteIsolation.IsolateAllSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12390 HasOneSample(9));
nick8c3895b72015-08-13 00:04:02391 EXPECT_THAT(details->uma()->GetAllSamples(
392 "SiteIsolation.IsolateAllSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12393 HasOneSample(9));
nick8c3895b72015-08-13 00:04:02394 EXPECT_THAT(details->uma()->GetAllSamples(
395 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12396 HasOneSample(1));
nick8c3895b72015-08-13 00:04:02397 EXPECT_THAT(details->uma()->GetAllSamples(
398 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12399 HasOneSample(1));
nick8c3895b72015-08-13 00:04:02400 EXPECT_THAT(details->uma()->GetAllSamples(
401 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12402 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03403 EXPECT_THAT(details->uma()->GetAllSamples(
404 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12405 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03406 EXPECT_THAT(details->uma()->GetAllSamples(
407 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12408 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03409 EXPECT_THAT(details->uma()->GetAllSamples(
410 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12411 HasOneSample(1));
412 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(1, 1, 9));
naskoaab1a442015-11-19 02:10:36413 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12414 DependingOnPolicy(0, 0, 14));
nickde8b0272016-02-11 04:29:25415 EXPECT_THAT(details->uma()->GetAllSamples("SiteIsolation.ProxyCount"),
416 HasOneSample(DependingOnPolicy(0, 0, 114)));
417 EXPECT_THAT(details->uma()->GetAllSamples(
418 "SiteIsolation.ProxyCountPerBrowsingInstance"),
419 HasOneSample(DependingOnPolicy(0, 0, 114)));
nick8c3895b72015-08-13 00:04:02420
421 // Navigate to a different, disjoint set of 7 sites.
422 GURL pqrstuv_url = embedded_test_server()->GetURL(
423 "p.com",
424 "/cross_site_iframe_factory.html?p(q(r),r(s),s(t),t(q),u(u),v(p))");
425 ui_test_utils::NavigateToURL(browser(), pqrstuv_url);
426
427 details = new TestMemoryDetails();
428 details->StartFetchAndWait();
429
nickb2545f72015-10-30 20:05:15430 EXPECT_EQ(1U, details->CountPageTitles());
nick8c3895b72015-08-13 00:04:02431 EXPECT_THAT(
432 details->uma()->GetAllSamples("SiteIsolation.BrowsingInstanceCount"),
nick6c28ecc92016-02-09 21:30:12433 HasOneSample(1));
nick8c3895b72015-08-13 00:04:02434 EXPECT_THAT(details->uma()->GetAllSamples(
435 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12436 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15437 EXPECT_THAT(details->uma()->GetAllSamples(
438 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12439 HasOneSample(1));
nick8c3895b72015-08-13 00:04:02440 EXPECT_THAT(details->uma()->GetAllSamples(
441 "SiteIsolation.IsolateAllSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12442 HasOneSample(7));
nick8c3895b72015-08-13 00:04:02443 EXPECT_THAT(details->uma()->GetAllSamples(
444 "SiteIsolation.IsolateAllSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12445 HasOneSample(7));
nick8c3895b72015-08-13 00:04:02446 EXPECT_THAT(details->uma()->GetAllSamples(
447 "SiteIsolation.IsolateAllSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12448 HasOneSample(7));
nick8c3895b72015-08-13 00:04:02449 EXPECT_THAT(details->uma()->GetAllSamples(
450 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12451 HasOneSample(1));
nick8c3895b72015-08-13 00:04:02452 EXPECT_THAT(details->uma()->GetAllSamples(
453 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12454 HasOneSample(1));
nick8c3895b72015-08-13 00:04:02455 EXPECT_THAT(details->uma()->GetAllSamples(
456 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12457 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03458 EXPECT_THAT(details->uma()->GetAllSamples(
459 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12460 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03461 EXPECT_THAT(details->uma()->GetAllSamples(
462 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12463 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03464 EXPECT_THAT(details->uma()->GetAllSamples(
465 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12466 HasOneSample(1));
467 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(1, 1, 7));
naskoaab1a442015-11-19 02:10:36468 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12469 DependingOnPolicy(0, 0, 11));
nickde8b0272016-02-11 04:29:25470 EXPECT_THAT(details->uma()->GetAllSamples("SiteIsolation.ProxyCount"),
471 HasOneSample(DependingOnPolicy(0, 0, 68)));
472 EXPECT_THAT(details->uma()->GetAllSamples(
473 "SiteIsolation.ProxyCountPerBrowsingInstance"),
474 HasOneSample(DependingOnPolicy(0, 0, 68)));
nick8c3895b72015-08-13 00:04:02475
476 // Open a second tab (different BrowsingInstance) with 4 sites (a through d).
477 GURL abcd_url = embedded_test_server()->GetURL(
478 "a.com", "/cross_site_iframe_factory.html?a(b(c(d())))");
479 AddTabAtIndex(1, abcd_url, ui::PAGE_TRANSITION_TYPED);
480
481 details = new TestMemoryDetails();
482 details->StartFetchAndWait();
483
nickb2545f72015-10-30 20:05:15484 EXPECT_EQ(2U, details->CountPageTitles());
nick8c3895b72015-08-13 00:04:02485 EXPECT_THAT(
486 details->uma()->GetAllSamples("SiteIsolation.BrowsingInstanceCount"),
nick6c28ecc92016-02-09 21:30:12487 HasOneSample(2));
nick8c3895b72015-08-13 00:04:02488 EXPECT_THAT(details->uma()->GetAllSamples(
489 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12490 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15491 EXPECT_THAT(details->uma()->GetAllSamples(
492 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12493 HasOneSample(2));
nick8c3895b72015-08-13 00:04:02494 EXPECT_THAT(details->uma()->GetAllSamples(
495 "SiteIsolation.IsolateAllSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12496 HasOneSample(11));
nick8c3895b72015-08-13 00:04:02497 EXPECT_THAT(details->uma()->GetAllSamples(
498 "SiteIsolation.IsolateAllSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12499 HasOneSample(11));
nick8c3895b72015-08-13 00:04:02500 EXPECT_THAT(details->uma()->GetAllSamples(
501 "SiteIsolation.IsolateAllSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12502 HasOneSample(11));
nick8c3895b72015-08-13 00:04:02503 EXPECT_THAT(details->uma()->GetAllSamples(
504 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12505 HasOneSample(2));
nick8c3895b72015-08-13 00:04:02506 EXPECT_THAT(details->uma()->GetAllSamples(
507 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12508 HasOneSample(1)); // TODO(nick): This should be 2.
nick8c3895b72015-08-13 00:04:02509 EXPECT_THAT(details->uma()->GetAllSamples(
510 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12511 HasOneSample(2));
nick37dfd9de2015-09-14 19:54:03512 EXPECT_THAT(details->uma()->GetAllSamples(
513 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12514 HasOneSample(2));
nick37dfd9de2015-09-14 19:54:03515 EXPECT_THAT(details->uma()->GetAllSamples(
516 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12517 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03518 EXPECT_THAT(details->uma()->GetAllSamples(
519 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12520 HasOneSample(2));
521 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(2, 2, 11));
naskoaab1a442015-11-19 02:10:36522 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12523 DependingOnPolicy(0, 0, 14));
nickde8b0272016-02-11 04:29:25524 EXPECT_THAT(details->uma()->GetAllSamples("SiteIsolation.ProxyCount"),
525 HasOneSample(DependingOnPolicy(0, 0, 81)));
526 EXPECT_THAT(
527 details->uma()->GetAllSamples(
528 "SiteIsolation.ProxyCountPerBrowsingInstance"),
529 DependingOnPolicy(ElementsAre(Bucket(0, 2)), ElementsAre(Bucket(0, 2)),
530 ElementsAre(Bucket(12, 1), Bucket(68, 1))));
nick8c3895b72015-08-13 00:04:02531
532 // Open a third tab (different BrowsingInstance) with the same 4 sites.
533 AddTabAtIndex(2, abcd_url, ui::PAGE_TRANSITION_TYPED);
534
535 details = new TestMemoryDetails();
536 details->StartFetchAndWait();
537
538 EXPECT_THAT(
539 details->uma()->GetAllSamples("SiteIsolation.BrowsingInstanceCount"),
nick6c28ecc92016-02-09 21:30:12540 HasOneSample(3));
nick8c3895b72015-08-13 00:04:02541 EXPECT_THAT(details->uma()->GetAllSamples(
542 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12543 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15544 EXPECT_THAT(details->uma()->GetAllSamples(
545 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12546 HasOneSample(3));
nick8c3895b72015-08-13 00:04:02547 // Could be 11 if subframe processes were reused across BrowsingInstances.
548 EXPECT_THAT(details->uma()->GetAllSamples(
549 "SiteIsolation.IsolateAllSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12550 HasOneSample(15));
nick8c3895b72015-08-13 00:04:02551 EXPECT_THAT(details->uma()->GetAllSamples(
552 "SiteIsolation.IsolateAllSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12553 HasOneSample(11));
nick8c3895b72015-08-13 00:04:02554 EXPECT_THAT(details->uma()->GetAllSamples(
555 "SiteIsolation.IsolateAllSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12556 HasOneSample(15));
nick8c3895b72015-08-13 00:04:02557 EXPECT_THAT(details->uma()->GetAllSamples(
558 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12559 HasOneSample(3));
nick8c3895b72015-08-13 00:04:02560 EXPECT_THAT(details->uma()->GetAllSamples(
561 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12562 HasOneSample(1)); // TODO(nick): This should be 3.
nick8c3895b72015-08-13 00:04:02563 EXPECT_THAT(details->uma()->GetAllSamples(
564 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12565 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03566 EXPECT_THAT(details->uma()->GetAllSamples(
567 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12568 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03569 EXPECT_THAT(details->uma()->GetAllSamples(
570 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12571 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03572 EXPECT_THAT(details->uma()->GetAllSamples(
573 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12574 HasOneSample(3));
575 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(3, 3, 15));
naskoaab1a442015-11-19 02:10:36576 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12577 DependingOnPolicy(0, 0, 17));
nickde8b0272016-02-11 04:29:25578 EXPECT_THAT(details->uma()->GetAllSamples("SiteIsolation.ProxyCount"),
579 HasOneSample(DependingOnPolicy(0, 0, 96)));
580 EXPECT_THAT(
581 details->uma()->GetAllSamples(
582 "SiteIsolation.ProxyCountPerBrowsingInstance"),
583 DependingOnPolicy(ElementsAre(Bucket(0, 3)), ElementsAre(Bucket(0, 3)),
584 ElementsAre(Bucket(12, 2), Bucket(68, 1))));
nick8c3895b72015-08-13 00:04:02585
nick37dfd9de2015-09-14 19:54:03586 // From the third tab, window.open() a fourth tab in the same
587 // BrowsingInstance, to a page using the same four sites "a-d" as third tab,
nick8c3895b72015-08-13 00:04:02588 // plus an additional site "e". The estimated process counts should increase
nick37dfd9de2015-09-14 19:54:03589 // by one (not five) from the previous scenario, as the new tab can reuse the
nick8c3895b72015-08-13 00:04:02590 // four processes already in the BrowsingInstance.
591 GURL dcbae_url = embedded_test_server()->GetURL(
592 "a.com", "/cross_site_iframe_factory.html?d(c(b(a(e))))");
593 ui_test_utils::UrlLoadObserver load_complete(
594 dcbae_url, content::NotificationService::AllSources());
595 ASSERT_EQ(3, browser()->tab_strip_model()->count());
596 ASSERT_TRUE(content::ExecuteScript(
597 browser()->tab_strip_model()->GetActiveWebContents(),
598 "window.open('" + dcbae_url.spec() + "');"));
599 ASSERT_EQ(4, browser()->tab_strip_model()->count());
600 load_complete.Wait();
601
602 details = new TestMemoryDetails();
603 details->StartFetchAndWait();
604
605 EXPECT_THAT(
606 details->uma()->GetAllSamples("SiteIsolation.BrowsingInstanceCount"),
nick6c28ecc92016-02-09 21:30:12607 HasOneSample(3));
nick8c3895b72015-08-13 00:04:02608 EXPECT_THAT(details->uma()->GetAllSamples(
609 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12610 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15611 EXPECT_THAT(details->uma()->GetAllSamples(
612 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12613 HasOneSample(3));
nick8c3895b72015-08-13 00:04:02614 // Could be 11 if subframe processes were reused across BrowsingInstances.
615 EXPECT_THAT(details->uma()->GetAllSamples(
616 "SiteIsolation.IsolateAllSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12617 HasOneSample(16));
nick8c3895b72015-08-13 00:04:02618 EXPECT_THAT(details->uma()->GetAllSamples(
619 "SiteIsolation.IsolateAllSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12620 HasOneSample(12));
nick8c3895b72015-08-13 00:04:02621 EXPECT_THAT(details->uma()->GetAllSamples(
622 "SiteIsolation.IsolateAllSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12623 HasOneSample(16));
nick8c3895b72015-08-13 00:04:02624 EXPECT_THAT(details->uma()->GetAllSamples(
625 "SiteIsolation.IsolateHttpsSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12626 HasOneSample(3));
nick8c3895b72015-08-13 00:04:02627 EXPECT_THAT(details->uma()->GetAllSamples(
628 "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12629 HasOneSample(1)); // TODO(nick): This should be 3.
nick8c3895b72015-08-13 00:04:02630 EXPECT_THAT(details->uma()->GetAllSamples(
631 "SiteIsolation.IsolateHttpsSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12632 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03633 EXPECT_THAT(details->uma()->GetAllSamples(
634 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12635 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03636 EXPECT_THAT(details->uma()->GetAllSamples(
637 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12638 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03639 EXPECT_THAT(details->uma()->GetAllSamples(
640 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12641 HasOneSample(3));
642 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(3, 3, 16));
naskoaab1a442015-11-19 02:10:36643 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12644 DependingOnPolicy(0, 0, 21));
nickde8b0272016-02-11 04:29:25645 EXPECT_THAT(details->uma()->GetAllSamples("SiteIsolation.ProxyCount"),
646 HasOneSample(DependingOnPolicy(0, 0, 114)));
647 EXPECT_THAT(details->uma()->GetAllSamples(
648 "SiteIsolation.ProxyCountPerBrowsingInstance"),
649 DependingOnPolicy(
650 ElementsAre(Bucket(0, 3)), ElementsAre(Bucket(0, 3)),
651 ElementsAre(Bucket(12, 1), Bucket(29, 1), Bucket(68, 1))));
nasko7d4c2cb2015-11-26 01:29:35652
653 // This test doesn't navigate to any extensions URLs, so it should not be
654 // in any of the field trial groups.
655 EXPECT_FALSE(IsInTrial("SiteIsolationExtensionsActive"));
nick37dfd9de2015-09-14 19:54:03656}
657
nickeac69982016-02-11 22:18:53658IN_PROC_BROWSER_TEST_F(SiteDetailsBrowserTest, IsolateExtensions) {
nick37dfd9de2015-09-14 19:54:03659 // We start on "about:blank", which should be credited with a process in this
660 // case.
661 scoped_refptr<TestMemoryDetails> details = new TestMemoryDetails();
662 details->StartFetchAndWait();
663 EXPECT_THAT(details->uma()->GetAllSamples(
664 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12665 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15666 EXPECT_THAT(details->uma()->GetAllSamples(
667 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12668 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03669 EXPECT_THAT(details->uma()->GetAllSamples(
670 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12671 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03672 EXPECT_THAT(details->uma()->GetAllSamples(
673 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12674 HasOneSample(1));
nick37dfd9de2015-09-14 19:54:03675 EXPECT_THAT(details->uma()->GetAllSamples(
676 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12677 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:13678 EXPECT_THAT(GetRenderProcessCount(), 1);
naskoaab1a442015-11-19 02:10:36679 EXPECT_EQ(0, details->GetOutOfProcessIframeCount());
nick37dfd9de2015-09-14 19:54:03680
681 // Install one script-injecting extension with background page, and an
682 // extension with web accessible resources.
683 const Extension* extension1 = CreateExtension("Extension One", true);
684 const Extension* extension2 = CreateExtension("Extension Two", false);
685
686 // Open two a.com tabs (with cross site http iframes). IsolateExtensions mode
687 // should have no effect so far, since there are no frames straddling the
688 // extension/web boundary.
689 GURL tab1_url = embedded_test_server()->GetURL(
690 "a.com", "/cross_site_iframe_factory.html?a(b,c)");
691 ui_test_utils::NavigateToURL(browser(), tab1_url);
692 WebContents* tab1 = browser()->tab_strip_model()->GetWebContentsAt(0);
693 GURL tab2_url = embedded_test_server()->GetURL(
694 "a.com", "/cross_site_iframe_factory.html?a(d,e)");
695 AddTabAtIndex(1, tab2_url, ui::PAGE_TRANSITION_TYPED);
696 WebContents* tab2 = browser()->tab_strip_model()->GetWebContentsAt(1);
697
698 details = new TestMemoryDetails();
699 details->StartFetchAndWait();
700 EXPECT_THAT(details->uma()->GetAllSamples(
701 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12702 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15703 EXPECT_THAT(details->uma()->GetAllSamples(
704 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12705 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03706 EXPECT_THAT(details->uma()->GetAllSamples(
707 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12708 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03709 EXPECT_THAT(details->uma()->GetAllSamples(
710 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12711 HasOneSample(2));
nick37dfd9de2015-09-14 19:54:03712 EXPECT_THAT(details->uma()->GetAllSamples(
713 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12714 HasOneSample(3));
715 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(3, 3, 7));
naskoaab1a442015-11-19 02:10:36716 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12717 DependingOnPolicy(0, 0, 4));
nick37dfd9de2015-09-14 19:54:03718
719 // Test that "one process per extension" applies even when web content has an
720 // extension iframe.
721
722 // Tab1 navigates its first iframe to a resource of extension1. This shouldn't
723 // result in a new extension process (it should share with extension1's
724 // background page).
725 content::NavigateIframeToURL(
726 tab1, "child-0", extension1->GetResourceURL("/blank_iframe.html"));
727 details = new TestMemoryDetails();
728 details->StartFetchAndWait();
729 EXPECT_THAT(details->uma()->GetAllSamples(
730 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12731 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15732 EXPECT_THAT(details->uma()->GetAllSamples(
733 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12734 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03735 EXPECT_THAT(details->uma()->GetAllSamples(
736 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12737 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03738 EXPECT_THAT(details->uma()->GetAllSamples(
739 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12740 HasOneSample(2));
nick37dfd9de2015-09-14 19:54:03741 EXPECT_THAT(details->uma()->GetAllSamples(
742 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12743 HasOneSample(3));
744 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(3, 3, 6));
naskoaab1a442015-11-19 02:10:36745 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12746 DependingOnPolicy(0, 1, 4));
nick37dfd9de2015-09-14 19:54:03747
748 // Tab2 navigates its first iframe to a resource of extension1. This also
749 // shouldn't result in a new extension process (it should share with the
750 // background page and the other iframe).
751 content::NavigateIframeToURL(
752 tab2, "child-0", extension1->GetResourceURL("/blank_iframe.html"));
753 details = new TestMemoryDetails();
754 details->StartFetchAndWait();
755 EXPECT_THAT(details->uma()->GetAllSamples(
756 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12757 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15758 EXPECT_THAT(details->uma()->GetAllSamples(
759 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12760 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03761 EXPECT_THAT(details->uma()->GetAllSamples(
762 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12763 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03764 EXPECT_THAT(details->uma()->GetAllSamples(
765 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12766 HasOneSample(2));
nick37dfd9de2015-09-14 19:54:03767 EXPECT_THAT(details->uma()->GetAllSamples(
768 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12769 HasOneSample(3));
770 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(3, 3, 5));
naskoaab1a442015-11-19 02:10:36771 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12772 DependingOnPolicy(0, 2, 4));
nick37dfd9de2015-09-14 19:54:03773
774 // Tab1 navigates its second iframe to a resource of extension2. This SHOULD
775 // result in a new process since extension2 had no existing process.
776 content::NavigateIframeToURL(
777 tab1, "child-1", extension2->GetResourceURL("/blank_iframe.html"));
778 details = new TestMemoryDetails();
779 details->StartFetchAndWait();
780 EXPECT_THAT(details->uma()->GetAllSamples(
781 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12782 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15783 EXPECT_THAT(details->uma()->GetAllSamples(
784 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12785 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03786 EXPECT_THAT(details->uma()->GetAllSamples(
787 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12788 HasOneSample(4));
nick37dfd9de2015-09-14 19:54:03789 EXPECT_THAT(details->uma()->GetAllSamples(
790 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12791 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03792 EXPECT_THAT(details->uma()->GetAllSamples(
793 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12794 HasOneSample(4));
795 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(3, 4, 5));
naskoaab1a442015-11-19 02:10:36796 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12797 DependingOnPolicy(0, 3, 4));
nick37dfd9de2015-09-14 19:54:03798
799 // Tab2 navigates its second iframe to a resource of extension2. This should
800 // share the existing extension2 process.
801 content::NavigateIframeToURL(
802 tab2, "child-1", extension2->GetResourceURL("/blank_iframe.html"));
803 details = new TestMemoryDetails();
804 details->StartFetchAndWait();
805 EXPECT_THAT(details->uma()->GetAllSamples(
806 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12807 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15808 EXPECT_THAT(details->uma()->GetAllSamples(
809 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12810 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03811 EXPECT_THAT(details->uma()->GetAllSamples(
812 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12813 HasOneSample(4));
nick37dfd9de2015-09-14 19:54:03814 EXPECT_THAT(details->uma()->GetAllSamples(
815 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12816 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03817 EXPECT_THAT(details->uma()->GetAllSamples(
818 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12819 HasOneSample(4));
820 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(3, 4, 4));
naskoaab1a442015-11-19 02:10:36821 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12822 DependingOnPolicy(0, 4, 4));
nick37dfd9de2015-09-14 19:54:03823
824 // Install extension3 (identical config to extension2)
825 const Extension* extension3 = CreateExtension("Extension Three", false);
826
827 // Navigate Tab2 to a top-level page from extension3. There are four processes
828 // now: one for tab1's main frame, and one for each of the extensions:
829 // extension1 has a process because it has a background page; extension2 is
830 // used as an iframe in tab1, and extension3 is the top-level frame in tab2.
831 ui_test_utils::NavigateToURL(browser(),
832 extension3->GetResourceURL("blank_iframe.html"));
833 details = new TestMemoryDetails();
834 details->StartFetchAndWait();
835 EXPECT_THAT(details->uma()->GetAllSamples(
836 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12837 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15838 EXPECT_THAT(details->uma()->GetAllSamples(
839 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12840 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03841 EXPECT_THAT(details->uma()->GetAllSamples(
842 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12843 HasOneSample(4));
nick37dfd9de2015-09-14 19:54:03844 EXPECT_THAT(details->uma()->GetAllSamples(
845 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12846 HasOneSample(4));
nick37dfd9de2015-09-14 19:54:03847 EXPECT_THAT(details->uma()->GetAllSamples(
848 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12849 HasOneSample(4));
850 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(3, 4, 4));
naskoaab1a442015-11-19 02:10:36851 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12852 DependingOnPolicy(0, 2, 2));
nick37dfd9de2015-09-14 19:54:03853
854 // Navigate tab2 to a different extension3 page containing a web iframe. The
855 // iframe should get its own process. The lower bound number indicates that,
856 // in theory, the iframe could share a process with tab1's main frame.
857 ui_test_utils::NavigateToURL(browser(),
858 extension3->GetResourceURL("http_iframe.html"));
859 details = new TestMemoryDetails();
860 details->StartFetchAndWait();
861 EXPECT_THAT(details->uma()->GetAllSamples(
862 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12863 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15864 EXPECT_THAT(details->uma()->GetAllSamples(
865 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12866 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03867 EXPECT_THAT(details->uma()->GetAllSamples(
868 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12869 HasOneSample(5));
nick37dfd9de2015-09-14 19:54:03870 EXPECT_THAT(details->uma()->GetAllSamples(
871 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12872 HasOneSample(4));
nick37dfd9de2015-09-14 19:54:03873 EXPECT_THAT(details->uma()->GetAllSamples(
874 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12875 HasOneSample(5));
876 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(3, 5, 5));
naskoaab1a442015-11-19 02:10:36877 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12878 DependingOnPolicy(0, 3, 3));
nick37dfd9de2015-09-14 19:54:03879
880 // Navigate tab1 to an extension3 page with an extension3 iframe. There should
881 // be three processes estimated by IsolateExtensions: one for extension3, one
882 // for extension1's background page, and one for the web iframe in tab2.
883 browser()->tab_strip_model()->ActivateTabAt(0, true);
884 ui_test_utils::NavigateToURL(browser(),
885 extension3->GetResourceURL("blank_iframe.html"));
886 details = new TestMemoryDetails();
887 details->StartFetchAndWait();
888 EXPECT_THAT(details->uma()->GetAllSamples(
889 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12890 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15891 EXPECT_THAT(details->uma()->GetAllSamples(
892 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12893 HasOneSample(2));
nick37dfd9de2015-09-14 19:54:03894 EXPECT_THAT(details->uma()->GetAllSamples(
895 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12896 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03897 EXPECT_THAT(details->uma()->GetAllSamples(
898 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12899 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03900 EXPECT_THAT(details->uma()->GetAllSamples(
901 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12902 HasOneSample(3));
903 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(2, 3, 3));
naskoaab1a442015-11-19 02:10:36904 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12905 DependingOnPolicy(0, 1, 1));
nick37dfd9de2015-09-14 19:54:03906
907 // Now navigate tab1 to an extension3 page with a web iframe. This could share
908 // a process with tab2's iframe (the LowerBound number), or it could get its
909 // own process (the Estimate number).
910 ui_test_utils::NavigateToURL(browser(),
911 extension3->GetResourceURL("http_iframe.html"));
912 details = new TestMemoryDetails();
913 details->StartFetchAndWait();
914 EXPECT_THAT(details->uma()->GetAllSamples(
915 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12916 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15917 EXPECT_THAT(details->uma()->GetAllSamples(
918 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12919 HasOneSample(2));
nick37dfd9de2015-09-14 19:54:03920 EXPECT_THAT(details->uma()->GetAllSamples(
921 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12922 HasOneSample(4));
nick37dfd9de2015-09-14 19:54:03923 EXPECT_THAT(details->uma()->GetAllSamples(
924 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12925 HasOneSample(3));
nick37dfd9de2015-09-14 19:54:03926 EXPECT_THAT(details->uma()->GetAllSamples(
927 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12928 HasOneSample(4));
929 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(2, 4, 4));
naskoaab1a442015-11-19 02:10:36930 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12931 DependingOnPolicy(0, 2, 2));
nasko7d4c2cb2015-11-26 01:29:35932
933 EXPECT_TRUE(IsInTrial("SiteIsolationExtensionsActive"));
nick3a8aa1f2015-09-24 17:00:13934}
935
lazyboy730669d2016-06-10 18:07:57936// Due to http://crbug.com/612711, we are not isolating iframes from platform
lazyboyb8ac1f172016-06-11 00:24:06937// apps with --isolate-extenions.
lazyboy730669d2016-06-10 18:07:57938IN_PROC_BROWSER_TEST_F(SiteDetailsBrowserTest, PlatformAppsNotIsolated) {
lazyboyb8ac1f172016-06-11 00:24:06939 // --site-per-process will still isolate iframes from platform apps, so skip
940 // the test in that case.
941 if (content::AreAllSitesIsolatedForTesting())
942 return;
lazyboy730669d2016-06-10 18:07:57943 CreateAppWithSandboxPage("Extension One");
944 scoped_refptr<TestMemoryDetails> details = new TestMemoryDetails();
945 details->StartFetchAndWait();
946 EXPECT_EQ(0, details->GetOutOfProcessIframeCount());
947}
948
nick3a8aa1f2015-09-24 17:00:13949// Exercises accounting in the case where an extension has two different-site
950// web iframes.
nickeac69982016-02-11 22:18:53951IN_PROC_BROWSER_TEST_F(SiteDetailsBrowserTest, ExtensionWithTwoWebIframes) {
nick3a8aa1f2015-09-24 17:00:13952 scoped_refptr<TestMemoryDetails> details = new TestMemoryDetails();
953 details->StartFetchAndWait();
954
955 // Install one script-injecting extension with background page, and an
956 // extension with web accessible resources.
957 const Extension* extension = CreateExtension("Test Extension", false);
958
959 ui_test_utils::NavigateToURL(
960 browser(), extension->GetResourceURL("/two_http_iframes.html"));
961
962 details = new TestMemoryDetails();
963 details->StartFetchAndWait();
964 EXPECT_THAT(details->uma()->GetAllSamples(
965 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:12966 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:15967 EXPECT_THAT(details->uma()->GetAllSamples(
968 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12969 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:13970 EXPECT_THAT(details->uma()->GetAllSamples(
971 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:12972 HasOneSample(2));
nick3a8aa1f2015-09-24 17:00:13973 EXPECT_THAT(details->uma()->GetAllSamples(
974 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:12975 HasOneSample(2));
nick3a8aa1f2015-09-24 17:00:13976 EXPECT_THAT(details->uma()->GetAllSamples(
977 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:12978 HasOneSample(2));
nick3a8aa1f2015-09-24 17:00:13979 // TODO(nick): https://crbug.com/512560 Make the number below agree with the
980 // estimates above, which assume consolidation of subframe processes.
nick6c28ecc92016-02-09 21:30:12981 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(1, 3, 3));
naskoaab1a442015-11-19 02:10:36982 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:12983 DependingOnPolicy(0, 2, 2));
nasko7d4c2cb2015-11-26 01:29:35984
985 EXPECT_TRUE(IsInTrial("SiteIsolationExtensionsActive"));
nick3a8aa1f2015-09-24 17:00:13986}
987
nickcc0d9142015-10-14 16:27:10988// Verifies that --isolate-extensions doesn't isolate hosted apps.
nickeac69982016-02-11 22:18:53989IN_PROC_BROWSER_TEST_F(SiteDetailsBrowserTest, IsolateExtensionsHostedApps) {
nick3a8aa1f2015-09-24 17:00:13990 GURL app_with_web_iframe_url = embedded_test_server()->GetURL(
991 "app.org", "/cross_site_iframe_factory.html?app.org(b.com)");
992 GURL app_in_web_iframe_url = embedded_test_server()->GetURL(
993 "b.com", "/cross_site_iframe_factory.html?b.com(app.org)");
994
995 // No hosted app is installed: app.org just behaves like a normal domain.
996 ui_test_utils::NavigateToURL(browser(), app_with_web_iframe_url);
997 scoped_refptr<TestMemoryDetails> details = new TestMemoryDetails();
998 details->StartFetchAndWait();
999 EXPECT_THAT(details->uma()->GetAllSamples(
1000 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:121001 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:151002 EXPECT_THAT(details->uma()->GetAllSamples(
1003 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121004 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131005 EXPECT_THAT(details->uma()->GetAllSamples(
1006 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121007 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131008 EXPECT_THAT(details->uma()->GetAllSamples(
1009 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:121010 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131011 EXPECT_THAT(details->uma()->GetAllSamples(
1012 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:121013 HasOneSample(1));
1014 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(1, 1, 2));
nickcc0d9142015-10-14 16:27:101015 EXPECT_THAT(details->uma()->GetAllSamples(
1016 "SiteIsolation.IsolateAllSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121017 HasOneSample(2));
nickcc0d9142015-10-14 16:27:101018 EXPECT_THAT(details->uma()->GetAllSamples(
1019 "SiteIsolation.IsolateAllSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:121020 HasOneSample(2));
nickcc0d9142015-10-14 16:27:101021 EXPECT_THAT(details->uma()->GetAllSamples(
1022 "SiteIsolation.IsolateAllSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:121023 HasOneSample(2));
1024 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(1, 1, 2));
naskoaab1a442015-11-19 02:10:361025 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:121026 DependingOnPolicy(0, 0, 1));
nick3a8aa1f2015-09-24 17:00:131027
1028 ui_test_utils::NavigateToURL(browser(), app_in_web_iframe_url);
1029 details = new TestMemoryDetails();
1030 details->StartFetchAndWait();
1031 EXPECT_THAT(details->uma()->GetAllSamples(
1032 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:121033 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:151034 EXPECT_THAT(details->uma()->GetAllSamples(
1035 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121036 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131037 EXPECT_THAT(details->uma()->GetAllSamples(
1038 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121039 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131040 EXPECT_THAT(details->uma()->GetAllSamples(
1041 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:121042 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131043 EXPECT_THAT(details->uma()->GetAllSamples(
1044 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:121045 HasOneSample(1));
1046 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(1, 1, 2));
nickcc0d9142015-10-14 16:27:101047 EXPECT_THAT(details->uma()->GetAllSamples(
1048 "SiteIsolation.IsolateAllSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121049 HasOneSample(2));
nickcc0d9142015-10-14 16:27:101050 EXPECT_THAT(details->uma()->GetAllSamples(
1051 "SiteIsolation.IsolateAllSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:121052 HasOneSample(2));
nickcc0d9142015-10-14 16:27:101053 EXPECT_THAT(details->uma()->GetAllSamples(
1054 "SiteIsolation.IsolateAllSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:121055 HasOneSample(2));
1056 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(1, 1, 2));
naskoaab1a442015-11-19 02:10:361057 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:121058 DependingOnPolicy(0, 0, 1));
nick3a8aa1f2015-09-24 17:00:131059
1060 // Now install app.org as a hosted app.
1061 CreateHostedApp("App", GURL("http://app.org"));
1062
nickcc0d9142015-10-14 16:27:101063 // Reload the same two pages, and verify that the hosted app still is not
1064 // isolated by --isolate-extensions, but is isolated by --site-per-process.
nick3a8aa1f2015-09-24 17:00:131065 ui_test_utils::NavigateToURL(browser(), app_with_web_iframe_url);
1066 details = new TestMemoryDetails();
1067 details->StartFetchAndWait();
1068 EXPECT_THAT(details->uma()->GetAllSamples(
1069 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:121070 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:151071 EXPECT_THAT(details->uma()->GetAllSamples(
1072 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121073 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131074 EXPECT_THAT(details->uma()->GetAllSamples(
1075 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121076 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131077 EXPECT_THAT(details->uma()->GetAllSamples(
1078 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:121079 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131080 EXPECT_THAT(details->uma()->GetAllSamples(
1081 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:121082 HasOneSample(1));
1083 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(1, 1, 2));
nickcc0d9142015-10-14 16:27:101084 EXPECT_THAT(details->uma()->GetAllSamples(
1085 "SiteIsolation.IsolateAllSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121086 HasOneSample(2));
nickcc0d9142015-10-14 16:27:101087 EXPECT_THAT(details->uma()->GetAllSamples(
1088 "SiteIsolation.IsolateAllSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:121089 HasOneSample(2));
nickcc0d9142015-10-14 16:27:101090 EXPECT_THAT(details->uma()->GetAllSamples(
1091 "SiteIsolation.IsolateAllSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:121092 HasOneSample(2));
1093 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(1, 1, 2));
naskoaab1a442015-11-19 02:10:361094 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:121095 DependingOnPolicy(0, 0, 1));
nick3a8aa1f2015-09-24 17:00:131096
1097 ui_test_utils::NavigateToURL(browser(), app_in_web_iframe_url);
1098 details = new TestMemoryDetails();
1099 details->StartFetchAndWait();
1100 EXPECT_THAT(details->uma()->GetAllSamples(
1101 "SiteIsolation.CurrentRendererProcessCount"),
nick6c28ecc92016-02-09 21:30:121102 HasOneSample(GetRenderProcessCount()));
nickb2545f72015-10-30 20:05:151103 EXPECT_THAT(details->uma()->GetAllSamples(
1104 "SiteIsolation.IsolateNothingProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121105 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131106 EXPECT_THAT(details->uma()->GetAllSamples(
1107 "SiteIsolation.IsolateExtensionsProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121108 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131109 EXPECT_THAT(details->uma()->GetAllSamples(
1110 "SiteIsolation.IsolateExtensionsProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:121111 HasOneSample(1));
nick3a8aa1f2015-09-24 17:00:131112 EXPECT_THAT(details->uma()->GetAllSamples(
1113 "SiteIsolation.IsolateExtensionsProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:121114 HasOneSample(1));
1115 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(1, 1, 2));
nickcc0d9142015-10-14 16:27:101116 EXPECT_THAT(details->uma()->GetAllSamples(
1117 "SiteIsolation.IsolateAllSitesProcessCountEstimate"),
nick6c28ecc92016-02-09 21:30:121118 HasOneSample(2));
nickcc0d9142015-10-14 16:27:101119 EXPECT_THAT(details->uma()->GetAllSamples(
1120 "SiteIsolation.IsolateAllSitesProcessCountLowerBound"),
nick6c28ecc92016-02-09 21:30:121121 HasOneSample(2));
nickcc0d9142015-10-14 16:27:101122 EXPECT_THAT(details->uma()->GetAllSamples(
1123 "SiteIsolation.IsolateAllSitesProcessCountNoLimit"),
nick6c28ecc92016-02-09 21:30:121124 HasOneSample(2));
1125 EXPECT_THAT(GetRenderProcessCount(), DependingOnPolicy(1, 1, 2));
naskoaab1a442015-11-19 02:10:361126 EXPECT_THAT(details->GetOutOfProcessIframeCount(),
nick6c28ecc92016-02-09 21:30:121127 DependingOnPolicy(0, 0, 1));
nasko7d4c2cb2015-11-26 01:29:351128
1129 // Since hosted apps are excluded from isolation, this test should not be
1130 // in any of the field trial groups.
1131 EXPECT_FALSE(IsInTrial("SiteIsolationExtensionsActive"));
1132}
1133
1134// Verifies that the client is put in the appropriate field trial group.
nickeac69982016-02-11 22:18:531135IN_PROC_BROWSER_TEST_F(SiteDetailsBrowserTest, VerifyFieldTrialGroup) {
nasko7d4c2cb2015-11-26 01:29:351136 const Extension* extension = CreateExtension("Extension", false);
1137 GURL tab1_url = embedded_test_server()->GetURL(
1138 "a.com", "/cross_site_iframe_factory.html?a(b,c)");
1139 ui_test_utils::NavigateToURL(browser(), tab1_url);
1140 WebContents* tab = browser()->tab_strip_model()->GetWebContentsAt(0);
1141
1142 // Tab navigates its second iframe to a page of the extension.
1143 content::NavigateIframeToURL(tab, "child-1",
1144 extension->GetResourceURL("/blank_iframe.html"));
1145
1146 std::string group;
1147 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1148 switches::kSitePerProcess)) {
1149 group = "SitePerProcessFlag";
1150 } else if (extensions::IsIsolateExtensionsEnabled()) {
1151 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
alexmos9d656a82015-12-02 02:03:091152 extensions::switches::kIsolateExtensions)) {
nasko7d4c2cb2015-11-26 01:29:351153 group = "IsolateExtensionsFlag";
1154 } else {
1155 group = "FieldTrial";
1156 }
1157 } else {
nick1b39cd72016-02-11 23:08:211158 if (base::FieldTrialList::FindFullName("SiteIsolationExtensions").empty())
1159 group = "Default";
1160 else
1161 group = "Control";
nasko7d4c2cb2015-11-26 01:29:351162 }
1163
1164 EXPECT_TRUE(IsInTrialGroup("SiteIsolationExtensionsActive", group));
nick8c3895b72015-08-13 00:04:021165}
nasko50273712015-12-03 16:03:501166
1167// Verifies that the UMA counter for SiteInstances in a BrowsingInstance is
1168// correct when using tabs with web pages.
nickeac69982016-02-11 22:18:531169IN_PROC_BROWSER_TEST_F(SiteDetailsBrowserTest,
nasko50273712015-12-03 16:03:501170 VerifySiteInstanceCountInBrowsingInstance) {
1171 // Page with 14 nested oopifs across 9 sites (a.com through i.com).
1172 GURL abcdefghi_url = embedded_test_server()->GetURL(
1173 "a.com",
1174 "/cross_site_iframe_factory.html?a(b(a(b,c,d,e,f,g,h)),c,d,e,i(f))");
1175 ui_test_utils::NavigateToURL(browser(), abcdefghi_url);
1176
1177 // Get the metrics.
1178 scoped_refptr<TestMemoryDetails> details = new TestMemoryDetails();
1179 details->StartFetchAndWait();
nick6c28ecc92016-02-09 21:30:121180
1181 // Since there are no extensions involved, the results in the default case
1182 // and extensions::IsIsolateExtensionsEnabled() are the same.
1183 EXPECT_THAT(details->uma()->GetAllSamples(
1184 "SiteIsolation.SiteInstancesPerBrowsingInstance"),
1185 HasOneSample(DependingOnPolicy(1, 1, 9)));
nickde8b0272016-02-11 04:29:251186 EXPECT_THAT(details->uma()->GetAllSamples("SiteIsolation.ProxyCount"),
1187 HasOneSample(DependingOnPolicy(0, 0, 114)));
1188 EXPECT_THAT(details->uma()->GetAllSamples(
1189 "SiteIsolation.ProxyCountPerBrowsingInstance"),
1190 HasOneSample(DependingOnPolicy(0, 0, 114)));
nasko50273712015-12-03 16:03:501191
1192 // Open another tab through window.open(), which will be in the same
1193 // BrowsingInstance.
1194 GURL dcbae_url = embedded_test_server()->GetURL(
1195 "a.com", "/cross_site_iframe_factory.html?d(c(b(j(k))))");
1196 ui_test_utils::UrlLoadObserver load_complete(
1197 dcbae_url, content::NotificationService::AllSources());
1198 ASSERT_EQ(1, browser()->tab_strip_model()->count());
1199 ASSERT_TRUE(content::ExecuteScript(
1200 browser()->tab_strip_model()->GetActiveWebContents(),
1201 "window.open('" + dcbae_url.spec() + "');"));
1202 ASSERT_EQ(2, browser()->tab_strip_model()->count());
1203 load_complete.Wait();
1204
1205 details = new TestMemoryDetails();
1206 details->StartFetchAndWait();
nick6c28ecc92016-02-09 21:30:121207 EXPECT_THAT(details->uma()->GetAllSamples(
1208 "SiteIsolation.SiteInstancesPerBrowsingInstance"),
1209 HasOneSample(DependingOnPolicy(1, 1, 11)));
nickde8b0272016-02-11 04:29:251210 EXPECT_THAT(details->uma()->GetAllSamples("SiteIsolation.ProxyCount"),
1211 HasOneSample(DependingOnPolicy(0, 0, 160)));
1212 EXPECT_THAT(details->uma()->GetAllSamples(
1213 "SiteIsolation.ProxyCountPerBrowsingInstance"),
1214 HasOneSample(DependingOnPolicy(0, 0, 160)));
nasko50273712015-12-03 16:03:501215
1216 // Open a tab, which will be in a different BrowsingInstance.
1217 GURL abcd_url = embedded_test_server()->GetURL(
1218 "a.com", "/cross_site_iframe_factory.html?a(b(c(d())))");
1219 AddTabAtIndex(1, abcd_url, ui::PAGE_TRANSITION_TYPED);
1220
1221 details = new TestMemoryDetails();
1222 details->StartFetchAndWait();
nick6c28ecc92016-02-09 21:30:121223 EXPECT_THAT(
1224 details->uma()->GetAllSamples(
1225 "SiteIsolation.SiteInstancesPerBrowsingInstance"),
1226 DependingOnPolicy(ElementsAre(Sample(1, 2)), ElementsAre(Sample(1, 2)),
1227 ElementsAre(Sample(4, 1), Sample(11, 1))));
nickde8b0272016-02-11 04:29:251228 EXPECT_THAT(details->uma()->GetAllSamples("SiteIsolation.ProxyCount"),
1229 HasOneSample(DependingOnPolicy(0, 0, 160)));
1230 EXPECT_THAT(
1231 details->uma()->GetAllSamples(
1232 "SiteIsolation.ProxyCountPerBrowsingInstance"),
1233 DependingOnPolicy(ElementsAre(Sample(0, 2)), ElementsAre(Sample(0, 2)),
1234 ElementsAre(Sample(12, 1), Sample(160, 1))));
nasko50273712015-12-03 16:03:501235}
1236
1237// Verifies that the UMA counter for SiteInstances in a BrowsingInstance is
1238// correct when extensions and web pages are mixed together.
nickeac69982016-02-11 22:18:531239IN_PROC_BROWSER_TEST_F(
nasko50273712015-12-03 16:03:501240 SiteDetailsBrowserTest,
1241 VerifySiteInstanceCountInBrowsingInstanceWithExtensions) {
1242 // Open two a.com tabs (with cross site http iframes). IsolateExtensions mode
1243 // should have no effect so far, since there are no frames straddling the
1244 // extension/web boundary.
1245 GURL tab_url = embedded_test_server()->GetURL(
1246 "a.com", "/cross_site_iframe_factory.html?a(b,c,d(e))");
1247 ui_test_utils::NavigateToURL(browser(), tab_url);
1248 WebContents* tab = browser()->tab_strip_model()->GetWebContentsAt(0);
1249 scoped_refptr<TestMemoryDetails> details = new TestMemoryDetails();
1250 details->StartFetchAndWait();
nick6c28ecc92016-02-09 21:30:121251
1252 // Since there are no extensions loaded yet, the results in the default case
1253 // and extensions::IsIsolateExtensionsEnabled() are the same.
1254 EXPECT_THAT(details->uma()->GetAllSamples(
1255 "SiteIsolation.SiteInstancesPerBrowsingInstance"),
1256 HasOneSample(DependingOnPolicy(1, 1, 5)));
nasko50273712015-12-03 16:03:501257
1258 // Load an extension without a background page, which will avoid creating a
1259 // BrowsingInstance for it.
1260 const Extension* extension1 = CreateExtension("Extension One", false);
1261
1262 // Navigate the tab's first iframe to a resource of the extension. The
naskoe8e623d2015-12-04 21:00:301263 // extension iframe will be put in the same BrowsingInstance as it is part
1264 // of the frame tree.
nasko50273712015-12-03 16:03:501265 content::NavigateIframeToURL(
1266 tab, "child-0", extension1->GetResourceURL("/blank_iframe.html"));
1267 details = new TestMemoryDetails();
1268 details->StartFetchAndWait();
nick6c28ecc92016-02-09 21:30:121269 EXPECT_THAT(details->uma()->GetAllSamples(
1270 "SiteIsolation.SiteInstancesPerBrowsingInstance"),
1271 HasOneSample(DependingOnPolicy(1, 2, 5)));
nasko50273712015-12-03 16:03:501272
1273 // Now load an extension with a background page. This will result in a
1274 // BrowsingInstance for the background page.
nick455cb632016-05-25 19:06:071275 const Extension* extension2 = CreateExtension("Extension Two", true);
nasko50273712015-12-03 16:03:501276 details = new TestMemoryDetails();
1277 details->StartFetchAndWait();
nick6c28ecc92016-02-09 21:30:121278 EXPECT_THAT(details->uma()->GetAllSamples(
1279 "SiteIsolation.SiteInstancesPerBrowsingInstance"),
1280 DependingOnPolicy(ElementsAre(Bucket(1, 2)),
1281 ElementsAre(Bucket(1, 1), Bucket(2, 1)),
1282 ElementsAre(Bucket(1, 1), Bucket(5, 1))));
nasko50273712015-12-03 16:03:501283
naskoe8e623d2015-12-04 21:00:301284 // Navigate the second iframe of the tab to the second extension. It should
1285 // stay in the same BrowsingInstance as the page.
nasko50273712015-12-03 16:03:501286 content::NavigateIframeToURL(
1287 tab, "child-1", extension2->GetResourceURL("/blank_iframe.html"));
1288 details = new TestMemoryDetails();
1289 details->StartFetchAndWait();
nick6c28ecc92016-02-09 21:30:121290 EXPECT_THAT(details->uma()->GetAllSamples(
1291 "SiteIsolation.SiteInstancesPerBrowsingInstance"),
1292 DependingOnPolicy(ElementsAre(Bucket(1, 2)),
1293 ElementsAre(Bucket(1, 1), Bucket(3, 1)),
1294 ElementsAre(Bucket(1, 1), Bucket(5, 1))));
nasko50273712015-12-03 16:03:501295}