Upstream version 9.37.190.0
[platform/framework/web/crosswalk.git] / src / xwalk / extensions / test / nested_namespace.cc
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.
4
5 #include "xwalk/extensions/test/xwalk_extensions_test_base.h"
6
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"
12
13 using namespace xwalk::extensions;  // NOLINT
14
15 namespace {
16
17 bool g_outer_extension_loaded = false;
18 bool g_inner_extension_loaded = false;
19 bool g_another_extension_loaded = false;
20
21 }
22
23 class OuterInstance : public XWalkExtensionInstance {
24  public:
25   OuterInstance() {
26     g_outer_extension_loaded = true;
27   }
28   virtual void HandleMessage(scoped_ptr<base::Value> msg) OVERRIDE {}
29 };
30
31 class OuterExtension : public XWalkExtension {
32  public:
33   OuterExtension() : XWalkExtension() {
34     set_name("outer");
35     set_javascript_api("exports.value = true");
36   }
37
38   virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
39     return new OuterInstance;
40   }
41 };
42
43 class InnerInstance : public XWalkExtensionInstance {
44  public:
45   InnerInstance() {
46     g_inner_extension_loaded = true;
47   }
48   virtual void HandleMessage(scoped_ptr<base::Value> msg) OVERRIDE {}
49 };
50
51 class InnerExtension : public XWalkExtension {
52  public:
53   InnerExtension() : XWalkExtension() {
54     set_name("outer.inner");
55     set_javascript_api("exports.value = true;");
56   }
57
58   virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
59     return new InnerInstance;
60   }
61 };
62
63 class AnotherInstance : public XWalkExtensionInstance {
64  public:
65   AnotherInstance() {
66     g_another_extension_loaded = true;
67   }
68   virtual void HandleMessage(scoped_ptr<base::Value> msg) OVERRIDE {}
69 };
70
71 class AnotherExtension : public XWalkExtension {
72  public:
73   AnotherExtension() : XWalkExtension() {
74     set_name("another");
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
78     // extension.
79     set_javascript_api("if (outer.inner.value === true) { "
80                        "exports.value = true;"
81                        "}");
82   }
83
84   virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
85     return new AnotherInstance;
86   }
87 };
88
89 class XWalkExtensionsNestedNamespaceTest : public XWalkExtensionsTestBase {
90  public:
91   virtual void CreateExtensionsForUIThread(
92       XWalkExtensionVector* extensions) OVERRIDE {
93     extensions->push_back(new OuterExtension);
94     extensions->push_back(new InnerExtension);
95   }
96 };
97
98 class XWalkExtensionsTrampolinesForNested : public XWalkExtensionsTestBase {
99  public:
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);
105   }
106 };
107
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"));
113
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());
118
119   EXPECT_TRUE(g_outer_extension_loaded);
120   EXPECT_TRUE(g_inner_extension_loaded);
121 }
122
123 IN_PROC_BROWSER_TEST_F(XWalkExtensionsNestedNamespaceTest,
124                        InstanceNotCreatedForUnusedInnerExtension) {
125   content::RunAllPendingInMessageLoop();
126   GURL url = GetExtensionsTestURL(base::FilePath(),
127       base::FilePath().AppendASCII("outer.html"));
128
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());
133
134   EXPECT_TRUE(g_outer_extension_loaded);
135   EXPECT_FALSE(g_inner_extension_loaded);
136 }
137
138 IN_PROC_BROWSER_TEST_F(XWalkExtensionsTrampolinesForNested,
139                        InstanceCreatedForExtensionUsedByAnother) {
140   content::RunAllPendingInMessageLoop();
141   GURL url = GetExtensionsTestURL(base::FilePath(),
142       base::FilePath().AppendASCII("another.html"));
143
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());
148
149   EXPECT_TRUE(g_another_extension_loaded);
150   EXPECT_TRUE(g_inner_extension_loaded);
151   EXPECT_TRUE(g_outer_extension_loaded);
152 }