b3232f1c4b71caaa3654b9d0327a39419c842294
[platform/framework/web/crosswalk.git] / src / xwalk / extensions / test / in_process_threads_browsertest.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 "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"
12
13 using namespace xwalk::extensions;  // NOLINT
14
15 const char kInProcessExtensionThread[] = "in_process_extension_thread";
16 const char kInProcessUIThread[] = "in_process_ui_thread";
17
18 class InProcessExtension;
19
20 class InProcessExtensionInstance : public XWalkExtensionInstance {
21  public:
22   InProcessExtensionInstance() {}
23
24   scoped_ptr<base::Value> InRunningOnUIThread() {
25     bool is_on_ui_thread =
26         content::BrowserThread::CurrentlyOn(content::BrowserThread::UI);
27
28     scoped_ptr<base::ListValue> reply(new base::ListValue);
29     reply->AppendBoolean(is_on_ui_thread);
30
31     return reply.PassAs<base::Value>();
32   }
33
34   virtual void HandleMessage(scoped_ptr<base::Value> msg) OVERRIDE {
35     PostMessageToJS(InRunningOnUIThread());
36   }
37
38   virtual void HandleSyncMessage(scoped_ptr<base::Value> msg) OVERRIDE {
39     SendSyncReplyToJS(InRunningOnUIThread());
40   }
41 };
42
43 class InProcessExtension : public XWalkExtension {
44  public:
45   explicit InProcessExtension(const char* name) {
46     set_name(name);
47     set_javascript_api(
48       "var listener = null;"
49       "extension.setMessageListener(function(msg) {"
50       "  listener(msg);"
51       "});"
52       "exports.isExtensionRunningOnUIThread = function(callback) {"
53       "  listener = callback;"
54       "  extension.postMessage('');"
55       "};"
56       "exports.syncIsExtensionRunningOnUIThread = function() {"
57       "  return extension.internal.sendSyncMessage('');"
58       "};");
59   }
60
61   virtual XWalkExtensionInstance* CreateInstance() OVERRIDE {
62     return new InProcessExtensionInstance();
63   }
64 };
65
66 class InProcessThreadsTest : public XWalkExtensionsTestBase {
67  public:
68   virtual void CreateExtensionsForUIThread(
69       XWalkExtensionVector* extensions) OVERRIDE {
70     extensions->push_back(new InProcessExtension(kInProcessUIThread));
71   }
72
73   virtual void CreateExtensionsForExtensionThread(
74       XWalkExtensionVector* extensions) OVERRIDE {
75     extensions->push_back(new InProcessExtension(kInProcessExtensionThread));
76   }
77 };
78
79 IN_PROC_BROWSER_TEST_F(InProcessThreadsTest, InProcessThreads) {
80   content::RunAllPendingInMessageLoop();
81
82   content::TitleWatcher title_watcher(runtime()->web_contents(), kPassString);
83   title_watcher.AlsoWaitForTitle(kFailString);
84
85   GURL url = GetExtensionsTestURL(base::FilePath(),
86       base::FilePath().AppendASCII("in_process_threads.html"));
87   xwalk_test_utils::NavigateToURL(runtime(), url);
88
89   EXPECT_EQ(kPassString, title_watcher.WaitAndGetTitle());
90 }