Update To 11.40.268.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 using xwalk::Runtime;
15
16 namespace {
17
18 bool g_outer_extension_loaded = false;
19 bool g_inner_extension_loaded = false;
20 bool g_another_extension_loaded = false;
21
22 }
23
24 class OuterInstance : public XWalkExtensionInstance {
25  public:
26   OuterInstance() {
27     g_outer_extension_loaded = true;
28   }
29   void HandleMessage(scoped_ptr<base::Value> msg) override {}
30 };
31
32 class OuterExtension : public XWalkExtension {
33  public:
34   OuterExtension() : XWalkExtension() {
35     set_name("outer");
36     set_javascript_api("exports.value = true");
37   }
38
39   XWalkExtensionInstance* CreateInstance() override {
40     return new OuterInstance;
41   }
42 };
43
44 class InnerInstance : public XWalkExtensionInstance {
45  public:
46   InnerInstance() {
47     g_inner_extension_loaded = true;
48   }
49   void HandleMessage(scoped_ptr<base::Value> msg) override {}
50 };
51
52 class InnerExtension : public XWalkExtension {
53  public:
54   InnerExtension() : XWalkExtension() {
55     set_name("outer.inner");
56     set_javascript_api("exports.value = true;");
57   }
58
59   XWalkExtensionInstance* CreateInstance() override {
60     return new InnerInstance;
61   }
62 };
63
64 class AnotherInstance : public XWalkExtensionInstance {
65  public:
66   AnotherInstance() {
67     g_another_extension_loaded = true;
68   }
69   void HandleMessage(scoped_ptr<base::Value> msg) override {}
70 };
71
72 class AnotherExtension : public XWalkExtension {
73  public:
74   AnotherExtension() : XWalkExtension() {
75     set_name("another");
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
79     // extension.
80     set_javascript_api("if (outer.inner.value === true) { "
81                        "exports.value = true;"
82                        "}");
83   }
84
85   XWalkExtensionInstance* CreateInstance() override {
86     return new AnotherInstance;
87   }
88 };
89
90 class XWalkExtensionsNestedNamespaceTest : public XWalkExtensionsTestBase {
91  public:
92   void CreateExtensionsForUIThread(
93       XWalkExtensionVector* extensions) override {
94     extensions->push_back(new OuterExtension);
95     extensions->push_back(new InnerExtension);
96   }
97 };
98
99 class XWalkExtensionsTrampolinesForNested : public XWalkExtensionsTestBase {
100  public:
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);
106   }
107 };
108
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"));
114
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());
119
120   EXPECT_TRUE(g_outer_extension_loaded);
121   EXPECT_TRUE(g_inner_extension_loaded);
122 }
123
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"));
129
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());
134
135   EXPECT_TRUE(g_outer_extension_loaded);
136   EXPECT_FALSE(g_inner_extension_loaded);
137 }
138
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"));
144
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());
149
150   EXPECT_TRUE(g_another_extension_loaded);
151   EXPECT_TRUE(g_inner_extension_loaded);
152   EXPECT_TRUE(g_outer_extension_loaded);
153 }