Index: mojo/services/native_viewport/native_viewport_impl.cc |
diff --git a/mojo/services/native_viewport/native_viewport_impl.cc b/mojo/services/native_viewport/native_viewport_impl.cc |
index 6aba9ab0bb7dad8f263a15ec56bff6f75ee95b9d..3006612a564f8c2dee4de3e63876b95a6f0a4f0f 100644 |
--- a/mojo/services/native_viewport/native_viewport_impl.cc |
+++ b/mojo/services/native_viewport/native_viewport_impl.cc |
@@ -4,6 +4,7 @@ |
#include "mojo/services/native_viewport/native_viewport_impl.h" |
+#include "base/auto_reset.h" |
#include "base/bind.h" |
#include "base/macros.h" |
#include "base/message_loop/message_loop.h" |
@@ -48,13 +49,12 @@ NativeViewportImpl::~NativeViewportImpl() { |
void NativeViewportImpl::Create(SizePtr size, |
const Callback<void(uint64_t)>& callback) { |
create_callback_ = callback; |
+ size_ = size.To<gfx::Size>(); |
if (is_headless_) |
platform_viewport_ = PlatformViewportHeadless::Create(this); |
else |
platform_viewport_ = PlatformViewport::Create(this); |
- const gfx::Rect bounds(gfx::Rect(size.To<gfx::Size>())); |
- platform_viewport_->Init(bounds); |
- OnBoundsChanged(bounds); |
+ platform_viewport_->Init(gfx::Rect(size.To<gfx::Size>())); |
} |
void NativeViewportImpl::Show() { |
@@ -94,10 +94,14 @@ void NativeViewportImpl::SubmittedFrame(SurfaceIdPtr child_surface_id) { |
} |
void NativeViewportImpl::OnBoundsChanged(const gfx::Rect& bounds) { |
+ if (size_ == bounds.size()) |
+ return; |
+ |
size_ = bounds.size(); |
- client()->OnSizeChanged(Size::From(size_)); |
- if (viewport_surface_) |
- viewport_surface_->SetSize(size_); |
+ |
+ // Wait for the accelerated widget before telling the client of the bounds. |
+ if (create_callback_.is_null()) |
+ ProcessOnBoundsChanged(); |
} |
void NativeViewportImpl::OnAcceleratedWidgetAvailable( |
@@ -105,6 +109,10 @@ void NativeViewportImpl::OnAcceleratedWidgetAvailable( |
widget_id_ = static_cast<uint64_t>(bit_cast<uintptr_t>(widget)); |
// TODO(jamesr): Remove once everything is converted to surfaces. |
create_callback_.Run(widget_id_); |
+ create_callback_.reset(); |
+ // Immediately tell the client of the size. The size may be wrong, if so we'll |
+ // get the right one in the next OnBoundsChanged() call. |
+ ProcessOnBoundsChanged(); |
if (viewport_surface_) |
viewport_surface_->SetWidgetId(widget_id_); |
} |
@@ -142,5 +150,11 @@ void NativeViewportImpl::AckEvent() { |
waiting_for_event_ack_ = false; |
} |
+void NativeViewportImpl::ProcessOnBoundsChanged() { |
+ client()->OnSizeChanged(Size::From(size_)); |
+ if (viewport_surface_) |
+ viewport_surface_->SetSize(size_); |
+} |
+ |
} // namespace mojo |