1 // Copyright (c) 2013 Intel Corporation. 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.
5 #include "xwalk/extensions/test/xwalk_extensions_test_base.h"
7 #include "content/public/test/browser_test_utils.h"
8 #include "content/public/test/test_utils.h"
9 #include "xwalk/extensions/common/xwalk_extension.h"
10 #include "xwalk/runtime/browser/runtime.h"
11 #include "xwalk/test/base/xwalk_test_utils.h"
13 using namespace xwalk::extensions; // NOLINT
18 bool g_outer_extension_loaded = false;
19 bool g_inner_extension_loaded = false;
20 bool g_another_extension_loaded = false;
24 class OuterInstance : public XWalkExtensionInstance {
27 g_outer_extension_loaded = true;
29 void HandleMessage(scoped_ptr<base::Value> msg) override {}
32 class OuterExtension : public XWalkExtension {
34 OuterExtension() : XWalkExtension() {
36 set_javascript_api("exports.value = true");
39 XWalkExtensionInstance* CreateInstance() override {
40 return new OuterInstance;
44 class InnerInstance : public XWalkExtensionInstance {
47 g_inner_extension_loaded = true;
49 void HandleMessage(scoped_ptr<base::Value> msg) override {}
52 class InnerExtension : public XWalkExtension {
54 InnerExtension() : XWalkExtension() {
55 set_name("outer.inner");
56 set_javascript_api("exports.value = true;");
59 XWalkExtensionInstance* CreateInstance() override {
60 return new InnerInstance;
64 class AnotherInstance : public XWalkExtensionInstance {
67 g_another_extension_loaded = true;
69 void HandleMessage(scoped_ptr<base::Value> msg) override {}
72 class AnotherExtension : public XWalkExtension {
74 AnotherExtension() : XWalkExtension() {
76 // With load on demand enabled, this should cause 'outer' and 'outer.inner'
77 // extensions to be loaded. The aim is to guarantee that our trampoline
78 // mechanism works in the case that the JS API code depends on another
80 set_javascript_api("if (outer.inner.value === true) { "
81 "exports.value = true;"
85 XWalkExtensionInstance* CreateInstance() override {
86 return new AnotherInstance;
90 class XWalkExtensionsNestedNamespaceTest : public XWalkExtensionsTestBase {
92 void CreateExtensionsForUIThread(
93 XWalkExtensionVector* extensions) override {
94 extensions->push_back(new OuterExtension);
95 extensions->push_back(new InnerExtension);
99 class XWalkExtensionsTrampolinesForNested : public XWalkExtensionsTestBase {
101 void CreateExtensionsForUIThread(
102 XWalkExtensionVector* extensions) override {
103 extensions->push_back(new OuterExtension);
104 extensions->push_back(new InnerExtension);
105 extensions->push_back(new AnotherExtension);
109 IN_PROC_BROWSER_TEST_F(XWalkExtensionsNestedNamespaceTest,
110 InstanceCreatedForInnerExtension) {
111 Runtime* runtime = CreateRuntime();
112 GURL url = GetExtensionsTestURL(base::FilePath(),
113 base::FilePath().AppendASCII("inner_outer.html"));
115 content::TitleWatcher title_watcher(runtime->web_contents(), kPassString);
116 title_watcher.AlsoWaitForTitle(kFailString);
117 xwalk_test_utils::NavigateToURL(runtime, url);
118 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());
120 EXPECT_TRUE(g_outer_extension_loaded);
121 EXPECT_TRUE(g_inner_extension_loaded);
124 IN_PROC_BROWSER_TEST_F(XWalkExtensionsNestedNamespaceTest,
125 InstanceNotCreatedForUnusedInnerExtension) {
126 Runtime* runtime = CreateRuntime();
127 GURL url = GetExtensionsTestURL(base::FilePath(),
128 base::FilePath().AppendASCII("outer.html"));
130 content::TitleWatcher title_watcher(runtime->web_contents(), kPassString);
131 title_watcher.AlsoWaitForTitle(kFailString);
132 xwalk_test_utils::NavigateToURL(runtime, url);
133 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());
135 EXPECT_TRUE(g_outer_extension_loaded);
136 EXPECT_FALSE(g_inner_extension_loaded);
139 IN_PROC_BROWSER_TEST_F(XWalkExtensionsTrampolinesForNested,
140 InstanceCreatedForExtensionUsedByAnother) {
141 Runtime* runtime = CreateRuntime();
142 GURL url = GetExtensionsTestURL(base::FilePath(),
143 base::FilePath().AppendASCII("another.html"));
145 content::TitleWatcher title_watcher(runtime->web_contents(), kPassString);
146 title_watcher.AlsoWaitForTitle(kFailString);
147 xwalk_test_utils::NavigateToURL(runtime, url);
148 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());
150 EXPECT_TRUE(g_another_extension_loaded);
151 EXPECT_TRUE(g_inner_extension_loaded);
152 EXPECT_TRUE(g_outer_extension_loaded);