- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / test / data / extensions / platform_apps / web_view / focus / embedder.js
1 // Copyright 2013 The Chromium Authors. 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 var embedder = {};
6 embedder.tests = {};
7 embedder.triggerNavUrl =
8     'data:text/html,<html><body>trigger navigation<body></html>';
9
10 window.runTest = function(testName) {
11   if (!embedder.test.testList[testName]) {
12     console.log('Incorrect testName: ' + testName);
13     embedder.test.fail();
14     return;
15   }
16
17   // Run the test.
18   embedder.test.testList[testName]();
19 };
20 // window.* exported functions end.
21
22 embedder.test = {};
23 embedder.test.succeed = function() {
24   chrome.test.sendMessage('TEST_PASSED');
25 };
26
27 embedder.test.fail = function() {
28   chrome.test.sendMessage('TEST_FAILED');
29 };
30
31 embedder.test.assertEq = function(a, b) {
32   if (a != b) {
33     console.log('assertion failed: ' + a + ' != ' + b);
34     embedder.test.fail();
35   }
36 };
37
38 embedder.test.assertTrue = function(condition) {
39   if (!condition) {
40     console.log('assertion failed: true != ' + condition);
41     embedder.test.fail();
42   }
43 };
44
45 embedder.test.assertFalse = function(condition) {
46   if (condition) {
47     console.log('assertion failed: false != ' + condition);
48     embedder.test.fail();
49   }
50 };
51
52 /** @private */
53 embedder.setUpGuest_ = function() {
54   document.querySelector('#webview-tag-container').innerHTML =
55       '<webview style="width: 100px; height: 100px;"></webview>';
56   var webview = document.querySelector('webview');
57   if (!webview) {
58     embedder.test.fail('No <webview> element created');
59   }
60   return webview;
61 };
62
63 /** @private */
64 embedder.waitForResponseFromGuest_ =
65     function(webview,
66              channelCreationCallback,
67              expectedResponse,
68              responseCallback) {
69   var onPostMessageReceived = function(e) {
70     var data = JSON.parse(e.data);
71     var response = data[0];
72     if (response == 'connected') {
73       channelCreationCallback(webview);
74       return;
75     }
76     if (response != expectedResponse) {
77       return;
78     }
79     responseCallback();
80     window.removeEventListener('message', onPostMessageReceived);
81   };
82   window.addEventListener('message', onPostMessageReceived);
83
84   var onWebViewLoadStop = function(e) {
85     console.log('loadstop');
86     webview.executeScript(
87       {file: 'inject_focus.js'},
88       function(results) {
89         console.log('Injected script into webview.');
90         // Establish a communication channel with the webview1's guest.
91         var msg = ['connect'];
92         webview.contentWindow.postMessage(JSON.stringify(msg), '*');
93       });
94     webview.removeEventListener('loadstop', onWebViewLoadStop);
95   };
96   webview.addEventListener('loadstop', onWebViewLoadStop);
97   webview.src = embedder.triggerNavUrl;
98 };
99
100 // Tests begin.
101
102 // The embedder has to initiate a post message so that the guest can get a
103 // reference to embedder to send the reply back.
104
105 embedder.testFocus_ = function(channelCreationCallback,
106                                expectedResponse,
107                                responseCallback) {
108   var webview = embedder.setUpGuest_();
109
110   embedder.waitForResponseFromGuest_(webview,
111                                      channelCreationCallback,
112                                      expectedResponse,
113                                      responseCallback);
114 };
115
116 function testFocusEvent() {
117   var seenResponse = false;
118   embedder.testFocus_(function(webview) {
119     webview.focus();
120   }, 'focused', function() {
121     // The focus event fires three times on first focus. We only care about
122     // the first focus.
123     if (seenResponse) {
124       return;
125     }
126     seenResponse = true;
127     embedder.test.succeed();
128   });
129 }
130
131 function testBlurEvent() {
132   var seenResponse = false;
133   embedder.testFocus_(function(webview) {
134     webview.focus();
135     webview.blur();
136   }, 'blurred', function() {
137     if (seenResponse) {
138       return;
139     }
140     seenResponse = true;
141     embedder.test.succeed();
142   });
143 }
144
145 embedder.test.testList = {
146   'testFocusEvent': testFocusEvent,
147   'testBlurEvent': testBlurEvent
148 };
149
150 onload = function() {
151   chrome.test.getConfig(function(config) {
152     chrome.test.sendMessage('Launched');
153   });
154 };