| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "mojo/services/html_viewer/web_layer_tree_view_impl.h" | |
| 6 | |
| 7 #include "base/message_loop/message_loop_proxy.h" | |
| 8 #include "cc/blink/web_layer_impl.h" | |
| 9 #include "cc/layers/layer.h" | |
| 10 #include "cc/output/begin_frame_args.h" | |
| 11 #include "cc/scheduler/begin_frame_source.h" | |
| 12 #include "cc/trees/layer_tree_host.h" | |
| 13 #include "mojo/cc/context_provider_mojo.h" | |
| 14 #include "mojo/cc/output_surface_mojo.h" | |
| 15 #include "mojo/converters/surfaces/surfaces_type_converters.h" | |
| 16 #include "third_party/WebKit/public/web/WebWidget.h" | |
| 17 #include "third_party/mojo_services/src/view_manager/public/cpp/view.h" | |
| 18 | |
| 19 namespace html_viewer { | |
| 20 | |
| 21 WebLayerTreeViewImpl::WebLayerTreeViewImpl( | |
| 22 scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy, | |
| 23 mojo::SurfacePtr surface, | |
| 24 mojo::GpuPtr gpu_service) | |
| 25 : widget_(NULL), | |
| 26 view_(NULL), | |
| 27 main_thread_compositor_task_runner_(base::MessageLoopProxy::current()), | |
| 28 weak_factory_(this) { | |
| 29 main_thread_bound_weak_ptr_ = weak_factory_.GetWeakPtr(); | |
| 30 | |
| 31 cc::LayerTreeSettings settings; | |
| 32 | |
| 33 // For web contents, layer transforms should scale up the contents of layers | |
| 34 // to keep content always crisp when possible. | |
| 35 settings.layer_transforms_should_scale_layer_contents = true; | |
| 36 | |
| 37 cc::SharedBitmapManager* shared_bitmap_manager = nullptr; | |
| 38 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = nullptr; | |
| 39 cc::TaskGraphRunner* task_graph_runner = nullptr; | |
| 40 | |
| 41 layer_tree_host_ = | |
| 42 cc::LayerTreeHost::CreateThreaded(this, | |
| 43 shared_bitmap_manager, | |
| 44 gpu_memory_buffer_manager, | |
| 45 task_graph_runner, | |
| 46 settings, | |
| 47 base::MessageLoopProxy::current(), | |
| 48 compositor_message_loop_proxy, | |
| 49 nullptr); | |
| 50 DCHECK(layer_tree_host_); | |
| 51 | |
| 52 if (surface && gpu_service) { | |
| 53 mojo::CommandBufferPtr cb; | |
| 54 gpu_service->CreateOffscreenGLES2Context(GetProxy(&cb)); | |
| 55 scoped_refptr<cc::ContextProvider> context_provider( | |
| 56 new mojo::ContextProviderMojo(cb.PassMessagePipe())); | |
| 57 output_surface_.reset( | |
| 58 new mojo::OutputSurfaceMojo(this, context_provider, surface.Pass())); | |
| 59 } | |
| 60 layer_tree_host_->SetLayerTreeHostClientReady(); | |
| 61 } | |
| 62 | |
| 63 WebLayerTreeViewImpl::~WebLayerTreeViewImpl() { | |
| 64 } | |
| 65 | |
| 66 void WebLayerTreeViewImpl::WillBeginMainFrame() { | |
| 67 } | |
| 68 | |
| 69 void WebLayerTreeViewImpl::DidBeginMainFrame() { | |
| 70 } | |
| 71 | |
| 72 void WebLayerTreeViewImpl::BeginMainFrameNotExpectedSoon() { | |
| 73 } | |
| 74 | |
| 75 void WebLayerTreeViewImpl::BeginMainFrame(const cc::BeginFrameArgs& args) { | |
| 76 VLOG(2) << "WebLayerTreeViewImpl::BeginMainFrame"; | |
| 77 double frame_time_sec = (args.frame_time - base::TimeTicks()).InSecondsF(); | |
| 78 double deadline_sec = (args.deadline - base::TimeTicks()).InSecondsF(); | |
| 79 double interval_sec = args.interval.InSecondsF(); | |
| 80 blink::WebBeginFrameArgs web_begin_frame_args( | |
| 81 frame_time_sec, deadline_sec, interval_sec); | |
| 82 widget_->beginFrame(web_begin_frame_args); | |
| 83 } | |
| 84 | |
| 85 void WebLayerTreeViewImpl::Layout() { | |
| 86 widget_->layout(); | |
| 87 } | |
| 88 | |
| 89 void WebLayerTreeViewImpl::ApplyViewportDeltas( | |
| 90 const gfx::Vector2dF& inner_delta, | |
| 91 const gfx::Vector2dF& outer_delta, | |
| 92 const gfx::Vector2dF& elastic_overscroll_delta, | |
| 93 float page_scale, | |
| 94 float top_controls_delta) { | |
| 95 widget_->applyViewportDeltas( | |
| 96 inner_delta, | |
| 97 outer_delta, | |
| 98 elastic_overscroll_delta, | |
| 99 page_scale, | |
| 100 top_controls_delta); | |
| 101 } | |
| 102 | |
| 103 void WebLayerTreeViewImpl::ApplyViewportDeltas( | |
| 104 const gfx::Vector2d& scroll_delta, | |
| 105 float page_scale, | |
| 106 float top_controls_delta) { | |
| 107 widget_->applyViewportDeltas(scroll_delta, page_scale, top_controls_delta); | |
| 108 } | |
| 109 | |
| 110 void WebLayerTreeViewImpl::RequestNewOutputSurface() { | |
| 111 if (output_surface_.get()) | |
| 112 layer_tree_host_->SetOutputSurface(output_surface_.Pass()); | |
| 113 } | |
| 114 | |
| 115 void WebLayerTreeViewImpl::DidFailToInitializeOutputSurface() { | |
| 116 RequestNewOutputSurface(); | |
| 117 } | |
| 118 | |
| 119 void WebLayerTreeViewImpl::DidInitializeOutputSurface() { | |
| 120 } | |
| 121 | |
| 122 void WebLayerTreeViewImpl::WillCommit() { | |
| 123 } | |
| 124 | |
| 125 void WebLayerTreeViewImpl::DidCommit() { | |
| 126 } | |
| 127 | |
| 128 void WebLayerTreeViewImpl::DidCommitAndDrawFrame() { | |
| 129 } | |
| 130 | |
| 131 void WebLayerTreeViewImpl::DidCompleteSwapBuffers() { | |
| 132 } | |
| 133 | |
| 134 void WebLayerTreeViewImpl::setRootLayer(const blink::WebLayer& layer) { | |
| 135 layer_tree_host_->SetRootLayer( | |
| 136 static_cast<const cc_blink::WebLayerImpl*>(&layer)->layer()); | |
| 137 } | |
| 138 | |
| 139 void WebLayerTreeViewImpl::clearRootLayer() { | |
| 140 layer_tree_host_->SetRootLayer(scoped_refptr<cc::Layer>()); | |
| 141 } | |
| 142 | |
| 143 void WebLayerTreeViewImpl::setViewportSize( | |
| 144 const blink::WebSize& device_viewport_size) { | |
| 145 layer_tree_host_->SetViewportSize(device_viewport_size); | |
| 146 } | |
| 147 | |
| 148 blink::WebSize WebLayerTreeViewImpl::deviceViewportSize() const { | |
| 149 return layer_tree_host_->device_viewport_size(); | |
| 150 } | |
| 151 | |
| 152 void WebLayerTreeViewImpl::setDeviceScaleFactor(float device_scale_factor) { | |
| 153 layer_tree_host_->SetDeviceScaleFactor(device_scale_factor); | |
| 154 } | |
| 155 | |
| 156 float WebLayerTreeViewImpl::deviceScaleFactor() const { | |
| 157 return layer_tree_host_->device_scale_factor(); | |
| 158 } | |
| 159 | |
| 160 void WebLayerTreeViewImpl::setBackgroundColor(blink::WebColor color) { | |
| 161 layer_tree_host_->set_background_color(color); | |
| 162 } | |
| 163 | |
| 164 void WebLayerTreeViewImpl::setHasTransparentBackground( | |
| 165 bool has_transparent_background) { | |
| 166 layer_tree_host_->set_has_transparent_background(has_transparent_background); | |
| 167 } | |
| 168 | |
| 169 void WebLayerTreeViewImpl::setVisible(bool visible) { | |
| 170 layer_tree_host_->SetVisible(visible); | |
| 171 } | |
| 172 | |
| 173 void WebLayerTreeViewImpl::setPageScaleFactorAndLimits(float page_scale_factor, | |
| 174 float minimum, | |
| 175 float maximum) { | |
| 176 layer_tree_host_->SetPageScaleFactorAndLimits( | |
| 177 page_scale_factor, minimum, maximum); | |
| 178 } | |
| 179 | |
| 180 void WebLayerTreeViewImpl::registerForAnimations(blink::WebLayer* layer) { | |
| 181 cc::Layer* cc_layer = static_cast<cc_blink::WebLayerImpl*>(layer)->layer(); | |
| 182 cc_layer->layer_animation_controller()->SetAnimationRegistrar( | |
| 183 layer_tree_host_->animation_registrar()); | |
| 184 } | |
| 185 | |
| 186 void WebLayerTreeViewImpl::registerViewportLayers( | |
| 187 const blink::WebLayer* overscrollElasticityLayer, | |
| 188 const blink::WebLayer* pageScaleLayer, | |
| 189 const blink::WebLayer* innerViewportScrollLayer, | |
| 190 const blink::WebLayer* outerViewportScrollLayer) { | |
| 191 layer_tree_host_->RegisterViewportLayers( | |
| 192 // The scroll elasticity layer will only exist when using pinch virtual | |
| 193 // viewports. | |
| 194 overscrollElasticityLayer | |
| 195 ? static_cast<const cc_blink::WebLayerImpl*>( | |
| 196 overscrollElasticityLayer)->layer() | |
| 197 : NULL, | |
| 198 static_cast<const cc_blink::WebLayerImpl*>(pageScaleLayer)->layer(), | |
| 199 static_cast<const cc_blink::WebLayerImpl*>(innerViewportScrollLayer) | |
| 200 ->layer(), | |
| 201 // The outer viewport layer will only exist when using pinch virtual | |
| 202 // viewports. | |
| 203 outerViewportScrollLayer | |
| 204 ? static_cast<const cc_blink::WebLayerImpl*>(outerViewportScrollLayer) | |
| 205 ->layer() | |
| 206 : NULL); | |
| 207 } | |
| 208 | |
| 209 void WebLayerTreeViewImpl::clearViewportLayers() { | |
| 210 layer_tree_host_->RegisterViewportLayers(scoped_refptr<cc::Layer>(), | |
| 211 scoped_refptr<cc::Layer>(), | |
| 212 scoped_refptr<cc::Layer>(), | |
| 213 scoped_refptr<cc::Layer>()); | |
| 214 } | |
| 215 | |
| 216 void WebLayerTreeViewImpl::startPageScaleAnimation( | |
| 217 const blink::WebPoint& destination, | |
| 218 bool use_anchor, | |
| 219 float new_page_scale, | |
| 220 double duration_sec) { | |
| 221 base::TimeDelta duration = base::TimeDelta::FromMicroseconds( | |
| 222 duration_sec * base::Time::kMicrosecondsPerSecond); | |
| 223 layer_tree_host_->StartPageScaleAnimation( | |
| 224 gfx::Vector2d(destination.x, destination.y), | |
| 225 use_anchor, | |
| 226 new_page_scale, | |
| 227 duration); | |
| 228 } | |
| 229 | |
| 230 void WebLayerTreeViewImpl::setNeedsAnimate() { | |
| 231 layer_tree_host_->SetNeedsAnimate(); | |
| 232 } | |
| 233 | |
| 234 bool WebLayerTreeViewImpl::commitRequested() const { | |
| 235 return layer_tree_host_->CommitRequested(); | |
| 236 } | |
| 237 | |
| 238 void WebLayerTreeViewImpl::finishAllRendering() { | |
| 239 layer_tree_host_->FinishAllRendering(); | |
| 240 } | |
| 241 | |
| 242 void WebLayerTreeViewImpl::DidCreateSurface(cc::SurfaceId id) { | |
| 243 main_thread_compositor_task_runner_->PostTask( | |
| 244 FROM_HERE, | |
| 245 base::Bind(&WebLayerTreeViewImpl::DidCreateSurfaceOnMainThread, | |
| 246 main_thread_bound_weak_ptr_, | |
| 247 id)); | |
| 248 } | |
| 249 | |
| 250 void WebLayerTreeViewImpl::DidCreateSurfaceOnMainThread(cc::SurfaceId id) { | |
| 251 view_->SetSurfaceId(mojo::SurfaceId::From(id)); | |
| 252 } | |
| 253 | |
| 254 } // namespace html_viewer | |
| OLD | NEW |