| // Copyright 2012 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "build/build_config.h" | 
 | #include "chrome/browser/extensions/extension_apitest.h" | 
 | #include "chrome/browser/ui/browser_tabstrip.h" | 
 | #include "chrome/test/base/ui_test_utils.h" | 
 | #include "content/public/common/content_switches.h" | 
 | #include "content/public/test/browser_test.h" | 
 | #include "content/public/test/test_navigation_observer.h" | 
 | #include "extensions/test/extension_test_message_listener.h" | 
 | #include "extensions/test/result_catcher.h" | 
 | #include "extensions/test/test_extension_dir.h" | 
 |  | 
 | namespace extensions { | 
 |  | 
 | // Failed run on ChromeOS CI builder. https://crbug.com/1245240 | 
 | #if BUILDFLAG(IS_CHROMEOS) | 
 | #define MAYBE_GetViews DISABLED_GetViews | 
 | #else | 
 | #define MAYBE_GetViews GetViews | 
 | #endif | 
 | IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_GetViews) { | 
 |   ASSERT_TRUE(RunExtensionTest("get_views")) << message_; | 
 | } | 
 |  | 
 | class ExtensionApiTestWithoutAutomationController : public ExtensionApiTest { | 
 |  public: | 
 |   void SetUpInProcessBrowserTestFixture() override { | 
 |     // This switch must be removed in SetUpInProcessBrowserTestFixture() instead | 
 |     // of SetUpCommandLine() because BrowserTestBase::SetUp() adds the switch | 
 |     // after SetUpCommandLine() is called. | 
 |     base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | 
 |  | 
 |     base::CommandLine new_command_line(command_line->GetProgram()); | 
 |     base::CommandLine::SwitchMap switches = command_line->GetSwitches(); | 
 |     // Disable kDomAutomationController to avoid creating the V8 context for | 
 |     // every frame. This interferes with the behavior we are trying to emulate | 
 |     // for the regression test. | 
 |     switches.erase(switches::kDomAutomationController); | 
 |  | 
 |     for (const auto& it : switches) | 
 |       new_command_line.AppendSwitchNative(it.first, it.second); | 
 |  | 
 |     *command_line = new_command_line; | 
 |   } | 
 | }; | 
 |  | 
 | // Regression test for http://crbug.com/1349787. | 
 | IN_PROC_BROWSER_TEST_F(ExtensionApiTestWithoutAutomationController, | 
 |                        GetWebAccessibleExtensionView) { | 
 |   ASSERT_TRUE(embedded_test_server()->Start()); | 
 |   ASSERT_TRUE(ui_test_utils::NavigateToURL( | 
 |       browser(), embedded_test_server()->GetURL("/echo"))); | 
 |  | 
 |   TestExtensionDir test_dir; | 
 |   test_dir.WriteManifest(R"({ | 
 |         "name": "GetViews Test", | 
 |         "manifest_version": 2, | 
 |         "version": "0.1", | 
 |         "background": {"scripts": ["background.js"]}, | 
 |         "web_accessible_resources": ["page.html"] | 
 |       })"); | 
 |   test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), R"( | 
 |         chrome.test.sendMessage('ready', function() { | 
 |           var views = chrome.extension.getViews(); | 
 |           chrome.test.assertEq(2, views.length); | 
 |  | 
 |           let paths = views.map((v) => v.location.pathname).sort(); | 
 |           chrome.test.assertEq( | 
 |               ['/_generated_background_page.html', '/page.html'], paths); | 
 |  | 
 |           chrome.test.notifyPass(); | 
 |         }); | 
 |       )"); | 
 |   test_dir.WriteFile(FILE_PATH_LITERAL("page.html"), "<html></html>"); | 
 |  | 
 |   ResultCatcher result_catcher; | 
 |   ExtensionTestMessageListener listener("ready", ReplyBehavior::kWillReply); | 
 |   const Extension* extension = LoadExtension(test_dir.UnpackedPath()); | 
 |   ASSERT_TRUE(extension); | 
 |   EXPECT_TRUE(listener.WaitUntilSatisfied()); | 
 |  | 
 |   auto* tab = chrome::AddSelectedTabWithURL( | 
 |       browser(), extension->GetResourceURL("page.html"), | 
 |       ui::PAGE_TRANSITION_LINK); | 
 |   content::TestNavigationObserver observer(tab); | 
 |   observer.Wait(); | 
 |  | 
 |   listener.Reply("ok"); | 
 |   EXPECT_TRUE(result_catcher.GetNextResult()) << result_catcher.message(); | 
 | } | 
 |  | 
 | }  // namespace extensions |