// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:fidl/fidl.dart' show InterfaceHandle;
import 'package:fidl_fuchsia_web/fidl_async.dart' as web;
import 'package:fidl_fuchsia_io/fidl_async.dart' as fidl_io;
import 'package:fuchsia_services/services.dart' show StartupContext;
import 'package:zircon/zircon.dart';

/// Creates a web context for creating new web frames
web.ContextProxy createWebContext() {
  final context = web.ContextProxy();
  final contextProvider = web.ContextProviderProxy();
  final contextProviderProxyRequest = contextProvider.ctrl.request();
  StartupContext.fromStartupInfo().incoming.connectToServiceByNameWithChannel(
      contextProvider.ctrl.$serviceName,
      contextProviderProxyRequest.passChannel());
  final channel = Channel.fromFile('/svc');
  final webFeatures = web.ContextFeatureFlags.network |
      web.ContextFeatureFlags.audio |
      web.ContextFeatureFlags.hardwareVideoDecoder |
      web.ContextFeatureFlags.vulkan;
  final web.CreateContextParams params = web.CreateContextParams(
      serviceDirectory: InterfaceHandle<fidl_io.Directory>(channel),
      features: webFeatures);
  contextProvider.create(params, context.ctrl.request());
  contextProvider.ctrl.close();

  return context;
}
