• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#import "chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.h"
6
7#include "base/run_loop.h"
8#include "base/threading/sequenced_worker_pool.h"
9#include "chrome/browser/ui/browser.h"
10#import "chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h"
11#import "chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h"
12#include "chrome/test/base/in_process_browser_test.h"
13#include "content/public/browser/browser_thread.h"
14#include "extensions/common/extension.h"
15
16namespace {
17
18// Similar to ShowExtensionInstallDialogImpl except this allows the created
19// dialog controller to be captured and manipulated for tests.
20void TestingShowAppListInstallDialogController(
21    WindowedInstallDialogController** controller,
22    const ExtensionInstallPrompt::ShowParams& show_params,
23    ExtensionInstallPrompt::Delegate* delegate,
24    scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) {
25  *controller =
26      new WindowedInstallDialogController(show_params, delegate, prompt);
27}
28
29typedef InProcessBrowserTest WindowedInstallDialogControllerBrowserTest;
30
31}  // namespace
32
33// Test for showing an extension install prompt with no parent WebContents.
34IN_PROC_BROWSER_TEST_F(WindowedInstallDialogControllerBrowserTest,
35                       ShowInstallDialog) {
36  // Construct a prompt with a NULL parent window, the way ExtensionEnableFlow
37  // will for the Mac app list. For testing, sets a NULL PageNavigator as well.
38  scoped_ptr<ExtensionInstallPrompt> prompt(
39      new ExtensionInstallPrompt(browser()->profile(), NULL, NULL));
40
41  WindowedInstallDialogController* controller = NULL;
42  chrome::MockExtensionInstallPromptDelegate delegate;
43  scoped_refptr<extensions::Extension> extension =
44      chrome::LoadInstallPromptExtension("permissions", "many-apis.json");
45  prompt->ConfirmInstall(
46      &delegate,
47      extension.get(),
48      base::Bind(&TestingShowAppListInstallDialogController, &controller));
49
50  // The prompt needs to load the image, which happens on the blocking pool.
51  content::BrowserThread::GetBlockingPool()->FlushForTesting();
52  base::RunLoop().RunUntilIdle();
53  ASSERT_TRUE(controller);
54
55  base::scoped_nsobject<NSWindow> window(
56      [[[controller->GetViewController() view] window] retain]);
57  EXPECT_TRUE([window isVisible]);
58  EXPECT_TRUE([window delegate]);
59  EXPECT_EQ(0, delegate.abort_count());
60
61  // Press cancel to close the window.
62  [[controller->GetViewController() cancelButton] performClick:nil];
63  EXPECT_FALSE([window delegate]);
64  EXPECT_EQ(1, delegate.abort_count());
65
66  // Ensure the window is closed.
67  EXPECT_FALSE([window isVisible]);
68}
69