13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef CHROME_BROWSER_APPS_APP_BROWSERTEST_UTIL_H_
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define CHROME_BROWSER_APPS_APP_BROWSERTEST_UTIL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/app_window/app_window.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base {
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandLine;
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class Browser;
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ExtensionTestMessageListener;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PlatformAppBrowserTest : public ExtensionApiTest {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PlatformAppBrowserTest();
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Gets the first app window that is found for a given browser.
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static AppWindow* GetFirstAppWindowForBrowser(Browser* browser);
338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the app named |name| out of the platform_apps subdirectory. Waits
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // for the provided listener to be satisifed.
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* LoadAndLaunchPlatformApp(
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const char* name,
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ExtensionTestMessageListener* listener);
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Runs the app named |name| out of the platform_apps subdirectory. Waits
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // until the given message is received from the app.
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* LoadAndLaunchPlatformApp(const char* name,
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                            const std::string& message);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Installs the app named |name| out of the platform_apps subdirectory.
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const Extension* InstallPlatformApp(const char* name);
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installs and runs the app named |name| out of the platform_apps
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // subdirectory. Waits until it is launched.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* InstallAndLaunchPlatformApp(const char* name);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Launch the given platform app.
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void LaunchPlatformApp(const Extension* extension);
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Gets the WebContents associated with the first app window that is found
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (most tests only deal with one platform app window, so this is good
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // enough).
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::WebContents* GetFirstAppWindowWebContents();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Gets the first app window that is found (most tests only deal with one
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // platform app window, so this is good enough).
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AppWindow* GetFirstAppWindow();
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Gets the first app window for an app.
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AppWindow* GetFirstAppWindowForApp(const std::string& app_id);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs chrome.windows.getAll for the given extension and returns the number
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of windows that the function returns.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t RunGetWindowsFunctionForExtension(const Extension* extension);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs chrome.windows.get(|window_id|) for the the given extension and
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns whether or not a window was found.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RunGetWindowFunctionForExtension(int window_id,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const Extension* extension);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns the number of app windows.
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t GetAppWindowCount();
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns the number of app windows for a specific app.
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t GetAppWindowCountForApp(const std::string& app_id);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The command line already has an argument on it - about:blank, which
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is set by InProcessBrowserTest::PrepareTestCommandLine. For platform app
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launch tests we need to clear this.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearCommandLineArgs();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets up the command line for running platform apps.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCommandLineArg(const std::string& test_file);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Creates an empty app window for |extension|.
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AppWindow* CreateAppWindow(const Extension* extension);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AppWindow* CreateAppWindowFromParams(const Extension* extension,
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       const AppWindow::CreateParams& params);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Closes |window| and waits until it's gone.
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void CloseAppWindow(AppWindow* window);
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Call AdjustBoundsToBeVisibleOnScreen of |window|.
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void CallAdjustBoundsToBeVisibleOnScreenForAppWindow(
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AppWindow* window,
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const gfx::Rect& cached_bounds,
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const gfx::Rect& cached_screen_bounds,
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const gfx::Rect& current_screen_bounds,
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const gfx::Size& minimum_size,
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      gfx::Rect* bounds);
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Load a simple test app and create a window. The window must be closed by
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // the caller in order to terminate the test - use CloseAppWindow().
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // |window_create_options| are the options that will be passed to
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // chrome.app.window.create() in the test app.
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AppWindow* CreateTestAppWindow(const std::string& window_create_options);
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PlatformAppBrowserTest);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExperimentalPlatformAppBrowserTest : public PlatformAppBrowserTest {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace extensions
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif  // CHROME_BROWSER_APPS_APP_BROWSERTEST_UTIL_H_
127