using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using Tango.PPC.Browser.Attributes; using CefSharp; using CefSharp.Wpf; using Tango.Core.Helpers; using System.Windows.Threading; namespace Tango.PPC.Browser.Helpers { public static class BoundObjectsHelper { private static DispatcherTimer _timer; private static Dispatcher _dispatcher; private static ChromiumWebBrowser _browser; private static List _scripts = new List(); public static void RegisterAllBoundObjects(ChromiumWebBrowser browser, Dispatcher dispatcher) { _dispatcher = dispatcher; _browser = browser; _timer = new DispatcherTimer(DispatcherPriority.Background, dispatcher); _timer.Tick += _timer_Tick; _timer.Interval = TimeSpan.FromSeconds(2); _timer.Stop(); foreach (var type in typeof(BoundObjectsHelper).Assembly.GetTypes().Where(x => x.GetCustomAttribute() != null)) { var att = type.GetCustomAttribute(); var script = EmbeddedResourceHelper.GetEmbeddedResourceText($"Tango.PPC.Browser.Scripts.{att.ScriptFile}"); _scripts.Add(script); browser.JavascriptObjectRepository.Register(att.Name, Activator.CreateInstance(type), true); browser.FrameLoadEnd += Browser_FrameLoadEnd; } } private static void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e) { _timer.Stop(); _timer.Start(); } private static void _timer_Tick(object sender, EventArgs e) { try { _timer.Stop(); _dispatcher.BeginInvoke(new Action(() => { foreach (var script in _scripts) { _browser.GetMainFrame().ExecuteJavaScriptAsync(script); } })); } catch { _timer.Start(); } } } }