OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 // This module implements the attributes of the <webview> tag. | 5 // This module implements the attributes of the <webview> tag. |
6 | 6 |
7 var GuestViewInternal = | 7 var GuestViewInternal = |
8 require('binding').Binding.create('guestViewInternal').generate(); | 8 require('binding').Binding.create('guestViewInternal').generate(); |
9 var WebViewImpl = require('webView').WebViewImpl; | 9 var WebViewImpl = require('webView').WebViewImpl; |
10 var WebViewConstants = require('webViewConstants').WebViewConstants; | 10 var WebViewConstants = require('webViewConstants').WebViewConstants; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 if (this.ignoreMutation) { | 57 if (this.ignoreMutation) { |
58 return; | 58 return; |
59 } | 59 } |
60 | 60 |
61 this.handleMutation(oldValue, newValue); | 61 this.handleMutation(oldValue, newValue); |
62 }; | 62 }; |
63 | 63 |
64 // Called when a change that isn't ignored occurs to the attribute's value. | 64 // Called when a change that isn't ignored occurs to the attribute's value. |
65 WebViewAttribute.prototype.handleMutation = function(oldValue, newValue) {}; | 65 WebViewAttribute.prototype.handleMutation = function(oldValue, newValue) {}; |
66 | 66 |
| 67 // Called when the <webview> element is detached from the DOM tree. |
| 68 WebViewAttribute.prototype.reset = function() {}; |
| 69 |
67 // An attribute that is treated as a Boolean. | 70 // An attribute that is treated as a Boolean. |
68 function BooleanAttribute(name, webViewImpl) { | 71 function BooleanAttribute(name, webViewImpl) { |
69 WebViewAttribute.call(this, name, webViewImpl); | 72 WebViewAttribute.call(this, name, webViewImpl); |
70 } | 73 } |
71 | 74 |
72 BooleanAttribute.prototype.__proto__ = WebViewAttribute.prototype; | 75 BooleanAttribute.prototype.__proto__ = WebViewAttribute.prototype; |
73 | 76 |
74 BooleanAttribute.prototype.getValue = function() { | 77 BooleanAttribute.prototype.getValue = function() { |
75 return this.webViewImpl.element.hasAttribute(this.name); | 78 return this.webViewImpl.element.hasAttribute(this.name); |
76 }; | 79 }; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 this, WebViewConstants.ATTRIBUTE_PARTITION, webViewImpl); | 172 this, WebViewConstants.ATTRIBUTE_PARTITION, webViewImpl); |
170 this.validPartitionId = true; | 173 this.validPartitionId = true; |
171 } | 174 } |
172 | 175 |
173 PartitionAttribute.prototype.__proto__ = WebViewAttribute.prototype; | 176 PartitionAttribute.prototype.__proto__ = WebViewAttribute.prototype; |
174 | 177 |
175 PartitionAttribute.prototype.handleMutation = function(oldValue, newValue) { | 178 PartitionAttribute.prototype.handleMutation = function(oldValue, newValue) { |
176 newValue = newValue || ''; | 179 newValue = newValue || ''; |
177 | 180 |
178 // The partition cannot change if the webview has already navigated. | 181 // The partition cannot change if the webview has already navigated. |
179 if (!this.webViewImpl.beforeFirstNavigation) { | 182 if (!this.webViewImpl.attributes[ |
| 183 WebViewConstants.ATTRIBUTE_SRC].beforeFirstNavigation) { |
180 window.console.error(WebViewConstants.ERROR_MSG_ALREADY_NAVIGATED); | 184 window.console.error(WebViewConstants.ERROR_MSG_ALREADY_NAVIGATED); |
181 this.setValueIgnoreMutation(oldValue); | 185 this.setValueIgnoreMutation(oldValue); |
182 return; | 186 return; |
183 } | 187 } |
184 if (newValue == 'persist:') { | 188 if (newValue == 'persist:') { |
185 this.validPartitionId = false; | 189 this.validPartitionId = false; |
186 window.console.error( | 190 window.console.error( |
187 WebViewConstants.ERROR_MSG_INVALID_PARTITION_ATTRIBUTE); | 191 WebViewConstants.ERROR_MSG_INVALID_PARTITION_ATTRIBUTE); |
188 } | 192 } |
189 }; | 193 }; |
190 | 194 |
| 195 PartitionAttribute.prototype.reset = function() { |
| 196 this.validPartitionId = true; |
| 197 }; |
| 198 |
191 // Attribute that handles the location and navigation of the webview. | 199 // Attribute that handles the location and navigation of the webview. |
192 function SrcAttribute(webViewImpl) { | 200 function SrcAttribute(webViewImpl) { |
193 WebViewAttribute.call(this, WebViewConstants.ATTRIBUTE_SRC, webViewImpl); | 201 WebViewAttribute.call(this, WebViewConstants.ATTRIBUTE_SRC, webViewImpl); |
194 this.setupMutationObserver(); | 202 this.setupMutationObserver(); |
| 203 this.beforeFirstNavigation = true; |
195 } | 204 } |
196 | 205 |
197 SrcAttribute.prototype.__proto__ = WebViewAttribute.prototype; | 206 SrcAttribute.prototype.__proto__ = WebViewAttribute.prototype; |
198 | 207 |
199 SrcAttribute.prototype.setValueIgnoreMutation = function(value) { | 208 SrcAttribute.prototype.setValueIgnoreMutation = function(value) { |
200 // takeRecords() is needed to clear queued up src mutations. Without it, it is | 209 // takeRecords() is needed to clear queued up src mutations. Without it, it is |
201 // possible for this change to get picked up asyncronously by src's mutation | 210 // possible for this change to get picked up asyncronously by src's mutation |
202 // observer |observer|, and then get handled even though we do not want to | 211 // observer |observer|, and then get handled even though we do not want to |
203 // handle this mutation. | 212 // handle this mutation. |
204 this.observer.takeRecords(); | 213 this.observer.takeRecords(); |
205 this.ignoreMutation = true; | 214 this.ignoreMutation = true; |
206 this.webViewImpl.element.setAttribute(this.name, value || ''); | 215 this.webViewImpl.element.setAttribute(this.name, value || ''); |
207 this.ignoreMutation = false; | 216 this.ignoreMutation = false; |
208 } | 217 } |
209 | 218 |
210 SrcAttribute.prototype.handleMutation = function(oldValue, newValue) { | 219 SrcAttribute.prototype.handleMutation = function(oldValue, newValue) { |
211 // Once we have navigated, we don't allow clearing the src attribute. | 220 // Once we have navigated, we don't allow clearing the src attribute. |
212 // Once <webview> enters a navigated state, it cannot return to a | 221 // Once <webview> enters a navigated state, it cannot return to a |
213 // placeholder state. | 222 // placeholder state. |
214 if (!newValue && oldValue) { | 223 if (!newValue && oldValue) { |
215 // src attribute changes normally initiate a navigation. We suppress | 224 // src attribute changes normally initiate a navigation. We suppress |
216 // the next src attribute handler call to avoid reloading the page | 225 // the next src attribute handler call to avoid reloading the page |
217 // on every guest-initiated navigation. | 226 // on every guest-initiated navigation. |
218 this.setValueIgnoreMutation(oldValue); | 227 this.setValueIgnoreMutation(oldValue); |
219 return; | 228 return; |
220 } | 229 } |
221 this.parse(); | 230 this.parse(); |
222 }; | 231 }; |
223 | 232 |
| 233 SrcAttribute.prototype.reset = function() { |
| 234 this.beforeFirstNavigation = true; |
| 235 }; |
| 236 |
224 // The purpose of this mutation observer is to catch assignment to the src | 237 // The purpose of this mutation observer is to catch assignment to the src |
225 // attribute without any changes to its value. This is useful in the case | 238 // attribute without any changes to its value. This is useful in the case |
226 // where the webview guest has crashed and navigating to the same address | 239 // where the webview guest has crashed and navigating to the same address |
227 // spawns off a new process. | 240 // spawns off a new process. |
228 SrcAttribute.prototype.setupMutationObserver = | 241 SrcAttribute.prototype.setupMutationObserver = |
229 function() { | 242 function() { |
230 this.observer = new MutationObserver(function(mutations) { | 243 this.observer = new MutationObserver(function(mutations) { |
231 $Array.forEach(mutations, function(mutation) { | 244 $Array.forEach(mutations, function(mutation) { |
232 var oldValue = mutation.oldValue; | 245 var oldValue = mutation.oldValue; |
233 var newValue = this.getValue(); | 246 var newValue = this.getValue(); |
(...skipping 13 matching lines...) Expand all Loading... |
247 | 260 |
248 SrcAttribute.prototype.parse = function() { | 261 SrcAttribute.prototype.parse = function() { |
249 if (!this.webViewImpl.elementAttached || | 262 if (!this.webViewImpl.elementAttached || |
250 !this.webViewImpl.attributes[ | 263 !this.webViewImpl.attributes[ |
251 WebViewConstants.ATTRIBUTE_PARTITION].validPartitionId || | 264 WebViewConstants.ATTRIBUTE_PARTITION].validPartitionId || |
252 !this.getValue()) { | 265 !this.getValue()) { |
253 return; | 266 return; |
254 } | 267 } |
255 | 268 |
256 if (!this.webViewImpl.guest.getId()) { | 269 if (!this.webViewImpl.guest.getId()) { |
257 if (this.webViewImpl.beforeFirstNavigation) { | 270 if (this.beforeFirstNavigation) { |
258 this.webViewImpl.beforeFirstNavigation = false; | 271 this.beforeFirstNavigation = false; |
259 this.webViewImpl.createGuest(); | 272 this.webViewImpl.createGuest(); |
260 } | 273 } |
261 return; | 274 return; |
262 } | 275 } |
263 | 276 |
264 // Navigate to |src|. | 277 // Navigate to |src|. |
265 WebViewInternal.navigate(this.webViewImpl.guest.getId(), this.getValue()); | 278 WebViewInternal.navigate(this.webViewImpl.guest.getId(), this.getValue()); |
266 }; | 279 }; |
267 | 280 |
268 // ----------------------------------------------------------------------------- | 281 // ----------------------------------------------------------------------------- |
(...skipping 15 matching lines...) Expand all Loading... |
284 | 297 |
285 var autosizeAttributes = [WebViewConstants.ATTRIBUTE_MAXHEIGHT, | 298 var autosizeAttributes = [WebViewConstants.ATTRIBUTE_MAXHEIGHT, |
286 WebViewConstants.ATTRIBUTE_MAXWIDTH, | 299 WebViewConstants.ATTRIBUTE_MAXWIDTH, |
287 WebViewConstants.ATTRIBUTE_MINHEIGHT, | 300 WebViewConstants.ATTRIBUTE_MINHEIGHT, |
288 WebViewConstants.ATTRIBUTE_MINWIDTH]; | 301 WebViewConstants.ATTRIBUTE_MINWIDTH]; |
289 for (var i = 0; autosizeAttributes[i]; ++i) { | 302 for (var i = 0; autosizeAttributes[i]; ++i) { |
290 this.attributes[autosizeAttributes[i]] = | 303 this.attributes[autosizeAttributes[i]] = |
291 new AutosizeDimensionAttribute(autosizeAttributes[i], this); | 304 new AutosizeDimensionAttribute(autosizeAttributes[i], this); |
292 } | 305 } |
293 }; | 306 }; |
OLD | NEW |