diff options
-rw-r--r-- | content/browser/renderer_host/render_widget_host_impl.cc | 20 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_impl.h | 3 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_android.cc | 7 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_android.h | 1 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_base.cc | 18 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_base.h | 1 | ||||
-rw-r--r-- | content/common/view_messages.h | 3 | ||||
-rw-r--r-- | content/port/browser/render_widget_host_view_port.h | 3 | ||||
-rw-r--r-- | content/public/test/render_view_test.cc | 2 | ||||
-rw-r--r-- | content/renderer/render_view_impl.cc | 7 | ||||
-rw-r--r-- | content/renderer/render_view_impl.h | 1 | ||||
-rw-r--r-- | content/renderer/render_widget.cc | 11 | ||||
-rw-r--r-- | content/renderer/render_widget.h | 5 | ||||
-rw-r--r-- | content/renderer/render_widget_fullscreen_pepper.cc | 19 | ||||
-rw-r--r-- | content/renderer/render_widget_fullscreen_pepper.h | 1 |
15 files changed, 79 insertions, 23 deletions
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 85108c0..daba667 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -481,26 +481,30 @@ void RenderWidgetHostImpl::WasResized() { gfx::Rect view_bounds = view_->GetViewBounds(); gfx::Size new_size(view_bounds.size()); + gfx::Size old_physical_backing_size = physical_backing_size_; + physical_backing_size_ = view_->GetPhysicalBackingSize(); bool was_fullscreen = is_fullscreen_; is_fullscreen_ = IsFullscreen(); - bool fullscreen_changed = was_fullscreen != is_fullscreen_; + bool size_changed = new_size != current_size_; + bool side_payload_changed = + old_physical_backing_size != physical_backing_size_ || + was_fullscreen != is_fullscreen_; - // Avoid asking the RenderWidget to resize to its current size, since it - // won't send us a PaintRect message in that case. - if (!size_changed && !fullscreen_changed) + if (!size_changed && !side_payload_changed) return; if (in_flight_size_ != gfx::Size() && new_size == in_flight_size_ && - !fullscreen_changed) + !side_payload_changed) return; - // We don't expect to receive an ACK when the requested size is empty. + // We don't expect to receive an ACK when the requested size is empty or when + // the main viewport size didn't change. if (!new_size.IsEmpty() && size_changed) resize_ack_pending_ = true; - if (!Send(new ViewMsg_Resize(routing_id_, new_size, - GetRootWindowResizerRect(), is_fullscreen_))) { + if (!Send(new ViewMsg_Resize(routing_id_, new_size, physical_backing_size_, + GetRootWindowResizerRect(), is_fullscreen_))) { resize_ack_pending_ = false; } else { in_flight_size_ = new_size; diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index 4ab0059..1d3313d 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h @@ -690,6 +690,9 @@ class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost, // The current size of the RenderWidget. gfx::Size current_size_; + // The size of the view's backing surface in non-DPI-adjusted pixels. + gfx::Size physical_backing_size_; + // The size we last sent as requested size to the renderer. |current_size_| // is only updated once the resize message has been ack'd. This on the other // hand is updated when the resize message is sent. This is very similar to diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index 9637317..de560f1 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc @@ -280,6 +280,13 @@ gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { return gfx::Rect(content_view_core_->GetViewportSizeDip()); } +gfx::Size RenderWidgetHostViewAndroid::GetPhysicalBackingSize() const { + if (!content_view_core_) + return gfx::Size(); + + return content_view_core_->GetViewportSizePix(); +} + void RenderWidgetHostViewAndroid::UpdateCursor(const WebCursor& cursor) { // There are no cursors on Android. } diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index 9bcff13..4874172 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h @@ -76,6 +76,7 @@ class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase { virtual void Hide() OVERRIDE; virtual bool IsShowing() OVERRIDE; virtual gfx::Rect GetViewBounds() const OVERRIDE; + virtual gfx::Size GetPhysicalBackingSize() const OVERRIDE; virtual void UpdateCursor(const WebCursor& cursor) OVERRIDE; virtual void SetIsLoading(bool is_loading) OVERRIDE; virtual void TextInputStateChanged( diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc index a2cb5a4..f56413e 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.cc +++ b/content/browser/renderer_host/render_widget_host_view_base.cc @@ -12,6 +12,8 @@ #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" #include "ui/gfx/display.h" #include "ui/gfx/screen.h" +#include "ui/gfx/size_conversions.h" +#include "ui/gfx/size_f.h" #if defined(OS_WIN) #include "base/command_line.h" @@ -365,6 +367,14 @@ const SkBitmap& RenderWidgetHostViewBase::GetBackground() { return background_; } +gfx::Size RenderWidgetHostViewBase::GetPhysicalBackingSize() const { + gfx::Display display = + gfx::Screen::GetNativeScreen()->GetDisplayNearestPoint( + GetViewBounds().origin()); + return gfx::ToCeiledSize(gfx::ScaleSize(GetViewBounds().size(), + display.device_scale_factor())); +} + void RenderWidgetHostViewBase::SelectionChanged(const string16& text, size_t offset, const ui::Range& range) { @@ -432,11 +442,17 @@ void RenderWidgetHostViewBase::UpdateScreenInfo(gfx::NativeView view) { if (current_display_area_ == display.work_area() && current_device_scale_factor_ == display.device_scale_factor()) return; + + bool device_scale_factor_changed = + current_device_scale_factor_ != display.device_scale_factor(); current_display_area_ = display.work_area(); current_device_scale_factor_ = display.device_scale_factor(); - if (impl) + if (impl) { + if (device_scale_factor_changed) + impl->WasResized(); impl->NotifyScreenInfoChanged(); } +} SmoothScrollGesture* RenderWidgetHostViewBase::CreateSmoothScrollGesture( bool scroll_down, int pixels_to_scroll, int mouse_event_x, diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h index 7515862..67b59b1 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h @@ -51,6 +51,7 @@ class CONTENT_EXPORT RenderWidgetHostViewBase const ui::Range& range) OVERRIDE; virtual void SetBackground(const SkBitmap& background) OVERRIDE; virtual const SkBitmap& GetBackground() OVERRIDE; + virtual gfx::Size GetPhysicalBackingSize() const OVERRIDE; virtual bool IsShowingContextMenu() const OVERRIDE; virtual void SetShowingContextMenu(bool showing_menu) OVERRIDE; virtual string16 GetSelectedText() const OVERRIDE; diff --git a/content/common/view_messages.h b/content/common/view_messages.h index 42e3002..800c045 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -797,8 +797,9 @@ IPC_MESSAGE_ROUTED0(ViewMsg_Close) // the view's current size. The generated ViewHostMsg_PaintRect message will // have the IS_RESIZE_ACK flag set. It also receives the resizer rect so that // we don't have to fetch it every time WebKit asks for it. -IPC_MESSAGE_ROUTED3(ViewMsg_Resize, +IPC_MESSAGE_ROUTED4(ViewMsg_Resize, gfx::Size /* new_size */, + gfx::Size /* physical_backing_size */, gfx::Rect /* resizer_rect */, bool /* is_fullscreen */) diff --git a/content/port/browser/render_widget_host_view_port.h b/content/port/browser/render_widget_host_view_port.h index 52699be..05470af 100644 --- a/content/port/browser/render_widget_host_view_port.h +++ b/content/port/browser/render_widget_host_view_port.h @@ -229,6 +229,9 @@ class CONTENT_EXPORT RenderWidgetHostViewPort : public RenderWidgetHostView, virtual void GetScreenInfo(WebKit::WebScreenInfo* results) = 0; + // The size of the view's backing surface in non-DPI-adjusted pixels. + virtual gfx::Size GetPhysicalBackingSize() const = 0; + // Gets the bounds of the window, in screen coordinates. virtual gfx::Rect GetBoundsInRootWindow() = 0; diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index 005cbab..3a18949 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc @@ -311,7 +311,7 @@ void RenderViewTest::Resize(gfx::Size new_size, gfx::Rect resizer_rect, bool is_fullscreen) { scoped_ptr<IPC::Message> resize_message(new ViewMsg_Resize( - 0, new_size, resizer_rect, is_fullscreen)); + 0, new_size, new_size, resizer_rect, is_fullscreen)); OnMessageReceived(*resize_message); } diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 61554f7..070baed 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -5431,7 +5431,8 @@ void RenderViewImpl::OnDisableAutoResize(const gfx::Size& new_size) { return; webview()->disableAutoResizeMode(); - Resize(new_size, resizer_rect_, is_fullscreen_, NO_RESIZE_ACK); + Resize(new_size, physical_backing_size_, resizer_rect_, is_fullscreen_, + NO_RESIZE_ACK); } void RenderViewImpl::OnEnablePreferredSizeChangedMode() { @@ -5726,6 +5727,7 @@ void RenderViewImpl::OnMoveOrResizeStarted() { } void RenderViewImpl::OnResize(const gfx::Size& new_size, + const gfx::Size& physical_backing_size, const gfx::Rect& resizer_rect, bool is_fullscreen) { if (webview()) { @@ -5737,7 +5739,8 @@ void RenderViewImpl::OnResize(const gfx::Size& new_size, UpdateScrollState(webview()->mainFrame()); } - RenderWidget::OnResize(new_size, resizer_rect, is_fullscreen); + RenderWidget::OnResize(new_size, physical_backing_size, resizer_rect, + is_fullscreen); } void RenderViewImpl::WillInitiatePaint() { diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index a8c049e..6b26d8f 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h @@ -780,6 +780,7 @@ class CONTENT_EXPORT RenderViewImpl // RenderWidget overrides: virtual void Close() OVERRIDE; virtual void OnResize(const gfx::Size& new_size, + const gfx::Size& physical_backing_size, const gfx::Rect& resizer_rect, bool is_fullscreen) OVERRIDE; virtual void WillInitiatePaint() OVERRIDE; diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index d4c3ac0..fa1900a 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc @@ -329,6 +329,7 @@ bool RenderWidget::Send(IPC::Message* message) { } void RenderWidget::Resize(const gfx::Size& new_size, + const gfx::Size& physical_backing_size, const gfx::Rect& resizer_rect, bool is_fullscreen, ResizeAck resize_ack) { @@ -340,7 +341,10 @@ void RenderWidget::Resize(const gfx::Size& new_size, if (!webwidget_) return; - // Remember the rect where the resize corner will be drawn. + if (compositor_) + compositor_->setViewportSize(new_size, physical_backing_size); + + physical_backing_size_ = physical_backing_size_; resizer_rect_ = resizer_rect; // NOTE: We may have entered fullscreen mode without changing our size. @@ -414,9 +418,11 @@ void RenderWidget::OnCreatingNewAck() { } void RenderWidget::OnResize(const gfx::Size& new_size, + const gfx::Size& physical_backing_size, const gfx::Rect& resizer_rect, bool is_fullscreen) { - Resize(new_size, resizer_rect, is_fullscreen, SEND_RESIZE_ACK); + Resize(new_size, physical_backing_size, resizer_rect, is_fullscreen, + SEND_RESIZE_ACK); } void RenderWidget::OnChangeResizeRect(const gfx::Rect& resizer_rect) { @@ -1347,6 +1353,7 @@ void RenderWidget::initializeLayerTreeView( return; compositor_->setRootLayer(root_layer); + compositor_->setViewportSize(size_, physical_backing_size_); if (init_complete_) compositor_->setSurfaceReady(); } diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h index 5b763b5..653564e 100644 --- a/content/renderer/render_widget.h +++ b/content/renderer/render_widget.h @@ -269,6 +269,7 @@ class CONTENT_EXPORT RenderWidget // Resizes the render widget. void Resize(const gfx::Size& new_size, + const gfx::Size& physical_backing_size, const gfx::Rect& resizer_rect, bool is_fullscreen, ResizeAck resize_ack); @@ -277,6 +278,7 @@ class CONTENT_EXPORT RenderWidget void OnClose(); void OnCreatingNewAck(); virtual void OnResize(const gfx::Size& new_size, + const gfx::Size& physical_backing_size, const gfx::Rect& resizer_rect, bool is_fullscreen); void OnChangeResizeRect(const gfx::Rect& resizer_rect); @@ -501,6 +503,9 @@ class CONTENT_EXPORT RenderWidget PaintAggregator paint_aggregator_; + // The size of the view's backing surface in non-DPI-adjusted pixels. + gfx::Size physical_backing_size_; + // The area that must be reserved for drawing the resize corner. gfx::Rect resizer_rect_; diff --git a/content/renderer/render_widget_fullscreen_pepper.cc b/content/renderer/render_widget_fullscreen_pepper.cc index c1cba49..3154bbbd 100644 --- a/content/renderer/render_widget_fullscreen_pepper.cc +++ b/content/renderer/render_widget_fullscreen_pepper.cc @@ -519,15 +519,18 @@ RenderWidgetFullscreenPepper::GetBitmapForOptimizedPluginPaint( } void RenderWidgetFullscreenPepper::OnResize(const gfx::Size& size, - const gfx::Rect& resizer_rect, - bool is_fullscreen) { + const gfx::Size& physical_backing_size, + const gfx::Rect& resizer_rect, + bool is_fullscreen) { if (context_) { - gfx::Size pixel_size = gfx::ToFlooredSize( - gfx::ScaleSize(size, deviceScaleFactor())); - context_->reshape(pixel_size.width(), pixel_size.height()); - context_->viewport(0, 0, pixel_size.width(), pixel_size.height()); - } - RenderWidget::OnResize(size, resizer_rect, is_fullscreen); + context_->reshape(physical_backing_size.width(), + physical_backing_size.height()); + context_->viewport(0, 0, + physical_backing_size.width(), + physical_backing_size.height()); + } + RenderWidget::OnResize(size, physical_backing_size, resizer_rect, + is_fullscreen); } WebWidget* RenderWidgetFullscreenPepper::CreateWebWidget() { diff --git a/content/renderer/render_widget_fullscreen_pepper.h b/content/renderer/render_widget_fullscreen_pepper.h index 28a0e12..a20d53c 100644 --- a/content/renderer/render_widget_fullscreen_pepper.h +++ b/content/renderer/render_widget_fullscreen_pepper.h @@ -89,6 +89,7 @@ class RenderWidgetFullscreenPepper : gfx::Rect* clip, float* scale_factor) OVERRIDE; virtual void OnResize(const gfx::Size& new_size, + const gfx::Size& physical_backing_size, const gfx::Rect& resizer_rect, bool is_fullscreen) OVERRIDE; |