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 shared functionality for different guestview | 5 // This module implements the shared functionality for different guestview |
6 // containers, such as web_view, app_view, etc. | 6 // containers, such as web_view, app_view, etc. |
7 | 7 |
8 var DocumentNatives = requireNative('document_natives'); | 8 var DocumentNatives = requireNative('document_natives'); |
9 var GuestView = require('guestView').GuestView; | 9 var GuestView = require('guestView').GuestView; |
10 var GuestViewInternalNatives = requireNative('guest_view_internal'); | 10 var GuestViewInternalNatives = requireNative('guest_view_internal'); |
11 var IdGenerator = requireNative('id_generator'); | 11 var IdGenerator = requireNative('id_generator'); |
12 | 12 |
13 function GuestViewContainer(element, viewType) { | 13 function GuestViewContainer(element, viewType) { |
14 privates(element).internal = this; | 14 privates(element).internal = this; |
15 this.element = element; | 15 this.element = element; |
16 this.elementAttached = false; | 16 this.elementAttached = false; |
17 this.guest = new GuestView(viewType); | |
18 this.viewInstanceId = IdGenerator.GetNextId(); | 17 this.viewInstanceId = IdGenerator.GetNextId(); |
19 this.viewType = viewType; | 18 this.viewType = viewType; |
20 | 19 |
| 20 this.setupGuestProperty(); |
| 21 this.guest = new GuestView(viewType); |
| 22 |
21 privates(this).browserPluginElement = this.createBrowserPluginElement(); | 23 privates(this).browserPluginElement = this.createBrowserPluginElement(); |
22 this.setupFocusPropagation(); | 24 this.setupFocusPropagation(); |
23 | 25 |
24 var shadowRoot = this.element.createShadowRoot(); | 26 var shadowRoot = this.element.createShadowRoot(); |
25 shadowRoot.appendChild(privates(this).browserPluginElement); | 27 shadowRoot.appendChild(privates(this).browserPluginElement); |
26 } | 28 } |
27 | 29 |
28 // Forward public API methods from |proto| to their internal implementations. | 30 // Forward public API methods from |proto| to their internal implementations. |
29 GuestViewContainer.forwardApiMethods = function(proto, apiMethods) { | 31 GuestViewContainer.forwardApiMethods = function(proto, apiMethods) { |
30 var createProtoHandler = function(m) { | 32 var createProtoHandler = function(m) { |
(...skipping 15 matching lines...) Expand all Loading... |
46 window.addEventListener('readystatechange', function listener(event) { | 48 window.addEventListener('readystatechange', function listener(event) { |
47 if (document.readyState == 'loading') { | 49 if (document.readyState == 'loading') { |
48 return; | 50 return; |
49 } | 51 } |
50 | 52 |
51 registerBrowserPluginElement( | 53 registerBrowserPluginElement( |
52 guestViewContainerType.VIEW_TYPE.toLowerCase()); | 54 guestViewContainerType.VIEW_TYPE.toLowerCase()); |
53 registerGuestViewElement(guestViewContainerType); | 55 registerGuestViewElement(guestViewContainerType); |
54 window.removeEventListener(event.type, listener, useCapture); | 56 window.removeEventListener(event.type, listener, useCapture); |
55 }, useCapture); | 57 }, useCapture); |
| 58 }; |
| 59 |
| 60 // Create the 'guest' property to track new GuestViews and always listen for |
| 61 // their resizes. |
| 62 GuestViewContainer.prototype.setupGuestProperty = function() { |
| 63 Object.defineProperty(this, 'guest', { |
| 64 get: function() { |
| 65 return privates(this).guest; |
| 66 }.bind(this), |
| 67 set: function(value) { |
| 68 privates(this).guest = value; |
| 69 if (!value) { |
| 70 return; |
| 71 } |
| 72 privates(this).guest.onresize = function(e) { |
| 73 // Dispatch the 'contentresize' event. |
| 74 var contentResizeEvent = new Event('contentresize', { bubbles: true }); |
| 75 contentResizeEvent.oldWidth = e.oldWidth; |
| 76 contentResizeEvent.oldHeight = e.oldHeight; |
| 77 contentResizeEvent.newWidth = e.newWidth; |
| 78 contentResizeEvent.newHeight = e.newHeight; |
| 79 this.dispatchEvent(contentResizeEvent); |
| 80 }.bind(this); |
| 81 }.bind(this), |
| 82 enumerable: true |
| 83 }); |
56 }; | 84 }; |
57 | 85 |
58 GuestViewContainer.prototype.createBrowserPluginElement = function() { | 86 GuestViewContainer.prototype.createBrowserPluginElement = function() { |
59 // We create BrowserPlugin as a custom element in order to observe changes | 87 // We create BrowserPlugin as a custom element in order to observe changes |
60 // to attributes synchronously. | 88 // to attributes synchronously. |
61 var browserPluginElement = | 89 var browserPluginElement = |
62 new GuestViewContainer[this.viewType + 'BrowserPlugin'](); | 90 new GuestViewContainer[this.viewType + 'BrowserPlugin'](); |
63 privates(browserPluginElement).internal = this; | 91 privates(browserPluginElement).internal = this; |
64 return browserPluginElement; | 92 return browserPluginElement; |
65 }; | 93 }; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 return; | 135 return; |
108 } | 136 } |
109 this.guest.attach(this.internalInstanceId, | 137 this.guest.attach(this.internalInstanceId, |
110 this.viewInstanceId, | 138 this.viewInstanceId, |
111 this.buildParams()); | 139 this.buildParams()); |
112 } | 140 } |
113 }; | 141 }; |
114 | 142 |
115 GuestViewContainer.prototype.onElementResize = function(oldWidth, oldHeight, | 143 GuestViewContainer.prototype.onElementResize = function(oldWidth, oldHeight, |
116 newWidth, newHeight) { | 144 newWidth, newHeight) { |
| 145 // Dispatch the 'resize' event. |
| 146 var resizeEvent = new Event('resize', { bubbles: true }); |
| 147 resizeEvent.oldWidth = oldWidth; |
| 148 resizeEvent.oldHeight = oldHeight; |
| 149 resizeEvent.newWidth = newWidth; |
| 150 resizeEvent.newHeight = newHeight; |
| 151 this.dispatchEvent(resizeEvent); |
| 152 |
117 if (!this.guest.getId()) | 153 if (!this.guest.getId()) |
118 return; | 154 return; |
119 this.guest.setSize( | 155 this.guest.setSize({normal: {width: newWidth, height: newHeight}}); |
120 {normal: {width: newWidth, height: newHeight}}); | |
121 }; | 156 }; |
122 | 157 |
123 GuestViewContainer.prototype.buildParams = function() { | 158 GuestViewContainer.prototype.buildParams = function() { |
124 var params = this.buildContainerParams(); | 159 var params = this.buildContainerParams(); |
125 params['instanceId'] = this.viewInstanceId; | 160 params['instanceId'] = this.viewInstanceId; |
126 var elementRect = this.element.getBoundingClientRect(); | 161 var elementRect = this.element.getBoundingClientRect(); |
127 params['elementWidth'] = parseInt(elementRect.width); | 162 params['elementWidth'] = parseInt(elementRect.width); |
128 params['elementHeight'] = parseInt(elementRect.height); | 163 params['elementHeight'] = parseInt(elementRect.height); |
129 return params; | 164 return params; |
130 }; | 165 }; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 // Delete the callbacks so developers cannot call them and produce unexpected | 262 // Delete the callbacks so developers cannot call them and produce unexpected |
228 // behavior. | 263 // behavior. |
229 delete proto.createdCallback; | 264 delete proto.createdCallback; |
230 delete proto.attachedCallback; | 265 delete proto.attachedCallback; |
231 delete proto.detachedCallback; | 266 delete proto.detachedCallback; |
232 delete proto.attributeChangedCallback; | 267 delete proto.attributeChangedCallback; |
233 } | 268 } |
234 | 269 |
235 // Exports. | 270 // Exports. |
236 exports.GuestViewContainer = GuestViewContainer; | 271 exports.GuestViewContainer = GuestViewContainer; |
OLD | NEW |