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
17 bool g_outer_extension_loaded = false;
18 bool g_inner_extension_loaded = false;
19 bool g_another_extension_loaded = false;
23 class OuterInstance : public XWalkExtensionInstance {
26 g_outer_extension_loaded = true;
28 virtual void HandleMessage(scoped_ptr<base::Value> msg) OVERRIDE {}
31 class OuterExtension : public XWalkExtension {
33 OuterExtension() : XWalkExtension() {
35 set_javascript_api("exports.value = true");
38 virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
39 return new OuterInstance;
43 class InnerInstance : public XWalkExtensionInstance {
46 g_inner_extension_loaded = true;
48 virtual void HandleMessage(scoped_ptr<base::Value> msg) OVERRIDE {}
51 class InnerExtension : public XWalkExtension {
53 InnerExtension() : XWalkExtension() {
54 set_name("outer.inner");
55 set_javascript_api("exports.value = true;");
58 virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
59 return new InnerInstance;
63 class AnotherInstance : public XWalkExtensionInstance {
66 g_another_extension_loaded = true;
68 virtual void HandleMessage(scoped_ptr<base::Value> msg) OVERRIDE {}
71 class AnotherExtension : public XWalkExtension {
73 AnotherExtension() : XWalkExtension() {
75 // With load on demand enabled, this should cause 'outer' and 'outer.inner'
76 // extensions to be loaded. The aim is to guarantee that our trampoline
77 // mechanism works in the case that the JS API code depends on another
79 set_javascript_api("if (outer.inner.value === true) { "
80 "exports.value = true;"
84 virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
85 return new AnotherInstance;
89 class XWalkExtensionsNestedNamespaceTest : public XWalkExtensionsTestBase {
91 virtual void CreateExtensionsForUIThread(
92 XWalkExtensionVector* extensions) OVERRIDE {
93 extensions->push_back(new OuterExtension);
94 extensions->push_back(new InnerExtension);
98 class XWalkExtensionsTrampolinesForNested : public XWalkExtensionsTestBase {
100 virtual void CreateExtensionsForUIThread(
101 XWalkExtensionVector* extensions) OVERRIDE {
102 extensions->push_back(new OuterExtension);
103 extensions->push_back(new InnerExtension);
104 extensions->push_back(new AnotherExtension);
108 IN_PROC_BROWSER_TEST_F(XWalkExtensionsNestedNamespaceTest,
109 InstanceCreatedForInnerExtension) {
110 content::RunAllPendingInMessageLoop();
111 GURL url = GetExtensionsTestURL(base::FilePath(),
112 base::FilePath().AppendASCII("inner_outer.html"));
114 content::TitleWatcher title_watcher(runtime()->web_contents(), kPassString);
115 title_watcher.AlsoWaitForTitle(kFailString);
116 xwalk_test_utils::NavigateToURL(runtime(), url);
117 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());
119 EXPECT_TRUE(g_outer_extension_loaded);
120 EXPECT_TRUE(g_inner_extension_loaded);
123 IN_PROC_BROWSER_TEST_F(XWalkExtensionsNestedNamespaceTest,
124 InstanceNotCreatedForUnusedInnerExtension) {
125 content::RunAllPendingInMessageLoop();
126 GURL url = GetExtensionsTestURL(base::FilePath(),
127 base::FilePath().AppendASCII("outer.html"));
129 content::TitleWatcher title_watcher(runtime()->web_contents(), kPassString);
130 title_watcher.AlsoWaitForTitle(kFailString);
131 xwalk_test_utils::NavigateToURL(runtime(), url);
132 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());
134 EXPECT_TRUE(g_outer_extension_loaded);
135 EXPECT_FALSE(g_inner_extension_loaded);
138 IN_PROC_BROWSER_TEST_F(XWalkExtensionsTrampolinesForNested,
139 InstanceCreatedForExtensionUsedByAnother) {
140 content::RunAllPendingInMessageLoop();
141 GURL url = GetExtensionsTestURL(base::FilePath(),
142 base::FilePath().AppendASCII("another.html"));
144 content::TitleWatcher title_watcher(runtime()->web_contents(), kPassString);
145 title_watcher.AlsoWaitForTitle(kFailString);
146 xwalk_test_utils::NavigateToURL(runtime(), url);
147 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());
149 EXPECT_TRUE(g_another_extension_loaded);
150 EXPECT_TRUE(g_inner_extension_loaded);
151 EXPECT_TRUE(g_outer_extension_loaded);