Chromium Code Reviews| 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 // This module implements Webview (<webview>) as a custom element that wraps a | 5 // This module implements Webview (<webview>) as a custom element that wraps a |
| 6 // BrowserPlugin object element. The object element is hidden within | 6 // BrowserPlugin object element. The object element is hidden within |
| 7 // the shadow DOM of the Webview element. | 7 // the shadow DOM of the Webview element. |
| 8 | 8 |
| 9 var DocumentNatives = requireNative('document_natives'); | 9 var DocumentNatives = requireNative('document_natives'); |
| 10 var GuestViewInternal = | 10 var GuestViewInternal = |
| 11 require('binding').Binding.create('guestViewInternal').generate(); | 11 require('binding').Binding.create('guestViewInternal').generate(); |
| 12 var IdGenerator = requireNative('id_generator'); | 12 var IdGenerator = requireNative('id_generator'); |
| 13 // TODO(lazyboy): Rename this to WebViewInternal and call WebViewInternal | 13 // TODO(lazyboy): Rename this to WebViewInternal and call WebViewInternal |
| 14 // something else. | 14 // something else. |
| 15 var WebView = require('webViewInternal').WebView; | 15 var WebView = require('webViewInternal').WebView; |
| 16 var WebViewEvents = require('webViewEvents').WebViewEvents; | 16 var WebViewEvents = require('webViewEvents').WebViewEvents; |
| 17 | 17 |
| 18 var WEB_VIEW_ATTRIBUTE_MAXHEIGHT = 'maxheight'; | 18 var WEB_VIEW_ATTRIBUTE_MAXHEIGHT = 'maxheight'; |
| 19 var WEB_VIEW_ATTRIBUTE_MAXWIDTH = 'maxwidth'; | 19 var WEB_VIEW_ATTRIBUTE_MAXWIDTH = 'maxwidth'; |
| 20 var WEB_VIEW_ATTRIBUTE_MINHEIGHT = 'minheight'; | 20 var WEB_VIEW_ATTRIBUTE_MINHEIGHT = 'minheight'; |
| 21 var WEB_VIEW_ATTRIBUTE_MINWIDTH = 'minwidth'; | 21 var WEB_VIEW_ATTRIBUTE_MINWIDTH = 'minwidth'; |
| 22 var AUTO_SIZE_ATTRIBUTES = [ | |
| 23 'autosize', | |
| 24 WEB_VIEW_ATTRIBUTE_MAXHEIGHT, | |
| 25 WEB_VIEW_ATTRIBUTE_MAXWIDTH, | |
| 26 WEB_VIEW_ATTRIBUTE_MINHEIGHT, | |
| 27 WEB_VIEW_ATTRIBUTE_MINWIDTH | |
| 28 ]; | |
| 29 | |
| 22 var WEB_VIEW_ATTRIBUTE_PARTITION = 'partition'; | 30 var WEB_VIEW_ATTRIBUTE_PARTITION = 'partition'; |
| 23 | 31 |
| 24 var PLUGIN_METHOD_ATTACH = '-internal-attach'; | 32 var PLUGIN_METHOD_ATTACH = '-internal-attach'; |
| 25 | 33 |
| 26 var ERROR_MSG_ALREADY_NAVIGATED = | 34 var ERROR_MSG_ALREADY_NAVIGATED = |
| 27 'The object has already navigated, so its partition cannot be changed.'; | 35 'The object has already navigated, so its partition cannot be changed.'; |
| 28 var ERROR_MSG_INVALID_PARTITION_ATTRIBUTE = 'Invalid partition attribute.'; | 36 var ERROR_MSG_INVALID_PARTITION_ATTRIBUTE = 'Invalid partition attribute.'; |
| 29 | 37 |
| 30 /** @type {Array.<string>} */ | 38 /** @type {Array.<string>} */ |
| 31 var WEB_VIEW_ATTRIBUTES = [ | 39 var WEB_VIEW_ATTRIBUTES = [ |
| 32 'allowtransparency', | 40 'allowtransparency', |
| 33 'autosize', | |
| 34 WEB_VIEW_ATTRIBUTE_MINHEIGHT, | |
| 35 WEB_VIEW_ATTRIBUTE_MINWIDTH, | |
| 36 WEB_VIEW_ATTRIBUTE_MAXHEIGHT, | |
| 37 WEB_VIEW_ATTRIBUTE_MAXWIDTH | |
| 38 ]; | 41 ]; |
| 39 | 42 |
| 40 /** @class representing state of storage partition. */ | 43 /** @class representing state of storage partition. */ |
| 41 function Partition() { | 44 function Partition() { |
| 42 this.validPartitionId = true; | 45 this.validPartitionId = true; |
| 43 this.persistStorage = false; | 46 this.persistStorage = false; |
| 44 this.storagePartitionId = ''; | 47 this.storagePartitionId = ''; |
| 45 }; | 48 }; |
| 46 | 49 |
| 47 Partition.prototype.toAttribute = function() { | 50 Partition.prototype.toAttribute = function() { |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 307 /** | 310 /** |
| 308 * @private | 311 * @private |
| 309 */ | 312 */ |
| 310 WebViewInternal.prototype.insertCSS = function(var_args) { | 313 WebViewInternal.prototype.insertCSS = function(var_args) { |
| 311 this.validateExecuteCodeCall(); | 314 this.validateExecuteCodeCall(); |
| 312 var args = $Array.concat([this.instanceId, this.src], | 315 var args = $Array.concat([this.instanceId, this.src], |
| 313 $Array.slice(arguments)); | 316 $Array.slice(arguments)); |
| 314 $Function.apply(WebView.insertCSS, null, args); | 317 $Function.apply(WebView.insertCSS, null, args); |
| 315 }; | 318 }; |
| 316 | 319 |
| 320 WebViewInternal.prototype.setupAutoSizeProperties = function() { | |
| 321 var self = this; | |
| 322 $Array.forEach(AUTO_SIZE_ATTRIBUTES, function(attributeName) { | |
| 323 this[attributeName] = this.webviewNode.getAttribute(attributeName); | |
| 324 Object.defineProperty(this.webviewNode, attributeName, { | |
| 325 get: function() { | |
| 326 return self[attributeName]; | |
| 327 }, | |
| 328 set: function(value) { | |
| 329 self.webviewNode.setAttribute(attributeName, value); | |
| 330 }, | |
| 331 enumerable: true | |
| 332 }); | |
| 333 }, this); | |
| 334 }; | |
| 335 | |
| 317 /** | 336 /** |
| 318 * @private | 337 * @private |
| 319 */ | 338 */ |
| 320 WebViewInternal.prototype.setupWebviewNodeProperties = function() { | 339 WebViewInternal.prototype.setupWebviewNodeProperties = function() { |
| 321 var ERROR_MSG_CONTENTWINDOW_NOT_AVAILABLE = '<webview>: ' + | 340 var ERROR_MSG_CONTENTWINDOW_NOT_AVAILABLE = '<webview>: ' + |
| 322 'contentWindow is not available at this time. It will become available ' + | 341 'contentWindow is not available at this time. It will become available ' + |
| 323 'when the page has finished loading.'; | 342 'when the page has finished loading.'; |
| 324 | 343 |
| 344 this.setupAutoSizeProperties(); | |
| 325 var self = this; | 345 var self = this; |
| 326 var browserPluginNode = this.browserPluginNode; | 346 var browserPluginNode = this.browserPluginNode; |
| 327 // Expose getters and setters for the attributes. | 347 // Expose getters and setters for the attributes. |
| 328 $Array.forEach(WEB_VIEW_ATTRIBUTES, function(attributeName) { | 348 $Array.forEach(WEB_VIEW_ATTRIBUTES, function(attributeName) { |
| 329 Object.defineProperty(this.webviewNode, attributeName, { | 349 Object.defineProperty(this.webviewNode, attributeName, { |
| 330 get: function() { | 350 get: function() { |
| 331 if (browserPluginNode.hasOwnProperty(attributeName)) { | 351 if (browserPluginNode.hasOwnProperty(attributeName)) { |
| 332 return browserPluginNode[attributeName]; | 352 return browserPluginNode[attributeName]; |
| 333 } else { | 353 } else { |
| 334 return browserPluginNode.getAttribute(attributeName); | 354 return browserPluginNode.getAttribute(attributeName); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 438 /** | 458 /** |
| 439 * @private | 459 * @private |
| 440 */ | 460 */ |
| 441 WebViewInternal.prototype.handleWebviewAttributeMutation = | 461 WebViewInternal.prototype.handleWebviewAttributeMutation = |
| 442 function(name, oldValue, newValue) { | 462 function(name, oldValue, newValue) { |
| 443 // This observer monitors mutations to attributes of the <webview> and | 463 // This observer monitors mutations to attributes of the <webview> and |
| 444 // updates the BrowserPlugin properties accordingly. In turn, updating | 464 // updates the BrowserPlugin properties accordingly. In turn, updating |
| 445 // a BrowserPlugin property will update the corresponding BrowserPlugin | 465 // a BrowserPlugin property will update the corresponding BrowserPlugin |
| 446 // attribute, if necessary. See BrowserPlugin::UpdateDOMAttribute for more | 466 // attribute, if necessary. See BrowserPlugin::UpdateDOMAttribute for more |
| 447 // details. | 467 // details. |
| 448 if (name == 'name') { | 468 if (AUTO_SIZE_ATTRIBUTES.indexOf(name) > -1) { |
| 469 this[name] = newValue; | |
| 470 if (!this.instanceId) { | |
| 471 return; | |
| 472 } | |
| 473 // Convert autosize attribute to boolean. | |
| 474 var autosize = (this.autosize + '').toLowerCase() == 'true' ? true : false; | |
|
lazyboy
2014/07/31 04:24:22
This is bad way of specifying attributes IIRC, don
Fady Samuel
2014/08/01 18:12:52
Fixed.
| |
| 475 WebView.setAutoSize(this.instanceId, { | |
| 476 'enableAutoSize': autosize, | |
| 477 'min': { | |
| 478 'width': parseInt(this.minwidth || 0), | |
| 479 'height': parseInt(this.minheight || 0) | |
| 480 }, | |
| 481 'max': { | |
| 482 'width': parseInt(this.maxwidth || 0), | |
| 483 'height': parseInt(this.maxheight || 0) | |
| 484 } | |
| 485 }); | |
| 486 } else if (name == 'name') { | |
| 449 // We treat null attribute (attribute removed) and the empty string as | 487 // We treat null attribute (attribute removed) and the empty string as |
| 450 // one case. | 488 // one case. |
| 451 oldValue = oldValue || ''; | 489 oldValue = oldValue || ''; |
| 452 newValue = newValue || ''; | 490 newValue = newValue || ''; |
| 453 | 491 |
| 454 if (oldValue === newValue) { | 492 if (oldValue === newValue) { |
| 455 return; | 493 return; |
| 456 } | 494 } |
| 457 this.name = newValue; | 495 this.name = newValue; |
| 458 if (!this.instanceId) { | 496 if (!this.instanceId) { |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 776 | 814 |
| 777 WebViewInternal.prototype.getZoom = function(callback) { | 815 WebViewInternal.prototype.getZoom = function(callback) { |
| 778 if (!this.instanceId) { | 816 if (!this.instanceId) { |
| 779 return; | 817 return; |
| 780 } | 818 } |
| 781 WebView.getZoom(this.instanceId, callback); | 819 WebView.getZoom(this.instanceId, callback); |
| 782 }; | 820 }; |
| 783 | 821 |
| 784 WebViewInternal.prototype.buildAttachParams = function(isNewWindow) { | 822 WebViewInternal.prototype.buildAttachParams = function(isNewWindow) { |
| 785 var params = { | 823 var params = { |
| 786 'api': 'webview', | 824 'autosize': (this.autosize + '').toLowerCase() == 'true' ? true : false, |
| 787 'instanceId': this.viewInstanceId, | 825 'instanceId': this.viewInstanceId, |
| 826 'maxheight': parseInt(this.maxheight || 0), | |
| 827 'maxwidth': parseInt(this.maxwidth || 0), | |
| 828 'minheight': parseInt(this.minheight || 0), | |
| 829 'minwidth': parseInt(this.minwidth || 0), | |
| 788 'name': this.name, | 830 'name': this.name, |
| 789 // We don't need to navigate new window from here. | 831 // We don't need to navigate new window from here. |
| 790 'src': isNewWindow ? undefined : this.src, | 832 'src': isNewWindow ? undefined : this.src, |
| 791 // If we have a partition from the opener, that will also be already | 833 // If we have a partition from the opener, that will also be already |
| 792 // set via this.onAttach(). | 834 // set via this.onAttach(). |
| 793 'storagePartitionId': this.partition.toAttribute(), | 835 'storagePartitionId': this.partition.toAttribute(), |
| 794 'userAgentOverride': this.userAgentOverride | 836 'userAgentOverride': this.userAgentOverride |
| 795 }; | 837 }; |
| 796 return params; | 838 return params; |
| 797 }; | 839 }; |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 962 }; | 1004 }; |
| 963 | 1005 |
| 964 /** | 1006 /** |
| 965 * Implemented when the experimental API is available. | 1007 * Implemented when the experimental API is available. |
| 966 * @private | 1008 * @private |
| 967 */ | 1009 */ |
| 968 WebViewInternal.prototype.setupExperimentalContextMenus = function() {}; | 1010 WebViewInternal.prototype.setupExperimentalContextMenus = function() {}; |
| 969 | 1011 |
| 970 exports.WebView = WebView; | 1012 exports.WebView = WebView; |
| 971 exports.WebViewInternal = WebViewInternal; | 1013 exports.WebViewInternal = WebViewInternal; |
| OLD | NEW |