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)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "apps/app_window.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "apps/app_window_registry.h"
74ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "apps/common/api/app_runtime.h"
8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "apps/launcher.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "apps/ui/native_app_window.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/command_line.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/file_util.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stl_util.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/apps/app_browsertest_util.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/permissions/permissions_api.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/component_loader.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_test_message_listener.h"
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/extensions/application_launch.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/pref_names.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h"
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h"
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_prefs.h"
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/pref_names.h"
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h"
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS)
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/mock_user_manager.h"
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/user_manager.h"
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chromeos/dbus/fake_dbus_thread_manager.h"
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/dbus/fake_power_manager_client.h"
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using apps::AppWindow;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using apps::AppWindowRegistry;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::WebContentsModalDialogManager;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochnamespace app_runtime = apps::api::app_runtime;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochnamespace extensions {
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Non-abstract RenderViewContextMenu class.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PlatformAppContextMenu : public RenderViewContextMenu {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PlatformAppContextMenu(content::RenderFrameHost* render_frame_host,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const content::ContextMenuParams& params)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : RenderViewContextMenu(render_frame_host, params) {}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasCommandWithId(int command_id) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return menu_model_.GetIndexOfCommandId(command_id) != -1;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderViewContextMenu implementation.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetAcceleratorForCommandId(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int command_id,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator* accelerator) OVERRIDE {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PlatformInit() OVERRIDE {}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PlatformCancel() OVERRIDE {}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class keeps track of tabs as they are added to the browser. It will be
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "done" (i.e. won't block on Wait()) once |observations| tabs have been added.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TabsAddedNotificationObserver
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::WindowedNotificationObserver {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TabsAddedNotificationObserver(size_t observations)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : content::WindowedNotificationObserver(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            chrome::NOTIFICATION_TAB_ADDED,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            content::NotificationService::AllSources()),
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        observations_(observations) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observed_tabs_.push_back(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Details<WebContents>(details).ptr());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (observed_tabs_.size() == observations_)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::WindowedNotificationObserver::Observe(type, source, details);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<content::WebContents*>& tabs() { return observed_tabs_; }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t observations_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<content::WebContents*> observed_tabs_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TabsAddedNotificationObserver);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class ScopedPreviewTestingDelegate : PrintPreviewUI::TestingDelegate {
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  explicit ScopedPreviewTestingDelegate(bool auto_cancel)
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : auto_cancel_(auto_cancel),
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        total_page_count_(1),
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        rendered_page_count_(0) {
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PrintPreviewUI::SetDelegateForTesting(this);
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ~ScopedPreviewTestingDelegate() {
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PrintPreviewUI::SetDelegateForTesting(NULL);
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // PrintPreviewUI::TestingDelegate implementation.
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool IsAutoCancelEnabled() OVERRIDE {
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return auto_cancel_;
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // PrintPreviewUI::TestingDelegate implementation.
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidGetPreviewPageCount(int page_count) OVERRIDE {
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    total_page_count_ = page_count;
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // PrintPreviewUI::TestingDelegate implementation.
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void DidRenderPreviewPage(content::WebContents* preview_dialog)
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      OVERRIDE {
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    dialog_size_ = preview_dialog->GetContainerBounds().size();
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ++rendered_page_count_;
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CHECK(rendered_page_count_ <= total_page_count_);
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (waiting_runner_ && rendered_page_count_ == total_page_count_) {
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      waiting_runner_->Quit();
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void WaitUntilPreviewIsReady() {
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CHECK(!waiting_runner_);
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (rendered_page_count_ < total_page_count_) {
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      waiting_runner_ = new content::MessageLoopRunner;
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      waiting_runner_->Run();
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      waiting_runner_ = NULL;
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size dialog_size() {
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return dialog_size_;
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool auto_cancel_;
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int total_page_count_;
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int rendered_page_count_;
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> waiting_runner_;
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size dialog_size_;
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(OS_CHROMEOS) && !defined(OS_WIN)
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool CopyTestDataAndSetCommandLineArg(
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& test_data_file,
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& temp_dir,
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const char* filename) {
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath path = temp_dir.AppendASCII(
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      filename).NormalizePathSeparators();
1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!(base::CopyFile(test_data_file, path)))
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  command_line->AppendArgPath(path);
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // !defined(OS_CHROMEOS) && !defined(OS_WIN)
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if !defined(OS_CHROMEOS)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestFilePath[] = "platform_apps/launch_files/test.txt";
1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests that CreateAppWindow doesn't crash if you close it straight away.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LauncherPlatformAppBrowserTest relies on this behaviour, but is only run for
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ash, so we test that it works here.
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, CreateAndCloseAppWindow) {
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = LoadAndLaunchPlatformApp("minimal", "Launched");
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AppWindow* window = CreateAppWindow(extension);
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CloseAppWindow(window);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that platform apps received the "launch" event when launched.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, OnLaunchedEvent) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch")) << message_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that platform apps cannot use certain disabled window properties, but
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// can override them and then use them.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, DisabledWindowProperties) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/disabled_window_properties"))
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, EmptyContextMenu) {
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp("minimal", "Launched");
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The empty app doesn't add any context menu items, so its menu should
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only include the developer tools.
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebContents* web_contents = GetFirstAppWindowWebContents();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(web_contents);
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::ContextMenuParams params;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PlatformAppContextMenu> menu;
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  menu.reset(new PlatformAppContextMenu(web_contents->GetMainFrame(), params));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu->Init();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_INSPECTELEMENT));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      menu->HasCommandWithId(IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_BACK));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_SAVE_PAGE));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, AppWithContextMenu) {
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp("context_menu", "Launched");
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The context_menu app has two context menu items. These, along with a
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // separator and the developer tools, is all that should be in the menu.
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebContents* web_contents = GetFirstAppWindowWebContents();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(web_contents);
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::ContextMenuParams params;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PlatformAppContextMenu> menu;
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  menu.reset(new PlatformAppContextMenu(web_contents->GetMainFrame(), params));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu->Init();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST + 1));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_INSPECTELEMENT));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      menu->HasCommandWithId(IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_BACK));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_SAVE_PAGE));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_UNDO));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, InstalledAppWithContextMenu) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener launched_listener("Launched", false);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallAndLaunchPlatformApp("context_menu");
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the extension to tell us it's initialized its context menus and
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launched a window.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The context_menu app has two context menu items. For an installed app
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // these are all that should be in the menu.
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebContents* web_contents = GetFirstAppWindowWebContents();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(web_contents);
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::ContextMenuParams params;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PlatformAppContextMenu> menu;
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  menu.reset(new PlatformAppContextMenu(web_contents->GetMainFrame(), params));
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu->Init();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST + 1));
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_INSPECTELEMENT));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      menu->HasCommandWithId(IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_BACK));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_SAVE_PAGE));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_UNDO));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, AppWithContextMenuTextField) {
288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp("context_menu", "Launched");
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The context_menu app has one context menu item. This, along with a
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // separator and the developer tools, is all that should be in the menu.
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebContents* web_contents = GetFirstAppWindowWebContents();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(web_contents);
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::ContextMenuParams params;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.is_editable = true;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PlatformAppContextMenu> menu;
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  menu.reset(new PlatformAppContextMenu(web_contents->GetMainFrame(), params));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu->Init();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_INSPECTELEMENT));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      menu->HasCommandWithId(IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_UNDO));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_COPY));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_BACK));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_SAVE_PAGE));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, AppWithContextMenuSelection) {
311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp("context_menu", "Launched");
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The context_menu app has one context menu item. This, along with a
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // separator and the developer tools, is all that should be in the menu.
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebContents* web_contents = GetFirstAppWindowWebContents();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(web_contents);
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::ContextMenuParams params;
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  params.selection_text = base::ASCIIToUTF16("Hello World");
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PlatformAppContextMenu> menu;
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  menu.reset(new PlatformAppContextMenu(web_contents->GetMainFrame(), params));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu->Init();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_INSPECTELEMENT));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      menu->HasCommandWithId(IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_UNDO));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_CONTENT_CONTEXT_COPY));
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_BACK));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->HasCommandWithId(IDC_SAVE_PAGE));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, AppWithContextMenuClicked) {
334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp("context_menu_click", "Launched");
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that the menu item shows up
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebContents* web_contents = GetFirstAppWindowWebContents();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(web_contents);
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::ContextMenuParams params;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.page_url = GURL("http://foo.bar");
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PlatformAppContextMenu> menu;
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  menu.reset(new PlatformAppContextMenu(web_contents->GetMainFrame(), params));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu->Init();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->HasCommandWithId(IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Execute the menu item
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener onclicked_listener("onClicked fired for id1",
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  false);
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  menu->ExecuteCommand(IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST, 0);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(onclicked_listener.WaitUntilSatisfied());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_DisallowNavigation DISABLED_DisallowNavigation
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_DisallowNavigation DisallowNavigation
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MAYBE_DisallowNavigation) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabsAddedNotificationObserver observer(2);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/navigation")) << message_;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, observer.tabs().size());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(chrome::kExtensionInvalidRequestURL),
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            observer.tabs()[0]->GetURL().spec());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://chromium.org/",
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            observer.tabs()[1]->GetURL().spec());
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Failing on some Win and Linux buildbots.  See crbug.com/354425.
376e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#if (defined(OS_WIN) || defined(OS_LINUX)) && defined(ARCH_CPU_X86)
377e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#define MAYBE_Iframes DISABLED_Iframes
378e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#else
379e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#define MAYBE_Iframes Iframes
380e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif
381e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochIN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MAYBE_Iframes) {
382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/iframes")) << message_;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that localStorage and WebSQL are disabled for platform apps.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, DisallowStorage) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/storage")) << message_;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, Restrictions) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/restrictions")) << message_;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that extensions can't use platform-app-only APIs.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, PlatformAppsOnly) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTestIgnoreManifestWarnings(
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "platform_apps/apps_only")) << message_;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that platform apps have isolated storage by default.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, Isolation) {
403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a (non-app) page under the "localhost" origin that sets a cookie.
406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GURL set_cookie_url = embedded_test_server()->GetURL(
407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "/extensions/platform_apps/isolation/set_cookie.html");
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL::Replacements replace_host;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host_str("localhost");  // Must stay in scope with replace_host.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  replace_host.SetHostStr(host_str);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_cookie_url = set_cookie_url.ReplaceComponents(replace_host);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), set_cookie_url,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the cookie is set.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cookie_size;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string cookie_value;
420e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ui_test_utils::GetCookies(
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set_cookie_url,
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetWebContentsAt(0),
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_size,
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_value);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("testCookie=1", cookie_value);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let the platform app request the same URL, and make sure that it doesn't
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // see the cookie.
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/isolation")) << message_;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// See crbug.com/248441
433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_WIN)
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_ExtensionWindowingApis DISABLED_ExtensionWindowingApis
435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_ExtensionWindowingApis ExtensionWindowingApis
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MAYBE_ExtensionWindowingApis) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initially there should be just the one browser window visible to the
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extensions API.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = LoadExtension(
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("common/background_page"));
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, RunGetWindowsFunctionForExtension(extension));
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // And no app windows.
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0U, GetAppWindowCount());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launch a platform app that shows a window.
450f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp("minimal", "Launched");
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1U, GetAppWindowCount());
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int app_window_id = GetFirstAppWindow()->session_id().id();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But it's not visible to the extensions API, it still thinks there's just
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one browser window.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, RunGetWindowsFunctionForExtension(extension));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It can't look it up by ID either
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(RunGetWindowFunctionForExtension(app_window_id, extension));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The app can also only see one window (its own).
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(jeremya): add an extension function to get an app window by ID, and
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // to get a list of all the app windows, so we can test this.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launch another platform app that also shows a window.
465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp("context_menu", "Launched");
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // There are two total app windows, but each app can only see its own.
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(2U, GetAppWindowCount());
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jeremya): as above, this requires more extension functions.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChromeOS does not support passing arguments on the command line, so the tests
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that rely on this functionality are disabled.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that command line parameters get passed through to platform apps
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// via launchData correctly when launching with a file.
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(benwells/jeremya): tests need a way to specify a handler ID.
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithFile) {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCommandLineArg(kTestFilePath);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_file"))
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that relative paths can be passed through to the platform app.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test doesn't use the normal test infrastructure as it needs to open
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the application differently to all other platform app tests, by setting
4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// the AppLaunchParams.current_directory field.
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithRelativeFile) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup the command line
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommandLineArgs();
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_test_doc =
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe(kTestFilePath);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  relative_test_doc = relative_test_doc.NormalizePathSeparators();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line->AppendArgPath(relative_test_doc);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the extension
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = LoadExtension(
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("platform_apps/launch_file"));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the test
504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AppLaunchParams params(
505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      browser()->profile(), extension, LAUNCH_CONTAINER_NONE, NEW_WINDOW);
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  params.command_line = *CommandLine::ForCurrentProcess();
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.current_directory = test_data_dir_;
5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  OpenApplication(params);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!catcher.GetNextResult()) {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_ = catcher.message();
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(0);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that launch data is sent through if the file extension matches.
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithFileExtension) {
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetCommandLineArg(kTestFilePath);
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_file_by_extension"))
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      << message_;
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Tests that launch data is sent through to a whitelisted extension if the file
524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// extension matches.
525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       LaunchWhiteListedExtensionWithFile) {
527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetCommandLineArg(kTestFilePath);
528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest(
529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "platform_apps/launch_whitelisted_ext_with_file"))
530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          << message_;
531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_LaunchWithFileExtensionAndMimeType DISABLED_LaunchWithFileExtensionAndMimeType
536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_LaunchWithFileExtensionAndMimeType LaunchWithFileExtensionAndMimeType
538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that launch data is sent through if the file extension and MIME type
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// both match.
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       MAYBE_LaunchWithFileExtensionAndMimeType) {
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetCommandLineArg(kTestFilePath);
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest(
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "platform_apps/launch_file_by_extension_and_type")) << message_;
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that launch data is sent through for a file with no extension if a
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// handler accepts "".
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithFileWithoutExtension) {
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetCommandLineArg("platform_apps/launch_files/test");
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_file_with_no_extension"))
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      << message_;
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_WIN)
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that launch data is sent through for a file with an empty extension if
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// a handler accepts "".
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithFileEmptyExtension) {
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ScopedTempDir temp_dir;
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ClearCommandLineArgs();
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(CopyTestDataAndSetCommandLineArg(
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_data_dir_.AppendASCII(kTestFilePath),
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      temp_dir.path(),
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "test."));
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_file_with_no_extension"))
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      << message_;
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that launch data is sent through for a file with an empty extension if
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// a handler accepts *.
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       LaunchWithFileEmptyExtensionAcceptAny) {
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ScopedTempDir temp_dir;
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ClearCommandLineArgs();
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(CopyTestDataAndSetCommandLineArg(
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_data_dir_.AppendASCII(kTestFilePath),
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      temp_dir.path(),
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "test."));
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest(
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "platform_apps/launch_file_with_any_extension")) << message_;
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that launch data is sent through for a file with no extension if a
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// handler accepts *.
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       LaunchWithFileWithoutExtensionAcceptAny) {
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetCommandLineArg("platform_apps/launch_files/test");
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest(
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "platform_apps/launch_file_with_any_extension")) << message_;
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that launch data is sent through for a file with an extension if a
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// handler accepts *.
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       LaunchWithFileAcceptAnyExtension) {
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetCommandLineArg(kTestFilePath);
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest(
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "platform_apps/launch_file_with_any_extension")) << message_;
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that no launch data is sent through if the file has the wrong
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// extension.
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithWrongExtension) {
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetCommandLineArg(kTestFilePath);
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_wrong_extension"))
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      << message_;
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that no launch data is sent through if the file has no extension but
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the handler requires a specific extension.
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithWrongEmptyExtension) {
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetCommandLineArg("platform_apps/launch_files/test");
618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_wrong_extension"))
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      << message_;
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that no launch data is sent through if the file is of the wrong MIME
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithWrongType) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCommandLineArg(kTestFilePath);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_wrong_type"))
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that no launch data is sent through if the platform app does not
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provide an intent.
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithNoIntent) {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCommandLineArg(kTestFilePath);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_no_intent"))
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that launch data is sent through when the file has unknown extension
6390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// but the MIME type can be sniffed and the sniffed type matches.
6400529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithSniffableType) {
6410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetCommandLineArg("platform_apps/launch_files/test.unknownextension");
6420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(RunPlatformAppTest(
6430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      "platform_apps/launch_file_by_extension_and_type")) << message_;
6440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
6450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that launch data is sent through with the MIME type set to
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// application/octet-stream if the file MIME type cannot be read.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchNoType) {
6490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetCommandLineArg("platform_apps/launch_files/test_binary.unknownextension");
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest(
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "platform_apps/launch_application_octet_stream")) << message_;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that no launch data is sent through if the file does not exist.
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchNoFile) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCommandLineArg("platform_apps/launch_files/doesnotexist.txt");
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_invalid"))
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that no launch data is sent through if the argument is a directory.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithDirectory) {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCommandLineArg("platform_apps/launch_files");
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_invalid"))
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that no launch data is sent through if there are no arguments passed
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on the command line
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchWithNothing) {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommandLineArgs();
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_nothing"))
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that platform apps can use the chrome.fileSystem.getDisplayPath
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function to get the native file system path of a file they are launched with.
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, GetDisplayPath) {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCommandLineArg(kTestFilePath);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/get_display_path"))
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
684424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Tests that the file is created if the file does not exist and the app has the
685424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// fileSystem.write permission.
686424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchNewFile) {
687424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::ScopedTempDir temp_dir;
688424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
689424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ClearCommandLineArgs();
690424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
691424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  command_line->AppendArgPath(temp_dir.path().AppendASCII("new_file.txt"));
692424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch_new_file")) << message_;
693424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
694424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
695424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, OpenLink) {
698eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<content::WebContentsDelegate>(browser()));
702f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp("open_link", "Launched");
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MutationEventsDisabled) {
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/mutation_events")) << message_;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
711b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// This appears to be unreliable on linux.
712b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// TODO(stevenjb): Investigate and enable
713b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(OS_LINUX) && !defined(USE_ASH)
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_AppWindowRestoreState DISABLED_AppWindowRestoreState
715b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#else
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_AppWindowRestoreState AppWindowRestoreState
717b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MAYBE_AppWindowRestoreState) {
719b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/restore_state"));
720b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
721b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       AppWindowAdjustBoundsToBeVisibleOnScreen) {
724f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = LoadAndLaunchPlatformApp("minimal", "Launched");
72546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AppWindow* window = CreateAppWindow(extension);
727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
728eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The screen bounds didn't change, the cached bounds didn't need to adjust.
729eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect cached_bounds(80, 100, 400, 400);
730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect cached_screen_bounds(0, 0, 1600, 900);
731eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect current_screen_bounds(0, 0, 1600, 900);
732eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Size minimum_size(200, 200);
733eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect bounds;
7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CallAdjustBoundsToBeVisibleOnScreenForAppWindow(window,
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  cached_bounds,
7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  cached_screen_bounds,
7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  current_screen_bounds,
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  minimum_size,
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  &bounds);
740eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(bounds, cached_bounds);
741eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
742eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We have an empty screen bounds, the cached bounds didn't need to adjust.
743eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect empty_screen_bounds;
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CallAdjustBoundsToBeVisibleOnScreenForAppWindow(window,
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  cached_bounds,
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  empty_screen_bounds,
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  current_screen_bounds,
7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  minimum_size,
7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  &bounds);
750eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(bounds, cached_bounds);
751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
752eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Cached bounds is completely off the new screen bounds in horizontal
753eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // locations. Expect to reposition the bounds.
754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect horizontal_out_of_screen_bounds(-800, 100, 400, 400);
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CallAdjustBoundsToBeVisibleOnScreenForAppWindow(
756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      window,
757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      horizontal_out_of_screen_bounds,
758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      gfx::Rect(-1366, 0, 1600, 900),
759eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      current_screen_bounds,
760eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      minimum_size,
761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &bounds);
762eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(bounds, gfx::Rect(0, 100, 400, 400));
763eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
764eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Cached bounds is completely off the new screen bounds in vertical
765eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // locations. Expect to reposition the bounds.
766eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect vertical_out_of_screen_bounds(10, 1000, 400, 400);
7675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CallAdjustBoundsToBeVisibleOnScreenForAppWindow(
768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      window,
769eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      vertical_out_of_screen_bounds,
770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      gfx::Rect(-1366, 0, 1600, 900),
771eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      current_screen_bounds,
772eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      minimum_size,
773eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &bounds);
774eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(bounds, gfx::Rect(10, 500, 400, 400));
775eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
776eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // From a large screen resulotion to a small one. Expect it fit on screen.
777eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect big_cache_bounds(10, 10, 1000, 1000);
7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CallAdjustBoundsToBeVisibleOnScreenForAppWindow(window,
7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  big_cache_bounds,
7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  gfx::Rect(0, 0, 1600, 1000),
7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  gfx::Rect(0, 0, 800, 600),
7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  minimum_size,
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  &bounds);
784eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(bounds, gfx::Rect(0, 0, 800, 600));
785eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Don't resize the bounds smaller than minimum size, when the minimum size is
787eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // larger than the screen.
7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CallAdjustBoundsToBeVisibleOnScreenForAppWindow(window,
7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  big_cache_bounds,
7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  gfx::Rect(0, 0, 1600, 1000),
7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  gfx::Rect(0, 0, 800, 600),
7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  gfx::Size(900, 900),
7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  &bounds);
794eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(bounds, gfx::Rect(0, 0, 900, 900));
795eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
796eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PlatformAppDevToolsBrowserTest : public PlatformAppBrowserTest {
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum TestFlags {
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RELAUNCH = 0x1,
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HAS_ID = 0x2,
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Runs a test inside a harness that opens DevTools on an app window.
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTestWithDevTools(const char* name, int test_flags);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PlatformAppDevToolsBrowserTest::RunTestWithDevTools(
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* name, int test_flags) {
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using content::DevToolsAgentHost;
812f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = LoadAndLaunchPlatformApp(name, "Launched");
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AppWindow* window = GetFirstAppWindow();
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(window);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window->window_key().empty(), (test_flags & HAS_ID) == 0);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* rvh = window->web_contents()->GetRenderViewHost();
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(rvh);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ensure no DevTools open for the AppWindow, then open one.
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(DevToolsAgentHost::HasFor(rvh));
8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DevToolsWindow::OpenDevToolsWindow(rvh);
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(DevToolsAgentHost::HasFor(rvh));
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test_flags & RELAUNCH) {
8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Close the AppWindow, and ensure it is gone.
8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CloseAppWindow(window);
8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_FALSE(GetFirstAppWindow());
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Relaunch the app and get a new AppWindow.
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver app_loaded_observer(
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
834a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OpenApplication(AppLaunchParams(
835a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        browser()->profile(), extension, LAUNCH_CONTAINER_NONE, NEW_WINDOW));
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    app_loaded_observer.Wait();
8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window = GetFirstAppWindow();
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(window);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // DevTools should have reopened with the relaunch.
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvh = window->web_contents()->GetRenderViewHost();
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(rvh);
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(DevToolsAgentHost::HasFor(rvh));
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
849868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// http://crbug.com/246634
850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_CHROMEOS)
851868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_ReOpenedWithID DISABLED_ReOpenedWithID
852868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else
853868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_ReOpenedWithID ReOpenedWithID
854868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
855868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppDevToolsBrowserTest, MAYBE_ReOpenedWithID) {
856ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
857a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
858a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
859ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
860ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestWithDevTools("minimal_id", RELAUNCH | HAS_ID);
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
864868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// http://crbug.com/246999
8657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_CHROMEOS) || defined(OS_WIN)
866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_ReOpenedWithURL DISABLED_ReOpenedWithURL
867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else
868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_ReOpenedWithURL ReOpenedWithURL
869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppDevToolsBrowserTest, MAYBE_ReOpenedWithURL) {
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestWithDevTools("minimal", RELAUNCH);
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that showing a permission request as a constrained window works and is
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly parented.
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ConstrainedWindowRequest DISABLED_ConstrainedWindowRequest
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(sail): Enable this on other platforms once http://crbug.com/95455 is
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fixed.
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ConstrainedWindowRequest DISABLED_ConstrainedWindowRequest
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MAYBE_ConstrainedWindowRequest) {
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PermissionsRequestFunction::SetIgnoreUserGestureForTests(true);
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension =
887f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      LoadAndLaunchPlatformApp("optional_permission_request", "Launched");
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension) << "Failed to load extension.";
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebContents* web_contents = GetFirstAppWindowWebContents();
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(web_contents);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Verify that the app window has a dialog attached.
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsModalDialogManager* web_contents_modal_dialog_manager =
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContentsModalDialogManager::FromWebContents(web_contents);
89658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(web_contents_modal_dialog_manager->IsDialogActive());
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the constrained window and wait for the reply to the permission
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request.
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener listener("PermissionRequestDone", false);
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsModalDialogManager::TestApi test_api(
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_modal_dialog_manager);
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_api.CloseAllDialogs();
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(listener.WaitUntilSatisfied());
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that an app calling chrome.runtime.reload will reload the app and
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// relaunch it if it was running.
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, ReloadRelaunches) {
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener launched_listener("Launched", true);
911f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension =
912f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      LoadAndLaunchPlatformApp("reload", &launched_listener);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
9145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(GetFirstAppWindow());
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now tell the app to reload itself
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener launched_listener2("Launched", false);
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launched_listener.Reply("reload");
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launched_listener2.WaitUntilSatisfied());
9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(GetFirstAppWindow());
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
925cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Simple observer to check for NOTIFICATION_EXTENSION_INSTALLED_DEPRECATED
926cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// events to
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ensure installation does or does not occur in certain scenarios.
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CheckExtensionInstalledObserver : public content::NotificationObserver {
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckExtensionInstalledObserver() : seen_(false) {
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    registrar_.Add(this,
932cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   chrome::NOTIFICATION_EXTENSION_INSTALLED_DEPRECATED,
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   content::NotificationService::AllSources());
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool seen() const {
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return seen_;
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NotificationObserver:
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Observe(int type,
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationSource& source,
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(seen_);
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    seen_ = true;
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool seen_;
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::NotificationRegistrar registrar_;
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Component App Test 1 of 3: ensure that the initial load of a component
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// extension utilizing a background page (e.g. a v2 platform app) has its
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// background page run and is launchable. Waits for the Launched response from
9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// the script resource in the opened app window.
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       PRE_PRE_ComponentAppBackgroundPage) {
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckExtensionInstalledObserver should_install;
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure that we wait until the background page is run (to register the
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnLaunched listener) before trying to open the application. This is similar
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to LoadAndLaunchPlatformApp, but we want to load as a component extension.
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WindowedNotificationObserver app_loaded_observer(
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::AllSources());
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* extension = LoadExtensionAsComponent(
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_data_dir_.AppendASCII("platform_apps").AppendASCII("component"));
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(extension);
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_loaded_observer.Wait();
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(should_install.seen());
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionTestMessageListener launched_listener("Launched", false);
978a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  OpenApplication(AppLaunchParams(
979a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      browser()->profile(), extension, LAUNCH_CONTAINER_NONE, NEW_WINDOW));
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Component App Test 2 of 3: ensure an installed component app can be launched
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// on a subsequent browser start, without requiring any install/upgrade logic
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to be run, then perform setup for step 3.
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       PRE_ComponentAppBackgroundPage) {
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Since the component app is now installed, re-adding it in the same profile
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should not cause it to be re-installed. Instead, we wait for the OnLaunched
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // in a different observer (which would timeout if not the app was not
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // previously installed properly) and then check this observer to make sure it
994cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // never saw the NOTIFICATION_EXTENSION_INSTALLED_DEPRECATED event.
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckExtensionInstalledObserver should_not_install;
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* extension = LoadExtensionAsComponent(
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_data_dir_.AppendASCII("platform_apps").AppendASCII("component"));
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(extension);
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionTestMessageListener launched_listener("Launched", false);
1001a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  OpenApplication(AppLaunchParams(
1002a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      browser()->profile(), extension, LAUNCH_CONTAINER_NONE, NEW_WINDOW));
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(should_not_install.seen());
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate a "downgrade" from version 2 in the test manifest.json to 1.
1008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(browser()->profile());
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clear the registered events to ensure they are updated.
10110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  extensions::EventRouter::Get(browser()->profile())
10120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      ->SetRegisteredEvents(extension->id(), std::set<std::string>());
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1014ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DictionaryPrefUpdate update(extension_prefs->pref_service(),
10155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              extensions::pref_names::kExtensions);
10165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* dict = update.Get();
1017ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string key(extension->id());
1018ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  key += ".manifest.version";
1019ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  dict->SetString(key, "1");
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Component App Test 3 of 3: simulate a component extension upgrade that
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// re-adds the OnLaunched event, and allows the app to be launched.
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, ComponentAppBackgroundPage) {
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckExtensionInstalledObserver should_install;
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Since we are forcing an upgrade, we need to wait for the load again.
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WindowedNotificationObserver app_loaded_observer(
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::AllSources());
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* extension = LoadExtensionAsComponent(
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_data_dir_.AppendASCII("platform_apps").AppendASCII("component"));
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(extension);
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_loaded_observer.Wait();
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(should_install.seen());
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionTestMessageListener launched_listener("Launched", false);
1038a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  OpenApplication(AppLaunchParams(
1039a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      browser()->profile(), extension, LAUNCH_CONTAINER_NONE, NEW_WINDOW));
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, Messaging) {
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionApiTest::ResultCatcher result_catcher;
1046f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp("messaging/app2", "Launched");
1047f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp("messaging/app1", "Launched");
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(result_catcher.GetNextResult());
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_WebContentsHasFocus DISABLED_WebContentsHasFocus
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test depends on focus and so needs to be in interactive_ui_tests.
1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// http://crbug.com/227041
1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_WebContentsHasFocus DISABLED_WebContentsHasFocus
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MAYBE_WebContentsHasFocus) {
1060f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LoadAndLaunchPlatformApp("minimal", "Launched");
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1LU, GetAppWindowCount());
10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(GetFirstAppWindow()
10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  ->web_contents()
10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  ->GetRenderWidgetHostView()
10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  ->HasFocus());
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
106946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
1070d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define MAYBE_WindowDotPrintShouldBringUpPrintPreview \
1071d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DISABLED_WindowDotPrintShouldBringUpPrintPreview
1072424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#else
1073d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define MAYBE_WindowDotPrintShouldBringUpPrintPreview \
1074d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    WindowDotPrintShouldBringUpPrintPreview
1075424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif
1076424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1077d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
1078d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                       MAYBE_WindowDotPrintShouldBringUpPrintPreview) {
10794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedPreviewTestingDelegate preview_delegate(true);
1080424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/print_api")) << message_;
10814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  preview_delegate.WaitUntilPreviewIsReady();
1082d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1083d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
10844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This test verifies that http://crbug.com/297179 is fixed.
1085d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
1086cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       DISABLED_ClosingWindowWhilePrintingShouldNotCrash) {
10874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedPreviewTestingDelegate preview_delegate(false);
10884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/print_api")) << message_;
10894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  preview_delegate.WaitUntilPreviewIsReady();
10905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetFirstAppWindow()->GetBaseWindow()->Close();
10914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
10924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This test currently only passes on OS X (on other platforms the print preview
10944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// dialog's size is limited by the size of the window being printed).
1095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_MACOSX)
10964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_PrintPreviewShouldNotBeTooSmall \
10974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DISABLED_PrintPreviewShouldNotBeTooSmall
10984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
10994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_PrintPreviewShouldNotBeTooSmall \
11004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PrintPreviewShouldNotBeTooSmall
11014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
11024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
11044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       MAYBE_PrintPreviewShouldNotBeTooSmall) {
11054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Print preview dialogs with widths less than 410 pixels will have preview
11064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // areas that are too small, and ones with heights less than 191 pixels will
11074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // have vertical scrollers for their controls that are too small.
11084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size minimum_dialog_size(410, 191);
11094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedPreviewTestingDelegate preview_delegate(false);
11104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(RunPlatformAppTest("platform_apps/print_api")) << message_;
11114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  preview_delegate.WaitUntilPreviewIsReady();
11124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GE(preview_delegate.dialog_size().width(),
11134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            minimum_dialog_size.width());
11144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GE(preview_delegate.dialog_size().height(),
11154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            minimum_dialog_size.height());
11165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetFirstAppWindow()->GetBaseWindow()->Close();
1117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PlatformAppIncognitoBrowserTest : public PlatformAppBrowserTest,
11235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        public AppWindowRegistry::Observer {
1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Tell chromeos to launch in Guest mode, aka incognito.
1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    command_line->AppendSwitch(switches::kIncognito);
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PlatformAppBrowserTest::SetUpCommandLine(command_line);
1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure the file manager actually gets loaded.
1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ComponentLoader::EnableBackgroundExtensionsForTesting();
1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PlatformAppBrowserTest::SetUp();
1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // AppWindowRegistry::Observer implementation.
11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnAppWindowAdded(AppWindow* app_window) OVERRIDE {
1138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    opener_app_ids_.insert(app_window->extension_id());
1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
11425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A set of ids of apps we've seen open a app window.
1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::set<std::string> opener_app_ids_;
1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppIncognitoBrowserTest, IncognitoComponentApp) {
1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get the file manager app.
1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const Extension* file_manager = extension_service()->GetExtensionById(
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "hhaomjibdihmijegdhdafkllkbggdgoj", false);
1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(file_manager != NULL);
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* incognito_profile = profile()->GetOffTheRecordProfile();
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(incognito_profile != NULL);
1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Wait until the file manager has had a chance to register its listener
1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // for the launch event.
11560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventRouter* router = EventRouter::Get(incognito_profile);
1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(router != NULL);
11583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  while (!router->ExtensionHasEventListener(
11593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      file_manager->id(), app_runtime::OnLaunched::kEventName)) {
1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::RunAllPendingInMessageLoop();
1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Listen for new app windows so we see the file manager app launch itself.
11645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AppWindowRegistry* registry = AppWindowRegistry::Get(incognito_profile);
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(registry != NULL);
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->AddObserver(this);
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  OpenApplication(AppLaunchParams(
11698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      incognito_profile, file_manager, 0, chrome::HOST_DESKTOP_TYPE_NATIVE));
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  while (!ContainsKey(opener_app_ids_, file_manager->id())) {
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::RunAllPendingInMessageLoop();
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class RestartDeviceTest : public PlatformAppBrowserTest {
11774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
11784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RestartDeviceTest()
11794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : power_manager_client_(NULL),
11804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mock_user_manager_(NULL) {}
11814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~RestartDeviceTest() {}
11824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // PlatformAppBrowserTest overrides
11844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
11854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PlatformAppBrowserTest::SetUpInProcessBrowserTestFixture();
11864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    chromeos::FakeDBusThreadManager* dbus_manager =
11888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        new chromeos::FakeDBusThreadManager;
1189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    dbus_manager->SetFakeClients();
1190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    power_manager_client_ = new chromeos::FakePowerManagerClient;
1191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    dbus_manager->SetPowerManagerClient(
1192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        scoped_ptr<chromeos::PowerManagerClient>(power_manager_client_));
1193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    chromeos::DBusThreadManager::SetInstanceForTesting(dbus_manager);
11944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
11954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
11974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PlatformAppBrowserTest::SetUpOnMainThread();
11984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    mock_user_manager_ = new chromeos::MockUserManager;
12004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    user_manager_enabler_.reset(
12014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        new chromeos::ScopedUserManagerEnabler(mock_user_manager_));
12024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_CALL(*mock_user_manager_, IsUserLoggedIn())
12044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillRepeatedly(testing::Return(true));
12054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_CALL(*mock_user_manager_, IsLoggedInAsKioskApp())
12064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillRepeatedly(testing::Return(true));
12074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
12084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void CleanUpOnMainThread() OVERRIDE {
12104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    user_manager_enabler_.reset();
12114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PlatformAppBrowserTest::CleanUpOnMainThread();
12124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
12134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
12154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PlatformAppBrowserTest::TearDownInProcessBrowserTestFixture();
12164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
12174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int num_request_restart_calls() const {
12195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return power_manager_client_->num_request_restart_calls();
12204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
12214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
12234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  chromeos::FakePowerManagerClient* power_manager_client_;
12244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  chromeos::MockUserManager* mock_user_manager_;
12254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<chromeos::ScopedUserManagerEnabler> user_manager_enabler_;
12264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RestartDeviceTest);
12284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
12294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Tests that chrome.runtime.restart would request device restart in
12314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// ChromeOS kiosk mode.
12324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RestartDeviceTest, Restart) {
12335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0, num_request_restart_calls());
12344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ExtensionTestMessageListener launched_listener("Launched", true);
1236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = LoadAndLaunchPlatformApp("restart_device",
1237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        &launched_listener);
12384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(extension);
12394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  launched_listener.Reply("restart");
12414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ExtensionTestMessageListener restart_requested_listener("restartRequested",
12424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                          false);
12434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(restart_requested_listener.WaitUntilSatisfied());
12444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, num_request_restart_calls());
12464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
12474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // defined(OS_CHROMEOS)
1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that when an application is uninstalled and re-install it does not have
12515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// access to the previously set data.
12525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, ReinstallDataCleanup) {
12535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The application is installed and launched. After the 'Launched' message is
12545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // acknowledged by the browser process, the application will test that some
12555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // data are not installed and then install them. The application will then be
12565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // uninstalled and the same process will be repeated.
12575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string extension_id;
12585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const Extension* extension =
1261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        LoadAndLaunchPlatformApp("reinstall_data_cleanup", "Launched");
12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(extension);
12635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    extension_id = extension->id();
12645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ExtensionApiTest::ResultCatcher result_catcher;
12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(result_catcher.GetNextResult());
12675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
12685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UninstallExtension(extension_id);
12705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
12735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const Extension* extension =
1274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        LoadAndLaunchPlatformApp("reinstall_data_cleanup", "Launched");
12755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(extension);
12765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ(extension_id, extension->id());
12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ExtensionApiTest::ResultCatcher result_catcher;
12795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(result_catcher.GetNextResult());
12805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
12815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
1284