Index: components/html_viewer/html_document.cc |
diff --git a/components/html_viewer/html_document.cc b/components/html_viewer/html_document.cc |
index b9223904d3a2530e33e11c49bd1261b132547ed6..6154d34d9fa4287ac76e8be88009b2bb4a919b3b 100644 |
--- a/components/html_viewer/html_document.cc |
+++ b/components/html_viewer/html_document.cc |
@@ -14,6 +14,7 @@ |
#include "base/thread_task_runner_handle.h" |
#include "components/html_viewer/blink_input_events_type_converters.h" |
#include "components/html_viewer/blink_url_request_type_converters.h" |
+#include "components/html_viewer/setup.h" |
#include "components/html_viewer/web_layer_tree_view_impl.h" |
#include "components/html_viewer/web_media_player_factory.h" |
#include "components/html_viewer/web_storage_namespace_impl.h" |
@@ -43,6 +44,7 @@ |
#include "third_party/skia/include/core/SkColor.h" |
#include "third_party/skia/include/core/SkDevice.h" |
#include "ui/gfx/geometry/dip_util.h" |
+#include "ui/gfx/geometry/size.h" |
using mojo::AxProvider; |
using mojo::Rect; |
@@ -121,22 +123,18 @@ HTMLDocument::HTMLDocument( |
mojo::InterfaceRequest<mojo::ServiceProvider> services, |
URLResponsePtr response, |
mojo::Shell* shell, |
- scoped_refptr<base::MessageLoopProxy> compositor_thread, |
- WebMediaPlayerFactory* web_media_player_factory, |
- bool is_headless) |
+ Setup* setup) |
: response_(response.Pass()), |
shell_(shell), |
web_view_(nullptr), |
root_(nullptr), |
view_manager_client_factory_(shell_, this), |
- compositor_thread_(compositor_thread), |
- web_media_player_factory_(web_media_player_factory), |
- is_headless_(is_headless), |
- device_pixel_ratio_(1.0) { |
+ setup_(setup) { |
exported_services_.AddService(this); |
exported_services_.AddService(&view_manager_client_factory_); |
exported_services_.Bind(services.Pass()); |
- Load(response_.Pass()); |
+ if (setup_->did_init()) |
+ Load(response_.Pass()); |
} |
HTMLDocument::~HTMLDocument() { |
@@ -153,13 +151,13 @@ void HTMLDocument::OnEmbed( |
View* root, |
mojo::InterfaceRequest<mojo::ServiceProvider> services, |
mojo::ServiceProviderPtr exposed_services) { |
- DCHECK(!is_headless_); |
+ DCHECK(!setup_->is_headless()); |
root_ = root; |
+ root_->AddObserver(this); |
embedder_service_provider_ = exposed_services.Pass(); |
navigator_host_.set_service_provider(embedder_service_provider_.get()); |
- UpdateWebviewSizeFromViewSize(); |
- web_layer_tree_view_impl_->set_view(root_); |
- root_->AddObserver(this); |
+ |
+ InitSetupAndLoadIfNecessary(); |
} |
void HTMLDocument::OnViewManagerDisconnected(ViewManager* view_manager) { |
@@ -201,8 +199,7 @@ void HTMLDocument::Load(URLResponsePtr response) { |
} |
void HTMLDocument::UpdateWebviewSizeFromViewSize() { |
- device_pixel_ratio_ = root_->viewport_metrics().device_pixel_ratio; |
- web_view_->setDeviceScaleFactor(device_pixel_ratio_); |
+ web_view_->setDeviceScaleFactor(setup_->device_pixel_ratio()); |
const gfx::Size size_in_pixels(root_->bounds().width, root_->bounds().height); |
const gfx::Size size_in_dips = gfx::ConvertSizeToDIP( |
root_->viewport_metrics().device_pixel_ratio, size_in_pixels); |
@@ -211,14 +208,28 @@ void HTMLDocument::UpdateWebviewSizeFromViewSize() { |
web_layer_tree_view_impl_->setViewportSize(size_in_pixels); |
} |
+void HTMLDocument::InitSetupAndLoadIfNecessary() { |
+ DCHECK(root_); |
+ if (web_view_ || root_->viewport_metrics().device_pixel_ratio == 0.f) |
+ return; |
+ |
+ setup_->InitIfNecessary(gfx::Size(root_->viewport_metrics().size->width, |
+ root_->viewport_metrics().size->height), |
+ root_->viewport_metrics().device_pixel_ratio); |
+ Load(response_.Pass()); |
+ |
+ UpdateWebviewSizeFromViewSize(); |
+ web_layer_tree_view_impl_->set_view(root_); |
+} |
+ |
blink::WebStorageNamespace* HTMLDocument::createSessionStorageNamespace() { |
return new WebStorageNamespaceImpl(); |
} |
void HTMLDocument::initializeLayerTreeView() { |
- if (is_headless_) { |
- web_layer_tree_view_impl_.reset( |
- new WebLayerTreeViewImpl(compositor_thread_, nullptr, nullptr)); |
+ if (setup_->is_headless()) { |
+ web_layer_tree_view_impl_.reset(new WebLayerTreeViewImpl( |
+ setup_->compositor_thread(), nullptr, nullptr)); |
return; |
} |
@@ -235,7 +246,7 @@ void HTMLDocument::initializeLayerTreeView() { |
mojo::GpuPtr gpu_service; |
ConnectToService(gpu_service_provider.get(), &gpu_service); |
web_layer_tree_view_impl_.reset(new WebLayerTreeViewImpl( |
- compositor_thread_, surface.Pass(), gpu_service.Pass())); |
+ setup_->compositor_thread(), surface.Pass(), gpu_service.Pass())); |
} |
blink::WebLayerTreeView* HTMLDocument::layerTreeView() { |
@@ -255,8 +266,8 @@ blink::WebMediaPlayer* HTMLDocument::createMediaPlayer( |
blink::WebMediaPlayerClient* client, |
blink::WebContentDecryptionModule* initial_cdm) { |
blink::WebMediaPlayer* player = |
- web_media_player_factory_ |
- ? web_media_player_factory_->CreateMediaPlayer( |
+ setup_->web_media_player_factory() |
+ ? setup_->web_media_player_factory()->CreateMediaPlayer( |
frame, url, client, GetMediaPermission(), GetCdmFactory(), |
initial_cdm, shell_) |
: nullptr; |
@@ -347,6 +358,13 @@ void HTMLDocument::OnViewBoundsChanged(View* view, |
UpdateWebviewSizeFromViewSize(); |
} |
+void HTMLDocument::OnViewViewportMetricsChanged( |
+ mojo::View* view, |
+ const mojo::ViewportMetrics& old_metrics, |
+ const mojo::ViewportMetrics& new_metrics) { |
+ InitSetupAndLoadIfNecessary(); |
+} |
+ |
void HTMLDocument::OnViewDestroyed(View* view) { |
DCHECK_EQ(view, root_); |
root_ = nullptr; |
@@ -357,10 +375,10 @@ void HTMLDocument::OnViewDestroyed(View* view) { |
void HTMLDocument::OnViewInputEvent(View* view, const mojo::EventPtr& event) { |
if (event->pointer_data) { |
// Blink expects coordintes to be in DIPs. |
- event->pointer_data->x /= device_pixel_ratio_; |
- event->pointer_data->y /= device_pixel_ratio_; |
- event->pointer_data->screen_x /= device_pixel_ratio_; |
- event->pointer_data->screen_y /= device_pixel_ratio_; |
+ event->pointer_data->x /= setup_->device_pixel_ratio(); |
+ event->pointer_data->y /= setup_->device_pixel_ratio(); |
+ event->pointer_data->screen_x /= setup_->device_pixel_ratio(); |
+ event->pointer_data->screen_y /= setup_->device_pixel_ratio(); |
} |
if ((event->action == mojo::EVENT_TYPE_POINTER_DOWN || |