精华内容
下载资源
问答
  • FrameLoader类负责一个Frame的... 顾名思义,FrameLoader是一个Frame的loader,它的作用就是为客户提供一个下载一个Frame的一系列接口。这里的客户指的是类的客户,比如Frame类,间接客户是上层应用,比如qwebframe。

    FrameLoader类负责一个Frame的加载,在Frame的流程中起到非常重要的重要,同很多组件都有交互,本文将分析FrameLoader类的代码。

    1. 概述

        顾名思义,FrameLoader是一个Frame的loader,它的作用就是为客户提供一个下载一个Frame的一系列接口。这里的客户指的是类的客户,比如Frame类,间接客户是上层应用,比如qwebframe。
        从它的定义看,最容易想到的是一个load接口,用来将一个frame load下来。任何一个页面至少都需要一个mainframe,因此一个页面的下载一般就是从load一个mainframe开始。
        在load frame的过程中,通过FrameLoaderClient接口将load过程的不同阶段告知客户。
        FrameLoader通过setDocumentLoader相当于把load的工作委托给了DocumentLoader类。
        FrameLoader同DocumentLoader是has-a的关系。一般在load的时候创建DocumentLoader。Frame调用DocumentLoader的startLoadingMainResource开始load frame。

    2. 类关系



    1)Frame和FrameLoader是contain-a的关系,在Frame的构造函数中调用FrameLoader的构造函数,调用时传入参数Frame指针和FrameLoaderClient指针。
    2)Frame有可能有子Frame,所以维护SubFrameLoader对象m_subframeLoader来管理子Frame的load。Frame可以对应xml document,也可对应html document,等等。跟Document相关的子resource的load不在FrameLoader的职责范围内。
    3)包含一个DocumentWriter类对象m_writer,当Frame的数据load finish的时候,将数据传给DocumentWriter类,进行下一步的处理(比如解码)
    4)FrameLoader维护了三个DocumentLoader对象,分别对应于不同的阶段,m_policyDocumentLoader对应于收到用户load调用,进行policy check阶段,m_provisionalDocumentLoader对应于policy check通过以后,Frame数据还没有到来之前,它会负责startLoadingMainResource的调用。m_documentLoader则是Frame第一个数据到来以后使用的DocumentLoader,这个时候,前一个主Frame的DocumentLoader已经不能再用(user agent开始白屏,刷掉前一个页面的显示)。
    5)包含一个HistoryController对象,用于操作历史记录相关的接口,保存或者恢复Document和View相关的状态,维护前进后退队列,以实现前进后退功能,前进后退本质上是同Page对象关联的,FrameLoader通过HistoryController操作m_backFowardController对象
    6)包含一个ResourceLoadNotifier对象,主要用于同ResourceLoader及FrameLoaderClient打交道,可以理解为ResourceLoader有事件变化或者发生的时候,通知FrameLoader的一个手段
    7)包含一个SubframeLoader对象,当FrameLoader下载的Document有子帧需要请求的时候(比如HTMLDocument中解析到iframe 元素),用来处理子帧请求
    8)将FrameLoader的状态封装到FrameLoaderStateMachine中,这个状态同FrameState不同,FrameState倾向于判断Frame涉及的Document的下载状态,是出于发起状态(Provisional),还是出于已经收到响应但不全(CommittedPage),还是响应收全的状态,倾向于同http相关。而FramLoaderStateMachine倾向于同DocumentLoader相关,用来描述FrameLoader处理DocumentLoader的节点,是处于已经创建,还是显示的状态。
    9)PolicyChecker主要用来对FrameLoader进行一些校验。包括三种校验:NewWindow,Navigation和Content。NewWindow对应于浏览器需要新开一个tab页或窗口的时候,Navigation对应于一个页面请求发起的时候,Content校验对应于收到数据以后(判断Mime type等),PolicyChecker通过提供对应的接口,由FrameLoaderClient来对这些请求进行校验,以确定是否允许继续,或者需要其它的动作。

    3.   主要接口

    Frame::init

    功能:FrameLoader的初始化

    函数调用系列
    QWebFrame::QWebFrame(QwebPage* parent,QWebFrameData *frameData)
    QWebFramePrivate::init(QWebFrame* qwebframe,QWebFrameData* frameData)
    Frame::init()
    FrameLoader::init()

    说明:主要做一些自身的初始化工作,比如初始化状态机,Sandbox Flags,创建DocumentLoader被设置为Policy DocumentLoader和Provisional DocumentLoader,调用DocumentLoader和documentWriter等的接口进行初始化操作

    FrameLoader::commitProvisionalLoad

    功能:提交Provisional阶段下载的数据

    函数调用系列:
    DocumentLoader::finishLoading
    DocumentLoader::commitIfReady
    FrameLoader::commitProvisionalLoad

    或者
    ResourceLoader::didReceiveData
    MainResourceLoader::addData
    DocumentLoader::receiveData
    DocumentLoader::commitLoad
    DocumentLoader::commitIfReady
    DocumentLoader::commitProvisionalLoad

    说明:这个接口主要的操作是将Provisional DocumentLoader设置成DocumentLoader,因为已经收到数据,所以FrameState也会跃迁到FrameStateCommittedPage。还有历史记录,PageCache相关的操作。另外,这个接口会间接调用FrameLoaderClientQt::transitionToCommittedForNewPage,通过Frame::createView创建出FrameView来。

    Frame::finishedLoading

    功能:frame请求网络加载完成的时候调用此接口

    函数调用系列
    ResourceLoader::didFinishLoading
    MainResourceLoader::didFinishLoading
    FrameLoader::finishedLoading
    FrameLoader::init()

    说明:检查是否有网络错误,告诉DocumentLoader和DocumentWriter下载完成,以便进行后续操作(提交数据,解析)。

    FrameLoader::finishedParsing

    功能:解析完成调用此接口

    函数调用系列
    DocumentWritter::end
    ….
    Document::finishParsing
    ….
    Document::finishedParsing
    FrameLoader::finishedParsing

    FrameLoader::load(const ResourceRequest& request,bool lockHistory)

    功能:加载一个frame请求,Frame请求相关的数据,封装成ResourceRequest传入。

    函数调用系列:一般由应用触发调用

    说明:这个接口调用FrameLoaderClientQt::createDocumentLoader创建出DocumentLoader,并以此DocumentLoader为Policy Document Loader,进入Policy check流程。

    展开全文
  • C# webkit内核的浏览器打开网页源码--值得下载 C# webkit内核的浏览器打开网页源码--值得下载
  • C# webkit内核的浏览器打开网页源码(值得下载
  • 1.先下载webKit源码 下载最新版本的webkit源码 如果有比这个更新的源码大家也可用下载,这一系列采用的源码地址: http://builds.nightly.webkit.org/files/trunk/src/WebKit-r189384.tar.bz2 2.这个版本的...

      这一系列记录的是怎么在ubuntu下编译webkit.

    1.先下载webKit源码 下载最新版本的webkit源码 如果有比这个更新的源码大家也可用下载,这一系列采用的源码地址:

    http://builds.nightly.webkit.org/files/trunk/src/WebKit-r189384.tar.bz2


    2.这个版本的源码需要使用gcc4.9.0及以上的版本,一般默认的ubuntu的GCC版本都需要升级,至于怎么升级请看我的另外一个博客:更新GCC版本  http://blog.csdn.net/laoma200808/article/details/50814062 


    3.安装必要的库:presentproto-1.0   dri3proto-1.0。

       

    wget http://xorg.freedesktop.org/archive/individual/proto/presentproto-1.0.tar.bz2     http://xorg.freedesktop.org/archive/individual/proto/dri3proto-1.0.tar.bz2           #下载对应的安装文件

     下载完成后解压文件,分别安装。

      在对应的解压目录下执行

    sudo make install       #安装类库

    4.依赖类库安装完成后,回到本次的主题,解压webkit源码,执行源码里面的解决依赖的的脚本。

     

    ./Tools/gtk/install-dependencies  #先下载安装需要的类库(源码级别)(非常耗时间,看网速)


    ./Tools/Scripts/update-webkitgtk-libs      #编译更新依赖的源码类库 编译程对应的*.o文件,并复制到指定的目录  (<span style="font-family: Arial, Helvetica, sans-serif;">非常耗时间</span>,看网速)


    5.正式编译内核了


    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:`pwd`/WebKitBuild/Dependencies/Root/lib/pkgconfig
    ./Tools/Scripts/build-webkit --gtk --debug                                 #这个过程与机器配置有关








      

    展开全文
  • 对于初次接触webkit源码的童鞋来说,是无法全面理解的。而且,本文立意也不是介绍HTMl的解析算法一类的东西。即便是我自己,对于很多东西都理解不了。 所以,本文重在解释HTML的解析过程,解说各个组成部分及功能。...

    声明

    HTML的解析过程是非常复杂的,下载、解析、脚本执行、显示是交错进行的。而且,HTML的解析器具有非常强的容错能力。

    对于初次接触webkit源码的童鞋来说,是无法全面理解的。而且,本文立意也不是介绍HTMl的解析算法一类的东西。即便是我自己,对于很多东西都理解不了。

    所以,本文重在解释HTML的解析过程,解说各个组成部分及功能。以后有机会,我将详细分析解析的算法。


    解析过程中的重要类和功能


    • Document和DocumentParser是相互引用的关系
    • HTMLDocumentParser继承自ScriptableDocumentParser,在继承自DecodedDataDocumentParser。本文不讨论脚本相关问题,因此,可以忽略ScriptableDocumentParser。DecodedDataDocumentParser类主要功能就是实现字符解码功能。
    • HTMLInputStream:保存解码后的字符流,可以看作一个缓冲区。和标准输入流的作用是一样的;
    • HTMLTokenizer : 解析字符流解析,将字符流分解成节点(包括节点名和属性列表),注释、Doc声明、结束节点、文本(节点包含的文字),这些信息都保存在HTMLToken类中。其作用是词法解析器; 实现这个功能的主要函数是nextToken;
    • HTMLTreeBuilder:它主要作用是生成DOM树,并对其语义进行检查(参阅processStartTag函数的代码)。如,如果在head标签中包含一个body标签,它就会检查出来,并报告错误。主要函数是constructTreeFromToken;
    • HTMLToken:这是一个中间类,由HTMLTokenizer生成,交给HTMLTreeBuilder使用;
    • HTMLConstructionSite : 这个类是负责创建HTML元素,并最终完成DOM树组装的函数。例如,它将标签 <img> 生成一个HTMLImageElement对象。 除了一些关键的标签外(如html, body, head等),其他标签的创建,通过HTMLElementFactory来实现; 对于属性的解析,直接调用生成的Element的parserSetAttributes函数,来实现。参阅HTMLConstructionSite::createHTMLElement函数的实现;
    • HTMLPreloadScanner : 这是一个负责查找和加载子资源的对象。它通过扫描节点中的 "src" , "link"等属性,找到外部连接资源后,通过CachedResourceLoader进行预加载。CachedResourceLoader是从DocumentLoader中得到的。这一点可以参考前一章。


    注意:HTMLElementFactory是通过脚本生成的,在源码中没有定义。


    解析过程简要说明(解析中的错误处理不是核心问题,忽略)

    说明: 下图中的箭头线表示下个处理单元,并不表示函数调用。箭头线上的文字,表示箭头所指对象,被调用的函数名。




    这个过程是

    • 当DocumentWriter调用DocumentParser::appendBytes时(实际上是HTMLDocumentParser),首先进行字符集转换,然后,将转换后字符集存入HTMLInputStream中
    • 在HTMLDocumentParser::pumpTokenizer函数中,HTMLTokenizer::nextToken函数将字符流解析为HTMLToken对象
    • HTMLToken对象将交给HTMLTreeBuilder
      • HTMLTreeBuilder分析标签,以确定标签是否是期望的(见代码HTMLTreeBuilder::processToken)
      • 调用HTMLConstructionSite的insertHTMLElement, insertHTMLHeadElement, ... 等(根据标签的类型),将他们插入到HTMLConstructionSite中
      • HTMLConstructionSite调用HTMLElementFactory::createHTMLElement(当然也不是所有的,有一部分是直接创建的)创建HTMLElement对象
      • HTMLElement的parserSetAttributes函数会被调用,用于解析属性
      • 当创建了一个元素后,该元素会被加入到当前节点中。HTMLConstructionSite::attachLater函数通过异步完成了该功能。
    • HTMLToken对象将交给HTMLPreloadScanner
      • HTMLPreloadScanner的scan函数被调用
      • 生成一个PreloadTask,放在队列中
      • 从队列中取得PreloadTask,调用它的preload函数
      • PreloadTask::preload或调用CachedResouceLoader的preload,进行资源的预加载。
      • 资源预加载时,是通过资源的URL作为key,被CachedresourceLoader管理起来的,在后面需要时,通过URL来获取这些资源。
      • CachedResourceLoader对象是从DocumentLoader中获取的,ProloadTask是通过Document对象找到DocumentLoader的。
      • 详细查看代码HTMLPreloadScanner::processToken

    HTMLConstructionSite使用了一种称为开发元素栈的方法,来帮助构造,英文是stack of open elements,详细可参阅http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#the-stack-of-open-elements 。对这个算法我也不是很清楚,以后再研究吧。

    元素属性的设置

    元素属性通过Element::parserSetAttributes函数来设置。

    void Element::parserSetAttributes(const Vector<Attribute>& attributeVector, FragmentScriptingPermission scriptingPermission)
    {
       ....
        Vector<Attribute> filteredAttributes = attributeVector;
       .....
    
        if (document() && document()->sharedObjectPool())
            m_attributeData = document()->sharedObjectPool()->cachedImmutableElementAttributeData(filteredAttributes);
        else
            m_attributeData = ElementAttributeData::createImmutable(filteredAttributes);
    
        // Iterate over the set of attributes we already have on the stack in case
        // attributeChanged mutates m_attributeData.
        // FIXME: Find a way so we don't have to do this.
        for (unsigned i = 0; i < filteredAttributes.size(); ++i)
            attributeChanged(filteredAttributes[i].name(), filteredAttributes[i].value());
    }
    
    • m_attributeData 这是存储属性的对象。Element元素可以通过setAttribute和getAttribute来访问属性。
    • attributeChanged函数调用parseAttribute函数。这个函数由派生类实现。它的作用是:让元素有机会根据属性创建对应的对象。如,对于HTMLImageElement类,它parseAttribute就会处理"src"属性,根据src属性值,加载图片。


    资源的加载和获取

    HTMLPreloadScanner发现并调用CachedresorceLoader加载资源。

    CachedResourceLoader中的资源是通过URL来唯一标识的。当元素的parseAttribute被调用时,元素就会从CachedResourceLoader中取得需要的资源。

    以HTMLImageElement为例。

    HTMLImageElement的parseAttribute函数代码

    void HTMLImageElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
    {
        if (name == altAttr) {
           ....
        } else if (name == srcAttr) {
            m_imageLoader.updateFromElementIgnoringPreviousError();
            ....
        } else if (name ....
        } else
            HTMLElement::parseAttribute(name, value);
    }
    
    注意语句
     m_imageLoader.updateFromElementIgnoringPreviousError()
    。m_imageLoader是一个HTMLImageLoader(继承自ImageLoader)对象,这个对象是负责从CachedResourceLoader中加载图片的。

    ImageLoader::updateFromElementIgnoringPreviousError()调用了ImageLoader::updateFromElement函数,我们看看这个函数的实现

    void ImageLoader::updateFromElement()
    {
        ....
        //重要:获取 src属性的值
        AtomicString attr = client()->sourceElement()->getAttribute(client()->sourceElement()->imageSourceAttributeName());
    
       ...
        // Do not load any image if the 'src' attribute is missing or if it is
        // an empty string.
        CachedResourceHandle<CachedImage> newImage = 0;
        if (!attr.isNull() && !stripLeadingAndTrailingHTMLSpaces(attr).isEmpty()) {
            //重要:根据url(attr的值),创建一个request,通过该request获取图片
            CachedResourceRequest request(ResourceRequest(document()->completeURL(sourceURI(attr))));
            request.setInitiator(client()->sourceElement());
    
          .....
            if (m_loadManually) {
                bool autoLoadOtherImages = document()->cachedResourceLoader()->autoLoadImages();
                document()->cachedResourceLoader()->setAutoLoadImages(false);
                newImage = new CachedImage(request.resourceRequest()); //创建image对象
                newImage->setLoading(true);
                newImage->setOwningCachedResourceLoader(document()->cachedResourceLoader());
                document()->cachedResourceLoader()->m_documentResources.set(newImage->url(), newImage.get());
                document()->cachedResourceLoader()->setAutoLoadImages(autoLoadOtherImages);
            } else
                newImage = document()->cachedResourceLoader()->requestImage(request); //直接获取一个cached的image对象
    
           ....
    }
    从 src属性中取得url,然后根据url,从document()->cachedResourceLoader (实际上就是DocumentLoader的cachedResourceLoader对象)中得到对应的图片。


    展开全文
  • 刚刚看到一篇文章,用css3和jQuery实现了iphone滑动解锁效果,真的很神奇!...效果链接 源码下载链接 一、渐变结构原理 HTML结构如下 <div id="page-wrap"> <div id="well"> ...

    译自:http://css-tricks.com/slide-to-unlock/

    刚刚看到一篇文章,用css3和jQuery实现了iphone滑动解锁效果,真的很神奇!

    效果链接       源码下载链接

    一、渐变结构原理

    HTML结构如下

    <div id="page-wrap">
        <div id="well">            
            <h2><strong id="slider"></strong> <span>slide to unlock</span></h2>            
        </div>            
    </div>

    h2文本渐变背景如下:

    background: -moz-linear-gradient(left, #4d4d4d, 0.4, #4d4d4d, 0.5, white, 0.6, #4d4d4d, #4d4d4d); 
    background: -webkit-gradient(linear,left top,right top,color-stop(0, #4d4d4d),color-stop(0.4, #4d4d4d),color-stop(0.5, white),color-stop(0.6, #4d4d4d),color-stop(1, #4d4d4d));

    二、CSS3实现滑动闪光效果

    背景图片实现闪光原理如下图:

    注意:渐变区域(图片)宽度应该是文本宽度+滑动块的宽度的2倍 

    #well {width: 720px;}
    h2 {
       width: 200%;
      -webkit-animation: slidetounlock 5s infinite;
    }
    @-webkit-keyframes slidetounlock {
      0% {background-position: -720px 0;  }
      100%{background-position: 720px 0;  }
    }

    完整的css如下

    #well {
      padding: 14px 20px 20px 20px;
      -webkit-border-radius: 30px;
      background: -webkit-gradient(linear,left top,left bottom,color-stop(0, #010101),color-stop(1, #181818));
      border: 2px solid #454545; 
      overflow: hidden; 
    }
    
    h2 {
      font-size: 80px;
      background: -webkit-gradient(linear,left top,right top,color-stop(0, #4d4d4d),color-stop(0.4, #4d4d4d),color-stop(0.5, white),color-stop(0.6, #4d4d4d),color-stop(1, #4d4d4d)); 
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
      -webkit-animation: slidetounlock 5s infinite;
      font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
      font-weight: 300;
      padding: 0;
      width: 200%;
    }
    @-webkit-keyframes slidetounlock {
      0% {    background-position: -720px 0;  }
      100% {    background-position: 720px 0;  }
    }

    三、用jQuery控制滑块实现解锁

    1、对img图像进行移动解锁——借用 jQuery UI draggable function

    <h2><img src="images/arrow.png" alt="slider" /> slide to unlock</h2>
    <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js'></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.min.js"></script>
    <script src='js/slidetounlock.js'></script>
    $(function() {
        $("h2 img").draggable({
            axis: 'x',
            containment: 'parent',
            drag: function(event, ui) {
                if (ui.position.left > 550) {
                    $("#well").fadeOut();
                }
            },
            stop: function(event, ui) {
                if (ui.position.left < 551) {
                    $(this).animate({
                        left: 0
                    })
                }
            }
        });
    });

    分析

    • 限制滑块图像只在水平方向移动——axis:‘x'
    • 回调函数drag——控制滑块的范围,并在超出范围时候隐藏整个滑块区域,即div#well
    • 回调函数stop——当释放鼠标按键的时候触发,让滑块回到原点

     2、实现解锁代码的另外方法

    此处代码借鉴了:http://www.evanblack.com/blog/touch-slide-to-unlock/

    function $(id){ return document.getElementById(id); }
    
    $('slider').addEventListener('touchmove', function(event) {
        event.preventDefault();
        var el = event.target;
        var touch = event.touches[0];
        curX = touch.pageX - this.offsetLeft - 73;
        if(curX <= 0) return;
        if(curX > 550){
            $('well').style.opacity = 0;
        }
           el.style.webkitTransform = 'translateX(' + curX + 'px)'; 
    }, false);
    
    $('slider').addEventListener('touchend', function(event) {    
        this.style.webkitTransition = '-webkit-transform 0.3s ease-in';
        this.addEventListener( 'webkitTransitionEnd', function( event ) { this.style.webkitTransition = 'none'; }, false );
        this.style.webkitTransform = 'translateX(0px)';
    }, false);

    在Webkit内核的浏览器中,使用touchstart、touchmove、touchend三个event来捕获touch events,即触屏操作。

    这里我们只关心手指的水平移动,所以curX配合webkitTransform使用

    curX = touch.pageX - this.offsetLeft - 73;
    el.style.webkitTransform = 'translateX(' + curX + 'px)'; 

     其中73px是背景滑动图像的一半的宽度值,这样滑动滑到背景一半图像时候就可以解锁

    注:Safari会在声明的属性变化的时候自动触发动画

    为了当还不到位置时候过早释放鼠标按键的时候让滑块回到原点,加入对touchmove的监听,并令webkitTransition = 'none'

    注明:后一段的jQuery代码只在手机上有效

    转载于:https://www.cnblogs.com/JoannaQ/archive/2013/02/05/2892497.html

    展开全文
  • 在Ubuntu下编译WebKit源码

    千次阅读 2012-06-21 14:18:46
    在朋友的介绍下有幸認识了WebKit这个让人心动的开源浏览器内核. 在这我也不多作介紹,搜索并看到这篇文章的朋友应该都是想通过做一个WebKit的"hello world"后再进一步的研究开发. 我做的"hello world"就是编译源码,...
  • 前些日子用wke内核封装了duilib的webkit浏览器控件,好多群里朋友私聊我希望可以我公布源码,今天把这个控件的源码和使用demo公布。其实这个控件封装起来没什么难度,我只是按照原来作者的demo,把相应的消息封装成...
  • Google Chrome 源码下载

    千次阅读 2016-09-13 15:00:56
    Google Chrome 源码下载  Goolgle 于 2008.09.02 发布了浏览器 Google Chrome。Google Chrome 使用的内核源码来自开源浏览器引擎 WebKit Open Source Project。Google Chrome 的源码,同样亦是开源的。...
  • Google Chrome源码下载

    2013-08-11 16:57:19
    Google Chrome 使用的内核源码来自开源浏览器引擎 WebKit Open Source Project。Google Chrome 的源码,同样亦是开源的。在 Google 的中文官方 Blog - Google 黑板报中,提到: QUOTE: 我们对很多开发开源项目...
  • Google Chrome Source Code 源码下载(转载...Google Chrome 使用的内核源码来自开源浏览器引擎 WebKit Open Source Project。Google Chrome 的源码,同样亦是开源的。在 Google 的中文官方 Blog - Google 黑板报中
  • Google Chrome 浏览器使用的内核源码来自开源浏览器引擎 WebKit Open Source Project。Google Chrome 的源码,同样亦是开源的。在 Google 的中文官方Blog - Google 黑板报中,提到: 我们对很多开发开源...
  • Google Chrome Source Code 源码下载

    千次阅读 2012-11-19 11:44:26
    Google Chrome 使用的内核源码来自开源浏览器引擎 WebKit Open Source Project。Google Chrome 的源码,同样亦是开源的。在 Google 的中文官方 Blog - Google 黑板报中,提到: QUOTE: 我们对很多开发开源项目的...
  • [转]Google Chrome 源码下载

    千次阅读 2010-01-09 06:55:00
    Google Chrome 使用的内核源码来自 开源浏览器引擎 WebKit Open Source Project。 Google Chrome 的源码,同样亦是开源的。在 Google 的中文官方 Blog - Google 黑板报中,提到: QUOTE: 我们对很多开发开源项目的...
  • 安卓上开源的浏览器内核主要有Webkit和Chromium,本文将以Mac系统为例,对编译Chromium的安卓版源码步骤进行介绍。 编译步骤 1.下载Ubuntu Server(64位)12.10的镜像(ISO),下载地址是http:

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

webkit内核源码下载