OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Shim that simulates a <webview> tag via Mutation Observers. | 5 // Shim that simulates a <webview> tag via Mutation Observers. |
6 // | 6 // |
7 // The actual tag is implemented via the browser plugin. The internals of this | 7 // The actual tag is implemented via the browser plugin. The internals of this |
8 // are hidden via Shadow DOM. | 8 // are hidden via Shadow DOM. |
9 | 9 |
10 var chrome = requireNative('chrome').GetChrome(); | 10 var chrome = requireNative('chrome').GetChrome(); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 this.objectNode_.style.height = '100%'; | 56 this.objectNode_.style.height = '100%'; |
57 forEach(WEB_VIEW_ATTRIBUTES, function(i, attributeName) { | 57 forEach(WEB_VIEW_ATTRIBUTES, function(i, attributeName) { |
58 // Only copy attributes that have been assigned values, rather than copying | 58 // Only copy attributes that have been assigned values, rather than copying |
59 // a series of undefined attributes to BrowserPlugin. | 59 // a series of undefined attributes to BrowserPlugin. |
60 if (this.node_.hasAttribute(attributeName)) { | 60 if (this.node_.hasAttribute(attributeName)) { |
61 this.objectNode_.setAttribute( | 61 this.objectNode_.setAttribute( |
62 attributeName, this.node_.getAttribute(attributeName)); | 62 attributeName, this.node_.getAttribute(attributeName)); |
63 } | 63 } |
64 }, this); | 64 }, this); |
65 | 65 |
| 66 if (!this.node_.hasAttribute('tabIndex')) { |
| 67 // <webview> needs a tabIndex in order to respond to keyboard focus. |
| 68 // TODO(fsamuel): This introduces unexpected tab ordering. We need to find |
| 69 // a way to take keyboard focus without messing with tab ordering. |
| 70 // See http://crbug.com/231664. |
| 71 this.node_.setAttribute('tabIndex', 0); |
| 72 } |
| 73 var self = this; |
| 74 this.node_.addEventListener('focus', function(e) { |
| 75 // Focus the BrowserPlugin when the <webview> takes focus. |
| 76 self.objectNode_.focus(); |
| 77 }); |
| 78 this.node_.addEventListener('blur', function(e) { |
| 79 // Blur the BrowserPlugin when the <webview> loses focus. |
| 80 self.objectNode_.blur(); |
| 81 }); |
| 82 |
66 shadowRoot.appendChild(this.objectNode_); | 83 shadowRoot.appendChild(this.objectNode_); |
67 | 84 |
68 // this.objectNode_[apiMethod] are not necessarily defined immediately after | 85 // this.objectNode_[apiMethod] are not necessarily defined immediately after |
69 // the shadow object is appended to the shadow root. | 86 // the shadow object is appended to the shadow root. |
70 var self = this; | |
71 forEach(WEB_VIEW_API_METHODS, function(i, apiMethod) { | 87 forEach(WEB_VIEW_API_METHODS, function(i, apiMethod) { |
72 node[apiMethod] = function(var_args) { | 88 node[apiMethod] = function(var_args) { |
73 return self.objectNode_[apiMethod].apply(self.objectNode_, arguments); | 89 return self.objectNode_[apiMethod].apply(self.objectNode_, arguments); |
74 }; | 90 }; |
75 }, this); | 91 }, this); |
76 | 92 |
77 // Map attribute modifications on the <webview> tag to property changes in | 93 // Map attribute modifications on the <webview> tag to property changes in |
78 // the underlying <object> node. | 94 // the underlying <object> node. |
79 var handleMutation = function(i, mutation) { | 95 var handleMutation = function(i, mutation) { |
80 this.handleMutation_(mutation); | 96 this.handleMutation_(mutation); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 */ | 215 */ |
200 WebView.prototype.maybeSetupPermissionEvent_ = function() {}; | 216 WebView.prototype.maybeSetupPermissionEvent_ = function() {}; |
201 | 217 |
202 /** | 218 /** |
203 * Implemented when experimental permission is available. | 219 * Implemented when experimental permission is available. |
204 * @private | 220 * @private |
205 */ | 221 */ |
206 WebView.prototype.maybeSetupExecuteScript_ = function() {}; | 222 WebView.prototype.maybeSetupExecuteScript_ = function() {}; |
207 | 223 |
208 exports.WebView = WebView; | 224 exports.WebView = WebView; |
OLD | NEW |