// 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 System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using CefSharp.Event; namespace CefSharp { /// /// Javascript binding extension methods /// public static class JavascriptBindingExtensions { /// /// Make sure an object is bound in javascript. Executes against the main frame /// /// browser /// object names /// List of objects that were bound public static Task> EnsureObjectBoundAsync(this IWebBrowser browser, params string[] names) { var objBoundTasks = new TaskCompletionSource>(); EventHandler handler = null; handler = (sender, args) => { //Remove handler browser.JavascriptObjectRepository.ObjectsBoundInJavascript -= handler; var allObjectsBound = names.ToList().SequenceEqual(args.ObjectNames); if (allObjectsBound) { objBoundTasks.SetResult(args.ObjectNames); } else { objBoundTasks.SetException(new Exception("Not all objects were bound successfully, bound objects were " + string.Join(",", args.ObjectNames))); } }; browser.JavascriptObjectRepository.ObjectsBoundInJavascript += handler; var bindCommand = "(function() { CefSharp.BindObjectAsync({ NotifyIfAlreadyBound: true, IgnoreCache: false }, '" + string.Join("', '", names) + "'); })();"; browser.ExecuteScriptAsync(bindCommand); return objBoundTasks.Task; } } }