Index: extensions/renderer/resources/guest_view/guest_view_iframe.js |
diff --git a/extensions/renderer/resources/guest_view/guest_view_iframe.js b/extensions/renderer/resources/guest_view/guest_view_iframe.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c27c809e299687294c268151eb51d3e467acf513 |
--- /dev/null |
+++ b/extensions/renderer/resources/guest_view/guest_view_iframe.js |
@@ -0,0 +1,98 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// --site-per-process overrides for guest_view.js. |
+ |
+var GuestView = require('guestView').GuestView; |
+var GuestViewImpl = require('guestView').GuestViewImpl; |
+var GuestViewInternalNatives = requireNative('guest_view_internal'); |
+var ResizeEvent = require('guestView').ResizeEvent; |
+ |
+var getIframeContentWindow = function(viewInstanceId) { |
+ var view = GuestViewInternalNatives.GetViewFromID(viewInstanceId); |
+ if (!view) |
+ return null; |
+ |
+ var internalIframeElement = privates(view).internalElement; |
+ if (internalIframeElement) |
+ return internalIframeElement.contentWindow; |
+ |
+ return null; |
+}; |
+ |
+// Internal implementation of attach(). |
+GuestViewImpl.prototype.attachImpl$ = function( |
+ internalInstanceId, viewInstanceId, attachParams, callback) { |
+ // Check the current state. |
+ if (!this.checkState('attach')) { |
+ this.handleCallback(callback); |
+ return; |
+ } |
+ |
+ // Callback wrapper function to store the contentWindow from the attachGuest() |
+ // callback, handle potential attaching failure, register an automatic detach, |
+ // and advance the queue. |
+ var callbackWrapper = function(callback, contentWindow) { |
+ // Check if attaching failed. |
+ contentWindow = getIframeContentWindow(viewInstanceId); |
+ if (!contentWindow) { |
+ this.state = GuestViewImpl.GuestState.GUEST_STATE_CREATED; |
+ this.internalInstanceId = 0; |
+ } else { |
+ // Only update the contentWindow if attaching is successful. |
+ this.contentWindow = contentWindow; |
+ } |
+ |
+ this.handleCallback(callback); |
+ }; |
+ |
+ attachParams['instanceId'] = viewInstanceId; |
+ var contentWindow = getIframeContentWindow(viewInstanceId); |
+ // TODO(lazyboy): Call binding function to attach this guest. |
+ // |contentWindow| should be used to retrieve the RenderFrame in cpp. |
+ |
+ this.internalInstanceId = internalInstanceId; |
+ this.state = GuestViewImpl.GuestState.GUEST_STATE_ATTACHED; |
+ |
+ // Detach automatically when the container is destroyed. |
+ GuestViewInternalNatives.RegisterDestructionCallback( |
+ internalInstanceId, this.weakWrapper(function() { |
+ if (this.state != GuestViewImpl.GuestState.GUEST_STATE_ATTACHED || |
+ this.internalInstanceId != internalInstanceId) { |
+ return; |
+ } |
+ |
+ this.internalInstanceId = 0; |
+ this.state = GuestViewImpl.GuestState.GUEST_STATE_CREATED; |
+ }, viewInstanceId)); |
+}; |
+ |
+// Internal implementation of create(). |
+GuestViewImpl.prototype.createImpl$ = function(createParams, callback) { |
+ // Check the current state. |
+ if (!this.checkState('create')) { |
+ this.handleCallback(callback); |
+ return; |
+ } |
+ |
+ // Callback wrapper function to store the guestInstanceId from the |
+ // createGuest() callback, handle potential creation failure, and advance the |
+ // queue. |
+ var callbackWrapper = function(callback, guestInfo) { |
+ this.id = guestInfo.id; |
+ |
+ // Check if creation failed. |
+ if (this.id === 0) { |
+ this.state = GuestViewImpl.GuestState.GUEST_STATE_START; |
+ this.contentWindow = null; |
+ } |
+ |
+ ResizeEvent.addListener(this.callOnResize, {instanceId: this.id}); |
+ this.handleCallback(callback); |
+ }; |
+ |
+ this.sendCreateRequest(createParams, callbackWrapper.bind(this, callback)); |
+ |
+ this.state = GuestViewImpl.GuestState.GUEST_STATE_CREATED; |
+}; |