Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(312)

Side by Side Diff: chrome/renderer/resources/extensions/web_view.js

Issue 434523003: <webview>: Ensure that createGuest is only called after element attached to DOM (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 =
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 // Implemented when the experimental API is available. 81 // Implemented when the experimental API is available.
82 WebViewInternal.maybeRegisterExperimentalAPIs = function(proto) {} 82 WebViewInternal.maybeRegisterExperimentalAPIs = function(proto) {}
83 83
84 /** 84 /**
85 * @constructor 85 * @constructor
86 */ 86 */
87 function WebViewInternal(webviewNode) { 87 function WebViewInternal(webviewNode) {
88 privates(webviewNode).internal = this; 88 privates(webviewNode).internal = this;
89 this.webviewNode = webviewNode; 89 this.webviewNode = webviewNode;
90 this.attached = false; 90 this.attached = false;
91 this.elementAttached = false;
91 92
92 this.beforeFirstNavigation = true; 93 this.beforeFirstNavigation = true;
93 this.validPartitionId = true; 94 this.validPartitionId = true;
94 // Used to save some state upon deferred attachment. 95 // Used to save some state upon deferred attachment.
95 // If <object> bindings is not available, we defer attachment. 96 // If <object> bindings is not available, we defer attachment.
96 // This state contains whether or not the attachment request was for 97 // This state contains whether or not the attachment request was for
97 // newwindow. 98 // newwindow.
98 this.deferredAttachState = null; 99 this.deferredAttachState = null;
99 100
100 // on* Event handlers. 101 // on* Event handlers.
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 if (!this.partition.validPartitionId) { 620 if (!this.partition.validPartitionId) {
620 result.error = ERROR_MSG_INVALID_PARTITION_ATTRIBUTE; 621 result.error = ERROR_MSG_INVALID_PARTITION_ATTRIBUTE;
621 return false; 622 return false;
622 } 623 }
623 this.src = this.webviewNode.getAttribute('src'); 624 this.src = this.webviewNode.getAttribute('src');
624 625
625 if (!this.src) { 626 if (!this.src) {
626 return true; 627 return true;
627 } 628 }
628 629
630 if (!this.elementAttached) {
631 return true;
632 }
633
629 if (!this.hasGuestInstanceID()) { 634 if (!this.hasGuestInstanceID()) {
630 if (this.beforeFirstNavigation) { 635 if (this.beforeFirstNavigation) {
631 this.beforeFirstNavigation = false; 636 this.beforeFirstNavigation = false;
632 this.allocateInstanceId(); 637 this.allocateInstanceId();
633 } 638 }
634 return true; 639 return true;
635 } 640 }
636 641
637 // Navigate to this.src. 642 // Navigate to this.src.
638 WebView.navigate(this.instanceId, this.src); 643 WebView.navigate(this.instanceId, this.src);
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 } 851 }
847 852
848 // Registers <webview> custom element. 853 // Registers <webview> custom element.
849 function registerWebViewElement() { 854 function registerWebViewElement() {
850 var proto = Object.create(HTMLElement.prototype); 855 var proto = Object.create(HTMLElement.prototype);
851 856
852 proto.createdCallback = function() { 857 proto.createdCallback = function() {
853 new WebViewInternal(this); 858 new WebViewInternal(this);
854 }; 859 };
855 860
856 proto.customElementDetached = false;
857
858 proto.attributeChangedCallback = function(name, oldValue, newValue) { 861 proto.attributeChangedCallback = function(name, oldValue, newValue) {
859 var internal = privates(this).internal; 862 var internal = privates(this).internal;
860 if (!internal) { 863 if (!internal) {
861 return; 864 return;
862 } 865 }
863 internal.handleWebviewAttributeMutation(name, oldValue, newValue); 866 internal.handleWebviewAttributeMutation(name, oldValue, newValue);
864 }; 867 };
865 868
866 proto.detachedCallback = function() { 869 proto.detachedCallback = function() {
867 this.customElementDetached = true; 870 var internal = privates(this).internal;
871 if (!internal) {
872 return;
873 }
874 internal.elementAttached = false;
868 }; 875 };
869 876
870 proto.attachedCallback = function() { 877 proto.attachedCallback = function() {
871 if (this.customElementDetached) { 878 var internal = privates(this).internal;
872 var webViewInternal = privates(this).internal; 879 if (!internal) {
873 webViewInternal.resetUponReattachment(); 880 return;
874 webViewInternal.allocateInstanceId();
875 } 881 }
876 this.customElementDetached = false; 882 if (!internal.elementAttached) {
883 internal.elementAttached = true;
884 internal.resetUponReattachment();
885 internal.parseAttributes();
886 }
877 }; 887 };
878 888
879 var methods = [ 889 var methods = [
880 'back', 890 'back',
881 'find', 891 'find',
882 'forward', 892 'forward',
883 'canGoBack', 893 'canGoBack',
884 'canGoForward', 894 'canGoForward',
885 'clearData', 895 'clearData',
886 'getProcessId', 896 'getProcessId',
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 }; 972 };
963 973
964 /** 974 /**
965 * Implemented when the experimental API is available. 975 * Implemented when the experimental API is available.
966 * @private 976 * @private
967 */ 977 */
968 WebViewInternal.prototype.setupExperimentalContextMenus = function() {}; 978 WebViewInternal.prototype.setupExperimentalContextMenus = function() {};
969 979
970 exports.WebView = WebView; 980 exports.WebView = WebView;
971 exports.WebViewInternal = WebViewInternal; 981 exports.WebViewInternal = WebViewInternal;
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698