public void Start() { var pathToThisAssembly = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var pathToBinFolder = Path.Combine(pathToThisAssembly, "Dependencies", "x86", "CefGlue"); var envPath = Environment.GetEnvironmentVariable("PATH"); envPath = string.Format("{0};{1}", envPath, pathToBinFolder); Environment.SetEnvironmentVariable("PATH", envPath); var cefSettings = new CefSettings(); cefSettings.GraphicsImplementation = CefGraphicsImplementation.DesktopInProcess; cefSettings.MultiThreadedMessageLoop = true; //cefSettings.ExtraPluginPaths.Add(@"D:\vvvv_dev\misc\cef_binary_1.1025.607_windows\Release\pdf.dll"); //cefSettings.ExtraPluginPaths.Add(@"D:\vvvv_dev\misc\cef_binary_1.1025.607_windows\Release\gcswf32.dll"); // cefSettings.CachePath = Path.GetDirectoryName(Application.ExecutablePath) + "/cache"; // cefSettings.LogFile = Path.GetDirectoryName(Application.ExecutablePath) + "/CEF.log"; // Disable logging as it leads to freezes and crashes in some occasions. // For example see: // * http://code.google.com/p/chromiumembedded/issues/detail?id=570 // * http://www.magpcss.org/ceforum/viewtopic.php?f=6&t=761 cefSettings.LogSeverity = CefLogSeverity.Disable; Cef.Initialize(cefSettings); CefGlue.Threading.CefThread.UI.Send(_ => System.Threading.Thread.CurrentThread.Name = "UI", null); CefGlue.Threading.CefThread.IO.Send(_ => System.Threading.Thread.CurrentThread.Name = "IO", null); CefGlue.Threading.CefThread.File.Send(_ => System.Threading.Thread.CurrentThread.Name = "File", null); var schemeName = "cef"; if (!Cef.RegisterCustomScheme(schemeName, false, true, false)) { throw new Exception(string.Format("Couldn't register custom scheme '{0}'.", schemeName)); } if (!Cef.RegisterSchemeHandlerFactory(schemeName, null, new SchemeHandlerFactory())) { throw new Exception(string.Format("Couldn't register custom scheme factory for '{0}'.", schemeName)); } }
public void Start() { var pathToThisAssembly = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var pathToBinFolder = Path.Combine(pathToThisAssembly, "Dependencies", "x86", "CefGlue"); var envPath = Environment.GetEnvironmentVariable("PATH"); envPath = string.Format("{0};{1}", envPath, pathToBinFolder); Environment.SetEnvironmentVariable("PATH", envPath); var cefSettings = new CefSettings(); cefSettings.GraphicsImplementation = CefGraphicsImplementation.DesktopInProcess; cefSettings.MultiThreadedMessageLoop = true; //cefSettings.ExtraPluginPaths.Add(@"D:\vvvv_dev\misc\cef_binary_1.1025.607_windows\Release\pdf.dll"); //cefSettings.ExtraPluginPaths.Add(@"D:\vvvv_dev\misc\cef_binary_1.1025.607_windows\Release\gcswf32.dll"); // cefSettings.CachePath = Path.GetDirectoryName(Application.ExecutablePath) + "/cache"; // cefSettings.LogFile = Path.GetDirectoryName(Application.ExecutablePath) + "/CEF.log"; #if DEBUG cefSettings.LogSeverity = CefLogSeverity.Verbose; cefSettings.ReleaseDCheckEnabled = true; #else cefSettings.LogSeverity = CefLogSeverity.Disable; cefSettings.ReleaseDCheckEnabled = false; #endif var app = new App(); Cef.Initialize(cefSettings, app); CefGlue.Threading.CefThread.UI.Send(_ => System.Threading.Thread.CurrentThread.Name = "UI", null); CefGlue.Threading.CefThread.IO.Send(_ => System.Threading.Thread.CurrentThread.Name = "IO", null); CefGlue.Threading.CefThread.File.Send(_ => System.Threading.Thread.CurrentThread.Name = "File", null); if (!Cef.RegisterSchemeHandlerFactory(App.CEF_SCHEME_NAME, null, new SchemeHandlerFactory())) { throw new Exception(string.Format("Couldn't register custom scheme factory for '{0}'.", App.CEF_SCHEME_NAME)); } }
static void Main(string[] args) { var options = Options.Parse(args); if (options.Help) { MessageBox.Show(options.GetHelpText(), "CefGlue Client"); return; } var settings = new CefSettings(); settings.MultiThreadedMessageLoop = options.MultiThreadedMessageLoop; settings.CachePath = Path.GetDirectoryName(Application.ExecutablePath) + "/cache"; settings.LogFile = Path.GetDirectoryName(Application.ExecutablePath) + "/CEF.log"; settings.LogSeverity = CefLogSeverity.Verbose; settings.JavaScriptFlags = "--expose_gc"; #if DEBUG settings.ReleaseDCheckEnabled = true; #endif // settings.GraphicsImplementation = CefGraphicsImplementation.DesktopInProcess; var app = new App(); try { Cef.Initialize(settings, app); } catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } #if DIAGNOSTICS Cef.Logger.SetAllTargets(false); // Cef.Logger.SetTarget(Diagnostics.LogTarget.ScriptableObject, true); // Cef.Logger.SetTarget(Diagnostics.LogTarget.CefWebBrowser, true); Cef.Logger.SetTarget(Diagnostics.LogTarget.CefLoadHandler, true); Cef.Logger.SetTarget(Diagnostics.LogTarget.Default, true); #endif var version = Application.ProductVersion; // TODO: make Cef.Version property Cef.RegisterExtension("clientExtension", @" var cefGlue = cefGlue || {}; Object.defineProperty(cefGlue, ""version"", { value: """ + version + @""", configurable: false }); cefGlue.getDocumentState = function() { cefGlue.client.log('Querying document state... (cefGlue.getDocumentState)'); return true; } if (!cefGlue.client) { cefGlue.client = { dump: function() { native function Dump(); return Dump.apply(this, arguments); }, returnVoid: function() { native function ReturnVoid(); ReturnVoid(); }, returnVoidAndDisposeThis: function() { native function ReturnVoidAndDisposeThis(); ReturnVoidAndDisposeThis(); }, returnUndefined: function() { native function ReturnUndefined(); return ReturnUndefined(); }, returnNull: function() { native function ReturnNull(); return ReturnNull(); }, returnBool: function() { native function ReturnBool(); return ReturnBool(); }, returnInt: function() { native function ReturnInt(); return ReturnInt(); }, returnDouble: function() { native function ReturnDouble(); return ReturnDouble(); }, returnDate: function() { native function ReturnDate(); return ReturnDate(); }, returnString: function() { native function ReturnString(); return ReturnString(); }, returnArray: function() { native function ReturnArray(); return ReturnArray(); }, returnObject: function() { native function ReturnObject(); return ReturnObject(); }, returnComplexArray: function() { native function ReturnComplexArray(); return ReturnComplexArray(); }, returnComplexObject: function() { native function ReturnComplexObject(); return ReturnComplexObject(); }, subtractIntImplicit: function(a, b) { native function SubtractIntImplicit(); return SubtractIntImplicit(a, b); }, subtractIntExplicit: function(a, b) { native function SubtractIntExplicit(); return SubtractIntExplicit(a, b); }, get privateWorkingSet() { native function get_PrivateWorkingSet(); return get_PrivateWorkingSet(); }, log: function(message) { native function Log(); return Log.apply(this, arguments); }, leakTestV8Func: function() { native function leakTestV8Func(); return leakTestV8Func(); }, }; }; ", new ClientV8Handler()); Cef.JSBinding.BindJSObject( "cefGlue.tests.scriptableObject.v8Extension", new TestScriptableObject(), JSBindingOptions.Extension | JSBindingOptions.Public ); // TODO: must be cefglue.scriptableObject.tests.jsBinding Cef.JSBinding.BindJSObject( "testScriptableObject", new TestScriptableObject() ); Cef.JSBinding.BindJSObject <IJSObject>( "iJSObject", new TestScriptableObject() ); var testObject1 = new CefGlue.Client.Examples.ScriptableObject.TestObject1(); Cef.JSBinding.BindJSObject(testObject1, JSBindingOptions.Extension | JSBindingOptions.Public); Cef.JSBinding.BindJSObject("myTestObject1", testObject1, JSBindingOptions.Extension | JSBindingOptions.Public); // res is registered in App.cs // Cef.RegisterCustomScheme("res", true, true, false); Cef.RegisterSchemeHandlerFactory("res", null, new ClientSchemeHandlerFactory()); // This is shows that handler works like zombie - when handler is used by native side only // it prevents to be collected by GC. CefTask.Post(CefThreadId.UI, () => { #if DIAGNOSTICS Cef.Logger.Trace(Diagnostics.LogTarget.Default, "Cef.CurrentlyOn(CefThreadId.UI)=[{0}]", Cef.CurrentlyOn(CefThreadId.UI)); #endif }); GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); CefTask.Post(CefThreadId.IO, () => { #if DIAGNOSTICS Cef.Logger.Trace(Diagnostics.LogTarget.Default, "Cef.CurrentlyOn(CefThreadId.IO)=[{0}]", Cef.CurrentlyOn(CefThreadId.IO)); #endif }); CefTask.Post(CefThreadId.File, () => { #if DIAGNOSTICS Cef.Logger.Trace(Diagnostics.LogTarget.Default, "Cef.CurrentlyOn(CefThreadId.File)=[{0}]", Cef.CurrentlyOn(CefThreadId.File)); #endif }); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (!Cef.CurrentSettings.MultiThreadedMessageLoop && !options.CefMessageLoop) { Application.Idle += (sender, e) => { Cef.DoMessageLoopWork(); }; } using (var mainForm = new MainForm()) { if (Cef.CurrentSettings.MultiThreadedMessageLoop || !options.CefMessageLoop) { Application.Run(mainForm); } else { mainForm.Show(); Cef.RunMessageLoop(); } /* * if (!cefMessageLoop) * { * for (var i = 0; i < 1000; i++) * { * Cef.DoMessageLoopWork(); * } * } */ } Cef.Shutdown(); }