diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index b2a0eef6cde0..571ae0f7f2aa 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -34,11 +34,13 @@ v8::Persistent template_; WebContents::WebContents(content::WebContents* web_contents) : content::WebContentsObserver(web_contents), guest_instance_id_(-1), + guest_opaque_(true), auto_size_enabled_(false) { } WebContents::WebContents(const mate::Dictionary& options) : guest_instance_id_(-1), + guest_opaque_(true), auto_size_enabled_(false) { options.Get("guestInstanceId", &guest_instance_id_); @@ -103,6 +105,13 @@ void WebContents::RenderViewReady() { if (!is_guest()) return; + // We don't want to accidentally set the opacity of an interstitial page. + // WebContents::GetRenderWidgetHostView will return the RWHV of an + // interstitial page if one is showing at this time. We only want opacity + // to apply to web pages. + web_contents()->GetRenderViewHost()->GetView()-> + SetBackgroundOpaque(guest_opaque_); + content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); if (auto_size_enabled_) { rvh->EnableAutoResize(min_auto_size_, max_auto_size_); @@ -291,6 +300,17 @@ void WebContents::SetAutoSize(bool enabled, } } +void WebContents::SetAllowTransparency(bool allow) { + if (guest_opaque_ != allow) + return; + + guest_opaque_ = !allow; + if (!web_contents()->GetRenderViewHost()->GetView()) + return; + + web_contents()->GetRenderViewHost()->GetView()->SetBackgroundOpaque(!allow); +} + mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder( v8::Isolate* isolate) { if (template_.IsEmpty()) @@ -318,6 +338,7 @@ mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder( .SetMethod("_executeJavaScript", &WebContents::ExecuteJavaScript) .SetMethod("_send", &WebContents::SendIPCMessage) .SetMethod("setAutoSize", &WebContents::SetAutoSize) + .SetMethod("setAllowTransparency", &WebContents::SetAllowTransparency) .Build()); return mate::ObjectTemplateBuilder( diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index ee2fcc784d85..0dcd47114dc8 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -61,6 +61,9 @@ class WebContents : public mate::EventEmitter, const gfx::Size& min_size, const gfx::Size& max_size); + // Sets the transparency of the guest. + void SetAllowTransparency(bool allow); + // Returns whether this is a guest view. bool is_guest() const { return guest_instance_id_ != -1; } @@ -129,6 +132,9 @@ class WebContents : public mate::EventEmitter, DestructionCallback destruction_callback_; + // Stores whether the contents of the guest can be transparent. + bool guest_opaque_; + // The extra parameters associated with this guest view passed // in from JavaScript. This will typically be the view instance ID, // the API to use, and view-specific parameters. These parameters diff --git a/atom/browser/api/lib/web-contents.coffee b/atom/browser/api/lib/web-contents.coffee index 24f7375cb994..318769eab535 100644 --- a/atom/browser/api/lib/web-contents.coffee +++ b/atom/browser/api/lib/web-contents.coffee @@ -22,14 +22,6 @@ module.exports.wrap = (webContents) -> else webContents.once 'did-finish-load', @_executeJavaScript.bind(this, code) - # Init guest web view. - webContents.on 'internal-did-attach', (event, params) -> - min = width: params.minwidth, height: params.minheight - max = width: params.maxwidth, height: params.maxheight - @setAutoSize params.autosize, min, max - if params.src - @loadUrl params.src - # The processId and routingId and identify a webContents. webContents.getId = -> "#{@getProcessId()}-#{@getRoutingId()}" webContents.equal = (other) -> @getId() is other.getId() diff --git a/atom/browser/lib/guest-view-manager.coffee b/atom/browser/lib/guest-view-manager.coffee index e66103ba1890..10de5a5d6d5e 100644 --- a/atom/browser/lib/guest-view-manager.coffee +++ b/atom/browser/lib/guest-view-manager.coffee @@ -22,7 +22,18 @@ createGuest = (embedder, params) -> webViewManager.addGuest id, embedder, guest # Destroy guest when the embedder is gone. - embedder.once 'render-view-deleted', -> destroyGuest id + embedder.once 'render-view-deleted', -> + destroyGuest id + + # Init guest web view after attached. + guest.once 'internal-did-attach', (event, params) -> + min = width: params.minwidth, height: params.minheight + max = width: params.maxwidth, height: params.maxheight + @setAutoSize params.autosize, min, max + if params.src + @loadUrl params.src + if params.allowtransparency? + @setAllowTransparency params.allowtransparency id @@ -35,8 +46,11 @@ destroyGuest = (id) -> ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_CREATE_GUEST', (event, type, params, requestId) -> event.sender.send "ATOM_SHELL_RESPONSE_#{requestId}", createGuest(event.sender, params) -ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_DESTROY_GUEST', (event, guestInstanceId) -> - destroyGuest guestInstanceId +ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_DESTROY_GUEST', (event, id) -> + destroyGuest id -ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_AUTO_SIZE', (event, guestInstanceId, params) -> +ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_AUTO_SIZE', (event, id, params) -> guestInstances[id]?.setAutoSize params.enableAutoSize, params.min, params.max + +ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_ALLOW_TRANSPARENCY', (event, id, allowtransparency) -> + guestInstances[id]?.setAllowTransparency allowtransparency diff --git a/atom/renderer/lib/guest-view-internal.coffee b/atom/renderer/lib/guest-view-internal.coffee index e2fd9b356b90..7fc2de3f2dde 100644 --- a/atom/renderer/lib/guest-view-internal.coffee +++ b/atom/renderer/lib/guest-view-internal.coffee @@ -13,3 +13,6 @@ module.exports = setAutoSize: (guestInstanceId, params) -> ipc.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_AUTO_SIZE', guestInstanceId, params + + setAllowTransparency: (guestInstanceId, allowtransparency) -> + ipc.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_ALLOW_TRANSPARENCY', guestInstanceId, allowtransparency diff --git a/atom/renderer/lib/webview.coffee b/atom/renderer/lib/webview.coffee index 1e1ee08210fa..7a7672343525 100644 --- a/atom/renderer/lib/webview.coffee +++ b/atom/renderer/lib/webview.coffee @@ -242,8 +242,7 @@ class WebView return unless @guestInstanceId - # FIXME - # WebViewInternal.setAllowTransparency @guestInstanceId, @allowtransparency + guestViewInternal.setAllowTransparency @guestInstanceId, @allowtransparency else if name is 'name' # We treat null attribute (attribute removed) and the empty string as # one case.