Listen to ElementSizeChanged event
This commit is contained in:
		
					parent
					
						
							
								e4bb456964
							
						
					
				
			
			
				commit
				
					
						b5c9fe78f1
					
				
			
		
					 9 changed files with 104 additions and 8 deletions
				
			
		| 
						 | 
					@ -62,7 +62,7 @@ struct Converter<atom::api::SetSizeParams> {
 | 
				
			||||||
      out->min_size.reset(new gfx::Size(size));
 | 
					      out->min_size.reset(new gfx::Size(size));
 | 
				
			||||||
    if (params.Get("max", &size))
 | 
					    if (params.Get("max", &size))
 | 
				
			||||||
      out->max_size.reset(new gfx::Size(size));
 | 
					      out->max_size.reset(new gfx::Size(size));
 | 
				
			||||||
    if (params.Get("elementSize", &size))
 | 
					    if (params.Get("normal", &size))
 | 
				
			||||||
      out->normal_size.reset(new gfx::Size(size));
 | 
					      out->normal_size.reset(new gfx::Size(size));
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,6 @@ app.on('ready', function() {
 | 
				
			||||||
  mainWindow = new BrowserWindow({
 | 
					  mainWindow = new BrowserWindow({
 | 
				
			||||||
    width: 800,
 | 
					    width: 800,
 | 
				
			||||||
    height: 600,
 | 
					    height: 600,
 | 
				
			||||||
    resizable: false,
 | 
					 | 
				
			||||||
    'auto-hide-menu-bar': true,
 | 
					    'auto-hide-menu-bar': true,
 | 
				
			||||||
    'use-content-size': true,
 | 
					    'use-content-size': true,
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,6 +58,8 @@ createGuest = (embedder, params) ->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @viewInstanceId = params.instanceId
 | 
					    @viewInstanceId = params.instanceId
 | 
				
			||||||
    @setSize
 | 
					    @setSize
 | 
				
			||||||
 | 
					      normal:
 | 
				
			||||||
 | 
					        width: params.elementWidth, height: params.elementHeight
 | 
				
			||||||
      enableAutoSize: params.autosize
 | 
					      enableAutoSize: params.autosize
 | 
				
			||||||
      min:
 | 
					      min:
 | 
				
			||||||
        width: params.minwidth, height: params.minheight
 | 
					        width: params.minwidth, height: params.minheight
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,9 +10,11 @@
 | 
				
			||||||
#define USE(WTF_FEATURE) (defined WTF_USE_##WTF_FEATURE  && WTF_USE_##WTF_FEATURE)  // NOLINT
 | 
					#define USE(WTF_FEATURE) (defined WTF_USE_##WTF_FEATURE  && WTF_USE_##WTF_FEATURE)  // NOLINT
 | 
				
			||||||
#define ENABLE(WTF_FEATURE) (defined ENABLE_##WTF_FEATURE  && ENABLE_##WTF_FEATURE)  // NOLINT
 | 
					#define ENABLE(WTF_FEATURE) (defined ENABLE_##WTF_FEATURE  && ENABLE_##WTF_FEATURE)  // NOLINT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "atom/common/native_mate_converters/gfx_converter.h"
 | 
				
			||||||
#include "atom/common/native_mate_converters/string16_converter.h"
 | 
					#include "atom/common/native_mate_converters/string16_converter.h"
 | 
				
			||||||
#include "atom/renderer/api/atom_api_spell_check_client.h"
 | 
					#include "atom/renderer/api/atom_api_spell_check_client.h"
 | 
				
			||||||
#include "content/public/renderer/render_frame.h"
 | 
					#include "content/public/renderer/render_frame.h"
 | 
				
			||||||
 | 
					#include "native_mate/callback.h"
 | 
				
			||||||
#include "native_mate/dictionary.h"
 | 
					#include "native_mate/dictionary.h"
 | 
				
			||||||
#include "native_mate/object_template_builder.h"
 | 
					#include "native_mate/object_template_builder.h"
 | 
				
			||||||
#include "third_party/WebKit/public/web/WebDocument.h"
 | 
					#include "third_party/WebKit/public/web/WebDocument.h"
 | 
				
			||||||
| 
						 | 
					@ -78,6 +80,14 @@ v8::Local<v8::Value> WebFrame::RegisterEmbedderCustomElement(
 | 
				
			||||||
  return web_frame_->document().registerEmbedderCustomElement(name, options, c);
 | 
					  return web_frame_->document().registerEmbedderCustomElement(name, options, c);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void WebFrame::RegisterElementResizeCallback(
 | 
				
			||||||
 | 
					    int element_instance_id,
 | 
				
			||||||
 | 
					    const GuestViewContainer::ResizeCallback& callback) {
 | 
				
			||||||
 | 
					  auto guest_view_container = GuestViewContainer::FromID(element_instance_id);
 | 
				
			||||||
 | 
					  if (guest_view_container)
 | 
				
			||||||
 | 
					    guest_view_container->RegisterElementResizeCallback(callback);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WebFrame::AttachGuest(int id) {
 | 
					void WebFrame::AttachGuest(int id) {
 | 
				
			||||||
  content::RenderFrame::FromWebFrame(web_frame_)->AttachGuest(id);
 | 
					  content::RenderFrame::FromWebFrame(web_frame_)->AttachGuest(id);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -106,6 +116,8 @@ mate::ObjectTemplateBuilder WebFrame::GetObjectTemplateBuilder(
 | 
				
			||||||
      .SetMethod("getZoomFactor", &WebFrame::GetZoomFactor)
 | 
					      .SetMethod("getZoomFactor", &WebFrame::GetZoomFactor)
 | 
				
			||||||
      .SetMethod("registerEmbedderCustomElement",
 | 
					      .SetMethod("registerEmbedderCustomElement",
 | 
				
			||||||
                 &WebFrame::RegisterEmbedderCustomElement)
 | 
					                 &WebFrame::RegisterEmbedderCustomElement)
 | 
				
			||||||
 | 
					      .SetMethod("registerElementResizeCallback",
 | 
				
			||||||
 | 
					                 &WebFrame::RegisterElementResizeCallback)
 | 
				
			||||||
      .SetMethod("attachGuest", &WebFrame::AttachGuest)
 | 
					      .SetMethod("attachGuest", &WebFrame::AttachGuest)
 | 
				
			||||||
      .SetMethod("setSpellCheckProvider", &WebFrame::SetSpellCheckProvider)
 | 
					      .SetMethod("setSpellCheckProvider", &WebFrame::SetSpellCheckProvider)
 | 
				
			||||||
      .SetMethod("registerUrlSchemeAsSecure",
 | 
					      .SetMethod("registerUrlSchemeAsSecure",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "atom/renderer/guest_view_container.h"
 | 
				
			||||||
#include "base/memory/scoped_ptr.h"
 | 
					#include "base/memory/scoped_ptr.h"
 | 
				
			||||||
#include "native_mate/handle.h"
 | 
					#include "native_mate/handle.h"
 | 
				
			||||||
#include "native_mate/wrappable.h"
 | 
					#include "native_mate/wrappable.h"
 | 
				
			||||||
| 
						 | 
					@ -42,6 +43,9 @@ class WebFrame : public mate::Wrappable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  v8::Local<v8::Value> RegisterEmbedderCustomElement(
 | 
					  v8::Local<v8::Value> RegisterEmbedderCustomElement(
 | 
				
			||||||
      const base::string16& name, v8::Local<v8::Object> options);
 | 
					      const base::string16& name, v8::Local<v8::Object> options);
 | 
				
			||||||
 | 
					  void RegisterElementResizeCallback(
 | 
				
			||||||
 | 
					      int element_instance_id,
 | 
				
			||||||
 | 
					      const GuestViewContainer::ResizeCallback& callback);
 | 
				
			||||||
  void AttachGuest(int element_instance_id);
 | 
					  void AttachGuest(int element_instance_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Set the provider that will be used by SpellCheckClient for spell check.
 | 
					  // Set the provider that will be used by SpellCheckClient for spell check.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,12 +4,54 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "atom/renderer/guest_view_container.h"
 | 
					#include "atom/renderer/guest_view_container.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <map>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "base/lazy_instance.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace atom {
 | 
					namespace atom {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GuestViewContainer::GuestViewContainer(content::RenderFrame* render_frame) {
 | 
					namespace {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using GuestViewContainerMap = std::map<int, GuestViewContainer*>;
 | 
				
			||||||
 | 
					static base::LazyInstance<GuestViewContainerMap> g_guest_view_container_map =
 | 
				
			||||||
 | 
					    LAZY_INSTANCE_INITIALIZER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}  // namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GuestViewContainer::GuestViewContainer(content::RenderFrame* render_frame)
 | 
				
			||||||
 | 
					    : render_frame_(render_frame) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GuestViewContainer::~GuestViewContainer() {
 | 
					GuestViewContainer::~GuestViewContainer() {
 | 
				
			||||||
 | 
					  if (element_instance_id_ > 0)
 | 
				
			||||||
 | 
					    g_guest_view_container_map.Get().erase(element_instance_id_);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// static
 | 
				
			||||||
 | 
					GuestViewContainer* GuestViewContainer::FromID(int element_instance_id) {
 | 
				
			||||||
 | 
					  GuestViewContainerMap* guest_view_containers =
 | 
				
			||||||
 | 
					      g_guest_view_container_map.Pointer();
 | 
				
			||||||
 | 
					  auto it = guest_view_containers->find(element_instance_id);
 | 
				
			||||||
 | 
					  return it == guest_view_containers->end() ? nullptr : it->second;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GuestViewContainer::RegisterElementResizeCallback(
 | 
				
			||||||
 | 
					    const ResizeCallback& callback) {
 | 
				
			||||||
 | 
					  element_resize_callback_ = callback;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GuestViewContainer::SetElementInstanceID(int element_instance_id) {
 | 
				
			||||||
 | 
					  element_instance_id_ = element_instance_id;
 | 
				
			||||||
 | 
					  g_guest_view_container_map.Get().insert(
 | 
				
			||||||
 | 
					      std::make_pair(element_instance_id, this));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GuestViewContainer::DidResizeElement(const gfx::Size& old_size,
 | 
				
			||||||
 | 
					                                          const gfx::Size& new_size) {
 | 
				
			||||||
 | 
					  if (element_resize_callback_.is_null())
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  element_resize_callback_.Run(old_size, new_size);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace atom
 | 
					}  // namespace atom
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,17 +5,38 @@
 | 
				
			||||||
#ifndef ATOM_RENDERER_GUEST_VIEW_CONTAINER_H_
 | 
					#ifndef ATOM_RENDERER_GUEST_VIEW_CONTAINER_H_
 | 
				
			||||||
#define ATOM_RENDERER_GUEST_VIEW_CONTAINER_H_
 | 
					#define ATOM_RENDERER_GUEST_VIEW_CONTAINER_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "base/callback.h"
 | 
				
			||||||
#include "content/public/renderer/browser_plugin_delegate.h"
 | 
					#include "content/public/renderer/browser_plugin_delegate.h"
 | 
				
			||||||
#include "v8/include/v8.h"
 | 
					
 | 
				
			||||||
 | 
					namespace gfx {
 | 
				
			||||||
 | 
					class Size;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace atom {
 | 
					namespace atom {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class GuestViewContainer : public content::BrowserPluginDelegate {
 | 
					class GuestViewContainer : public content::BrowserPluginDelegate {
 | 
				
			||||||
 public:
 | 
					 public:
 | 
				
			||||||
 | 
					  typedef base::Callback<void(const gfx::Size&, const gfx::Size&)>
 | 
				
			||||||
 | 
					      ResizeCallback;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  explicit GuestViewContainer(content::RenderFrame* render_frame);
 | 
					  explicit GuestViewContainer(content::RenderFrame* render_frame);
 | 
				
			||||||
  ~GuestViewContainer() override;
 | 
					  ~GuestViewContainer() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static GuestViewContainer* FromID(int element_instance_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void RegisterElementResizeCallback(const ResizeCallback& callback);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // content::BrowserPluginDelegate:
 | 
				
			||||||
 | 
					  void SetElementInstanceID(int element_instance_id) final;
 | 
				
			||||||
 | 
					  void DidResizeElement(const gfx::Size& old_size,
 | 
				
			||||||
 | 
					                        const gfx::Size& new_size) final;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 private:
 | 
					 private:
 | 
				
			||||||
 | 
					  int element_instance_id_;
 | 
				
			||||||
 | 
					  content::RenderFrame* render_frame_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ResizeCallback element_resize_callback_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DISALLOW_COPY_AND_ASSIGN(GuestViewContainer);
 | 
					  DISALLOW_COPY_AND_ASSIGN(GuestViewContainer);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,6 +86,9 @@ class WebViewImpl
 | 
				
			||||||
      @browserPluginNode.removeAttribute webViewConstants.ATTRIBUTE_INTERNALINSTANCEID
 | 
					      @browserPluginNode.removeAttribute webViewConstants.ATTRIBUTE_INTERNALINSTANCEID
 | 
				
			||||||
      @internalInstanceId = parseInt newValue
 | 
					      @internalInstanceId = parseInt newValue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Track when the element resizes using the element resize callback.
 | 
				
			||||||
 | 
					      webFrame.registerElementResizeCallback @internalInstanceId, @onElementResize.bind(this)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return unless @guestInstanceId
 | 
					      return unless @guestInstanceId
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      guestViewInternal.attachGuest @internalInstanceId, @guestInstanceId, @buildParams()
 | 
					      guestViewInternal.attachGuest @internalInstanceId, @guestInstanceId, @buildParams()
 | 
				
			||||||
| 
						 | 
					@ -120,6 +123,18 @@ class WebViewImpl
 | 
				
			||||||
      # changed.
 | 
					      # changed.
 | 
				
			||||||
      @dispatchEvent webViewEvent
 | 
					      @dispatchEvent webViewEvent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  onElementResize: (oldSize, newSize) ->
 | 
				
			||||||
 | 
					    # Dispatch the 'resize' event.
 | 
				
			||||||
 | 
					    resizeEvent = new Event('resize', bubbles: true)
 | 
				
			||||||
 | 
					    resizeEvent.oldWidth = oldSize.width
 | 
				
			||||||
 | 
					    resizeEvent.oldHeight = oldSize.height
 | 
				
			||||||
 | 
					    resizeEvent.newWidth = newSize.width
 | 
				
			||||||
 | 
					    resizeEvent.newHeight = newSize.height
 | 
				
			||||||
 | 
					    @dispatchEvent resizeEvent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if @guestInstanceId
 | 
				
			||||||
 | 
					      guestViewInternal.setSize @guestInstanceId, normal: newSize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  createGuest: ->
 | 
					  createGuest: ->
 | 
				
			||||||
    guestViewInternal.createGuest @buildParams(), (guestInstanceId) =>
 | 
					    guestViewInternal.createGuest @buildParams(), (guestInstanceId) =>
 | 
				
			||||||
      @attachWindow guestInstanceId
 | 
					      @attachWindow guestInstanceId
 | 
				
			||||||
| 
						 | 
					@ -167,9 +182,10 @@ class WebViewImpl
 | 
				
			||||||
    #  the on display:block.
 | 
					    #  the on display:block.
 | 
				
			||||||
    css = window.getComputedStyle @webviewNode, null
 | 
					    css = window.getComputedStyle @webviewNode, null
 | 
				
			||||||
    elementRect = @webviewNode.getBoundingClientRect()
 | 
					    elementRect = @webviewNode.getBoundingClientRect()
 | 
				
			||||||
    params.elementSize =
 | 
					    params.elementWidth = parseInt(elementRect.width) ||
 | 
				
			||||||
      width: parseInt(elementRect.width) || parseInt(css.getPropertyValue('width'))
 | 
					                          parseInt(css.getPropertyValue('width'))
 | 
				
			||||||
      height: parseInt(elementRect.height) || parseInt(css.getPropertyValue('height'))
 | 
					    params.elementHeight = parseInt(elementRect.height) ||
 | 
				
			||||||
 | 
					                           parseInt(css.getPropertyValue('height'))
 | 
				
			||||||
    params
 | 
					    params
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  attachWindow: (guestInstanceId) ->
 | 
					  attachWindow: (guestInstanceId) ->
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								vendor/native_mate
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/native_mate
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
Subproject commit 1696237a3f444f0e33a8947749b4d70f6feb511b
 | 
					Subproject commit ad207eeabb0185f74c017e70ca3411d522627ff0
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue