Home | History | Annotate | Download | only in extensions
      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 #include "chrome/browser/extensions/extension_process_manager.h"
      6 #include "chrome/browser/extensions/extension_test_message_listener.h"
      7 #include "chrome/browser/extensions/platform_app_browsertest_util.h"
      8 #include "chrome/browser/profiles/profile.h"
      9 #include "chrome/common/chrome_switches.h"
     10 #include "content/public/browser/web_contents_view.h"
     11 #include "content/public/test/browser_test_utils.h"
     12 
     13 class WindowControlsTest : public extensions::PlatformAppBrowserTest {
     14  protected:
     15   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
     16     extensions::PlatformAppBrowserTest::SetUpCommandLine(command_line);
     17     command_line->AppendSwitch(switches::kEnableAppWindowControls);
     18   }
     19   content::WebContents* GetWebContentsForExtensionWindow(
     20       const extensions::Extension* extension);
     21 };
     22 
     23 content::WebContents* WindowControlsTest::GetWebContentsForExtensionWindow(
     24     const extensions::Extension* extension) {
     25   ExtensionProcessManager* process_manager =
     26       extensions::ExtensionSystem::Get(profile())->process_manager();
     27 
     28   // Lookup render view host for background page.
     29   const extensions::ExtensionHost* extension_host =
     30       process_manager->GetBackgroundHostForExtension(extension->id());
     31   content::RenderViewHost* background_view_host =
     32       extension_host->render_view_host();
     33 
     34   // Go through all active views, looking for the first window of the extension
     35   const ExtensionProcessManager::ViewSet all_views =
     36       process_manager->GetAllViews();
     37   ExtensionProcessManager::ViewSet::const_iterator it = all_views.begin();
     38   for (; it != all_views.end(); ++it) {
     39     content::RenderViewHost* host = *it;
     40 
     41     // Filter out views not part of this extension
     42     if (process_manager->GetExtensionForRenderViewHost(host) == extension) {
     43       // Filter out the background page view
     44       if (host != background_view_host) {
     45         content::WebContents* web_contents =
     46             content::WebContents::FromRenderViewHost(host);
     47         return web_contents;
     48       }
     49     }
     50   }
     51   return NULL;
     52 }
     53 
     54 IN_PROC_BROWSER_TEST_F(WindowControlsTest, CloseControlWorks) {
     55   // Launch app and wait for window to show up
     56   ExtensionTestMessageListener window_opened("window-opened", false);
     57   const extensions::Extension* extension =
     58       LoadAndLaunchPlatformApp("window_controls/buttons");
     59   ASSERT_TRUE(window_opened.WaitUntilSatisfied());
     60 
     61   // Find WebContents of window
     62   content::WebContents* web_contents =
     63       GetWebContentsForExtensionWindow(extension);
     64   ASSERT_TRUE(web_contents != NULL);
     65 
     66   // Send a left click on the "Close" button and wait for the close action
     67   // to happen.
     68   ExtensionTestMessageListener window_closed("window-closed", false);
     69 
     70   // Send mouse click somewhere inside the [x] button
     71   const int controlOffset = 25;
     72   int x = web_contents->GetView()->GetContainerSize().width() - controlOffset;
     73   int y = controlOffset;
     74   content::SimulateMouseClickAt(web_contents,
     75                                 0,
     76                                 WebKit::WebMouseEvent::ButtonLeft,
     77                                 gfx::Point(x, y));
     78 
     79   ASSERT_TRUE(window_closed.WaitUntilSatisfied());
     80 }
     81