• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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/ui/browser_navigator_browsertest.h"
6 
7 #include "base/command_line.h"
8 #include "base/prefs/pref_service.h"
9 #include "base/strings/string_util.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/app/chrome_command_ids.h"
12 #include "chrome/browser/prefs/incognito_mode_prefs.h"
13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/ui/browser.h"
15 #include "chrome/browser/ui/browser_commands.h"
16 #include "chrome/browser/ui/browser_finder.h"
17 #include "chrome/browser/ui/browser_navigator.h"
18 #include "chrome/browser/ui/browser_tabstrip.h"
19 #include "chrome/browser/ui/browser_window.h"
20 #include "chrome/browser/ui/chrome_pages.h"
21 #include "chrome/browser/ui/singleton_tabs.h"
22 #include "chrome/browser/ui/tabs/tab_strip_model.h"
23 #include "chrome/common/chrome_switches.h"
24 #include "chrome/common/pref_names.h"
25 #include "chrome/common/url_constants.h"
26 #include "chrome/test/base/ui_test_utils.h"
27 #include "content/public/browser/notification_service.h"
28 #include "content/public/browser/notification_types.h"
29 #include "content/public/browser/web_contents.h"
30 
31 using content::WebContents;
32 
33 namespace {
34 
35 const char kExpectedTitle[] = "PASSED!";
36 const char kEchoTitleCommand[] = "echotitle";
37 
GetGoogleURL()38 GURL GetGoogleURL() {
39   return GURL("http://www.google.com/");
40 }
41 
GetSettingsURL()42 GURL GetSettingsURL() {
43   return GURL(chrome::kChromeUISettingsURL);
44 }
45 
GetContentSettingsURL()46 GURL GetContentSettingsURL() {
47   return GetSettingsURL().Resolve(chrome::kContentSettingsExceptionsSubPage);
48 }
49 
GetClearBrowsingDataURL()50 GURL GetClearBrowsingDataURL() {
51   return GetSettingsURL().Resolve(chrome::kClearBrowserDataSubPage);
52 }
53 
54 // Converts long uber URLs ("chrome://chrome/foo/") to short (virtual) URLs
55 // ("chrome://foo/"). This should be used to convert the return value of
56 // WebContentsImpl::GetURL before comparison because it can return either the
57 // real URL or the virtual URL.
ShortenUberURL(const GURL & url)58 GURL ShortenUberURL(const GURL& url) {
59   std::string url_string = url.spec();
60   const std::string long_prefix = "chrome://chrome/";
61   const std::string short_prefix = "chrome://";
62   if (url_string.find(long_prefix) != 0)
63     return url;
64   url_string.replace(0, long_prefix.length(), short_prefix);
65   return GURL(url_string);
66 }
67 
68 }  // namespace
69 
MakeNavigateParams() const70 chrome::NavigateParams BrowserNavigatorTest::MakeNavigateParams() const {
71   return MakeNavigateParams(browser());
72 }
73 
MakeNavigateParams(Browser * browser) const74 chrome::NavigateParams BrowserNavigatorTest::MakeNavigateParams(
75     Browser* browser) const {
76   chrome::NavigateParams params(browser, GetGoogleURL(),
77                                 content::PAGE_TRANSITION_LINK);
78   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
79   return params;
80 }
81 
OpenPOSTURLInNewForegroundTabAndGetTitle(const GURL & url,const std::string & post_data,bool is_browser_initiated,base::string16 * title)82 bool BrowserNavigatorTest::OpenPOSTURLInNewForegroundTabAndGetTitle(
83     const GURL& url, const std::string& post_data, bool is_browser_initiated,
84     base::string16* title) {
85   chrome::NavigateParams param(MakeNavigateParams());
86   param.disposition = NEW_FOREGROUND_TAB;
87   param.url = url;
88   param.is_renderer_initiated = !is_browser_initiated;
89   param.uses_post = true;
90   param.browser_initiated_post_data = new base::RefCountedStaticMemory(
91       post_data.data(), post_data.size());
92 
93   ui_test_utils::NavigateToURL(&param);
94   if (!param.target_contents)
95     return false;
96 
97   // Navigate() should have opened the contents in new foreground tab in the
98   // current Browser.
99   EXPECT_EQ(browser(), param.browser);
100   EXPECT_EQ(browser()->tab_strip_model()->GetActiveWebContents(),
101             param.target_contents);
102   // We should have one window, with one tab.
103   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
104   EXPECT_EQ(2, browser()->tab_strip_model()->count());
105 
106   *title = param.target_contents->GetTitle();
107   return true;
108 }
109 
CreateEmptyBrowserForType(Browser::Type type,Profile * profile)110 Browser* BrowserNavigatorTest::CreateEmptyBrowserForType(Browser::Type type,
111                                                          Profile* profile) {
112   Browser* browser = new Browser(
113       Browser::CreateParams(type, profile, chrome::GetActiveDesktop()));
114   chrome::AddTabAt(browser, GURL(), -1, true);
115   return browser;
116 }
117 
CreateEmptyBrowserForApp(Profile * profile)118 Browser* BrowserNavigatorTest::CreateEmptyBrowserForApp(Profile* profile) {
119   Browser* browser = new Browser(
120       Browser::CreateParams::CreateForApp(
121           "Test", false /* trusted_source */, gfx::Rect(), profile,
122           chrome::GetActiveDesktop()));
123   chrome::AddTabAt(browser, GURL(), -1, true);
124   return browser;
125 }
126 
CreateWebContents()127 WebContents* BrowserNavigatorTest::CreateWebContents() {
128   content::WebContents::CreateParams create_params(browser()->profile());
129   content::WebContents* base_web_contents =
130       browser()->tab_strip_model()->GetActiveWebContents();
131   if (base_web_contents) {
132     create_params.initial_size =
133         base_web_contents->GetContainerBounds().size();
134   }
135   return WebContents::Create(create_params);
136 }
137 
RunSuppressTest(WindowOpenDisposition disposition)138 void BrowserNavigatorTest::RunSuppressTest(WindowOpenDisposition disposition) {
139   GURL old_url = browser()->tab_strip_model()->GetActiveWebContents()->GetURL();
140   chrome::NavigateParams p(MakeNavigateParams());
141   p.disposition = disposition;
142   chrome::Navigate(&p);
143 
144   // Nothing should have happened as a result of Navigate();
145   EXPECT_EQ(1, browser()->tab_strip_model()->count());
146   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
147   EXPECT_EQ(old_url,
148             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
149 }
150 
RunUseNonIncognitoWindowTest(const GURL & url)151 void BrowserNavigatorTest::RunUseNonIncognitoWindowTest(const GURL& url) {
152   Browser* incognito_browser = CreateIncognitoBrowser();
153 
154   EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
155   EXPECT_EQ(1, browser()->tab_strip_model()->count());
156   EXPECT_EQ(1, incognito_browser->tab_strip_model()->count());
157 
158   // Navigate to the page.
159   chrome::NavigateParams p(MakeNavigateParams(incognito_browser));
160   p.disposition = SINGLETON_TAB;
161   p.url = url;
162   p.window_action = chrome::NavigateParams::SHOW_WINDOW;
163   chrome::Navigate(&p);
164 
165   // This page should be opened in browser() window.
166   EXPECT_NE(incognito_browser, p.browser);
167   EXPECT_EQ(browser(), p.browser);
168   EXPECT_EQ(2, browser()->tab_strip_model()->count());
169   EXPECT_EQ(url,
170             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
171 }
172 
RunDoNothingIfIncognitoIsForcedTest(const GURL & url)173 void BrowserNavigatorTest::RunDoNothingIfIncognitoIsForcedTest(
174     const GURL& url) {
175   Browser* browser = CreateIncognitoBrowser();
176 
177   // Set kIncognitoModeAvailability to FORCED.
178   PrefService* prefs1 = browser->profile()->GetPrefs();
179   prefs1->SetInteger(prefs::kIncognitoModeAvailability,
180                      IncognitoModePrefs::FORCED);
181   PrefService* prefs2 = browser->profile()->GetOriginalProfile()->GetPrefs();
182   prefs2->SetInteger(prefs::kIncognitoModeAvailability,
183                      IncognitoModePrefs::FORCED);
184 
185   // Navigate to the page.
186   chrome::NavigateParams p(MakeNavigateParams(browser));
187   p.disposition = OFF_THE_RECORD;
188   p.url = url;
189   p.window_action = chrome::NavigateParams::SHOW_WINDOW;
190   chrome::Navigate(&p);
191 
192   // The page should not be opened.
193   EXPECT_EQ(browser, p.browser);
194   EXPECT_EQ(1, browser->tab_strip_model()->count());
195   EXPECT_EQ(GURL(url::kAboutBlankURL),
196             browser->tab_strip_model()->GetActiveWebContents()->GetURL());
197 }
198 
SetUpCommandLine(base::CommandLine * command_line)199 void BrowserNavigatorTest::SetUpCommandLine(base::CommandLine* command_line) {
200   // Disable settings-in-a-window so that we can use the settings page and
201   // sub-pages to test browser navigation.
202   command_line->AppendSwitch(::switches::kDisableSettingsWindow);
203 }
204 
Observe(int type,const content::NotificationSource & source,const content::NotificationDetails & details)205 void BrowserNavigatorTest::Observe(
206     int type,
207     const content::NotificationSource& source,
208     const content::NotificationDetails& details) {
209   switch (type) {
210     case content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED: {
211       ++this->created_tab_contents_count_;
212       break;
213     }
214     default:
215       break;
216   }
217 }
218 
219 
220 namespace {
221 
222 // This test verifies that when a navigation occurs within a tab, the tab count
223 // of the Browser remains the same and the current tab bears the loaded URL.
224 // Note that network URLs are not actually loaded in tests, so this also tests
225 // that error pages leave the intended URL in the address bar.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_CurrentTab)226 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_CurrentTab) {
227   ui_test_utils::NavigateToURL(browser(), GetGoogleURL());
228   EXPECT_EQ(GetGoogleURL(),
229             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
230   // We should have one window with one tab.
231   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
232   EXPECT_EQ(1, browser()->tab_strip_model()->count());
233 }
234 
235 // This test verifies that a singleton tab is refocused if one is already opened
236 // in another or an existing window, or added if it is not.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_SingletonTabExisting)237 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SingletonTabExisting) {
238   GURL singleton_url1("http://maps.google.com/");
239 
240   // Register for a notification if an additional WebContents was instantiated.
241   // Opening a Singleton tab that is already opened should not be opening a new
242   // tab nor be creating a new WebContents object.
243   content::NotificationRegistrar registrar;
244 
245   // As the registrar object goes out of scope, this will get unregistered
246   registrar.Add(this,
247                 content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED,
248                 content::NotificationService::AllSources());
249 
250   chrome::AddSelectedTabWithURL(browser(), singleton_url1,
251                                 content::PAGE_TRANSITION_LINK);
252   chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
253                                 content::PAGE_TRANSITION_LINK);
254 
255   // We should have one browser with 3 tabs, the 3rd selected.
256   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
257   EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
258 
259   unsigned int previous_tab_contents_count =
260       created_tab_contents_count_ = 0;
261 
262   // Navigate to singleton_url1.
263   chrome::NavigateParams p(MakeNavigateParams());
264   p.disposition = SINGLETON_TAB;
265   p.url = singleton_url1;
266   chrome::Navigate(&p);
267 
268   // The middle tab should now be selected.
269   EXPECT_EQ(browser(), p.browser);
270   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
271 
272   // No tab contents should have been created
273   EXPECT_EQ(previous_tab_contents_count,
274             created_tab_contents_count_);
275 }
276 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_SingletonTabRespectingRef)277 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
278                        Disposition_SingletonTabRespectingRef) {
279   GURL singleton_ref_url1("http://maps.google.com/#a");
280   GURL singleton_ref_url2("http://maps.google.com/#b");
281   GURL singleton_ref_url3("http://maps.google.com/");
282 
283   chrome::AddSelectedTabWithURL(browser(), singleton_ref_url1,
284                                 content::PAGE_TRANSITION_LINK);
285 
286   // We should have one browser with 2 tabs, 2nd selected.
287   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
288   EXPECT_EQ(2, browser()->tab_strip_model()->count());
289   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
290 
291   // Navigate to singleton_url2.
292   chrome::NavigateParams p(MakeNavigateParams());
293   p.disposition = SINGLETON_TAB;
294   p.url = singleton_ref_url2;
295   chrome::Navigate(&p);
296 
297   // We should now have 2 tabs, the 2nd one selected.
298   EXPECT_EQ(browser(), p.browser);
299   EXPECT_EQ(2, browser()->tab_strip_model()->count());
300   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
301 
302   // Navigate to singleton_url2, but with respect ref set.
303   p = MakeNavigateParams();
304   p.disposition = SINGLETON_TAB;
305   p.url = singleton_ref_url2;
306   p.ref_behavior = chrome::NavigateParams::RESPECT_REF;
307   chrome::Navigate(&p);
308 
309   // We should now have 3 tabs, the 3th one selected.
310   EXPECT_EQ(browser(), p.browser);
311   EXPECT_EQ(3, browser()->tab_strip_model()->count());
312   EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
313 
314   // Navigate to singleton_url3.
315   p = MakeNavigateParams();
316   p.disposition = SINGLETON_TAB;
317   p.url = singleton_ref_url3;
318   p.ref_behavior = chrome::NavigateParams::RESPECT_REF;
319   chrome::Navigate(&p);
320 
321   // We should now have 4 tabs, the 4th one selected.
322   EXPECT_EQ(browser(), p.browser);
323   EXPECT_EQ(4, browser()->tab_strip_model()->count());
324   EXPECT_EQ(3, browser()->tab_strip_model()->active_index());
325 }
326 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_SingletonTabNoneExisting)327 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
328                        Disposition_SingletonTabNoneExisting) {
329   GURL singleton_url1("http://maps.google.com/");
330 
331   // We should have one browser with 1 tab.
332   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
333   EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
334 
335   // Navigate to singleton_url1.
336   chrome::NavigateParams p(MakeNavigateParams());
337   p.disposition = SINGLETON_TAB;
338   p.url = singleton_url1;
339   chrome::Navigate(&p);
340 
341   // We should now have 2 tabs, the 2nd one selected.
342   EXPECT_EQ(browser(), p.browser);
343   EXPECT_EQ(2, browser()->tab_strip_model()->count());
344   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
345 }
346 
347 // This test verifies that when a navigation results in a foreground tab, the
348 // tab count of the Browser increases and the selected tab shifts to the new
349 // foreground tab.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_NewForegroundTab)350 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewForegroundTab) {
351   WebContents* old_contents =
352       browser()->tab_strip_model()->GetActiveWebContents();
353   chrome::NavigateParams p(MakeNavigateParams());
354   p.disposition = NEW_FOREGROUND_TAB;
355   chrome::Navigate(&p);
356   EXPECT_NE(old_contents,
357             browser()->tab_strip_model()->GetActiveWebContents());
358   EXPECT_EQ(browser()->tab_strip_model()->GetActiveWebContents(),
359             p.target_contents);
360   EXPECT_EQ(2, browser()->tab_strip_model()->count());
361 }
362 
363 // This test verifies that when a navigation results in a background tab, the
364 // tab count of the Browser increases but the selected tab remains the same.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_NewBackgroundTab)365 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewBackgroundTab) {
366   WebContents* old_contents =
367       browser()->tab_strip_model()->GetActiveWebContents();
368   chrome::NavigateParams p(MakeNavigateParams());
369   p.disposition = NEW_BACKGROUND_TAB;
370   chrome::Navigate(&p);
371   WebContents* new_contents =
372       browser()->tab_strip_model()->GetActiveWebContents();
373   // The selected tab should have remained unchanged, since the new tab was
374   // opened in the background.
375   EXPECT_EQ(old_contents, new_contents);
376   EXPECT_EQ(2, browser()->tab_strip_model()->count());
377 }
378 
379 // This test verifies that when a navigation requiring a new foreground tab
380 // occurs in a Browser that cannot host multiple tabs, the new foreground tab
381 // is created in an existing compatible Browser.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_IncompatibleWindow_Existing)382 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
383                        Disposition_IncompatibleWindow_Existing) {
384   // Open a foreground tab in a window that cannot open popups when there is an
385   // existing compatible window somewhere else that they can be opened within.
386   Browser* popup = CreateEmptyBrowserForType(Browser::TYPE_POPUP,
387                                              browser()->profile());
388   chrome::NavigateParams p(MakeNavigateParams(popup));
389   p.disposition = NEW_FOREGROUND_TAB;
390   chrome::Navigate(&p);
391 
392   // Navigate() should have opened the tab in a different browser since the
393   // one we supplied didn't support additional tabs.
394   EXPECT_NE(popup, p.browser);
395 
396   // Since browser() is an existing compatible tabbed browser, it should have
397   // opened the tab there.
398   EXPECT_EQ(browser(), p.browser);
399 
400   // We should be left with 2 windows, the popup with one tab and the browser()
401   // provided by the framework with two.
402   EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
403   EXPECT_EQ(1, popup->tab_strip_model()->count());
404   EXPECT_EQ(2, browser()->tab_strip_model()->count());
405 }
406 
407 // This test verifies that when a navigation requiring a new foreground tab
408 // occurs in a Browser that cannot host multiple tabs and no compatible Browser
409 // that can is open, a compatible Browser is created.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_IncompatibleWindow_NoExisting)410 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
411                        Disposition_IncompatibleWindow_NoExisting) {
412   // We want to simulate not being able to find an existing window compatible
413   // with our non-tabbed browser window so Navigate() is forced to create a
414   // new compatible window. Because browser() supplied by the in-process
415   // browser testing framework is compatible with browser()->profile(), we
416   // need a different profile, and creating a popup window with an incognito
417   // profile is a quick and dirty way of achieving this.
418   Browser* popup = CreateEmptyBrowserForType(
419       Browser::TYPE_POPUP,
420       browser()->profile()->GetOffTheRecordProfile());
421   chrome::NavigateParams p(MakeNavigateParams(popup));
422   p.disposition = NEW_FOREGROUND_TAB;
423   chrome::Navigate(&p);
424 
425   // Navigate() should have opened the tab in a different browser since the
426   // one we supplied didn't support additional tabs.
427   EXPECT_NE(popup, p.browser);
428 
429   // This time, browser() is _not_ compatible with popup since it is not an
430   // incognito window.
431   EXPECT_NE(browser(), p.browser);
432 
433   // We should have three windows, each with one tab:
434   // 1. the browser() provided by the framework (unchanged in this test)
435   // 2. the incognito popup we created originally
436   // 3. the new incognito tabbed browser that was created by Navigate().
437   EXPECT_EQ(3u, chrome::GetTotalBrowserCount());
438   EXPECT_EQ(1, browser()->tab_strip_model()->count());
439   EXPECT_EQ(1, popup->tab_strip_model()->count());
440   EXPECT_EQ(1, p.browser->tab_strip_model()->count());
441   EXPECT_TRUE(p.browser->is_type_tabbed());
442 }
443 
444 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
445 // from a normal Browser results in a new Browser with TYPE_POPUP.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_NewPopup)446 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopup) {
447   chrome::NavigateParams p(MakeNavigateParams());
448   p.disposition = NEW_POPUP;
449   p.window_bounds = gfx::Rect(0, 0, 200, 200);
450   // Wait for new popup to to load and gain focus.
451   ui_test_utils::NavigateToURL(&p);
452 
453   // Navigate() should have opened a new, focused popup window.
454   EXPECT_NE(browser(), p.browser);
455 #if 0
456   // TODO(stevenjb): Enable this test. See: crbug.com/79493
457   EXPECT_TRUE(p.browser->window()->IsActive());
458 #endif
459   EXPECT_TRUE(p.browser->is_type_popup());
460   EXPECT_FALSE(p.browser->is_app());
461 
462   // We should have two windows, the browser() provided by the framework and the
463   // new popup window.
464   EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
465   EXPECT_EQ(1, browser()->tab_strip_model()->count());
466   EXPECT_EQ(1, p.browser->tab_strip_model()->count());
467 }
468 
469 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
470 // from a normal Browser results in a new Browser with is_app() true.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_NewPopup_ExtensionId)471 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopup_ExtensionId) {
472   chrome::NavigateParams p(MakeNavigateParams());
473   p.disposition = NEW_POPUP;
474   p.extension_app_id = "extensionappid";
475   p.window_bounds = gfx::Rect(0, 0, 200, 200);
476   // Wait for new popup to to load and gain focus.
477   ui_test_utils::NavigateToURL(&p);
478 
479   // Navigate() should have opened a new, focused popup window.
480   EXPECT_NE(browser(), p.browser);
481   EXPECT_TRUE(p.browser->is_type_popup());
482   EXPECT_TRUE(p.browser->is_app());
483 
484   // We should have two windows, the browser() provided by the framework and the
485   // new popup window.
486   EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
487   EXPECT_EQ(1, browser()->tab_strip_model()->count());
488   EXPECT_EQ(1, p.browser->tab_strip_model()->count());
489 }
490 
491 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
492 // from a normal popup results in a new Browser with TYPE_POPUP.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_NewPopupFromPopup)493 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupFromPopup) {
494   // Open a popup.
495   chrome::NavigateParams p1(MakeNavigateParams());
496   p1.disposition = NEW_POPUP;
497   p1.window_bounds = gfx::Rect(0, 0, 200, 200);
498   chrome::Navigate(&p1);
499   // Open another popup.
500   chrome::NavigateParams p2(MakeNavigateParams(p1.browser));
501   p2.disposition = NEW_POPUP;
502   p2.window_bounds = gfx::Rect(0, 0, 200, 200);
503   chrome::Navigate(&p2);
504 
505   // Navigate() should have opened a new normal popup window.
506   EXPECT_NE(p1.browser, p2.browser);
507   EXPECT_TRUE(p2.browser->is_type_popup());
508   EXPECT_FALSE(p2.browser->is_app());
509 
510   // We should have three windows, the browser() provided by the framework,
511   // the first popup window, and the second popup window.
512   EXPECT_EQ(3u, chrome::GetTotalBrowserCount());
513   EXPECT_EQ(1, browser()->tab_strip_model()->count());
514   EXPECT_EQ(1, p1.browser->tab_strip_model()->count());
515   EXPECT_EQ(1, p2.browser->tab_strip_model()->count());
516 }
517 
518 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
519 // from an app frame results in a new Browser with TYPE_POPUP.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_NewPopupFromAppWindow)520 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
521                        Disposition_NewPopupFromAppWindow) {
522   Browser* app_browser = CreateEmptyBrowserForApp(browser()->profile());
523   chrome::NavigateParams p(MakeNavigateParams(app_browser));
524   p.disposition = NEW_POPUP;
525   p.window_bounds = gfx::Rect(0, 0, 200, 200);
526   chrome::Navigate(&p);
527 
528   // Navigate() should have opened a new popup app window.
529   EXPECT_NE(app_browser, p.browser);
530   EXPECT_NE(browser(), p.browser);
531   EXPECT_TRUE(p.browser->is_type_popup());
532   EXPECT_TRUE(p.browser->is_app());
533 
534   // We should now have three windows, the app window, the app popup it created,
535   // and the original browser() provided by the framework.
536   EXPECT_EQ(3u, chrome::GetTotalBrowserCount());
537   EXPECT_EQ(1, browser()->tab_strip_model()->count());
538   EXPECT_EQ(1, app_browser->tab_strip_model()->count());
539   EXPECT_EQ(1, p.browser->tab_strip_model()->count());
540 }
541 
542 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
543 // from an app popup results in a new Browser also of TYPE_POPUP.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_NewPopupFromAppPopup)544 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
545                        Disposition_NewPopupFromAppPopup) {
546   Browser* app_browser = CreateEmptyBrowserForApp(browser()->profile());
547   // Open an app popup.
548   chrome::NavigateParams p1(MakeNavigateParams(app_browser));
549   p1.disposition = NEW_POPUP;
550   p1.window_bounds = gfx::Rect(0, 0, 200, 200);
551   chrome::Navigate(&p1);
552   // Now open another app popup.
553   chrome::NavigateParams p2(MakeNavigateParams(p1.browser));
554   p2.disposition = NEW_POPUP;
555   p2.window_bounds = gfx::Rect(0, 0, 200, 200);
556   chrome::Navigate(&p2);
557 
558   // Navigate() should have opened a new popup app window.
559   EXPECT_NE(browser(), p1.browser);
560   EXPECT_NE(p1.browser, p2.browser);
561   EXPECT_TRUE(p2.browser->is_type_popup());
562   EXPECT_TRUE(p2.browser->is_app());
563 
564   // We should now have four windows, the app window, the first app popup,
565   // the second app popup, and the original browser() provided by the framework.
566   EXPECT_EQ(4u, chrome::GetTotalBrowserCount());
567   EXPECT_EQ(1, browser()->tab_strip_model()->count());
568   EXPECT_EQ(1, app_browser->tab_strip_model()->count());
569   EXPECT_EQ(1, p1.browser->tab_strip_model()->count());
570   EXPECT_EQ(1, p2.browser->tab_strip_model()->count());
571 }
572 
573 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
574 // from an extension app tab results in a new Browser with TYPE_APP_POPUP.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_NewPopupFromExtensionApp)575 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
576                        Disposition_NewPopupFromExtensionApp) {
577   // TODO(beng): TBD.
578 }
579 
580 // This test verifies that navigating with window_action = SHOW_WINDOW_INACTIVE
581 // does not focus a new new popup window.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_NewPopupUnfocused)582 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupUnfocused) {
583   chrome::NavigateParams p(MakeNavigateParams());
584   p.disposition = NEW_POPUP;
585   p.window_bounds = gfx::Rect(0, 0, 200, 200);
586   p.window_action = chrome::NavigateParams::SHOW_WINDOW_INACTIVE;
587   // Wait for new popup to load (and gain focus if the test fails).
588   ui_test_utils::NavigateToURL(&p);
589 
590   // Navigate() should have opened a new, unfocused, popup window.
591   EXPECT_NE(browser(), p.browser);
592   EXPECT_EQ(Browser::TYPE_POPUP, p.browser->type());
593 #if 0
594 // TODO(stevenjb): Enable this test. See: crbug.com/79493
595   EXPECT_FALSE(p.browser->window()->IsActive());
596 #endif
597 }
598 
599 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
600 // and trusted_source = true results in a new Browser where is_trusted_source()
601 // is true.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_NewPopupTrusted)602 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupTrusted) {
603   chrome::NavigateParams p(MakeNavigateParams());
604   p.disposition = NEW_POPUP;
605   p.trusted_source = true;
606   p.window_bounds = gfx::Rect(0, 0, 200, 200);
607   // Wait for new popup to to load and gain focus.
608   ui_test_utils::NavigateToURL(&p);
609 
610   // Navigate() should have opened a new popup window of TYPE_TRUSTED_POPUP.
611   EXPECT_NE(browser(), p.browser);
612   EXPECT_TRUE(p.browser->is_type_popup());
613   EXPECT_TRUE(p.browser->is_trusted_source());
614 }
615 
616 
617 // This test verifies that navigating with WindowOpenDisposition = NEW_WINDOW
618 // always opens a new window.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_NewWindow)619 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewWindow) {
620   chrome::NavigateParams p(MakeNavigateParams());
621   p.disposition = NEW_WINDOW;
622   chrome::Navigate(&p);
623 
624   // Navigate() should have opened a new toplevel window.
625   EXPECT_NE(browser(), p.browser);
626   EXPECT_TRUE(p.browser->is_type_tabbed());
627 
628   // We should now have two windows, the browser() provided by the framework and
629   // the new normal window.
630   EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
631   EXPECT_EQ(1, browser()->tab_strip_model()->count());
632   EXPECT_EQ(1, p.browser->tab_strip_model()->count());
633 }
634 
635 // This test verifies that navigating with WindowOpenDisposition = INCOGNITO
636 // opens a new incognito window if no existing incognito window is present.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_Incognito)637 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_Incognito) {
638   chrome::NavigateParams p(MakeNavigateParams());
639   p.disposition = OFF_THE_RECORD;
640   chrome::Navigate(&p);
641 
642   // Navigate() should have opened a new toplevel incognito window.
643   EXPECT_NE(browser(), p.browser);
644   EXPECT_EQ(browser()->profile()->GetOffTheRecordProfile(),
645             p.browser->profile());
646 
647   // |source_contents| should be set to NULL because the profile for the new
648   // page is different from the originating page.
649   EXPECT_EQ(NULL, p.source_contents);
650 
651   // We should now have two windows, the browser() provided by the framework and
652   // the new incognito window.
653   EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
654   EXPECT_EQ(1, browser()->tab_strip_model()->count());
655   EXPECT_EQ(1, p.browser->tab_strip_model()->count());
656 }
657 
658 // This test verifies that navigating with WindowOpenDisposition = INCOGNITO
659 // reuses an existing incognito window when possible.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_IncognitoRefocus)660 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_IncognitoRefocus) {
661   Browser* incognito_browser =
662       CreateEmptyBrowserForType(Browser::TYPE_TABBED,
663                                 browser()->profile()->GetOffTheRecordProfile());
664   chrome::NavigateParams p(MakeNavigateParams());
665   p.disposition = OFF_THE_RECORD;
666   chrome::Navigate(&p);
667 
668   // Navigate() should have opened a new tab in the existing incognito window.
669   EXPECT_NE(browser(), p.browser);
670   EXPECT_EQ(p.browser, incognito_browser);
671 
672   // We should now have two windows, the browser() provided by the framework and
673   // the incognito window we opened earlier.
674   EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
675   EXPECT_EQ(1, browser()->tab_strip_model()->count());
676   EXPECT_EQ(2, incognito_browser->tab_strip_model()->count());
677 }
678 
679 // This test verifies that no navigation action occurs when
680 // WindowOpenDisposition = SUPPRESS_OPEN.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_SuppressOpen)681 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SuppressOpen) {
682   RunSuppressTest(SUPPRESS_OPEN);
683 }
684 
685 // This test verifies that no navigation action occurs when
686 // WindowOpenDisposition = SAVE_TO_DISK.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_SaveToDisk)687 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SaveToDisk) {
688   RunSuppressTest(SAVE_TO_DISK);
689 }
690 
691 // This test verifies that no navigation action occurs when
692 // WindowOpenDisposition = IGNORE_ACTION.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_IgnoreAction)693 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_IgnoreAction) {
694   RunSuppressTest(IGNORE_ACTION);
695 }
696 
697 // This tests adding a foreground tab with a predefined WebContents.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,TargetContents_ForegroundTab)698 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, TargetContents_ForegroundTab) {
699   chrome::NavigateParams p(MakeNavigateParams());
700   p.disposition = NEW_FOREGROUND_TAB;
701   p.target_contents = CreateWebContents();
702   chrome::Navigate(&p);
703 
704   // Navigate() should have opened the contents in a new foreground in the
705   // current Browser.
706   EXPECT_EQ(browser(), p.browser);
707   EXPECT_EQ(browser()->tab_strip_model()->GetActiveWebContents(),
708             p.target_contents);
709 
710   // We should have one window, with two tabs.
711   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
712   EXPECT_EQ(2, browser()->tab_strip_model()->count());
713 }
714 
715 #if defined(OS_WIN)
716 // This tests adding a popup with a predefined WebContents.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,DISABLED_TargetContents_Popup)717 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, DISABLED_TargetContents_Popup) {
718   chrome::NavigateParams p(MakeNavigateParams());
719   p.disposition = NEW_POPUP;
720   p.target_contents = CreateWebContents();
721   p.window_bounds = gfx::Rect(10, 10, 500, 500);
722   chrome::Navigate(&p);
723 
724   // Navigate() should have opened a new popup window.
725   EXPECT_NE(browser(), p.browser);
726   EXPECT_TRUE(p.browser->is_type_popup());
727   EXPECT_FALSE(p.browser->is_app());
728 
729   // The web platform is weird. The window bounds specified in
730   // |p.window_bounds| are used as follows:
731   // - the origin is used to position the window
732   // - the size is used to size the WebContents of the window.
733   // As such the position of the resulting window will always match
734   // p.window_bounds.origin(), but its size will not. We need to match
735   // the size against the selected tab's view's container size.
736   // Only Windows positions the window according to |p.window_bounds.origin()| -
737   // on Mac the window is offset from the opener and on Linux it always opens
738   // at 0,0.
739   EXPECT_EQ(p.window_bounds.origin(),
740             p.browser->window()->GetRestoredBounds().origin());
741   // All platforms should respect size however provided width > 400 (Mac has a
742   // minimum window width of 400).
743   EXPECT_EQ(p.window_bounds.size(),
744             p.target_contents->GetContainerBounds().size());
745 
746   // We should have two windows, the new popup and the browser() provided by the
747   // framework.
748   EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
749   EXPECT_EQ(1, browser()->tab_strip_model()->count());
750   EXPECT_EQ(1, p.browser->tab_strip_model()->count());
751 }
752 #endif
753 
754 // This tests adding a tab at a specific index.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Tabstrip_InsertAtIndex)755 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Tabstrip_InsertAtIndex) {
756   // This is not meant to be a comprehensive test of whether or not the tab
757   // implementation of the browser observes the insertion index. That is
758   // covered by the unit tests for TabStripModel. This merely verifies that
759   // insertion index preference is reflected in common cases.
760   chrome::NavigateParams p(MakeNavigateParams());
761   p.disposition = NEW_FOREGROUND_TAB;
762   p.tabstrip_index = 0;
763   p.tabstrip_add_types = TabStripModel::ADD_FORCE_INDEX;
764   chrome::Navigate(&p);
765 
766   // Navigate() should have inserted a new tab at slot 0 in the tabstrip.
767   EXPECT_EQ(browser(), p.browser);
768   EXPECT_EQ(0, browser()->tab_strip_model()->GetIndexOfWebContents(
769       static_cast<const WebContents*>(p.target_contents)));
770 
771   // We should have one window - the browser() provided by the framework.
772   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
773   EXPECT_EQ(2, browser()->tab_strip_model()->count());
774 }
775 
776 // This test verifies that constructing params with disposition = SINGLETON_TAB
777 // and IGNORE_AND_NAVIGATE opens a new tab navigated to the specified URL if
778 // no previous tab with that URL (minus the path) exists.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_SingletonTabNew_IgnorePath)779 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
780                        Disposition_SingletonTabNew_IgnorePath) {
781   chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
782                                 content::PAGE_TRANSITION_LINK);
783 
784   // We should have one browser with 2 tabs, the 2nd selected.
785   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
786   EXPECT_EQ(2, browser()->tab_strip_model()->count());
787   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
788 
789   // Navigate to a new singleton tab with a sub-page.
790   chrome::NavigateParams p(MakeNavigateParams());
791   p.disposition = SINGLETON_TAB;
792   p.url = GetContentSettingsURL();
793   p.window_action = chrome::NavigateParams::SHOW_WINDOW;
794   p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
795   chrome::Navigate(&p);
796 
797   // The last tab should now be selected and navigated to the sub-page of the
798   // URL.
799   EXPECT_EQ(browser(), p.browser);
800   EXPECT_EQ(3, browser()->tab_strip_model()->count());
801   EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
802   EXPECT_EQ(GetContentSettingsURL(),
803             ShortenUberURL(browser()->tab_strip_model()->
804                 GetActiveWebContents()->GetURL()));
805 }
806 
807 // This test verifies that constructing params with disposition = SINGLETON_TAB
808 // and IGNORE_AND_NAVIGATE opens an existing tab with the matching URL (minus
809 // the path) which is navigated to the specified URL.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_SingletonTabExisting_IgnorePath)810 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
811                        Disposition_SingletonTabExisting_IgnorePath) {
812   GURL singleton_url1(GetSettingsURL());
813   chrome::AddSelectedTabWithURL(browser(), singleton_url1,
814                                 content::PAGE_TRANSITION_LINK);
815   chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
816                                 content::PAGE_TRANSITION_LINK);
817 
818   // We should have one browser with 3 tabs, the 3rd selected.
819   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
820   EXPECT_EQ(3, browser()->tab_strip_model()->count());
821   EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
822 
823   // Navigate to singleton_url1.
824   chrome::NavigateParams p(MakeNavigateParams());
825   p.disposition = SINGLETON_TAB;
826   p.url = GetContentSettingsURL();
827   p.window_action = chrome::NavigateParams::SHOW_WINDOW;
828   p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
829   chrome::Navigate(&p);
830 
831   // The middle tab should now be selected and navigated to the sub-page of the
832   // URL.
833   EXPECT_EQ(browser(), p.browser);
834   EXPECT_EQ(3, browser()->tab_strip_model()->count());
835   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
836   EXPECT_EQ(GetContentSettingsURL(),
837             ShortenUberURL(browser()->tab_strip_model()->
838                 GetActiveWebContents()->GetURL()));
839 }
840 
841 // This test verifies that constructing params with disposition = SINGLETON_TAB
842 // and IGNORE_AND_NAVIGATE opens an existing tab with the matching URL (minus
843 // the path) which is navigated to the specified URL.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_SingletonTabExistingSubPath_IgnorePath)844 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
845                        Disposition_SingletonTabExistingSubPath_IgnorePath) {
846   GURL singleton_url1(GetContentSettingsURL());
847   chrome::AddSelectedTabWithURL(browser(), singleton_url1,
848                                 content::PAGE_TRANSITION_LINK);
849   chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
850                                 content::PAGE_TRANSITION_LINK);
851 
852   // We should have one browser with 3 tabs, the 3rd selected.
853   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
854   EXPECT_EQ(3, browser()->tab_strip_model()->count());
855   EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
856 
857   // Navigate to singleton_url1.
858   chrome::NavigateParams p(MakeNavigateParams());
859   p.disposition = SINGLETON_TAB;
860   p.url = GetClearBrowsingDataURL();
861   p.window_action = chrome::NavigateParams::SHOW_WINDOW;
862   p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
863   chrome::Navigate(&p);
864 
865   // The middle tab should now be selected and navigated to the sub-page of the
866   // URL.
867   EXPECT_EQ(browser(), p.browser);
868   EXPECT_EQ(3, browser()->tab_strip_model()->count());
869   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
870   EXPECT_EQ(GetClearBrowsingDataURL(),
871             ShortenUberURL(browser()->tab_strip_model()->
872                 GetActiveWebContents()->GetURL()));
873 }
874 
875 // This test verifies that constructing params with disposition = SINGLETON_TAB
876 // and IGNORE_AND_STAY_PUT opens an existing tab with the matching URL (minus
877 // the path).
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_SingletonTabExistingSubPath_IgnorePath2)878 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
879                        Disposition_SingletonTabExistingSubPath_IgnorePath2) {
880   GURL singleton_url1(GetContentSettingsURL());
881   chrome::AddSelectedTabWithURL(browser(), singleton_url1,
882                                 content::PAGE_TRANSITION_LINK);
883   chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
884                                 content::PAGE_TRANSITION_LINK);
885 
886   // We should have one browser with 3 tabs, the 3rd selected.
887   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
888   EXPECT_EQ(3, browser()->tab_strip_model()->count());
889   EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
890 
891   // Navigate to singleton_url1.
892   chrome::NavigateParams p(MakeNavigateParams());
893   p.disposition = SINGLETON_TAB;
894   p.url = GetClearBrowsingDataURL();
895   p.window_action = chrome::NavigateParams::SHOW_WINDOW;
896   p.path_behavior = chrome::NavigateParams::IGNORE_AND_STAY_PUT;
897   chrome::Navigate(&p);
898 
899   // The middle tab should now be selected.
900   EXPECT_EQ(browser(), p.browser);
901   EXPECT_EQ(3, browser()->tab_strip_model()->count());
902   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
903   EXPECT_EQ(singleton_url1,
904             ShortenUberURL(browser()->tab_strip_model()->
905                 GetActiveWebContents()->GetURL()));
906 }
907 
908 // This test verifies that constructing params with disposition = SINGLETON_TAB
909 // and IGNORE_AND_NAVIGATE will update the current tab's URL if the currently
910 // selected tab is a match but has a different path.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_SingletonTabFocused_IgnorePath)911 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
912                        Disposition_SingletonTabFocused_IgnorePath) {
913   GURL singleton_url_current(GetContentSettingsURL());
914   chrome::AddSelectedTabWithURL(browser(), singleton_url_current,
915                                 content::PAGE_TRANSITION_LINK);
916 
917   // We should have one browser with 2 tabs, the 2nd selected.
918   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
919   EXPECT_EQ(2, browser()->tab_strip_model()->count());
920   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
921 
922   // Navigate to a different settings path.
923   GURL singleton_url_target(GetClearBrowsingDataURL());
924   chrome::NavigateParams p(MakeNavigateParams());
925   p.disposition = SINGLETON_TAB;
926   p.url = singleton_url_target;
927   p.window_action = chrome::NavigateParams::SHOW_WINDOW;
928   p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
929   chrome::Navigate(&p);
930 
931   // The second tab should still be selected, but navigated to the new path.
932   EXPECT_EQ(browser(), p.browser);
933   EXPECT_EQ(2, browser()->tab_strip_model()->count());
934   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
935   EXPECT_EQ(singleton_url_target,
936             ShortenUberURL(browser()->tab_strip_model()->
937                 GetActiveWebContents()->GetURL()));
938 }
939 
940 // This test verifies that constructing params with disposition = SINGLETON_TAB
941 // and IGNORE_AND_NAVIGATE will open an existing matching tab with a different
942 // query.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_SingletonTabExisting_IgnoreQuery)943 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
944                        Disposition_SingletonTabExisting_IgnoreQuery) {
945   int initial_tab_count = browser()->tab_strip_model()->count();
946   GURL singleton_url_current("chrome://settings/internet");
947   chrome::AddSelectedTabWithURL(browser(), singleton_url_current,
948                                 content::PAGE_TRANSITION_LINK);
949 
950   EXPECT_EQ(initial_tab_count + 1, browser()->tab_strip_model()->count());
951   EXPECT_EQ(initial_tab_count, browser()->tab_strip_model()->active_index());
952 
953   // Navigate to a different settings path.
954   GURL singleton_url_target(
955       "chrome://settings/internet?"
956       "servicePath=/profile/ethernet_00aa00aa00aa&networkType=1");
957   chrome::NavigateParams p(MakeNavigateParams());
958   p.disposition = SINGLETON_TAB;
959   p.url = singleton_url_target;
960   p.window_action = chrome::NavigateParams::SHOW_WINDOW;
961   p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
962   chrome::Navigate(&p);
963 
964   // Last tab should still be selected.
965   EXPECT_EQ(browser(), p.browser);
966   EXPECT_EQ(initial_tab_count + 1, browser()->tab_strip_model()->count());
967   EXPECT_EQ(initial_tab_count, browser()->tab_strip_model()->active_index());
968 }
969 
970 // This test verifies that the settings page isn't opened in the incognito
971 // window.
972 // Disabled until fixed for uber settings: http://crbug.com/111243
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,DISABLED_Disposition_Settings_UseNonIncognitoWindow)973 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
974                        DISABLED_Disposition_Settings_UseNonIncognitoWindow) {
975   RunUseNonIncognitoWindowTest(GetSettingsURL());
976 }
977 
978 // This test verifies that the view-source settings page isn't opened in the
979 // incognito window.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_ViewSource_Settings_DoNothingIfIncognitoForced)980 IN_PROC_BROWSER_TEST_F(
981     BrowserNavigatorTest,
982     Disposition_ViewSource_Settings_DoNothingIfIncognitoForced) {
983   std::string view_source(content::kViewSourceScheme);
984   view_source.append(":");
985   view_source.append(chrome::kChromeUISettingsURL);
986   RunDoNothingIfIncognitoIsForcedTest(GURL(view_source));
987 }
988 
989 // This test verifies that the view-source settings page isn't opened in the
990 // incognito window even if incognito mode is forced (does nothing in that
991 // case).
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_ViewSource_Settings_UseNonIncognitoWindow)992 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
993                        Disposition_ViewSource_Settings_UseNonIncognitoWindow) {
994   std::string view_source(content::kViewSourceScheme);
995   view_source.append(":");
996   view_source.append(chrome::kChromeUISettingsURL);
997   RunUseNonIncognitoWindowTest(GURL(view_source));
998 }
999 
1000 // This test verifies that the settings page isn't opened in the incognito
1001 // window from a non-incognito window (bookmark open-in-incognito trigger).
1002 // Disabled until fixed for uber settings: http://crbug.com/111243
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,DISABLED_Disposition_Settings_UseNonIncognitoWindowForBookmark)1003 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1004     DISABLED_Disposition_Settings_UseNonIncognitoWindowForBookmark) {
1005   chrome::NavigateParams params(browser(), GetSettingsURL(),
1006                                 content::PAGE_TRANSITION_AUTO_BOOKMARK);
1007   params.disposition = OFF_THE_RECORD;
1008   {
1009     content::WindowedNotificationObserver observer(
1010         content::NOTIFICATION_LOAD_STOP,
1011         content::NotificationService::AllSources());
1012     chrome::Navigate(&params);
1013     observer.Wait();
1014   }
1015 
1016   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
1017   EXPECT_EQ(GetSettingsURL(),
1018             ShortenUberURL(browser()->tab_strip_model()->
1019                 GetActiveWebContents()->GetURL()));
1020 }
1021 
1022 // Settings page is expected to always open in normal mode regardless
1023 // of whether the user is trying to open it in incognito mode or not.
1024 // This test verifies that if incognito mode is forced (by policy), settings
1025 // page doesn't open at all.
1026 // Disabled until fixed for uber settings: http://crbug.com/111243
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,DISABLED_Disposition_Settings_DoNothingIfIncognitoIsForced)1027 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1028     DISABLED_Disposition_Settings_DoNothingIfIncognitoIsForced) {
1029   RunDoNothingIfIncognitoIsForcedTest(GetSettingsURL());
1030 }
1031 
1032 // This test verifies that the bookmarks page isn't opened in the incognito
1033 // window.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_Bookmarks_UseNonIncognitoWindow)1034 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1035                        Disposition_Bookmarks_UseNonIncognitoWindow) {
1036   RunUseNonIncognitoWindowTest(GURL(chrome::kChromeUIBookmarksURL));
1037 }
1038 
1039 // Bookmark manager is expected to always open in normal mode regardless
1040 // of whether the user is trying to open it in incognito mode or not.
1041 // This test verifies that if incognito mode is forced (by policy), bookmark
1042 // manager doesn't open at all.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,Disposition_Bookmarks_DoNothingIfIncognitoIsForced)1043 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1044                        Disposition_Bookmarks_DoNothingIfIncognitoIsForced) {
1045   RunDoNothingIfIncognitoIsForcedTest(GURL(chrome::kChromeUIBookmarksURL));
1046 }
1047 
1048 // This test makes sure a crashed singleton tab reloads from a new navigation.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,NavigateToCrashedSingletonTab)1049 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1050                        NavigateToCrashedSingletonTab) {
1051   GURL singleton_url(GetContentSettingsURL());
1052   WebContents* web_contents = chrome::AddSelectedTabWithURL(
1053       browser(), singleton_url, content::PAGE_TRANSITION_LINK);
1054 
1055   // We should have one browser with 2 tabs, the 2nd selected.
1056   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
1057   EXPECT_EQ(2, browser()->tab_strip_model()->count());
1058   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
1059 
1060   // Kill the singleton tab.
1061   web_contents->SetIsCrashed(base::TERMINATION_STATUS_PROCESS_CRASHED, -1);
1062   EXPECT_TRUE(web_contents->IsCrashed());
1063 
1064   chrome::NavigateParams p(MakeNavigateParams());
1065   p.disposition = SINGLETON_TAB;
1066   p.url = singleton_url;
1067   p.window_action = chrome::NavigateParams::SHOW_WINDOW;
1068   p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
1069   ui_test_utils::NavigateToURL(&p);
1070 
1071   // The tab should not be sad anymore.
1072   EXPECT_FALSE(web_contents->IsCrashed());
1073 }
1074 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,NavigateFromDefaultToOptionsInSameTab)1075 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1076                        NavigateFromDefaultToOptionsInSameTab) {
1077   {
1078     content::WindowedNotificationObserver observer(
1079         content::NOTIFICATION_LOAD_STOP,
1080         content::NotificationService::AllSources());
1081     chrome::ShowSettings(browser());
1082     observer.Wait();
1083   }
1084   EXPECT_EQ(1, browser()->tab_strip_model()->count());
1085   EXPECT_EQ(GetSettingsURL(),
1086             ShortenUberURL(browser()->tab_strip_model()->
1087                 GetActiveWebContents()->GetURL()));
1088 }
1089 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,NavigateFromBlankToOptionsInSameTab)1090 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1091                        NavigateFromBlankToOptionsInSameTab) {
1092   chrome::NavigateParams p(MakeNavigateParams());
1093   p.url = GURL(url::kAboutBlankURL);
1094   ui_test_utils::NavigateToURL(&p);
1095 
1096   {
1097     content::WindowedNotificationObserver observer(
1098         content::NOTIFICATION_LOAD_STOP,
1099         content::NotificationService::AllSources());
1100     chrome::ShowSettings(browser());
1101     observer.Wait();
1102   }
1103   EXPECT_EQ(1, browser()->tab_strip_model()->count());
1104   EXPECT_EQ(GetSettingsURL(),
1105             ShortenUberURL(browser()->tab_strip_model()->
1106                 GetActiveWebContents()->GetURL()));
1107 }
1108 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,NavigateFromNTPToOptionsInSameTab)1109 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1110                        NavigateFromNTPToOptionsInSameTab) {
1111   chrome::NavigateParams p(MakeNavigateParams());
1112   p.url = GURL(chrome::kChromeUINewTabURL);
1113   ui_test_utils::NavigateToURL(&p);
1114   EXPECT_EQ(1, browser()->tab_strip_model()->count());
1115   EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
1116             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
1117 
1118   {
1119     content::WindowedNotificationObserver observer(
1120         content::NOTIFICATION_LOAD_STOP,
1121         content::NotificationService::AllSources());
1122     chrome::ShowSettings(browser());
1123     observer.Wait();
1124   }
1125   EXPECT_EQ(1, browser()->tab_strip_model()->count());
1126   EXPECT_EQ(GetSettingsURL(),
1127             ShortenUberURL(browser()->tab_strip_model()->
1128                 GetActiveWebContents()->GetURL()));
1129 }
1130 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,NavigateFromPageToOptionsInNewTab)1131 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1132                        NavigateFromPageToOptionsInNewTab) {
1133   chrome::NavigateParams p(MakeNavigateParams());
1134   ui_test_utils::NavigateToURL(&p);
1135   EXPECT_EQ(GetGoogleURL(),
1136             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
1137   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
1138   EXPECT_EQ(1, browser()->tab_strip_model()->count());
1139 
1140   {
1141     content::WindowedNotificationObserver observer(
1142         content::NOTIFICATION_LOAD_STOP,
1143         content::NotificationService::AllSources());
1144     chrome::ShowSettings(browser());
1145     observer.Wait();
1146   }
1147   EXPECT_EQ(2, browser()->tab_strip_model()->count());
1148   EXPECT_EQ(GetSettingsURL(),
1149             ShortenUberURL(browser()->tab_strip_model()->
1150                 GetActiveWebContents()->GetURL()));
1151 }
1152 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,NavigateFromNTPToOptionsSingleton)1153 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1154                        NavigateFromNTPToOptionsSingleton) {
1155   {
1156     content::WindowedNotificationObserver observer(
1157         content::NOTIFICATION_LOAD_STOP,
1158         content::NotificationService::AllSources());
1159     chrome::ShowSettings(browser());
1160     observer.Wait();
1161   }
1162   EXPECT_EQ(1, browser()->tab_strip_model()->count());
1163 
1164   chrome::NewTab(browser());
1165   EXPECT_EQ(2, browser()->tab_strip_model()->count());
1166 
1167   {
1168     content::WindowedNotificationObserver observer(
1169         content::NOTIFICATION_LOAD_STOP,
1170         content::NotificationService::AllSources());
1171     chrome::ShowSettings(browser());
1172     observer.Wait();
1173   }
1174   EXPECT_EQ(2, browser()->tab_strip_model()->count());
1175   EXPECT_EQ(GetSettingsURL(),
1176             ShortenUberURL(browser()->tab_strip_model()->
1177                 GetActiveWebContents()->GetURL()));
1178 }
1179 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,NavigateFromNTPToOptionsPageInSameTab)1180 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1181                        NavigateFromNTPToOptionsPageInSameTab) {
1182   {
1183     content::WindowedNotificationObserver observer(
1184         content::NOTIFICATION_LOAD_STOP,
1185         content::NotificationService::AllSources());
1186     chrome::ShowClearBrowsingDataDialog(browser());
1187     observer.Wait();
1188   }
1189   EXPECT_EQ(1, browser()->tab_strip_model()->count());
1190   EXPECT_EQ(GetClearBrowsingDataURL(),
1191             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
1192 
1193   chrome::NewTab(browser());
1194   EXPECT_EQ(2, browser()->tab_strip_model()->count());
1195 
1196   {
1197     content::WindowedNotificationObserver observer(
1198         content::NOTIFICATION_LOAD_STOP,
1199         content::NotificationService::AllSources());
1200     chrome::ShowClearBrowsingDataDialog(browser());
1201     observer.Wait();
1202   }
1203   EXPECT_EQ(2, browser()->tab_strip_model()->count());
1204   EXPECT_EQ(GetClearBrowsingDataURL(),
1205             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
1206 }
1207 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,NavigateFromOtherTabToSingletonOptions)1208 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1209                        NavigateFromOtherTabToSingletonOptions) {
1210   {
1211     content::WindowedNotificationObserver observer(
1212         content::NOTIFICATION_LOAD_STOP,
1213         content::NotificationService::AllSources());
1214     chrome::ShowSettings(browser());
1215     observer.Wait();
1216   }
1217   {
1218     content::WindowedNotificationObserver observer(
1219         content::NOTIFICATION_LOAD_STOP,
1220         content::NotificationService::AllSources());
1221     chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
1222                                   content::PAGE_TRANSITION_LINK);
1223     observer.Wait();
1224   }
1225 
1226   // This load should simply cause a tab switch.
1227   chrome::ShowSettings(browser());
1228 
1229   EXPECT_EQ(2, browser()->tab_strip_model()->count());
1230   EXPECT_EQ(GetSettingsURL(),
1231             ShortenUberURL(browser()->tab_strip_model()->
1232                 GetActiveWebContents()->GetURL()));
1233 }
1234 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,CloseSingletonTab)1235 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, CloseSingletonTab) {
1236   for (int i = 0; i < 2; ++i) {
1237     content::WindowedNotificationObserver observer(
1238         content::NOTIFICATION_LOAD_STOP,
1239         content::NotificationService::AllSources());
1240     chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
1241                                   content::PAGE_TRANSITION_TYPED);
1242     observer.Wait();
1243   }
1244 
1245   browser()->tab_strip_model()->ActivateTabAt(0, true);
1246 
1247   {
1248     content::WindowedNotificationObserver observer(
1249         content::NOTIFICATION_LOAD_STOP,
1250         content::NotificationService::AllSources());
1251     chrome::ShowSettings(browser());
1252     observer.Wait();
1253   }
1254 
1255   EXPECT_TRUE(browser()->tab_strip_model()->CloseWebContentsAt(
1256       2, TabStripModel::CLOSE_USER_GESTURE));
1257   EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
1258 }
1259 
1260 // TODO(csilv): Update this for uber page. http://crbug.com/111579.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,DISABLED_NavigateFromDefaultToHistoryInSameTab)1261 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1262                        DISABLED_NavigateFromDefaultToHistoryInSameTab) {
1263   {
1264     content::WindowedNotificationObserver observer(
1265         content::NOTIFICATION_LOAD_STOP,
1266         content::NotificationService::AllSources());
1267     chrome::ShowHistory(browser());
1268     observer.Wait();
1269   }
1270   EXPECT_EQ(1, browser()->tab_strip_model()->count());
1271   EXPECT_EQ(GURL(chrome::kChromeUIHistoryFrameURL),
1272             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
1273 }
1274 
1275 // TODO(linux_aura) http://crbug.com/163931
1276 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
1277 #define MAYBE_NavigateFromDefaultToBookmarksInSameTab DISABLED_NavigateFromDefaultToBookmarksInSameTab
1278 #else
1279 #define MAYBE_NavigateFromDefaultToBookmarksInSameTab NavigateFromDefaultToBookmarksInSameTab
1280 #endif
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,MAYBE_NavigateFromDefaultToBookmarksInSameTab)1281 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1282                        MAYBE_NavigateFromDefaultToBookmarksInSameTab) {
1283   {
1284     content::WindowedNotificationObserver observer(
1285         content::NOTIFICATION_LOAD_STOP,
1286         content::NotificationService::AllSources());
1287     chrome::ShowBookmarkManager(browser());
1288     observer.Wait();
1289   }
1290   EXPECT_EQ(1, browser()->tab_strip_model()->count());
1291   EXPECT_TRUE(StartsWithASCII(
1292       browser()->tab_strip_model()->GetActiveWebContents()->GetURL().spec(),
1293       chrome::kChromeUIBookmarksURL,
1294       true));
1295 }
1296 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,NavigateFromDefaultToDownloadsInSameTab)1297 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1298                        NavigateFromDefaultToDownloadsInSameTab) {
1299   {
1300     content::WindowedNotificationObserver observer(
1301         content::NOTIFICATION_LOAD_STOP,
1302         content::NotificationService::AllSources());
1303     chrome::ShowDownloads(browser());
1304     observer.Wait();
1305   }
1306   EXPECT_EQ(1, browser()->tab_strip_model()->count());
1307   EXPECT_EQ(GURL(chrome::kChromeUIDownloadsURL),
1308             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
1309 }
1310 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,NavigateWithoutBrowser)1311 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1312                        NavigateWithoutBrowser) {
1313   // First navigate using the profile of the existing browser window, and
1314   // check that the window is reused.
1315   chrome::NavigateParams params(browser()->profile(), GetGoogleURL(),
1316                                 content::PAGE_TRANSITION_LINK);
1317   ui_test_utils::NavigateToURL(&params);
1318   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
1319 
1320   // Now navigate using the incognito profile and check that a new window
1321   // is created.
1322   chrome::NavigateParams params_incognito(
1323       browser()->profile()->GetOffTheRecordProfile(),
1324       GetGoogleURL(), content::PAGE_TRANSITION_LINK);
1325   ui_test_utils::NavigateToURL(&params_incognito);
1326   EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
1327 }
1328 
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,ViewSourceIsntSingleton)1329 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, ViewSourceIsntSingleton) {
1330   const std::string viewsource_ntp_url =
1331       std::string(content::kViewSourceScheme) + ":" +
1332       chrome::kChromeUIVersionURL;
1333 
1334   chrome::NavigateParams viewsource_params(browser(),
1335                                            GURL(viewsource_ntp_url),
1336                                            content::PAGE_TRANSITION_LINK);
1337   ui_test_utils::NavigateToURL(&viewsource_params);
1338 
1339   chrome::NavigateParams singleton_params(browser(),
1340                                           GURL(chrome::kChromeUIVersionURL),
1341                                           content::PAGE_TRANSITION_LINK);
1342   singleton_params.disposition = SINGLETON_TAB;
1343   EXPECT_EQ(-1, chrome::GetIndexOfSingletonTab(&singleton_params));
1344 }
1345 
1346 // This test verifies that browser initiated navigations can send requests
1347 // using POST.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,SendBrowserInitiatedRequestUsingPOST)1348 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1349                        SendBrowserInitiatedRequestUsingPOST) {
1350   // Uses a test sever to verify POST request.
1351   ASSERT_TRUE(test_server()->Start());
1352 
1353   // Open a browser initiated POST request in new foreground tab.
1354   base::string16 expected_title(base::ASCIIToUTF16(kExpectedTitle));
1355   std::string post_data = kExpectedTitle;
1356   base::string16 title;
1357   ASSERT_TRUE(OpenPOSTURLInNewForegroundTabAndGetTitle(
1358       test_server()->GetURL(kEchoTitleCommand), post_data, true, &title));
1359   EXPECT_EQ(expected_title, title);
1360 }
1361 
1362 // This test verifies that renderer initiated navigations can NOT send requests
1363 // using POST.
IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,SendRendererInitiatedRequestUsingPOST)1364 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1365                        SendRendererInitiatedRequestUsingPOST) {
1366   // Uses a test sever to verify POST request.
1367   ASSERT_TRUE(test_server()->Start());
1368 
1369   // Open a renderer initiated POST request in new foreground tab.
1370   base::string16 expected_title(base::ASCIIToUTF16(kExpectedTitle));
1371   std::string post_data = kExpectedTitle;
1372   base::string16 title;
1373   ASSERT_TRUE(OpenPOSTURLInNewForegroundTabAndGetTitle(
1374       test_server()->GetURL(kEchoTitleCommand), post_data, false, &title));
1375   EXPECT_NE(expected_title, title);
1376 }
1377 
1378 }  // namespace
1379