Starting the browser

来源:互联网 发布:linux 源码安装 卸载 编辑:程序博客网 时间:2024/06/06 21:42

http://opensource.spotify.com/cefbuilds/index.html

http://opensource.spotify.com/cefbuilds/cef_binary_3.2883.1548.gd6fc4a4_windows64_client.tar.bz2

download dll and exe

CEF简介: 

   嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件。CEF支持一系列的编程语言和操作系统,并且能很容易地整合到新的或已有的工程中去。

  它的设计思想政治就是易用且兼顾性能。CEF基本的框架包含C/C++程序接口,通过本地库的接口来实现,而这个库则会隔离宿主程序和Chromium&Webkit的操作细节。它在浏览器控件和宿主程序之间提供紧密的整合,它支持用户插件,协议,JavaScript对象以及javascript扩展,宿主程序可以随意地控件资源下载,导航,下下文内容和打印等,并且可以跟Google Chrome浏览器一起,支持高性能和HTML5 技术,


CEF指南:


指南:

  首先把这段代码插入到窗口的创建函数里面去:

[cpp] view plaincopy
  1. // Create an instance of our CefClient implementation. Various methods in the  
  2. // MyClient instance will be called to notify about and customize browser  
  3. // behavior.   
  4. CefRefPtr<CefClient> client(new MyClient());  
  5.   
  6. // Information about the parent window, client rectangle, etc.  
  7. CefWindowInfo info;  
  8. info.SetAsChild(...);  
  9.   
  10. // Browser initialization settings.  
  11. CefBrowserSettings settings;  
  12.   
  13. // Create the new browser window object asynchronously. This eventually results  
  14. // in a call to CefLifeSpanHandler::OnAfterCreated().  
  15. CefBrowser::CreateBrowser(info, client, "http://www.google.com", settings);  

这段代码你可以在[test]文件夹下面的cefclient工程里面看到。

文件结构:

  include -- 这个文件夹里面放CEF客户应用程序所需的头文件

  libcef -- 此文件夹存放CEF的静态库

  libcef_dll -- 此文件夹CEF的动态拉链库

  tests -- 此文件夹存放测试的例子

       cefclient -- 一个简单的客户程序

       unittests --  CEF界面单元测试


浏览器事件:


   应用程序通过调用CefBrowser和CefFrame的方法来处理浏览器控件事件:
       a.Back, Forward, Reload and Stop Load。控件浏览器的导航
       b.Undo, Redo, Cut, Copy, Paste, Delete, Select All.控件目标框架的选取
       c.Print。打印目标框架
       d.Get Source。以字符串的形式来获取目标框架的HTML源码
       e.View Source. 用缓存文件来保存目的框架的HTML源码,并且用系统默认的文本查看器打开
       f.Load URL.加载特定的URL到目标框架
       g.Load String. 加载一个特定的字符串到目标框架,通过一个随意指定的虚拟URL
       h.Load Stream. 加载一个特定的二进制文件到目标框架,通过一个随意指定的虚拟URL
       i.Load Request, 加载一个特定的请求到目标框架
       j.Execute JavaScript: 在目标框架里面执行一个特定的Javscript命令
       k. Zoom。 缩放特定框架的网页内容

插入网景风格插件:

      CEF支持插入网景风格的插件,插入插件的动作跟正常插入基本动态链接库的插件一样,但是做为一个单独的Dll,必须通过容器来创建,并且要用CefRegisterPlugin()这个函数来注册到系统里面去。你要调用这个函数的话,你就得包含cef_nplugin.h这个头文件。

JavaScript扩展:

    CEF支持能连接本地程序源代码的Javascript扩展,演示程序你可以去看cef_v8.h进而的CefRegisterExtension()方法,还有CEFClient下面的演示例子,你如果想得到更多的信息,可以点下面的链接:  JavaScriptIntegration。

用户计划:

    CEF支持注册和处理像myscheme://mydomain一样的用户计划,你可去查看cef_scheme.h里面的CefRegisterScheme()和Scheme Handler测试单元,得到详细的说明。


框架总览:

   所有的文件前缀都是Cef


框架的建立和销毁:

   CEF的UI消息寄宿在一个框架建立的单线程中,用户只负责用CefInitialize()和CefShutdown()来建立和销毁这个线程,但是你如果设置了CefSettings.multi_threaded_message_loop, 这个UI消息循环也可以运行在一个单独的线程里面。


引用计数:

   所有的框架数都从CefBase这个基类继承而来,并且所有的实例指针都用CefRefPtr智能指针来管理,可以用AddRef()和Release()函数来自动处理引用计数。

平台无关:

   CEF框架被设计成平台无关的,现在它支持Windows,Mac os-x和Linux,为了无缝地支持多种平台,框架定义了一系列的平台无关的接口和类型定义。


框架接口:

      CefBrowser是主要的浏览器窗口类,可以用静态的函数CreateBrowser() 和CreateBrowserSync() 来创建一个新的浏览器窗口。
      CefFrame 代表一个浏览器窗口的框架,每个浏览器窗口有一个顶层的主框架,而这个主框架可以用GetMainFrame() 方法得到。
      CefClient是主浏览器窗口的代表接口,这个接口做为参数传递给CreateBrowser()
      CefRequest 代表URL,方法,发送数据和头文件等这样的请求。
      CefSchemeHandleFactory 类是被用来处理像myscheme://mydomain类似客户计划的请求
      CefReadHandler和CefWriteHandle是一个读写数据的简单接口。
      CefV8Handler,CefV8Value和CefV8Context是被用来创建和访问JavaScript对象。

以上内容是Cef的简介,后面我将翻译怎么编译并生成一个用CEF控件来创建的一个简单浏览器!

与 Chromium 的关系

CEF 推出了两种版本,分别是 CEF1 和 CEF3,这两种版本都得到了积极维护。这两个项目向嵌入客户端公开的 API 几乎相同,同时使用 Chromium 风格的 WebKit(现为 Blink)来呈现 HTML。二者的不同之处体现在它们与底层 HTML 引擎结合的方式上,不过,为了更好地了解这一点,对 Chromium 体系结构进行总体概述会十分有用。

Chromium 体系结构主要有三个层:Blink(以前称作 WebKit)API、Content API 和 Chrome。借助 Blink API,可以访问呈现引擎和 V8 JavaScript 引擎,这两个引擎在单个进程中一起运行。Content API 增加了多进程体系结构,并为更为复杂的HTML5 和浏览器功能(例如加速合成、地理位置和 WebRTC)提供了具体实现。Chrome 层包括 Chrome 浏览器用户界面以及与 Chrome 浏览器紧密耦合的各种功能实现,例如历史记录管理、扩展程序和书签。Chromium 团队目前正在致力于引入称作“组件”的第四种概念,此概念将为跨多个层的浏览器功能提供模块化实现。

Blink API 和 Content API 不稳定,而且很多功能都有其他的实现要求。CEF 便提供了这些实现,以及一个隐藏了大部分底层 Chromium 和 Blink 复杂性的稳定 API。CEF1 直接使用 Blink API,并因此而共享单进程体系结构。CEF3 使用 Content API 并受益于多进程体系结构以及 Content API 中实现的很多高级功能。得益于“组件”方面的变化,将更容易有选择性地启用和共享目前因与 Chrome 层紧密耦合而无法共享的功能实现,这对 CEF3 而言是一项额外的益处。

CEF3 实现了 Content API 提供的一部分接口和委派,实现方式与 Chrome 颇为相似。虽然开发人员可以直接从 Content API 开始嵌入 Chromium,但这会涉及到相当大的工作量,而这些工作在 CEF3 中已经完成。这些工作包括实现应用程序希望操纵的 Content API 接口和委派,并且在实现的过程中,还要为应用程序所需的运行平台 (Windows/Mac/Linux) 编写平台代码。另一方面,使用 CEF 时则十分简单:只需先编写几行代码,然后直接在应用程序内触发一个现代、最新的Html5 视图即可。

CEF1 和 CEF3 都将 Chromium 的某些部分纳入到了所产生的库中,并因此形成了对 Chromium 代码的依赖性。该项目保持了与底层特定版本 Chromium 代码的兼容性,这些代码的更新颇为频繁。从这个角度而言,嵌入者不必担心更新 Chromium 会破坏他们的应用程序。

从此处开始,除非另有说明,否则 CEF 这个术语将称作 CEF3。

快速入门

要着手使用 CEF,最简单的方式或许就是下载其中一个二进制版本。CEF 维护的一些分支与用于各版本的 Chromium 稳定分支兼容。定期发布的二进制版本通常都是基于一个此类稳定分支生成的。

可分发程序包包含标头、库、一些必需的资源以及一款称作 cefclient 的测试应用程序。这正是您应该着眼的地方。它完美地展示了如何使用 CEF,从启动该框架到实现通过 API 公开的 HTML 内容回调,都一一说明。您可以通过修改应用程序代码、快速重新生成等方式进行测试。

请注意,您还可以将 Chromium 命令行开关传递给 cefclient,以这种方式使用时它们所产生的效果将与在浏览器中产生的效果(如果适用)相同。

如果您要作出贡献,或者要使用其中一个二进制版本目前未提供的功能,您必须基于源代码生成 CEF 库。虽然 CEF 本身是非常轻便的,但这还涉及到生成 Chromium,从而使工作复杂性略有增加。在本篇博文中我不作细致阐述,但如果您想知道要从何处着手,可以浏览一下 CEF 的 automate 文件夹。其中的 python 脚本会签出 CEF 和 Chromium 源代码,并继续生成最终 CEF 程序包。同一文件夹中的 README 文件更加详细地描述了这一过程,并且还包含了在运行该脚本前要执行的一些必需步骤。


chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决定自己开发webcore的分支,叫做Blink引擎,而后google以BSD伯克利许可开源,BSD许可限制较为宽松,很多浏览器都是基于chromium开发的,比如,此后省略100字。google在原有基础上做了进一步的精简优化,并开发出v8 javascript引擎,2010年google收购了webrtc技术随后开放了源代码,webrtc采用vp编码,兼容html5标准,同年google推出了chrome os云操作系统,浏览器的衍生产品。

废话不多说,检索一下Chromium Embedded Framework,简称cef,你可以在cefbuilds上看到当前chromium最新放出的版本,也可以在google code上下载到,里面包括浏览器的核心库和底层api,支持c和c++的编程语言,另外也有第三方的包括.net/mono、java、python、delphi等开源项目。

我们从google code下载win32的c++库,打开release文件夹。

1

这里面作个介绍:

libcef.dll:cef核心库。

icudt.dll:编码格式库。

ffmpegsumo.dll:视频解码器,包含vp8 vp9编码库。

d3dcompiler_43.dll、d3dcompiler_46.dll、libEGL.dll、libGLESv2.dll

这几个是3d图形的库,d3dcompiler_43.dll适用于xp,d3dcompiler_46适用于xp以上版本。

include文件夹里面是cef c++的头文件,可以去github下载.net调用的project,叫做cefsharp,提供了winform和wpf的完整demo。

2

CefSharp:封装是C#调用api的入口和数据接受类。

CefSharp.BrowserSubprocess:是.net写的一个伴随进程,主要负责处理javascript和后台线程。

CefSharp.BrowserSubprocess.Core:是一个c++的工程,需要引用到cef的c++头文件,主要是javascript相关操作。

CefSharp.Core:也是一个c++工程,包括cef的初始化配置、接受事件等。

CefSharp.Example:c#调用cef的初始化配置。

CefSharp.WinForm.Example:写了一个自定义控件,作为cef浏览器的窗口。

fpCEF3--ok

Chromium Embedded Framework for Free Pascal

How to get started

Install cef3.lpk into Lazarus. A good starting point is the LCLSimple project, available in the Examples directory.

Important: All examples use build modes. Make sure to select the correct one, otherwise compilation will fail.

Windows

Download CEF3 from here or here and copy all files from eitherDebug orRelease to the folder your .exe is / will be in.

Linux

You need a build of CEF3 with tcmalloc disabled. The official CEF binaries are suitable.

Copy / link libcef.so,
a) to a default library location, eg. /usr/lib(64), /usr/local/lib(64)or
b) somewhere and set LD_LIBRARY_PATH accordingly

Make sure to include cthreads as the first unit in your main program.

Download

You can download the ported source using Subversion:

 svn co https://svn.code.sf.net/p/lazarus-ccr/svn/components/thtmlport [local dir]

License

The original Delphi code on which this port is based has been released by Dave Baldwin into the public domain. Additional code supplied with this port is released under the MPL 1.1 license.

Installation

To install the HtmlComp package in Lazarus:

  • Choose Package | Open package file, then select htmlcomp.lpk (in the package subfolder).
  • Click Compile to compile the package.
  • Click Compile a second time. A quirk in FPC < 2.7.1 apparently make this extra compile necessary. (Q solution to this problem is to move htmlun2.pas before htmlgif1.pas in the package file list)
  • Click Install to rebuild and relaunch Lazarus.

To compile a sample application that uses the HtmlComp package:

  • Choose File | Open, then select framedem.lpi or htmldemo.lpi (both in the demo_src subfolder).
  • Choose Run | Run to compile and run the sample app.


unit Unit1;




{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, UTF8Process, Forms, Controls, Graphics, Dialogs,LCLProc,
  LazHelpHTML, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    HTMLHelpDatabase1: THTMLHelpDatabase;
    ProcessUTF8_1: TProcessUTF8;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  v: THTMLBrowserHelpViewer;
  BrowserPath, BrowserParams: string;
  p: LongInt;
  URL: String;
  BrowserProcess: TProcessUTF8;
begin
  v:=THTMLBrowserHelpViewer.Create(nil);
  try
    v.FindDefaultBrowser(BrowserPath,BrowserParams);
    debugln(['Path=',BrowserPath,' Params=',BrowserParams]);

    URL:='h';
    p:=System.Pos('%s', BrowserParams);
    System.Delete(BrowserParams,p,2);
    System.Insert(URL,BrowserParams,p);

    // start browser
    BrowserProcess:=TProcessUTF8.Create(nil);
    try
      BrowserProcess.CommandLine:=BrowserPath+' '+BrowserParams;
      BrowserProcess.Execute;
    finally
      BrowserProcess.Free;
    end;
  finally
    v.Free;
  end;
  end;
end.

0 0
原创粉丝点击