15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/files/file_path.h"
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/stringprintf.h"
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/common/feature_switch.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/common/switches.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/result_catcher.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using extensions::Extension;
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using extensions::FeatureSwitch;
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ExtensionOptionsApiTest : public ExtensionApiTest {
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ExtensionApiTest::SetUpCommandLine(command_line);
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    enable_options_.reset(new FeatureSwitch::ScopedOverride(
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        FeatureSwitch::embedded_extension_options(), true));
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Need to add a command line flag as well as a FeatureSwitch because the
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // FeatureSwitch is not copied over to the renderer process from the
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // browser process.
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    command_line->AppendSwitch(
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::switches::kEnableEmbeddedExtensionOptions);
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<FeatureSwitch::ScopedOverride> enable_options_;
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// crbug/415949.
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_MACOSX)
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_ExtensionCanEmbedOwnOptions DISABLED_ExtensionCanEmbedOwnOptions
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_ExtensionCanEmbedOwnOptions ExtensionCanEmbedOwnOptions
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(ExtensionOptionsApiTest,
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       MAYBE_ExtensionCanEmbedOwnOptions) {
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::FilePath extension_dir =
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test_data_dir_.AppendASCII("extension_options").AppendASCII("embed_self");
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(extension_dir));
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("extension_options/embed_self", "test.html"));
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionOptionsApiTest,
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       ShouldNotEmbedOtherExtensionsOptions) {
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::FilePath dir = test_data_dir_.AppendASCII("extension_options")
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           .AppendASCII("embed_other");
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const Extension* embedder = InstallExtension(dir.AppendASCII("embedder"), 1);
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const Extension* embedded = InstallExtension(dir.AppendASCII("embedded"), 1);
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(embedder);
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(embedded);
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Since the extension id of the embedded extension is not always the same,
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // store the embedded extension id in the embedder's storage before running
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // the tests.
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::string script = base::StringPrintf(
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "chrome.storage.local.set({'embeddedId': '%s'}, function() {"
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "window.domAutomationController.send('done injecting');});",
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      embedded->id().c_str());
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ExecuteScriptInBackgroundPage(embedder->id(), script);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extensions::ResultCatcher catcher;
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               embedder->GetResourceURL("test.html"));
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult());
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionOptionsApiTest,
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       CannotEmbedUsingInvalidExtensionIds) {
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(test_data_dir_.AppendASCII("extension_options")
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                   .AppendASCII("embed_invalid"),
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               1));
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      RunExtensionSubtest("extension_options/embed_invalid", "test.html"));
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
81