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