// Copyright © 2018 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
using System;
using CefSharp.Event;
namespace CefSharp
{
///
/// Javascript object repository, object are registered for binding
/// One repository per ChromiumWebBrowser instance
///
public interface IJavascriptObjectRepository : IDisposable
{
///
/// Register an object for binding in Javascript. You can either
/// register an object in advance or as part of the
/// event that will be called if no object matching object is found in the registry.
/// Objects binding is now initiated in Javascript through the CefSharp.BindObjectAsync
/// function (returns a Promise).
/// For more detailed examples see https://github.com/cefsharp/CefSharp/issues/2246
/// The equivilient to RegisterJsObject is isAsync = false
/// The equivilient RegisterAsyncJsObject is isAsync = true
///
/// object name
/// the object that will be bound in javascript
///
/// if true the object will be registered for async communication,
/// only methods will be exposed and when called from javascript will return a Promise to be awaited.
/// This method is newer and recommended for everyone starting out as it is faster and more reliable.
/// If false then methods and properties will be registered, this method relies on a WCF service to communicate.
/// If you are targeting .Net Core then you can only use isAsync = true as Microsoft has chosen not to support WCF.
///
/// binding options, by default method/property names are camelCased, you can control this
/// and other advanced options though this class.
void Register(string name, object objectToBind, bool isAsync, BindingOptions options = null);
///
/// UnRegister all the currently bound objects from the repository. If you unregister an object that is currently
/// bound in JavaScript then the method/property calls will fail.
///
void UnRegisterAll();
///
/// UnRegister a bound object from the repository. If you unregister an object that is currently
/// bound in JavaScript then the method/property calls will fail.
///
/// object name
/// returns true if the object was successfully unbound otherwise false.
bool UnRegister(string name);
///
/// Has bound objects
///
bool HasBoundObjects { get; }
///
/// Is object bound
///
/// name
/// true if object with matching name bound
bool IsBound(string name);
///
/// Event handler is called when an object with a given name is requested for binding and is not yet
/// registered with the repository. Use
/// to register objects (using
///
event EventHandler ResolveObject;
///
/// Event handler is triggered when a object has been successfully bound in javascript
///
event EventHandler ObjectBoundInJavascript;
///
/// Event handler is triggered when multiple objects has been successfully bound in javascript, this event only
/// contains the names of objects successfully bound.
///
event EventHandler ObjectsBoundInJavascript;
}
}