diff --git a/atom.gyp b/atom.gyp index c825be06cb42..898c6135271c 100644 --- a/atom.gyp +++ b/atom.gyp @@ -281,6 +281,8 @@ 'atom/renderer/atom_render_view_observer.h', 'atom/renderer/atom_renderer_client.cc', 'atom/renderer/atom_renderer_client.h', + 'atom/renderer/guest_view_container.cc', + 'atom/renderer/guest_view_container.h', 'chromium_src/chrome/browser/browser_process.cc', 'chromium_src/chrome/browser/browser_process.h', 'chromium_src/chrome/browser/chrome_notification_types.h', @@ -550,8 +552,9 @@ 'SK_SUPPORT_LEGACY_GETTOPDEVICE', # Disable warnings for g_settings_list_schemas. 'GLIB_DISABLE_DEPRECATION_WARNINGS', - # Defined in V8. + # Defined in Chromium but not exposed in its gyp file. 'V8_USE_EXTERNAL_STARTUP_DATA', + 'ENABLE_PLUGINS', ], 'sources': [ '<@(lib_sources)', diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 76b484452612..a9538167519b 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -56,6 +56,7 @@ WebContents::WebContents(content::WebContents* web_contents) guest_instance_id_(-1), element_instance_id_(-1), guest_opaque_(true), + guest_sizer_(nullptr), auto_size_enabled_(false) { } @@ -63,6 +64,7 @@ WebContents::WebContents(const mate::Dictionary& options) : guest_instance_id_(-1), element_instance_id_(-1), guest_opaque_(true), + guest_sizer_(nullptr), auto_size_enabled_(false) { options.Get("guestInstanceId", &guest_instance_id_); @@ -287,6 +289,14 @@ void WebContents::DidAttach(int guest_proxy_routing_id) { void WebContents::ElementSizeChanged(const gfx::Size& size) { element_size_ = size; + + // Only resize if needed. + if (!size.IsEmpty()) + guest_sizer_->SizeContents(size); +} + +content::WebContents* WebContents::GetOwnerWebContents() const { + return embedder_web_contents_; } void WebContents::GuestSizeChanged(const gfx::Size& old_size, @@ -302,6 +312,10 @@ void WebContents::RegisterDestructionCallback( destruction_callback_ = callback; } +void WebContents::SetGuestSizer(content::GuestSizer* guest_sizer) { + guest_sizer_ = guest_sizer; +} + void WebContents::WillAttach(content::WebContents* embedder_web_contents, int element_instance_id, bool is_full_page_plugin) { diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 298871f40e75..d570078d4c34 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -176,9 +176,11 @@ class WebContents : public mate::EventEmitter, // content::BrowserPluginGuestDelegate: void DidAttach(int guest_proxy_routing_id) final; void ElementSizeChanged(const gfx::Size& size) final; + content::WebContents* GetOwnerWebContents() const final; void GuestSizeChanged(const gfx::Size& old_size, const gfx::Size& new_size) final; void RegisterDestructionCallback(const DestructionCallback& callback) final; + void SetGuestSizer(content::GuestSizer* guest_sizer) final; void WillAttach(content::WebContents* embedder_web_contents, int element_instance_id, bool is_full_page_plugin) final; @@ -223,6 +225,9 @@ class WebContents : public mate::EventEmitter, // element may not match the size of the guest. gfx::Size guest_size_; + // A pointer to the guest_sizer. + content::GuestSizer* guest_sizer_; + // Indicates whether autosize mode is enabled or not. bool auto_size_enabled_; diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index 7a738f9a5d97..01daaa655fcb 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -10,6 +10,7 @@ #include "atom/common/node_bindings.h" #include "atom/common/options_switches.h" #include "atom/renderer/atom_render_view_observer.h" +#include "atom/renderer/guest_view_container.h" #include "chrome/renderer/printing/print_web_view_helper.h" #include "chrome/renderer/tts_dispatcher.h" #include "content/public/common/content_constants.h" @@ -149,6 +150,17 @@ bool AtomRendererClient::ShouldFork(blink::WebFrame* frame, return http_method == "GET"; } +content::BrowserPluginDelegate* AtomRendererClient::CreateBrowserPluginDelegate( + content::RenderFrame* render_frame, + const std::string& mime_type, + const GURL& original_url) { + if (mime_type == content::kBrowserPluginMimeType) { + return new GuestViewContainer(render_frame); + } else { + return nullptr; + } +} + void AtomRendererClient::EnableWebRuntimeFeatures() { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); bool b; diff --git a/atom/renderer/atom_renderer_client.h b/atom/renderer/atom_renderer_client.h index e6c89e1c2f7c..4aba42c5ad48 100644 --- a/atom/renderer/atom_renderer_client.h +++ b/atom/renderer/atom_renderer_client.h @@ -51,6 +51,10 @@ class AtomRendererClient : public content::ContentRendererClient, bool is_initial_navigation, bool is_server_redirect, bool* send_referrer) override; + content::BrowserPluginDelegate* CreateBrowserPluginDelegate( + content::RenderFrame* render_frame, + const std::string& mime_type, + const GURL& original_url) override; void EnableWebRuntimeFeatures(); diff --git a/atom/renderer/guest_view_container.cc b/atom/renderer/guest_view_container.cc new file mode 100644 index 000000000000..f23c36dfd356 --- /dev/null +++ b/atom/renderer/guest_view_container.cc @@ -0,0 +1,15 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#include "atom/renderer/guest_view_container.h" + +namespace atom { + +GuestViewContainer::GuestViewContainer(content::RenderFrame* render_frame) { +} + +GuestViewContainer::~GuestViewContainer() { +} + +} // namespace atom diff --git a/atom/renderer/guest_view_container.h b/atom/renderer/guest_view_container.h new file mode 100644 index 000000000000..5a21dad028ff --- /dev/null +++ b/atom/renderer/guest_view_container.h @@ -0,0 +1,24 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef ATOM_RENDERER_GUEST_VIEW_CONTAINER_H_ +#define ATOM_RENDERER_GUEST_VIEW_CONTAINER_H_ + +#include "content/public/renderer/browser_plugin_delegate.h" +#include "v8/include/v8.h" + +namespace atom { + +class GuestViewContainer : public content::BrowserPluginDelegate { + public: + explicit GuestViewContainer(content::RenderFrame* render_frame); + ~GuestViewContainer() override; + + private: + DISALLOW_COPY_AND_ASSIGN(GuestViewContainer); +}; + +} // namespace atom + +#endif // ATOM_RENDERER_GUEST_VIEW_CONTAINER_H_