// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "flutter/shell/platform/embedder/platform_view_embedder.h" namespace shell { PlatformViewEmbedder::PlatformViewEmbedder( PlatformView::Delegate& delegate, blink::TaskRunners task_runners, EmbedderSurfaceGL::GLDispatchTable gl_dispatch_table, bool fbo_reset_after_present, PlatformDispatchTable platform_dispatch_table) : PlatformView(delegate, std::move(task_runners)), embedder_surface_( std::make_unique(gl_dispatch_table, fbo_reset_after_present)), platform_dispatch_table_(platform_dispatch_table) {} PlatformViewEmbedder::PlatformViewEmbedder( PlatformView::Delegate& delegate, blink::TaskRunners task_runners, EmbedderSurfaceSoftware::SoftwareDispatchTable software_dispatch_table, PlatformDispatchTable platform_dispatch_table) : PlatformView(delegate, std::move(task_runners)), embedder_surface_( std::make_unique(software_dispatch_table)), platform_dispatch_table_(platform_dispatch_table) {} PlatformViewEmbedder::~PlatformViewEmbedder() = default; void PlatformViewEmbedder::UpdateSemantics( blink::SemanticsNodeUpdates update, blink::CustomAccessibilityActionUpdates actions) { if (platform_dispatch_table_.update_semantics_nodes_callback != nullptr) { platform_dispatch_table_.update_semantics_nodes_callback(std::move(update)); } if (platform_dispatch_table_.update_semantics_custom_actions_callback != nullptr) { platform_dispatch_table_.update_semantics_custom_actions_callback( std::move(actions)); } } void PlatformViewEmbedder::HandlePlatformMessage( fml::RefPtr message) { if (!message) { return; } if (!message->response()) { return; } if (platform_dispatch_table_.platform_message_response_callback == nullptr) { message->response()->CompleteEmpty(); return; } platform_dispatch_table_.platform_message_response_callback( std::move(message)); } // |shell::PlatformView| std::unique_ptr PlatformViewEmbedder::CreateRenderingSurface() { if (embedder_surface_ == nullptr) { FML_LOG(ERROR) << "Embedder surface was null."; return nullptr; } return embedder_surface_->CreateGPUSurface(); } // |shell::PlatformView| sk_sp PlatformViewEmbedder::CreateResourceContext() const { if (embedder_surface_ == nullptr) { FML_LOG(ERROR) << "Embedder surface was null."; return nullptr; } return embedder_surface_->CreateResourceContext(); } // |shell::PlatformView| std::unique_ptr PlatformViewEmbedder::CreateVSyncWaiter() { if (!platform_dispatch_table_.vsync_callback) { // Superclass implementation creates a timer based fallback. return PlatformView::CreateVSyncWaiter(); } return std::make_unique( platform_dispatch_table_.vsync_callback, task_runners_); } } // namespace shell