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 "xwalk/extensions/common/xwalk_extension.h"
8 #include "xwalk/runtime/browser/runtime.h"
9 #include "xwalk/test/base/in_process_browser_test.h"
10 #include "xwalk/test/base/xwalk_test_utils.h"
11 #include "content/public/test/browser_test_utils.h"
12 #include "content/public/test/test_utils.h"
13 #include "base/task_runner.h"
14 #include "base/time/time.h"
16 using namespace xwalk::extensions; // NOLINT
20 const char* kEchoAPI =
21 "var echoListener = null;"
22 "extension.setMessageListener(function(msg) {"
23 " if (echoListener instanceof Function) {"
27 "exports.echo = function(msg, callback) {"
28 " echoListener = callback;"
29 " extension.postMessage(msg);"
31 "exports.syncEcho = function(msg) {"
32 " return extension.internal.sendSyncMessage(msg);"
35 class EchoContext : public XWalkExtensionInstance {
39 virtual void HandleMessage(scoped_ptr<base::Value> msg) OVERRIDE {
40 PostMessageToJS(msg.Pass());
42 virtual void HandleSyncMessage(scoped_ptr<base::Value> msg) OVERRIDE {
43 SendSyncReplyToJS(msg.Pass());
47 class DelayedEchoContext : public XWalkExtensionInstance {
49 explicit DelayedEchoContext() {
51 virtual void HandleMessage(scoped_ptr<base::Value> msg) OVERRIDE {
52 PostMessageToJS(msg.Pass());
54 virtual void HandleSyncMessage(scoped_ptr<base::Value> msg) OVERRIDE {
55 base::MessageLoop::current()->PostDelayedTask(
56 FROM_HERE, base::Bind(&DelayedEchoContext::DelayedReply,
57 base::Unretained(this), base::Passed(&msg)),
58 base::TimeDelta::FromSeconds(1));
61 void DelayedReply(scoped_ptr<base::Value> reply) {
62 SendSyncReplyToJS(reply.Pass());
66 class EchoExtension : public XWalkExtension {
68 EchoExtension() : XWalkExtension() {
70 set_javascript_api(kEchoAPI);
73 virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
74 s_instance_was_created = true;
75 return new EchoContext();
78 static bool s_instance_was_created;
81 bool EchoExtension::s_instance_was_created = false;
83 class DelayedEchoExtension : public XWalkExtension {
85 DelayedEchoExtension() : XWalkExtension() {
87 set_javascript_api(kEchoAPI);
90 virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
91 return new DelayedEchoContext();
95 class ExtensionWithInvalidName : public XWalkExtension {
97 ExtensionWithInvalidName() : XWalkExtension() {
98 set_name("invalid name with spaces");
101 virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
102 s_instance_was_created = true;
106 static bool s_instance_was_created;
109 bool ExtensionWithInvalidName::s_instance_was_created = false;
111 static const char* kBulkDataAPI = "var bulkDataListener = null;"
113 "extension.setMessageListener(function(msg) {"
114 " if (bulkDataListener instanceof Function) {"
115 " bulkDataListener(msg);"
119 "exports.requestBulkDataAsync = function(power, callback) {"
120 " bulkDataListener = callback;"
121 " extension.postMessage(power.toString());"
124 class BulkDataContext : public XWalkExtensionInstance {
128 virtual void HandleMessage(scoped_ptr<base::Value> msg) OVERRIDE {
130 msg->GetAsString(&message);
131 int size = atoi(message.c_str());
132 std::string data_chunk(size, 'p');
133 scoped_ptr<base::Value> data(new base::StringValue(data_chunk));
134 PostMessageToJS(data.Pass());
138 class BulkDataExtension : public XWalkExtension {
140 BulkDataExtension() : XWalkExtension() {
141 set_name("bulkData");
142 set_javascript_api(kBulkDataAPI);
145 virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
146 return new BulkDataContext();
152 class XWalkExtensionsTest : public XWalkExtensionsTestBase {
154 virtual void CreateExtensionsForUIThread(
155 XWalkExtensionVector* extensions) OVERRIDE {
156 extensions->push_back(new EchoExtension);
157 extensions->push_back(new ExtensionWithInvalidName);
158 extensions->push_back(new BulkDataExtension);
162 class XWalkExtensionsDelayedTest : public XWalkExtensionsTestBase {
164 virtual void CreateExtensionsForUIThread(
165 XWalkExtensionVector* extensions) OVERRIDE {
166 extensions->push_back(new DelayedEchoExtension);
170 IN_PROC_BROWSER_TEST_F(XWalkExtensionsTest, EchoExtension) {
171 content::RunAllPendingInMessageLoop();
172 GURL url = GetExtensionsTestURL(base::FilePath(),
173 base::FilePath().AppendASCII("test_extension.html"));
174 content::TitleWatcher title_watcher(runtime()->web_contents(), kPassString);
175 title_watcher.AlsoWaitForTitle(kFailString);
176 xwalk_test_utils::NavigateToURL(runtime(), url);
177 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());
180 IN_PROC_BROWSER_TEST_F(XWalkExtensionsTest, ExtensionWithInvalidNameIgnored) {
181 content::RunAllPendingInMessageLoop();
182 GURL url = GetExtensionsTestURL(base::FilePath(),
183 base::FilePath().AppendASCII("test_extension.html"));
184 content::TitleWatcher title_watcher(runtime()->web_contents(), kPassString);
185 title_watcher.AlsoWaitForTitle(kFailString);
186 xwalk_test_utils::NavigateToURL(runtime(), url);
187 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());
189 EXPECT_TRUE(EchoExtension::s_instance_was_created);
190 EXPECT_FALSE(ExtensionWithInvalidName::s_instance_was_created);
193 IN_PROC_BROWSER_TEST_F(XWalkExtensionsTest, EchoExtensionSync) {
194 content::RunAllPendingInMessageLoop();
195 GURL url = GetExtensionsTestURL(base::FilePath(),
196 base::FilePath().AppendASCII(
198 content::TitleWatcher title_watcher(runtime()->web_contents(), kPassString);
199 title_watcher.AlsoWaitForTitle(kFailString);
200 xwalk_test_utils::NavigateToURL(runtime(), url);
201 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());
204 IN_PROC_BROWSER_TEST_F(XWalkExtensionsDelayedTest, EchoExtensionSync) {
205 content::RunAllPendingInMessageLoop();
206 GURL url = GetExtensionsTestURL(base::FilePath(),
207 base::FilePath().AppendASCII(
209 content::TitleWatcher title_watcher(runtime()->web_contents(), kPassString);
210 title_watcher.AlsoWaitForTitle(kFailString);
211 xwalk_test_utils::NavigateToURL(runtime(), url);
212 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());
215 IN_PROC_BROWSER_TEST_F(XWalkExtensionsTest, BulkDataExtension) {
216 content::RunAllPendingInMessageLoop();
217 GURL url = GetExtensionsTestURL(base::FilePath(),
218 base::FilePath().AppendASCII("bulk_data_transmission.html"));
219 content::TitleWatcher title_watcher(runtime()->web_contents(), kPassString);
220 title_watcher.AlsoWaitForTitle(kFailString);
221 xwalk_test_utils::NavigateToURL(runtime(), url);
222 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());