158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/stringprintf.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/win/windows_version.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/apps/app_browsertest_util.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/extension_test_message_listener.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/common/page_transition_types.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/browser_test_base.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h"
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace extensions {
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PlatformAppUrlRedirectorBrowserTest : public PlatformAppBrowserTest {
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE;
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Performs the following sequence:
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - installs the app |handler| (a relative path under the platform_apps
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // subdirectory);
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - navigates the current tab to the HTML page |lancher_page| (ditto);
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - then waits for |handler| to launch and send back a |handler_ack_message|;
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // - finally checks that the resulting app window count is as expected.
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The |launcher_page| is supposed to trigger a navigation matching one of the
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // url_handlers in the |handler|'s manifest, and thereby launch the |handler|.
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void TestNavigationInTab(const char* launcher_page,
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           const char* handler,
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           const char* handler_start_message);
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The same as above, but does not expect the |handler| to launch. Verifies
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // that it didn't, and that the navigation has opened in a new tab instead.
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void TestMismatchingNavigationInTab(const char* launcher_page,
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                      const char* success_tab_title,
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                      const char* handler);
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - installs the app |handler|;
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - opens the page |xhr_opening_page| in the current tab;
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - the page sends an XHR to a local resouce, whose URL matches one of the
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  //   url_handlers in |handler|;
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - waits until |xhr_opening_page| gets a response back and changes the tab's
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  //   title to a value indicating success/failure of the XHR;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // - verifies that no app windows have been opened, i.e. |handler| wasn't
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  //   launched even though its url_handlers match the URL.
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void TestNegativeXhrInTab(const char* xhr_opening_page,
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            const char* success_tab_title,
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            const char* failure_tab_title,
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            const char* handler);
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Performs the following sequence:
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - installs the app |handler| (a relative path under the platform_apps
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // subdirectory);
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - loads and launches the app |launcher| (ditto);
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - waits for the |launcher| to launch and send back a |launcher_ack_message|
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  //   (to make sure it's not the failing entity, if the test fails overall);
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - waits for the |handler| to launch and send back a |handler_ack_message|;
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // - finally checks that the resulting app window count is as expected.
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The |launcher| is supposed to trigger a navigation matching one of the
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // url_handlers in the |handler|'s manifest, and thereby launch the |handler|.
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void TestNavigationInApp(const char* launcher,
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           const char* launcher_done_message,
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           const char* handler,
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           const char* handler_start_message);
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The same as above, but does not expect the |handler| to launch. Verifies
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // that it didn't, and that the navigation has opened in a new tab instead.
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void TestMismatchingNavigationInApp(const char* launcher,
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                      const char* launcher_done_message,
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                      const char* handler);
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - installs the |handler| app;
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - loads and launches the |launcher| app;
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - waits until the |launcher| sends back a |launcher_done_message|;
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - the launcher performs a navigation to a URL that mismatches the
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  //   |handler|'s url_handlers;
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - verifies that the |handler| hasn't been launched as a result of the
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  //   navigation.
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void TestNegativeNavigationInApp(const char* launcher,
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   const char* launcher_done_message,
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   const char* handler);
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - installs the app |handler|;
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - navigates the current tab to the HTML page |matching_target_page| with
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  //   page transition |transition|;
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // - waits for |handler| to launch and send back a |handler_start_message|;
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // - finally checks that the resulting app window count is as expected.
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void TestNavigationInBrowser(const char* matching_target_page,
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                               content::PageTransition transition,
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                               const char* handler,
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                               const char* handler_start_message);
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Same as above, but does not expect |handler| to launch. This is used, e.g.
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // for form submissions, where the URL would normally match the url_handlers
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // but should not launch it.
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void TestNegativeNavigationInBrowser(const char* matching_target_page,
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       content::PageTransition transition,
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                       const char* success_tab_title,
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       const char* handler);
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Same as above, but expects the |mismatching_target_page| should not match
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // any of the |handler|'s url_handlers, and therefor not launch the app.
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void TestMismatchingNavigationInBrowser(const char* mismatching_target_page,
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                          content::PageTransition transition,
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                          const char* success_tab_title,
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                          const char* handler);
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PlatformAppUrlRedirectorBrowserTest::SetUpCommandLine(
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    CommandLine* command_line) {
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PlatformAppBrowserTest::SetUpCommandLine(command_line);
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  command_line->AppendSwitch(::switches::kDisablePopupBlocking);
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  command_line->AppendSwitchASCII(::switches::kPrerenderMode,
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  ::switches::kPrerenderModeSwitchValueEnabled);
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(sergeygs): Factor out common functionality from TestXyz,
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TestNegativeXyz, and TestMismatchingXyz versions.
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(sergeys): Return testing::AssertionErrors from these methods to
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// preserve line numbers and (if applicable) failure messages.
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PlatformAppUrlRedirectorBrowserTest::TestNavigationInTab(
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* launcher_page,
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler,
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler_start_message) {
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  InstallPlatformApp(handler);
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ExtensionTestMessageListener handler_listener(handler_start_message, false);
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser(),
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      embedded_test_server()->GetURL(base::StringPrintf(
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          "/extensions/platform_apps/%s", launcher_page)),
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CURRENT_TAB,
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(handler_listener.WaitUntilSatisfied());
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1U, GetAppWindowCount());
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PlatformAppUrlRedirectorBrowserTest::TestMismatchingNavigationInTab(
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* launcher_page,
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* success_tab_title,
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler) {
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  InstallPlatformApp(handler);
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 success_title = base::ASCIIToUTF16(success_tab_title);
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::WebContents* tab =
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::TitleWatcher title_watcher(tab, success_title);
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser(),
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      embedded_test_server()->GetURL(base::StringPrintf(
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          "/extensions/platform_apps/%s", launcher_page)),
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CURRENT_TAB,
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(success_title, title_watcher.WaitAndGetTitle());
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0U, GetAppWindowCount());
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PlatformAppUrlRedirectorBrowserTest::TestNegativeXhrInTab(
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* launcher_page,
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* success_tab_title,
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* failure_tab_title,
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler) {
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  InstallPlatformApp(handler);
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 success_title = base::ASCIIToUTF16(success_tab_title);
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 failure_title = base::ASCIIToUTF16(failure_tab_title);
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::WebContents* tab =
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::TitleWatcher title_watcher(tab, success_title);
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  title_watcher.AlsoWaitForTitle(failure_title);
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser(),
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      embedded_test_server()->GetURL(base::StringPrintf(
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          "/extensions/platform_apps/%s", launcher_page)),
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CURRENT_TAB,
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(success_title, title_watcher.WaitAndGetTitle());
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0U, GetAppWindowCount());
20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PlatformAppUrlRedirectorBrowserTest::TestNavigationInApp(
20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* launcher,
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* launcher_done_message,
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler,
20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler_start_message) {
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  InstallPlatformApp(handler);
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ExtensionTestMessageListener handler_listener(handler_start_message, false);
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp(launcher, launcher_done_message);
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(handler_listener.WaitUntilSatisfied());
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(2U, GetAppWindowCount());
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PlatformAppUrlRedirectorBrowserTest::TestNegativeNavigationInApp(
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* launcher,
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* launcher_done_message,
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler) {
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  InstallPlatformApp(handler);
23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::WindowedNotificationObserver observer(
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content::Source<content::WebContentsDelegate>(browser()));
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp(launcher, launcher_done_message);
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  observer.Wait();
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1U, GetAppWindowCount());
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PlatformAppUrlRedirectorBrowserTest::TestMismatchingNavigationInApp(
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* launcher,
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* launcher_done_message,
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler) {
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  InstallPlatformApp(handler);
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::WindowedNotificationObserver observer(
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content::Source<content::WebContentsDelegate>(browser()));
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp(launcher, launcher_done_message);
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  observer.Wait();
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1U, GetAppWindowCount());
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PlatformAppUrlRedirectorBrowserTest::TestNavigationInBrowser(
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* matching_target_page,
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    content::PageTransition transition,
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler,
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler_start_message) {
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  InstallPlatformApp(handler);
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ExtensionTestMessageListener handler_listener(handler_start_message, false);
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  chrome::NavigateParams params(
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser(),
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      embedded_test_server()->GetURL(base::StringPrintf(
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)           "/extensions/platform_apps/%s", matching_target_page)),
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      transition);
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui_test_utils::NavigateToURL(&params);
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(handler_listener.WaitUntilSatisfied());
28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1U, GetAppWindowCount());
28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PlatformAppUrlRedirectorBrowserTest::TestNegativeNavigationInBrowser(
28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* matching_target_page,
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    content::PageTransition transition,
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const char* success_tab_title,
28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler) {
28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  InstallPlatformApp(handler);
29258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 success_title = base::ASCIIToUTF16(success_tab_title);
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  content::WebContents* tab =
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  content::TitleWatcher title_watcher(tab, success_title);
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  chrome::NavigateParams params(
29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser(),
30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      embedded_test_server()->GetURL(base::StringPrintf(
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)           "/extensions/platform_apps/%s", matching_target_page)),
30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      transition);
30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui_test_utils::NavigateToURL(&params);
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(success_title, title_watcher.WaitAndGetTitle());
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0U, GetAppWindowCount());
30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PlatformAppUrlRedirectorBrowserTest::TestMismatchingNavigationInBrowser(
31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* mismatching_target_page,
31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    content::PageTransition transition,
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const char* success_tab_title,
31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const char* handler) {
3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestNegativeNavigationInBrowser(
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mismatching_target_page, transition, success_tab_title, handler);
31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a click on a regular link in a tab launches an app that has
31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// matching url_handlers.
32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       ClickInTabIntercepted) {
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestNavigationInTab(
32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/launching_pages/click_link.html",
32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/simple",
32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Handler launched");
32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a click on a target='_blank' link in a tab launches an app that has
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// matching url_handlers.
33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       BlankClickInTabIntercepted) {
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestNavigationInTab(
33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/launching_pages/click_blank_link.html",
34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/simple",
34158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Handler launched");
34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a call to window.open() in a tab launches an app that has
34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// matching url_handlers.
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       WindowOpenInTabIntercepted) {
3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestNavigationInTab(
35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/launching_pages/call_window_open.html",
35358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/simple",
35458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Handler launched");
35558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a click on a regular link in a tab launches an app that has
35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// matching url_handlers.
35958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       MismatchingClickInTabNotIntercepted) {
3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestMismatchingNavigationInTab(
36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/launching_pages/click_mismatching_link.html",
36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Mismatching link target loaded",
36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/simple");
36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a click on target='_blank' link in an app's window launches
37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// another app that has matching url_handlers.
37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       BlankClickInAppIntercepted) {
3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestNavigationInApp(
37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/launchers/click_blank_link",
37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Launcher done",
38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/simple",
38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Handler launched");
38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a call to window.open() in the app's foreground page launches
38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// another app that has matching url_handlers.
38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       WindowOpenInAppIntercepted) {
3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
39158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestNavigationInApp(
39258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/launchers/call_window_open",
39358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Launcher done",
39458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/simple",
39558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Handler launched");
39658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that an app with url_handlers does not intercept a mismatching
39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// click on a target='_blank' link in another app's window.
40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       MismatchingWindowOpenInAppNotIntercepted) {
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestMismatchingNavigationInApp(
40658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/launchers/call_mismatching_window_open",
40758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Launcher done",
40858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/simple");
40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a webview in an app can be navigated to a URL without interception
41258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// even when there are other (or the same) apps that have matching url_handlers.
41358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
41458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       WebviewNavigationNotIntercepted) {
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The launcher clicks on a link, which gets intercepted and launches the
41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // handler. The handler also redirects an embedded webview to the URL. The
42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // webview should just navigate without creating an endless loop of
42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // navigate-intercept-launch sequences with multiplying handler's windows.
42258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // There should be 2 windows only: launcher's and handler's.
42358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestNavigationInApp(
42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/launchers/click_blank_link",
42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Launcher done",
42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/navigate_webview_to_url",
42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Handler launched");
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
43058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a webview in an app can be navigated to a URL without interception
43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// even when there are other (or the same) apps that have matching url_handlers.
43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
43358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       MismatchingBlankClickInAppNotIntercepted) {
4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The launcher clicks on a link, which gets intercepted and launches the
43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // handler. The handler also redirects an embedded webview to the URL. The
43958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // webview should just navigate without creating an endless loop of
44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // navigate-intercept-launch sequences with multiplying handler's windows.
44158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // There should be 2 windows only: launcher's and handler's.
44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestMismatchingNavigationInApp(
44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/launchers/click_mismatching_blank_link",
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Launcher done",
44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/simple");
44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a URL entry in the omnibar launches an app that has matching
44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// url_handlers.
45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       EntryInOmnibarIntercepted) {
4524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestNavigationInBrowser(
45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/common/target.html",
45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content::PAGE_TRANSITION_TYPED,
45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/simple",
45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Handler launched");
46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that an app with url_handlers does not intercept a mismatching
46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// URL entry in the omnibar.
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       MismatchingEntryInOmnibarNotIntercepted) {
4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestMismatchingNavigationInBrowser(
47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/common/mismatching_target.html",
47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content::PAGE_TRANSITION_TYPED,
4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      "Mismatching link target loaded",
47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/simple");
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a form submission in a page is never subject to interception
47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// by apps even with matching url_handlers.
47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
4794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       FormSubmissionInTabNotIntercepted) {
4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
4814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestMismatchingNavigationInTab(
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      "url_handlers/launching_pages/submit_form.html",
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      "Link target loaded",
48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/simple");
48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
48958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a form submission in a page is never subject to interception
49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// by apps even with matching url_handlers.
49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       XhrInTabNotIntercepted) {
4934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined (OS_WIN)
4944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestNegativeXhrInTab(
49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/xhr_downloader/main.html",
49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "XHR succeeded",
49958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "XHR failed",
50058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "url_handlers/handlers/steal_xhr_target");
50158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that a click on a prerendered link still launches.
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       PrerenderedClickInTabIntercepted) {
506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined (OS_WIN)
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestNavigationInTab(
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "url_handlers/launching_pages/prerender_link.html",
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "url_handlers/handlers/simple",
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "Handler launched");
513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace extensions
516