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 "content/public/browser/browser_thread.h"
6 #include "content/public/test/browser_test_utils.h"
7 #include "content/public/test/test_utils.h"
8 #include "xwalk/extensions/common/xwalk_extension.h"
9 #include "xwalk/extensions/test/xwalk_extensions_test_base.h"
10 #include "xwalk/runtime/browser/runtime.h"
11 #include "xwalk/test/base/xwalk_test_utils.h"
13 using namespace xwalk::extensions; // NOLINT
15 const char kInProcessExtensionThread[] = "in_process_extension_thread";
16 const char kInProcessUIThread[] = "in_process_ui_thread";
18 class InProcessExtension;
20 class InProcessExtensionInstance : public XWalkExtensionInstance {
22 InProcessExtensionInstance() {}
24 scoped_ptr<base::Value> InRunningOnUIThread() {
25 bool is_on_ui_thread =
26 content::BrowserThread::CurrentlyOn(content::BrowserThread::UI);
28 scoped_ptr<base::ListValue> reply(new base::ListValue);
29 reply->AppendBoolean(is_on_ui_thread);
31 return reply.PassAs<base::Value>();
34 virtual void HandleMessage(scoped_ptr<base::Value> msg) OVERRIDE {
35 PostMessageToJS(InRunningOnUIThread());
38 virtual void HandleSyncMessage(scoped_ptr<base::Value> msg) OVERRIDE {
39 SendSyncReplyToJS(InRunningOnUIThread());
43 class InProcessExtension : public XWalkExtension {
45 explicit InProcessExtension(const char* name) {
48 "var listener = null;"
49 "extension.setMessageListener(function(msg) {"
52 "exports.isExtensionRunningOnUIThread = function(callback) {"
53 " listener = callback;"
54 " extension.postMessage('');"
56 "exports.syncIsExtensionRunningOnUIThread = function() {"
57 " return extension.internal.sendSyncMessage('');"
61 virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
62 return new InProcessExtensionInstance();
66 class InProcessThreadsTest : public XWalkExtensionsTestBase {
68 virtual void CreateExtensionsForUIThread(
69 XWalkExtensionVector* extensions) OVERRIDE {
70 extensions->push_back(new InProcessExtension(kInProcessUIThread));
73 virtual void CreateExtensionsForExtensionThread(
74 XWalkExtensionVector* extensions) OVERRIDE {
75 extensions->push_back(new InProcessExtension(kInProcessExtensionThread));
79 IN_PROC_BROWSER_TEST_F(InProcessThreadsTest, InProcessThreads) {
80 content::RunAllPendingInMessageLoop();
82 content::TitleWatcher title_watcher(runtime()->web_contents(), kPassString);
83 title_watcher.AlsoWaitForTitle(kFailString);
85 GURL url = GetExtensionsTestURL(base::FilePath(),
86 base::FilePath().AppendASCII("in_process_threads.html"));
87 xwalk_test_utils::NavigateToURL(runtime(), url);
89 EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());