/* * CEF JS调用C#组装类 * * 使用方法(CefGlue为例): * public class BrowserRenderProcessHandler : CefRenderProcessHandler { * //自定义Handler private TestBrowserHandler _testHandler = null; * * protected override void OnWebKitInitialized() * { * _testHandler = new TestBrowserHandler(); * CefRuntime.RegisterExtension(_testHandler.GetType().Name, _testHandler.Javascript.Create(), _testHandler); * } * } * * ////// 测试Handler /// public class TestBrowserHandler : CefV8Handler { public GenerateJavascriptFull Javascript = null; * * public TestBrowserHandler() { Javascript = new GenerateJavascriptFull("plugins", "test"); * // getHello的参数数量,可进一步封装。表示接受一个参数 Javascript.AddMethod("gethello", "arg0"); * // getHello的参数数量,可进一步封装。表示接受二个参数 Javascript.AddMethod("sethello", "arg0","arg1"); * //表示无参 * Javascript.AddMethod("sethello"); Javascript.AddGetProperty("hello", "gethello"); Javascript.AddSetProperty("hello", "sethello", "arg0"); Javascript.AddMethod("start", "arg0"); Javascript.AddMethod("stop"); * * //这里表示浏览器JS增加了: window.plugins.test 对象 * // window.plugins.test.gethello() * // window.plugins.test.sethello("123") * //断点在 Execute(**)中 } * * protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception) { try { returnValue = CefV8Value.CreateNull(); switch (name) { case "gethello": //returnValue = CefV8Value.CreateString(GetHello()); if (arguments.Length == 1 && arguments[0].IsFunction) { CefV8Value[] args = new CefV8Value[1]; args[0] = CefV8Value.CreateString(GetHello()); returnValue = arguments[0].ExecuteFunction(null, args); } break; case "sethello": returnValue = CefV8Value.CreateBool(SetHello(arguments[0].GetStringValue())); break; case "start": if (arguments.Length == 1 && arguments[0].IsFunction) { CefV8Context context = CefV8Context.GetCurrentContext(); //这里定义异步调用方式 new Thread(new ThreadStart(delegate() { while (isStart) { System.Threading.Thread.Sleep(1000); string timer = DateTime.Now.ToString(); * //TestTimerTask继承CefTask CefRuntime.PostTask(CefThreadId.Renderer, new TestTimerTask(context as CefV8Context, arguments[0], new object[] { timer })); } })).Start(); returnValue = CefV8Value.CreateBool(true); } break; case "stop": isStart = false; returnValue = CefV8Value.CreateBool(true); break; } exception = null; return true; } catch (Exception e) { returnValue = null; exception = e.Message; return false; } } * } * * * * * */using System;using System.Collections.Generic;using System.Text;namespace G.DeskCommon{ ////// 组装JS /// public class GenerateJavascriptFull { string _extensionName = string.Empty; string _functionName = string.Empty; Dictionary_methodName = new Dictionary (); // Dictionary _getterPropertyName = new Dictionary (); // 保存setter 名称 和参数。 与 _setterPropertyArgs 成对出现。 Dictionary _setterPropertyName = new Dictionary (); Dictionary _setterPropertyArgs = new Dictionary (); //自定义javascript代码 List _customJavascript = new List (); /// /// /// /// /// 插件方法作用域 /// e.g: window.plugin.test /// 其中 plugin 为作用域. 如不设置,添加的js方法在window下. /// /// /// /// public GenerateJavascriptFull(string extensionName, string functionName) { _extensionName = extensionName; _functionName = functionName; } ////// 增加方法 /// /// 方法名称 /// 参数名:arg0,arg1,...arg20 (固定写死) public void AddMethod(string methodName, params string[] args) { //检测是否存在改方法 if (_methodName.ContainsKey(methodName)) return; _methodName.Add(methodName, args); } ////// 增加Getter属性 /// /// 属性名称 /// 执行名称,CEF handler中execute的Name参数同名 public void AddGetProperty(string propertyName, string executeName) { if (_getterPropertyName.ContainsKey(propertyName)) return; _getterPropertyName.Add(propertyName, executeName); } ////// 增加Setter属性 /// /// 属性名称 /// 执行名称,CEF handler中execute的Name参数同名 /// 参数名:arg0,arg1,...arg20 (固定写死) public void AddSetProperty(string propertyName, string executeName, params string[] args) { if (_setterPropertyName.ContainsKey(propertyName) || _setterPropertyArgs.ContainsKey(propertyName)) return; _setterPropertyName.Add(propertyName, executeName); _setterPropertyArgs.Add(propertyName, args); } ////// 增加自定义的javascript代码。 /// /// 注意:functionName一定要大写。 /// 例如: TEST.__defineSetter__('hello', function(b) { /// native function sethello();sethello(b);}); public void AddCustomJavascript(string javascriptCode) { _customJavascript.Add(javascriptCode); } ////// 组装本地JS的一个过程 /// ///返回CEF识别的javascript public string Create() { //System.Threading.Thread.Sleep(3000); if (string.IsNullOrEmpty(_functionName)) throw new Exception("JavascriptFull函数名不能为空!"); StringBuilder sb = new StringBuilder(); //头部 if (!string.IsNullOrEmpty(_extensionName)) { sb.Append(string.Format("if (!{0}) var {0} = { { }}; ", _extensionName)); } if (!string.IsNullOrEmpty(_functionName)) { sb.Append(string.Format("var {0} = function () { { }}; ", _functionName.ToUpper())); if (!string.IsNullOrEmpty(_extensionName)) sb.Append(string.Format("if (!{0}.{1}) {0}.{1} = {2};", _extensionName, _functionName, _functionName.ToUpper())); else sb.Append(string.Format("if (!{0}) var {0} = {1};", _functionName, _functionName.ToUpper())); } //开始 sb.Append("(function () { "); //方法 foreach (KeyValuePairitem in _methodName) { sb.Append(string.Format("{0}.{1} = function ({2}) { { ", _functionName.ToUpper(), item.Key, string.Join(",", item.Value))); sb.Append(string.Format("native function {0}({1}); return {0}({1});", item.Key, string.Join(",", item.Value))); sb.Append("};"); } //GET属性 foreach (KeyValuePair item in _getterPropertyName) { sb.Append(string.Format("{0}.__defineGetter__('{1}', function () { { ", _functionName.ToUpper(), item.Key)); sb.Append(string.Format("native function {0}(); return {0}();", item.Value)); sb.Append("});"); } //SET属性 if (_setterPropertyArgs.Count == _setterPropertyName.Count) { foreach (KeyValuePair item in _setterPropertyName) { sb.Append(string.Format("{0}.__defineSetter__('{1}', function ({2}) { { ", _functionName.ToUpper(), item.Key, string.Join(",", _setterPropertyArgs[item.Key]))); sb.Append(string.Format("native function {0}({1}); return {0}({1});", item.Value, string.Join(",", _setterPropertyArgs[item.Key]))); sb.Append("});"); } } //自定义javascript for (int i = 0; i < _customJavascript.Count; i++) { sb.Append(_customJavascript[i]); } //结尾 sb.Append("})();"); return sb.ToString(); } }}