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

import 'dart:async';

import '../webkit_inspection_protocol.dart';

class WipTarget extends WipDomain {
  WipTarget(WipConnection connection) : super(connection);

  /// Creates a new page.
  ///
  /// [url] The initial URL the page will be navigated to.
  ///
  /// Returns the targetId of the page opened.
  Future<String> createTarget(String url) async {
    WipResponse response =
        await sendCommand('Target.createTarget', params: {'url': url});
    return response.result['targetId'];
  }

  /// Activates (focuses) the target.
  Future activateTarget(String targetId) =>
      sendCommand('Target.activateTarget', params: {'targetId': targetId});

  /// Closes the target. If the target is a page that gets closed too.
  ///
  /// Returns `true` on success.
  Future<bool> closeTarget(String targetId) async {
    WipResponse response =
        await sendCommand('Target.closeTarget', params: {'targetId': targetId});
    return response.result['success'];
  }

  /// Inject object to the target's main frame that provides a communication
  /// channel with browser target. Injected object will be available as
  /// `window[bindingName]`. The object has the following API:
  ///
  ///  - binding.send(json) - a method to send messages over the remote
  ///    debugging protocol
  ///  - binding.onmessage = json => handleMessage(json) - a callback that will
  ///    be called for the protocol notifications and command responses.
  @experimental
  Future<void> exposeDevToolsProtocol(
    String targetId, {
    String bindingName,
  }) async {
    final Map<String, dynamic> params = {'targetId': targetId};
    if (bindingName != null) {
      params['bindingName'] = bindingName;
    }
    final WipResponse response = await sendCommand(
      'Target.exposeDevToolsProtocol',
      params: params,
    );
    dynamic foo = await response.result['targetId'];
    print(foo);
  }
}
