// Copyright 2017 The Chromium 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/lib/ui/compositing/scene_host.h"

#include "flutter/lib/ui/ui_dart_state.h"
#include "third_party/tonic/dart_args.h"
#include "third_party/tonic/dart_binding_macros.h"
#include "third_party/tonic/dart_library_natives.h"

#ifdef OS_FUCHSIA
#include "dart-pkg/zircon/sdk_ext/handle.h"
#endif

namespace blink {

static void SceneHost_constructor(Dart_NativeArguments args) {
  DartCallConstructor(&SceneHost::create, args);
}

IMPLEMENT_WRAPPERTYPEINFO(ui, SceneHost);

#define FOR_EACH_BINDING(V) V(SceneHost, dispose)

FOR_EACH_BINDING(DART_NATIVE_CALLBACK)

void SceneHost::RegisterNatives(tonic::DartLibraryNatives* natives) {
  natives->Register({{"SceneHost_constructor", SceneHost_constructor, 2, true},
                     FOR_EACH_BINDING(DART_REGISTER_NATIVE)});
}

#if defined(OS_FUCHSIA)
fml::RefPtr<SceneHost> SceneHost::create(
    fml::RefPtr<zircon::dart::Handle> export_token_handle) {
  return fml::MakeRefCounted<SceneHost>(export_token_handle);
}

SceneHost::SceneHost(fml::RefPtr<zircon::dart::Handle> export_token_handle) {
  export_node_holder_ = fml::MakeRefCounted<flow::ExportNodeHolder>(
      blink::UIDartState::Current()->GetTaskRunners().GetGPUTaskRunner(),
      export_token_handle);
}
#else
fml::RefPtr<SceneHost> SceneHost::create(Dart_Handle export_token_handle) {
  return fml::MakeRefCounted<SceneHost>(export_token_handle);
}

SceneHost::SceneHost(Dart_Handle export_token_handle) {}
#endif

SceneHost::~SceneHost() {}

void SceneHost::dispose() {
  ClearDartWrapper();
}

}  // namespace blink
