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 GetExtensionAPIDefinition = |
| 11 requireNative('apiDefinitions').GetExtensionAPIDefinition; |
| 12 var WebRequestEvent = require('webRequest').webRequestEvent; |
| 13 |
10 var watchForTag = require("tagWatcher").watchForTag; | 14 var watchForTag = require("tagWatcher").watchForTag; |
11 | 15 |
12 var WEB_VIEW_ATTRIBUTES = ['name', 'src', 'partition', 'autosize', 'minheight', | 16 var WEB_VIEW_ATTRIBUTES = ['name', 'src', 'partition', 'autosize', 'minheight', |
13 'minwidth', 'maxheight', 'maxwidth']; | 17 'minwidth', 'maxheight', 'maxwidth']; |
14 | 18 |
15 // All exposed api methods for <webview>, these are forwarded to the browser | 19 // All exposed api methods for <webview>, these are forwarded to the browser |
16 // plugin. | 20 // plugin. |
17 var WEB_VIEW_API_METHODS = [ | 21 var WEB_VIEW_API_METHODS = [ |
18 'back', | 22 'back', |
19 'canGoBack', | 23 'canGoBack', |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 get: function() { | 108 get: function() { |
105 return objectNode[attributeName]; | 109 return objectNode[attributeName]; |
106 }, | 110 }, |
107 set: function(value) { | 111 set: function(value) { |
108 objectNode[attributeName] = value; | 112 objectNode[attributeName] = value; |
109 }, | 113 }, |
110 enumerable: true | 114 enumerable: true |
111 }); | 115 }); |
112 }, this); | 116 }, this); |
113 | 117 |
| 118 |
| 119 // Populate the WebRequest events from the API definition. |
| 120 var webRequestDefinition = |
| 121 GetExtensionAPIDefinition('webRequest')[0]; |
| 122 for (var i = 0; i < webRequestDefinition.events.length; ++i) { |
| 123 Object.defineProperty(self.node_, webRequestDefinition.events[i].name, { |
| 124 get: function(webRequestEvent) { |
| 125 return function() { |
| 126 if (!self[webRequestEvent.name + '_']) { |
| 127 self[webRequestEvent.name + '_'] = |
| 128 new WebRequestEvent( |
| 129 'webview.' + webRequestEvent.name, |
| 130 webRequestEvent.parameters, |
| 131 webRequestEvent.extraParameters, null, |
| 132 self.objectNode_.getInstanceId()); |
| 133 } |
| 134 return self[webRequestEvent.name + '_']; |
| 135 } |
| 136 }(webRequestDefinition.events[i]), |
| 137 // No setter. |
| 138 enumerable: true |
| 139 }); |
| 140 } |
| 141 |
114 // We cannot use {writable: true} property descriptor because we want dynamic | 142 // We cannot use {writable: true} property descriptor because we want dynamic |
115 // getter value. | 143 // getter value. |
116 Object.defineProperty(this.node_, 'contentWindow', { | 144 Object.defineProperty(this.node_, 'contentWindow', { |
117 get: function() { | 145 get: function() { |
118 // TODO(fsamuel): This is a workaround to enable | 146 // TODO(fsamuel): This is a workaround to enable |
119 // contentWindow.postMessage until http://crbug.com/152006 is fixed. | 147 // contentWindow.postMessage until http://crbug.com/152006 is fixed. |
120 if (objectNode.contentWindow) | 148 if (objectNode.contentWindow) |
121 return objectNode.contentWindow.self; | 149 return objectNode.contentWindow.self; |
122 console.error('contentWindow is not available at this time. ' + | 150 console.error('contentWindow is not available at this time. ' + |
123 'It will become available when the page has finished loading.'); | 151 'It will become available when the page has finished loading.'); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 var node = this.node_; | 196 var node = this.node_; |
169 this.objectNode_.addEventListener('-internal-' + eventname, function(e) { | 197 this.objectNode_.addEventListener('-internal-' + eventname, function(e) { |
170 var evt = new Event(eventname, { bubbles: true }); | 198 var evt = new Event(eventname, { bubbles: true }); |
171 var detail = e.detail ? JSON.parse(e.detail) : {}; | 199 var detail = e.detail ? JSON.parse(e.detail) : {}; |
172 attribs.forEach(function(attribName) { | 200 attribs.forEach(function(attribName) { |
173 evt[attribName] = detail[attribName]; | 201 evt[attribName] = detail[attribName]; |
174 }); | 202 }); |
175 node.dispatchEvent(evt); | 203 node.dispatchEvent(evt); |
176 }); | 204 }); |
177 } | 205 } |
OLD | NEW |