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