103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file.
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/memory/ref_counted.h"
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/path_service.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/prefs/pref_service.h"
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/plugins/plugin_prefs.h"
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar_controller.h"
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar_host_unittest_util.h"
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/common/pref_names.h"
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/child_process_data.h"
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/plugin_service.h"
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/web_contents.h"
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/common/content_constants.h"
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/common/content_paths.h"
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/common/process_type.h"
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/common/webplugininfo.h"
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h"
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/test/test_utils.h"
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(OS_WIN)
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/aura/window.h"
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/aura/window_tree_host.h"
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(OS_WIN)
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace {
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)BOOL CALLBACK EnumerateChildren(HWND hwnd, LPARAM l_param) {
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HWND* child = reinterpret_cast<HWND*>(l_param);
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  *child = hwnd;
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // The first child window is the plugin, then its children. So stop
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // enumerating after the first callback.
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return FALSE;
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)typedef InProcessBrowserTest ChromePluginTest;
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Test that if a background tab loads an NPAPI plugin, they are displayed after
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// switching to that page.  http://crbug.com/335900
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// flaky: http://crbug.com/406631
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ChromePluginTest, DISABLED_WindowedNPAPIPluginHidden) {
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  browser()->profile()->GetPrefs()->SetBoolean(prefs::kPluginsAlwaysAuthorize,
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               true);
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // First load the page in the background and wait for the NPAPI plugin's
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // window to be created.
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::FilePath(),
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::FilePath().AppendASCII("windowed_npapi_plugin.html"));
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser(), url, NEW_BACKGROUND_TAB,
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // We create a third window just to trigger the second one to update its
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // constrained window list. Normally this would be triggered by the status bar
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // animation closing after the user middle clicked a link.
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser(), GURL("about:blank"), NEW_BACKGROUND_TAB,
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::string16 expected_title(base::ASCIIToUTF16("created"));
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::WebContents* tab =
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser()->tab_strip_model()->GetWebContentsAt(1);
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (tab->GetTitle() != expected_title) {
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    content::TitleWatcher title_watcher(tab, expected_title);
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Now activate the tab and verify that the plugin painted.
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  browser()->tab_strip_model()->ActivateTabAt(1, true);
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::string16 expected_title2(base::ASCIIToUTF16("shown"));
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::TitleWatcher title_watcher2(tab, expected_title2);
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(expected_title2, title_watcher2.WaitAndGetTitle());
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HWND child = NULL;
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HWND hwnd = tab->GetNativeView()->GetHost()->GetAcceleratedWidget();
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EnumChildWindows(hwnd, EnumerateChildren,reinterpret_cast<LPARAM>(&child));
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RECT region;
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int result = GetWindowRgnBox(child, &region);
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_NE(result, NULLREGION);
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)typedef InProcessBrowserTest PrintPreviewTest;
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This test verifies that constrained windows aren't covered by windowed NPAPI
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// plugins. The code which fixes this is in WebContentsViewAura::WindowObserver.
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// flaky: http://crbug.com/406631
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrintPreviewTest, DISABLED_WindowedNPAPIPluginHidden) {
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  browser()->profile()->GetPrefs()->SetBoolean(prefs::kPluginsAlwaysAuthorize,
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               true);
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // First load the page and wait for the NPAPI plugin's window to display.
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::string16 expected_title(base::ASCIIToUTF16("ready"));
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::WebContents* tab =
11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::TitleWatcher title_watcher(tab, expected_title);
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::FilePath().AppendASCII("printing"),
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::FilePath().AppendASCII("npapi_plugin.html"));
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Now get the region of the plugin before and after the print preview is
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // shown. They should be different.
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HWND hwnd = tab->GetNativeView()->GetHost()->GetAcceleratedWidget();
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HWND child = NULL;
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EnumChildWindows(hwnd, EnumerateChildren,reinterpret_cast<LPARAM>(&child));
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RECT region_before, region_after;
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int result = GetWindowRgnBox(child, &region_before);
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_EQ(result, SIMPLEREGION);
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Now print preview.
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::TestNavigationObserver nav_observer(NULL);
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nav_observer.StartWatchingNewWebContents();
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  chrome::ExecuteCommand(browser(), IDC_PRINT);
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nav_observer.Wait();
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nav_observer.StopWatchingNewWebContents();
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  result = GetWindowRgnBox(child, &region_after);
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (result == NULLREGION) {
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Depending on the browser window size, the plugin could be full covered.
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (result == COMPLEXREGION) {
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Complex region, by definition not equal to the initial region.
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_EQ(result, SIMPLEREGION);
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool rects_equal =
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      region_before.left == region_after.left &&
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      region_before.top == region_after.top &&
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      region_before.right == region_after.right &&
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      region_before.bottom == region_after.bottom;
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_FALSE(rects_equal);
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)typedef InProcessBrowserTest FindInPageControllerTest;
16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void EnsureFindBoxOpen(Browser* browser) {
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  chrome::ShowFindBar(browser);
16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::Point position;
16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool fully_visible = false;
16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FindBarTesting* find_bar =
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser->GetFindBarController()->find_bar()->GetFindBarTesting();
17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(find_bar->GetFindBarWindowInfo(&position, &fully_visible));
17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(fully_visible);
17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Ensure that the find bar is always over a windowed NPAPI plugin.
17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// flaky: http://crbug.com/406631
17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(FindInPageControllerTest,
17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       DISABLED_WindowedNPAPIPluginHidden) {
17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  chrome::DisableFindBarAnimationsDuringTesting(true);
17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  browser()->profile()->GetPrefs()->SetBoolean(prefs::kPluginsAlwaysAuthorize,
18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               true);
18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // First load the page and wait for the NPAPI plugin's window to display.
18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::string16 expected_title(base::ASCIIToUTF16("ready"));
18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::WebContents* tab =
18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::TitleWatcher title_watcher(tab, expected_title);
18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::FilePath().AppendASCII("printing"),
19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::FilePath().AppendASCII("npapi_plugin.html"));
19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Now get the region of the plugin before the find bar is shown.
19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HWND hwnd = tab->GetNativeView()->GetHost()->GetAcceleratedWidget();
19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HWND child = NULL;
19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EnumChildWindows(hwnd, EnumerateChildren, reinterpret_cast<LPARAM>(&child));
19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RECT region_before, region_after;
20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int result = GetWindowRgnBox(child, &region_before);
20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_EQ(result, SIMPLEREGION);
20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Create a new tab and open the find bar there.
20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  chrome::NewTab(browser());
20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  browser()->tab_strip_model()->ActivateTabAt(1, true);
20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EnsureFindBoxOpen(browser());
21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Now switch back to the original tab with the plugin and show the find bar.
21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  browser()->tab_strip_model()->ActivateTabAt(0, true);
21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EnsureFindBoxOpen(browser());
21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  result = GetWindowRgnBox(child, &region_after);
21603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (result == NULLREGION) {
21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Depending on the browser window size, the plugin could be full covered.
21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (result == COMPLEXREGION) {
22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Complex region, by definition not equal to the initial region.
22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_EQ(result, SIMPLEREGION);
22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool rects_equal =
22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      region_before.left == region_after.left &&
22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      region_before.top == region_after.top &&
23003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      region_before.right == region_after.right &&
23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      region_before.bottom == region_after.bottom;
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_FALSE(rects_equal);
23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
236