DCEF3 调用 js

http://www.cnblogs.com/Delphi-Farmer/p/4103708.html

  1. interface
  2.  
  3. uses
  4. ceflib;//其它
  5.  
  6. type
  7. //这里建议用class 不建议用class(TThread) 不然有些地方要报错
  8. TMyExtension = class(TThread) // or just class, (extension code execute in thread)
  9. public
  10. class function _geta:string;
  11. end;
  12.  
  13. TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
  14. protected
  15. procedure OnWebKitInitialized; override;
  16. end;
  17.  
  18. implementation
  19.  
  20. class function TMyExtension._geta: string;
  21. begin
  22. Result:='调用成功';
  23. end;
  24.  
  25. procedure TCustomRenderProcessHandler.OnWebKitInitialized;
  26. begin
  27. TCefRTTIExtension.Register('JS_DELPHI', TMyExtension);
  28. end;
  29.  
  30. initialization
  31. CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
  32.  
  33. end.

JS调用实例:

  1. <script> alert( JS_DELPHI._geta() ); <script>

这种方式调用时要写注册的类名:JS_DELPHI

在CEF1中是不需要写类名的,这点要注意

Dcef 与 js 交互

  1. type
  2. TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
  3. protected
  4. procedure OnWebKitInitialized; override;
  5. end;
  6.  
  7. TDcefb_Extension = class
  8. class procedure DoTest(Msg: string);
  9. end;
  10.  
  11. class procedure TDcefb_Extension.DoTest(Msg: string);
  12. begin
  13. ShowMessage(Msg);
  14. end;
  15.  
  16. procedure TCustomRenderProcessHandler.OnWebKitInitialized;
  17. begin
  18. TCefRTTIExtension.Register('Dcefb_Test', TDcefb_Extension);
  19. end;

工程文件内添加

  1. CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
  2. if not CefLoadLibDefault then
  3. Exit;
  4. 测试代码
  5. DcefBrowser1.ExecuteJavaScript('Dcefb_Test.DoTest("TestStr");');

2. 关于 Tchrome 中加载 JS 与 delphi 交互问题

http://www.cnblogs.com/Delphi-Farmer/archive/2013/05/17/3083794.html

  1. 我这里直接给他代码,是转载的大神的,具体地址忘了。
  2.  
  3. (*
  4. * NeuglsWorkStudio
  5. * HTML Interface Javascript Extendtion
  6. * This unit implmented TNCJsExtented which used for extend the capablity of
  7. * javascript.
  8. *
  9. * Author : Neugls
  10. * Create time: 4/27/2011
  11. *
  12. * Thanks for : Henri Gourvest
  13. *
  14. *
  15. *
  16. *
  17. *
  18. *)
  19. unit VCL.JSExtented;
  20.  
  21. interface
  22.  
  23. uses
  24. SysUtils, Classes,ceflib,Rtti,cefvcl;
  25.  
  26. const
  27. csErrorParameters ='Error Parameters';
  28. csHaveNoThisMember ='Have no member';
  29. csChromiumCouldNotBeNil ='Chromium could not be nil, please first set the Chromium property';
  30.  
  31. type
  32. {}
  33. TVCLJsExtended = class(TComponent)
  34. type
  35. TANameType=(ntMethod,ntField,ntProperty);
  36. {Inner class}
  37. TNCJSHandle=class(TCefv8HandlerOwn)
  38. private
  39. FContainer:TVCLJsExtended;
  40. protected
  41. function Execute(const name: ustring; const obj: ICefv8Value;
  42. const arguments: TCefv8ValueArray; var retval: ICefv8Value;
  43. var exception: ustring): Boolean; override;
  44.  
  45. procedure JsCallMethod(Method:TRttiMethod;out ReturnVal:ICefv8Value; const Param:TCefv8ValueArray);overload;
  46. procedure JsCallMethod(Method:TRttiMethod;out ReturnVal:ICefv8Value);overload;
  47. function MethodParamLength(Mn:string):Integer;
  48. public
  49. constructor Create(Container:TVCLJsExtended);
  50. end;
  51.  
  52. private
  53. FProcessObject:TObject;
  54. FJsHandle:TNCJSHandle;
  55. FTypeInfo:Pointer;
  56. FCustomChromium:TChromium;
  57. FFrame:ICefFrame;
  58. public
  59. Frame:ICefFrame{ read FFrame write FFrame};
  60. property ProcessObject:TObject read FProcessObject;
  61. property ATypeInfo:Pointer read FTypeInfo;
  62. procedure SetProcessObject(value:TObject;ATypeInfo:Pointer);
  63. Procedure ExecuteJavaScript(const jsCode, scriptUrl: string; startLine: Integer);overload;
  64. Procedure ExecuteJavaScript(const jsCode:string);overload;
  65. constructor create(AOwner:TComponent);override;
  66.  
  67. property Chromium:TChromium read FCustomChromium write FCustomChromium;
  68. end;
  69.  
  70. TVCLNcJsExtended = class(TVCLJsExtended)
  71. published
  72. property Chromium;
  73. end;
  74. TNCWebBrowser=class(TChromium)
  75.  
  76. end;
  77.  
  78. procedure Register;
  79.  
  80. implementation
  81. uses TypInfo;
  82. procedure Register;
  83. begin
  84. RegisterComponents('NwControls', [TVCLNcJsExtended]);
  85. RegisterComponents('NwControls', [TChromium]);
  86. end;
  87.  
  88. { TVCLJsExtended }
  89.  
  90. constructor TVCLJsExtended.create(AOwner:TComponent);
  91. begin
  92. inherited create(AOwner);
  93. FProcessObject:=nil;
  94. FJsHandle:=TNCJSHandle.Create(Self);
  95. end;
  96.  
  97. procedure TVCLJsExtended.ExecuteJavaScript(const jsCode, scriptUrl: string;
  98. startLine: Integer);
  99. begin
  100. if not Assigned(FCustomChromium) then
  101. begin
  102. raise Exception.Create(csChromiumCouldNotBeNil);
  103. Exit;
  104. end;
  105. FCustomChromium.Browser.MainFrame.ExecuteJavaScript(jsCode,scriptUrl,startLine);
  106. end;
  107.  
  108. procedure TVCLJsExtended.ExecuteJavaScript(const jsCode:string);
  109. begin
  110. ExecuteJavaScript(jsCode,);
  111. end;
  112.  
  113. procedure TVCLJsExtended.SetProcessObject(value: TObject;ATypeInfo:Pointer);
  114. var
  115. RttiContext:TRttiContext;
  116. RttiType:TRttiType;
  117. RM:TRttiMethod;
  118. RP:TRttiProperty;
  119. RF:TRttiField;
  120.  
  121. JsStr,name:String;
  122. I:Integer;
  123. begin
  124. {
  125. 根据object所提供的方法属性生成js字符串,希望注册.
  126. }
  127. FProcessObject:=value;
  128. FTypeInfo:=ATypeInfo;
  129. RttiType:=RttiContext.GetType(FTypeInfo);
  130.  
  131. name:=RttiType.Name;
  132. JsStr:=Format('var %s;',[name]);
  133. JsStr:=Format('%s if(!%s) %s={};',[JsStr,name,name]);
  134.  
  135. {Process method}
  136. for RM in RttiType.GetMethods do
  137. begin
  138. JsStr:=JsStr+Format(#$A#$D' native function %s(',[RM.Name]);
  139. then
  140. JsStr:=Format('%s);',[JsStr])
  141. else
  142. begin
  143. do
  144. JsStr:=Format('%s %s,',[JsStr,chr(ord('A')+I)]);
  145. I:=Length(RM.GetParameters)-;
  146. JsStr:=Format('%s %s);',[JsStr,chr(ord('A')+I)]);
  147. end;
  148. end;
  149.  
  150. {Process Field}
  151. for RF in RttiType.GetFields do
  152. begin
  153. JsStr:=Format('%s'#$A#$D' var %s;',[JsStr,RF.Name]);
  154. case RF.FieldType.TypeKind of
  155. tkUnknown: ;
  156. tkInteger: JsStr:=Format('%s'#$A#$D' %s=%d;',[JsStr,RF.Name,RF.GetValue(FProcessObject).AsInteger]);
  157. tkChar: JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RF.Name,RF.GetValue(FProcessObject).AsString]);
  158. tkEnumeration: JsStr:=Format('%s'#$A#$D' %s=%d;',[JsStr,RF.Name,RF.GetValue(FProcessObject).AsInteger]);
  159. tkFloat: JsStr:=Format('%s'#$A#$D' %s=%f;',[JsStr,RF.Name,RF.GetValue(FProcessObject).AsExtended]);
  160. tkString: JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RF.Name,RF.GetValue(FProcessObject).AsString]);
  161. tkSet: JsStr:=Format('%s'#$A#$D' %s=%d;',[JsStr,RF.Name,RF.GetValue(FProcessObject).AsInteger]);
  162. tkClass:{support later} JsStr:=Format('%s'#$A#$D' %s={};',[JsStr,RF.Name]);
  163. tkMethod: ;
  164. tkWChar: JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RF.Name,RF.GetValue(FProcessObject).AsString]);
  165. tkLString: JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RF.Name,RF.GetValue(FProcessObject).AsString]);
  166. tkWString: JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RF.Name,RF.GetValue(FProcessObject).AsString]);
  167. tkVariant: ;
  168. tkArray: ;
  169. tkRecord: ;
  170. tkInterface: ;
  171. tkInt64: JsStr:=Format('%s'#$A#$D' %s=%d;',[JsStr,RF.Name,RF.GetValue(FProcessObject).AsInteger]);
  172. tkDynArray: ;
  173. tkUString: JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RF.Name,RF.GetValue(FProcessObject).AsString]);
  174. tkClassRef: ;
  175. tkPointer: ;
  176. tkProcedure: ;
  177. end;
  178. end;
  179.  
  180. {Process property}
  181. for RP in RttiType.GetProperties do
  182. begin
  183. JsStr:=Format('%s'#$A#$D' var %s;',[JsStr,RP.Name]);
  184. case RF.FieldType.TypeKind of
  185. tkUnknown: ;
  186. tkInteger: JsStr:=Format('%s'#$A#$D' %s=%d;',[JsStr,RP.Name,RP.GetValue(FProcessObject).AsInteger]);
  187. tkChar: JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RP.Name,RP.GetValue(FProcessObject).AsString]);
  188. tkEnumeration: JsStr:=Format('%s'#$A#$D' %s=%d;',[JsStr,RP.Name,RP.GetValue(FProcessObject).AsInteger]);
  189. tkFloat: JsStr:=Format('%s'#$A#$D' %s=%f;',[JsStr,RP.Name,RP.GetValue(FProcessObject).AsExtended]);
  190. tkString: JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RP.Name,RP.GetValue(FProcessObject).AsString]);
  191. tkSet: JsStr:=Format('%s'#$A#$D' %s=%d;',[JsStr,RP.Name,RP.GetValue(FProcessObject).AsInteger]);
  192. tkClass:{support later} JsStr:=Format('%s'#$A#$D' %s={};',[JsStr,RP.Name]);
  193. tkMethod: ;
  194. tkWChar: JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RP.Name,RP.GetValue(FProcessObject).AsString]);
  195. tkLString: JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RP.Name,RP.GetValue(FProcessObject).AsString]);
  196. tkWString: JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RP.Name,RP.GetValue(FProcessObject).AsString]);
  197. tkVariant: ;
  198. tkArray: ;
  199. tkRecord: ;
  200. tkInterface: ;
  201. tkInt64: JsStr:=Format('%s'#$A#$D' %s=%d;',[JsStr,RP.Name,RP.GetValue(FProcessObject).AsInteger]);
  202. tkDynArray: ;
  203. tkUString: if not RP.GetValue(FProcessObject).IsObject then JsStr:=Format('%s'#$A#$D' %s="%s";',[JsStr,RP.Name,RP.GetValue(FProcessObject).AsString]);
  204. tkClassRef: ;
  205. tkPointer: ;
  206. tkProcedure: ;
  207. end;
  208. end;
  209.  
  210. if not CefRegisterExtension(RttiType.Name,JsStr,FJsHandle) then
  211. Raise Exception.Create('Register JavaScript Extension Error');
  212. end;
  213.  
  214. { TVCLJsExtended.TNCJSHandle }
  215.  
  216. constructor TVCLJsExtended.TNCJSHandle.Create(
  217. Container: TVCLJsExtended);
  218. begin
  219. inherited Create;
  220. FContainer:=Container;
  221. end;
  222.  
  223. function TVCLJsExtended.TNCJSHandle.Execute(const name: ustring;
  224. const obj: ICefv8Value; const arguments: TCefv8ValueArray;
  225. var retval: ICefv8Value; var exception: ustring): Boolean;
  226. var
  227. RttiContext:TRttiContext;
  228. rm:TRttiMember;
  229. M:TRttiMethod;
  230. F:TRttiField;
  231. P:TRttiProperty;
  232. A:TRttiArrayType;
  233. nameType:TANameTYpe;
  234. o:TObject;
  235. n:string;
  236.  
  237. function ObjectHaveName(const AObject:TObject; const name:String;out isMethod:TANameTYpe; out mb:TRttiMember):Boolean;
  238. var
  239. RttiType:TRttiType;
  240. RM:TRttiMethod;
  241. RP:TRttiProperty;
  242. RF:TRttiField;
  243. begin
  244. Result:=false;
  245. RttiType:=RttiContext.GetType(FContainer.FTypeInfo);
  246. for RM in RttiType.GetMethods do
  247. begin
  248. then
  249. begin
  250. isMethod:=ntMethod;
  251. mb:=RM;
  252. Exit(True);
  253. end;
  254. end;
  255.  
  256. for RP in RttiType.GetProperties do
  257. begin
  258. then
  259. begin
  260. isMethod:=ntProperty;
  261. mb:=RP;
  262. Exit(True);
  263. end;
  264. end;
  265.  
  266. for RF in RttiType.GetFields do
  267. begin
  268. then
  269. begin
  270. isMethod:=ntField;
  271. mb:=RF;
  272. Exit(True);
  273. end;
  274. end;
  275. end;
  276. begin
  277. Result:=true;
  278. O:=FContainer.ProcessObject;
  279. n:=name;
  280. if not ObjectHaveName(O,name,nameType,rm) then
  281. begin
  282. exception:=csHaveNoThisMember;
  283. Exit(False);
  284. end;
  285.  
  286. case nameType of
  287. ntMethod:
  288. begin
  289. M:=rm as TRttiMethod;
  290.  
  291. //Assert(M.MethodKind<>mkFunction);
  292. then
  293. begin
  294. ) and (Length(arguments)=Length(M.GetParameters)) then
  295. begin
  296. JsCallMethod(M,retval,arguments);
  297.  
  298. end
  299. else
  300. begin
  301. exception:=csErrorParameters;
  302. Exit(False);
  303. end;
  304. end
  305. else
  306. begin
  307. JsCallMethod(M,retval);
  308. end;
  309.  
  310. end;
  311. ntField:
  312. begin
  313. F:=rm as TRttiField;
  314. case F.FieldType.TypeKind of
  315. tkUnknown: ;
  316. tkInteger: retval:=TCefv8ValueRef.CreateInt(F.GetValue(FContainer.ProcessObject).AsInteger);
  317. tkChar: retval:=TCefv8ValueRef.CreateString(F.GetValue(FContainer.ProcessObject).AsString);
  318. tkEnumeration: retval:=TCefv8ValueRef.CreateInt(F.GetValue(FContainer.ProcessObject).AsInteger);
  319. tkFloat: retval:=TCefv8ValueRef.CreateDouble(F.GetValue(FContainer.ProcessObject).AsExtended);
  320. tkString: retval:=TCefv8ValueRef.CreateString(F.GetValue(FContainer.ProcessObject).AsString);
  321. tkSet: retval:=TCefv8ValueRef.CreateInt(F.GetValue(FContainer.ProcessObject).AsInteger);
  322. tkClass: ;//retval:=TCefv8ValueRef.CreateObject(F.GetValue(FContainer.ProcessObject).AsObject);
  323. tkMethod: ;
  324. tkWChar: retval:=TCefv8ValueRef.CreateString(F.GetValue(FContainer.ProcessObject).AsString);
  325. tkLString: retval:=TCefv8ValueRef.CreateString(F.GetValue(FContainer.ProcessObject).AsString);
  326. tkWString: retval:=TCefv8ValueRef.CreateString(F.GetValue(FContainer.ProcessObject).AsString);
  327. tkVariant: ;
  328. tkArray:
  329. begin
  330. {
  331. retval:=TCefv8ValueRef.CreateArray;
  332. A:=F.FieldType as TRttiArrayType;
  333. //support only one demision array
  334. if A.DimensionCount=1 then
  335. for I := 0 to A.TotalElementCount do
  336. begin
  337. case A.ElementType.TypeKind of
  338. tkUnknown: retval.SetValueByIndex(I,TCefv8ValueRef.create());
  339. tkInteger: ;
  340. tkChar: ;
  341. tkEnumeration: ;
  342. tkFloat: ;
  343. tkString: ;
  344. tkSet: ;
  345. tkClass: ;
  346. tkMethod: ;
  347. tkWChar: ;
  348. tkLString: ;
  349. tkWString: ;
  350. tkVariant: ;
  351. tkArray: ;
  352. tkRecord: ;
  353. tkInterface: ;
  354. tkInt64: ;
  355. tkDynArray: ;
  356. tkUString: ;
  357. tkClassRef: ;
  358. tkPointer: ;
  359. tkProcedure: ;
  360. end;
  361. retval.SetValueByIndex(I,TCefv8ValueRef.create)
  362. end;
  363.  
  364. retval.SetValueByIndex()
  365. end;;
  366. tkRecord: ;
  367. tkInterface: ;
  368. tkInt64: retval:=TCefv8ValueRef.CreateInt(F.GetValue(FContainer.ProcessObject).AsInteger);
  369. tkDynArray: ;
  370. tkUString: retval:=TCefv8ValueRef.CreateString(F.GetValue(FContainer.ProcessObject).AsString);
  371. tkClassRef: ;
  372. tkPointer: retval:=TCefv8ValueRef.CreateInt(F.GetValue(FContainer.ProcessObject).AsInteger);
  373. tkProcedure: ; }
  374. end;
  375. end;
  376. end;
  377. ntProperty:
  378. begin
  379. P:=rm as TRttiProperty;
  380. case P.PropertyType.TypeKind of
  381. tkUnknown: ;
  382. tkInteger: retval:=TCefv8ValueRef.CreateInt(p.GetValue(FContainer.ProcessObject).AsInteger);
  383. tkChar: retval:=TCefv8ValueRef.CreateString(p.GetValue(FContainer.ProcessObject).AsString);
  384. tkEnumeration: retval:=TCefv8ValueRef.CreateInt(p.GetValue(FContainer.ProcessObject).AsInteger);
  385. tkFloat: retval:=TCefv8ValueRef.CreateDouble(p.GetValue(FContainer.ProcessObject).AsExtended);
  386. tkString: retval:=TCefv8ValueRef.CreateString(p.GetValue(FContainer.ProcessObject).AsString);
  387. tkSet: retval:=TCefv8ValueRef.CreateInt(p.GetValue(FContainer.ProcessObject).AsInteger);
  388. tkClass: ;//retval:=TCefv8ValueRef.CreateObject(p.GetValue(FContainer.ProcessObject).AsObject);
  389. tkMethod: ;
  390. tkWChar: retval:=TCefv8ValueRef.CreateString(p.GetValue(FContainer.ProcessObject).AsString);
  391. tkLString: retval:=TCefv8ValueRef.CreateString(p.GetValue(FContainer.ProcessObject).AsString);
  392. tkWString: retval:=TCefv8ValueRef.CreateString(p.GetValue(FContainer.ProcessObject).AsString);
  393. tkVariant: ;
  394. tkArray:;
  395. end;
  396. end;
  397. end;
  398.  
  399. end;
  400.  
  401. procedure TVCLJsExtended.TNCJSHandle.JsCallMethod(Method: TRttiMethod;
  402. out ReturnVal: ICefv8Value; const Param: TCefv8ValueArray);
  403. var
  404. VA:array of TValue;
  405. I:Integer;
  406. rva:TValue;
  407. AInstance:TObject;
  408. begin
  409. if Param<>nil then
  410. begin
  411. SetLength(VA,Length(Param));
  412. do
  413. begin
  414. if Param[I].IsBool then
  415. VA[I]:=TValue.From<Boolean>(Param[I].GetBoolValue);
  416.  
  417. if Param[I].IsInt then
  418. begin
  419. VA[I]:=TValue.From<Integer>(Param[I].GetIntValue);
  420. Continue;
  421. end;
  422.  
  423. if Param[I].IsDouble then
  424. begin
  425. VA[I]:=TValue.From<Double>(Param[I].GetDoubleValue);
  426. Continue;
  427. end;
  428.  
  429. if Param[I].IsString then
  430. VA[I]:=TValue.From<String>(Param[I].GetStringValue);
  431.  
  432. if Param[I].IsObject then
  433. {VA[I].AsObject:=Param[I].get};
  434. //if Param[I].is then
  435.  
  436. end;
  437. end
  438. else
  439. ;//VA:=nil;
  440. AInstance:=FContainer.ProcessObject;
  441. Rva:=Method.Invoke(AInstance,VA);
  442. case rva.Kind of
  443. tkUnknown: ;
  444. tkInteger: ReturnVal:=TCefv8ValueRef.CreateInt(rva.AsInteger);
  445. tkChar: ReturnVal:=TCefv8ValueRef.CreateString(rva.AsString);
  446. tkEnumeration: ReturnVal:=TCefv8ValueRef.CreateInt(rva.AsOrdinal);
  447. tkFloat: ReturnVal:=TCefv8ValueRef.CreateDouble(rva.AsExtended);
  448. tkString: ReturnVal:=TCefv8ValueRef.CreateString(rva.AsString);
  449. tkSet: ReturnVal:=TCefv8ValueRef.CreateInt(rva.AsInteger);
  450. tkClass: ;//ReturnVal:=TCefv8ValueRef.CreateObject(rva.AsObject);
  451. tkMethod: ;
  452. tkWChar: ReturnVal:=TCefv8ValueRef.CreateString(rva.AsString);
  453. tkLString: ReturnVal:=TCefv8ValueRef.CreateString(rva.AsString);
  454. tkWString: ReturnVal:=TCefv8ValueRef.CreateString(rva.AsString);
  455. tkVariant: ;
  456. tkArray:;
  457. tkRecord: ;
  458. tkInterface: ;
  459. tkInt64: ReturnVal:=TCefv8ValueRef.CreateInt(rva.AsInteger);
  460. tkDynArray: ;
  461. tkUString: ReturnVal:=TCefv8ValueRef.CreateString(rva.AsString);
  462. tkClassRef: ;
  463. tkPointer: ;
  464. tkProcedure: ;
  465. end;
  466. end;
  467.  
  468. procedure TVCLJsExtended.TNCJSHandle.JsCallMethod(Method: TRttiMethod;
  469. out ReturnVal: ICefv8Value);
  470. begin
  471. JsCallMethod(Method,ReturnVal,nil);
  472. end;
  473.  
  474. function TVCLJsExtended.TNCJSHandle.MethodParamLength(Mn: string): Integer;
  475. var
  476. Rtx:TRttiContext;
  477. M:TRttiMethod;
  478. RT:TRttiType;
  479. begin
  480. RT:=Rtx.GetType(FContainer.FTypeInfo);
  481. M:=Rt.GetMethod(Mn);
  482. Result:=Length(M.GetParameters);
  483. end;
  484.  
  485. end.
  486. 这是一个控件,他的功能是把delphi函数预注册到程序环境中,这样,在本程序内的所有chrome控件,都可以通过js调用到delphi函数,不过请注意,最好不要用到boolean类型的变量,这样会导致js调用不到delphi
  487.  
  488. 具体的用法可以在网上搜索下,我就里就不详细写了,毕竟是转载的。

黑屏问题

因为部分集成显卡版本太老或是不支持,导致webkit渲染失败,手动添加参数,关闭硬件渲染

  1. procedure OnbeforeCmdLine(const processType: ustring;
  2. const commandLine: ICefCommandLine);
  3. begin
  4. commandLine.AppendSwitch('disable-gpu');
  5. end;
  6.  
  7. CefOnBeforeCommandLineProcessing := OnbeforeCmdLine;

让 DCEF 支持摄像头

当前版本需要手动添加参数,可能以后dcef3会提供接口甚至回调事件

  1. procedure OnbeforeCmdLine(const processType: ustring;
  2. const commandLine: ICefCommandLine);
  3. begin
  4. commandLine.AppendSwitch('enable-media-stream');
  5. end;
  6.  
  7. CefOnBeforeCommandLineProcessing := OnbeforeCmdLine;

支持 Flash

需要用到pepperflash插件,由于git上不能上传这类文件,还有版权问题,就未添加到TDcefBrowser里

  1. if not CefLoadLibDefault then
  2. Exit;
  3.  
  4. CefAddWebPluginPath(ExtractFilePath(Paramstr()) +
  5. 'PepperFlash\pepflashplayer.dll');
  6. CefRefreshWebPlugins();

解决语言环境问题

单纯的设置CefLocale := 'zh-CN'有时并不能解决问题,JS获取的navigator.language的确为zh-CN,但很多网页通过HTTPACCEPTLANGUAGE来判断语言,例如QQ邮箱,因此我们需要在OnBeforeResourceLoad事件中做相应的设置

  1. procedure TMainForm.DcefBrowserBeforeResourceLoad(const PageIndex: Integer;
  2. const browser: ICefBrowser; const frame: ICefFrame;
  3. const request: ICefRequest; var CancelLoad: Boolean);
  4. var
  5. hm: ICefStringMultimap;
  6. begin
  7. if Not request.IsReadOnly then
  8. begin
  9. hm := TCefStringMultimapOwn.Create;
  10. request.GetHeaderMap(hm);
  11. hm.Append('Accept-Language', 'zh-CN');
  12. request.SetHeaderMap(hm);
  13. end;
  14. end;

CefSharp 实现 javascript 回调 c# 方法

http://www.cnblogs.com/worgeling/p/3421648.html

在构建完WebView webView = new WebView(url)后,即可调用RegisterJsObject方法来注册一个js对象,从而前端的javascript就可以访问这个对象,调用定义的方法。

  1. public class CallbackObjectForJs{
  2. public void showMessage(string msg){
  3. MessageBox.Show(msg);
  4. }
  5. }
  6.  
  7. WebView webView = new WebView("http://localhost:8080");
  8. webView.RegisterJsObject("callbackObj", new CallbackObjectForJs());

前端页面javascript代码即可访问对象 callbackObj。

  1. <script type="text/javascript">
  2. callbackObj.showMessage('message from js');
  3. </script >

 注意:CallbackObjectForJs的showMessage方法首字母不能使大写,不然javascript回调的时候找不到对应的方法。原因还在分析中。。。

 PS:cefsharp是一个用于C#的浏览器控件(开源),C#自带的控件在IE内核适配的问题上处理起来有点麻烦,同时如果网页是重度使用javascript,那你可以考虑基于cef的各种浏览器控件,执行效率飙升。cefsharp的github:https://github.com/cefsharp/CefSharp

Use this code to delete Cookies from Chromium Version CEF3:

Use c_WB_ClearCookies for deleating all Cookies

Use c_WB_Clear_url_Cookies for deleating all Cookies only from one speceally Url like this -> c_WB_Clear_url_Cookies('http://google.com','cookie_name');

  1. type
  2. CefTask = class(TCefTaskOwn)
  3. procedure Execute; override;
  4.  
  5. public
  6. var url,cookieName: ustring;
  7. constructor create; virtual;
  8. end;
  9.  
  10. constructor CefTask.create;
  11. begin
  12. inherited create;
  13. url := '';
  14. cookieName := '';
  15. end;
  16.  
  17. procedure CefTask.Execute;
  18. var CookieManager: ICefCookieManager;
  19. begin
  20. CookieManager := TCefCookieManagerRef.Global;
  21. CookieManager.DeleteCookies(url,cookieName);
  22. end;
  23.  
  24. procedure c_WB_ClearCookies;
  25. var Task: CefTask;
  26. begin
  27. Task := CefTask.Create;
  28. CefPostTask(TID_IO, Task);
  29. end;
  30.  
  31. // c_WB_Clear_url_Cookies('http://google.com','cookie_name');
  32. procedure c_WB_Clear_url_Cookies(c_url,c_cookieName: ustring);
  33. var Task: CefTask;
  34. begin
  35. Task := CefTask.Create;
  36. Task.url := c_url;
  37. Task.cookieName := c_cookieName;
  38. CefPostTask(TID_IO, Task);
  39. end;

For list all Cookies to get the cookieName use Procedure list_all_cookies

  1. procedure pausek;
  2. var M: TMsg;
  3. begin
  4. , , , pm_Remove) do
  5. begin
  6. TranslateMessage(M);
  7. DispatchMessage(M);
  8. end;
  9. end;
  10.  
  11. procedure pause(i:longint);
  12. var j : nativeint;
  13. begin
  14. to i do
  15. begin
  16. pausek;
  17. sleep();
  18. end;
  19. end;
  20.  
  21. procedure list_all_cookies;
  22. var CookieManager: ICefCookieManager;
  23. cookie_list : string;
  24. ) + chr();
  25. begin
  26.  
  27. cookie_list := '';
  28.  
  29. CookieManager := TCefCookieManagerRef.Global;
  30.  
  31. CookieManager.VisitAllCookiesProc(
  32.  
  33. function(const name, value, domain, path: ustring; secure, httponly,
  34.  
  35. hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
  36.  
  37. count, total: Integer; out deleteCookie: Boolean): Boolean
  38.  
  39. begin
  40.  
  41. cookie_list := cookie_list + inttostr(count) + ': ' + domain + ' - ' + name + ' - ' + value + ' - ' + path + lf;
  42.  
  43. if (count<total) then result := true;
  44.  
  45. end
  46.  
  47. );
  48.  
  49. pause();
  50.  
  51. ShowMessage(cookie_list);
  52. end;

Create and get a cookie

http://stackoverflow.com/questions/16086160/delphi-chromium-embedded-create-and-get-a-cookie/23723741#23723741

  1. Uses
  2. ceflib;
  3.  
  4. const
  5. DefaultCookiesDir = 'Cookies/';
  6.  
  7. implementation
  8. {$R *.dfm}
  9.  
  10. procedure TForm1.Button2Click(Sender: TObject);
  11. var
  12. CookieManager: ICefCookieManager;
  13. CookiesPath : String;
  14. begin
  15. CookiesPath := ExtractFilePath(Application.ExeName) + DefaultCookiesDir + 'User1';
  16. CookieManager := TCefCookieManagerRef.GetGlobalManager;
  17. CookieManager.SetStoragePath(CookiesPath);
  18. Chromium1.Load('www.vk.com');
  19. end;

A guy form the official's DCEF3 forum provided the solution below, tested and approved !

  1. CookieManager: ICefCookieManager;
  2.  
  3. FormCreate:
  4. begin
  5. CookiesPath := ExtractFilePath(Application.ExeName) + 'cookies';
  6. CookieManager := TCefCookieManagerRef.Global(nil);
  7. CookieManager.SetStoragePath(CookiesPath, True, nil);
  8. end;
  9.  
  10. FormClose:
  11. begin
  12. CookieManager.FlushStore(nil);
  13. end

为按钮添加单击事件 Sample

  1. {$I cef.inc}
  2.  
  3. type
  4. TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
  5. protected
  6. procedure OnWebKitInitialized; override;
  7. function OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId;
  8. const message: ICefProcessMessage): Boolean; override;
  9. end;
  10.  
  11. TTestExtension = class
  12. class function hello: string;
  13. end;
  14.  
  15. procedure TMainForm.Button2Click(Sender: TObject);
  16. begin
  17. Chromium.browser.SendProcessMessage(PID_RENDERER,
  18. TCefProcessMessageRef.New('visitdom'));//操作DOM
  19. end;
  20.  
  21. procedure ButtonClickProc(const Event: ICefDomEvent);
  22. begin
  23. ShowMessage('Click The Button');
  24. end;
  25.  
  26. procedure VisitDomProc(const Doc: ICefDomDocument);
  27. var
  28. ButtonNode: ICefDomNode;
  29. begin
  30. ButtonNode := Doc.GetElementById('su1');
  31. if Assigned(ButtonNode) then
  32. ButtonNode.AddEventListenerProc('click', True, ButtonClickProc);
  33. end;
  34.  
  35. { TCustomRenderProcessHandler }
  36.  
  37. function TCustomRenderProcessHandler.OnProcessMessageReceived(
  38. const browser: ICefBrowser; sourceProcess: TCefProcessId;
  39. const message: ICefProcessMessage): Boolean;
  40. begin
  41. {$IFDEF DELPHI14_UP}
  42. if (message.Name = 'visitdom') then
  43. begin
  44. browser.MainFrame.VisitDomProc( VisitDomProc);
  45. Result := True;
  46. end
  47. else
  48. {$ENDIF}
  49. Result := False;
  50. end;
  51.  
  52. procedure TCustomRenderProcessHandler.OnWebKitInitialized;
  53. begin
  54. {$IFDEF DELPHI14_UP}
  55. TCefRTTIExtension.Register('app', TTestExtension);
  56. {$ENDIF}
  57. end;
  58.  
  59. { TTestExtension }
  60.  
  61. class function TTestExtension.hello: string;
  62. begin
  63. Result := 'Hello from Delphi';
  64. end;
  65.  
  66. initialization
  67. CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
  68. CefBrowserProcessHandler := TCefBrowserProcessHandlerOwn.Create;
  69. end.

DCEF3 相关资料的更多相关文章

  1. 全文检索解决方案(lucene工具类以及sphinx相关资料)

    介绍两种全文检索的技术. 1.  lucene+ 中文分词(IK) 关于lucene的原理,在这里可以得到很好的学习. http://www.blogjava.net/zhyiwww/archive/ ...

  2. React Test相关资料

    karma 前端测试驱动器,生产测试报告,多个浏览器 mocha js的测试框架,相当于junit chai,单元测试的断言库,提供expect shudl assert enzyme sinon.j ...

  3. iOS10以及xCode8相关资料收集

    兼容iOS 10 资料整理笔记 源文:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不 ...

  4. Nao 类人机器人 相关资料

    Nao 类人机器人 相关资料: 1.兄妹 PEPPER :在山东烟台生产,http://www.robot-china.com/news/201510/30/26564.html 2.国内机器人领先公 ...

  5. GBrowse配置相关资料

    GBrowse配置相关资料(形状.颜色.配置.gff3) http://gmod.org/wiki/Glyphs_and_Glyph_Optionshttp://gmod.org/wiki/GBrow ...

  6. AssetBundle机制相关资料收集

    原地址:http://www.cnblogs.com/realtimepixels/p/3652075.html AssetBundle机制相关资料收集 最近网友通过网站搜索Unity3D在手机及其他 ...

  7. 转:基于IOS上MDM技术相关资料整理及汇总

    一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入 ...

  8. smb相关资料

    smb相关资料 看资料就上维基 https://en.wikipedia.org/wiki/Server_Message_Block#Implementation http://www.bing.co ...

  9. Linux命令学习总结之rmdir命令的相关资料可以参考下

    这篇文章主要介绍了Linux命令学习总结之rmdir命令的相关资料,需要的朋友可以参考下(http://www.nanke0834.com) 命令简介: rmdir命令用用来删除空目录,如果目录非空, ...

随机推荐

  1. myeclipse 打开xml jsp页面慢 有时候会自动退出

    Myeclipse默认打开文件的方式是 jsp design,每次双击或者使用Ctrl+Shift+R打开 就会用这个打开 ,太慢了而且多次导致Myeclipse挂掉.可以通过以下的方式转化成你想要的 ...

  2. SmartGit STUDY

    Git Concepts This section helps you to get started with Git and gives you an understanding of the fu ...

  3. C#中实现对Excel特定文本的搜索

    打开Excel的VBA帮助,查看Excel的对象模型,很容易找到完成这个功能需要的几个集合和对象: Application.Workbooks. Workbook.Worksheets还有Worksh ...

  4. db file sequential read (数据文件顺序读取)

    转载:http://www.dbtan.com/2010/04/db-file-sequential-read.html db file sequential read (数据文件顺序读取): db ...

  5. 【LeetCode】120 - Triangle

    原题:Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacen ...

  6. asp.net mvc源码分析-Action篇 IModelBinder

    我们首先还是看看ReflectedParameterBindingInfo的Binder属性吧: public override IModelBinder Binder {            ge ...

  7. MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. 使用MATLAB Coder产生代码的3个步骤: 准备用于产生代码的MATLAB算法: 检查MATLAB代 ...

  8. atoi()函数的实现

    atoi()函数的功能:将字符串转换成整型数:atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回( ...

  9. Hadoop2的简单安装

    前面花了很多时间来介绍hadoop1的安装,随着hadoop的发展,hadoop2的应用也越来越普及,hadoop2解决了hadoop1中的很多问题,比如单点故障,namenode容量小的问题. 我们 ...

  10. 【脚本语言对比】BASH,PERL以及PYTHON

    据说: BASH能调用linux的应用程序,这是其最大的优点,也是其最大的缺点. PERL那复杂的语法确实看得让人想吐. python很优美,但是据说对正则的支持不够,没有perl强大. 总结一下学习 ...