上千万行,十几G源码,浏览器为什么这么“变态”?

裸机编程如何用开源工具链和AI技能包少走弯路 嵌入式开发中,裸机编程长期被视为入门门槛,其本质是直接操作寄存器、中断和链接脚本,对精确性要求极高。传统学习路径常因芯片手册信息链断裂而受阻。随着arm-none-eabi-gcc、OpenOCD、CMSIS等开源工具链的成熟,开发者已能构建完全可复现的裸机开发流水线。引入AI技能包(Skill)机制后,AI可从“对话助手”升级为具备工程上下文的虚拟同事,将芯片手册知识、寄存器配置经验与代码生成流程结构化,显著降低信息检索成本。该方案适用于单片机爱好者从“抄例程”迈向独立开发,也适合工程师改造现有嵌入式工作 阅读详情

6adc3cd3cd91ce4ab998b80ec5d34e00.jpeg

https://www.zhihu.com/question/290767285/answer/1200063036

作者:龙泉寺扫地僧(首席浏览器架构吹牛师,全球最小chromium内核--miniblink作者),已获转载授权

我们来看开源的chromium,这货确实相当相当的复杂。源码拉下来就有十多G。

我们不禁好奇,chromium到底有哪些玩意,为啥平时感觉只是显示个网页、几句HTML而已,怎么会需要这么多代码?

第一眼从目录结构上,chromium包含这些东西:

base,通用代码,基础组件,包含字符串、文件、线程、消息队列等工具类集合。

cc,Chromium compositor 的缩写,负责渲染合成。

chrome,Chromium 浏览器外壳实现。

content,多进程沙盒浏览器的核心代码,管理进程架构和线程架构。

gpu,OpenGL 封装代码,包含 CommandBuffer 和 OpenGL 兼容性支持等。

net,网络栈实现。

ipc,进程间消息通信实现。

media,多媒体封装代码,包含了媒体内容捕获和播放的组件集合。

mojo,类似于 Android 的 AIDL,提供了跨语言(C++ / Java / JavaScript)跨平台的进程间对象(Object)通信机制;。

skia,图形库,这里存放的是 Chromium 对 skia 的 配置和扩展代码,另有 third_party/skia 目录存放原生的 skia 代码。

third_party,网页排版引擎。第三方库

ui,UI 框架。

v8,V8 JavaScript 引擎库。

看起来还好吧?但实际上,这里面每一个展开来讲,都是一本厚厚的工具书的容量。

比如net,看起来只是个网络库,然而里面包含主机解析,cookies,网络改变探测,SSL,资源缓存,ftp,HTTP, OCSP实现,代理 (SOCKS和HTTP) 配置,解析,脚本获取(包括各种不同系统下实现),QUIC,socket池,SPDY,WebSockets……里面每一项展开来讲,就是一本书。

v8层,看起来功能很单一,只是实现一下js嘛,但里面包括字节码解析器,JIT 编译器,多代GC,inspector (调试支持),内存和 CPU 的 profiler(性能统计),WebAssembly 支持,两种 post-mortem diagnostics 的支持,启动快照,代码缓存、代码热点分析……里面每一项展开来讲,又是一本书,还是难坑的编译原理和优化方向。

Skia,看起来只是个图形库嘛,用点画出各种图。然而里面包括十几种矢量的绘制,文字绘制、GPU加速、矢量的指令录制以及回放(还要能支持线程安全)、各种图像格式的编解码、pdf的生成(这个是个隐藏的很深的功能,但很有趣。Skia支持把矢量图绘制成pdf)、GPU渲染优化(既以上部分功能需要用gpu来渲染)……里面每项展开来讲,又是一本书。

另外值得一提的是,skia是谷歌收购的。不知道谷歌是觉得自己没实力做,还是太费功夫。总之谷歌选择了直接买别人的代码来完成这些功能。

ui,看起来只是一套UI 框架嘛。然而chromium需要一套全平台适配的ui库,还要能支持gpu加速。不过可惜的是里面没实现richedit。ui库的设计,深入来做,其实可以说又是个浏览器了。

等一下,以上这些,看起来只是浏览器的外层。我们最关心的网页排版呢?这个难道不是浏览器的核心嘛!

是的,神奇的是,chromium把排版引擎blink放到了third_party下,而且架构上真的当成了一个第三方库一样对待。

据谷歌的员工说,这是历史原因……好吧姑且信了。然而这个第三方库,成了当之无愧的最复杂,功能最重要的第三方库。

blink的工作包括:

  • 实现web平台的规范(例如,HTML标准),包括DOM,CSS和Web IDL

  • 配合V8运行JavaScript

  • 从底层网络堆栈请求资源

  • 构建DOM树

  • 计算样式和布局

  • 请求chrome compositor(上文提到的cc层)并绘制图形。

说起来简单。看一下现在的HTML、CSS规范,各种细节加起来……有快上万页。

除了chromium layout组、firefox的开发人员等,我想没几个人会去仔细阅读并一个个的实现这些规范吧。光是看目录和文字描述,就头大了,更别说要完整的实现出来。

往往一个简单的display:gird\flex背后就是庞大复杂的计算,而且还要充分考虑性能上如何优化,滚动时如何更快的展示…

另外排版还需要支持世界各国的奇奇怪怪的文字。例如从右往左写、规则复杂无比阿拉伯文。相比之下,汉字这种方块字的排版简直就是弟弟。还有各种奇怪的unicode字符。

de7131f1a5952a1ce9524afc52b89beb.png

怎么能处理好这些字符和语言,并配合几千页的html、css排版规则正确显示出来……这是个极度烧脑的事情。

我们再从排版这个大泥坑里跳出来看看外面别的东西。这时候你会发现……外面的泥坑好像更大。随便说几个,比如:

多进程框架。嗯,你需要更多的进程来渲染更多的网页,这样才能崩溃了也不影响其他网页。

注意,chromium把渲染排版放在渲染进程,但绘制到窗口又是主进程。这里面少不了各种跨进程通信、同步。对于代码的编写以及调试,是个很考验编程功底的事情。

webrtc。网络视频相关。又是一个被收购的库。关于webrtc,你需要知道它能实现多人实时语音、降噪、网络传输视频、摄像头的捕获,音频算法实现(比如 fft),视频算法实现(比如 h264 协议格式), Socket、线程、锁等基础库(是的,webrtc也造了套自己的轮子)。又是个庞大的组件。

密码管理、下载管理、扩展管理。

一套调度整个多进程框架以及blink的核心层。在chromium被称之为content层,负责处理一切繁琐的细节。例如各种系统、平台的鼠标键盘消息派发,历史栈(前进后退),页面缓存。

沙箱机制。负责隔离以及降低子进程的权限。沙箱的实现上,在不同系统做了诸多hook操作。

chrome相关的外壳及应用。例如我们常见的标题栏、url栏,webui如设置页、历史记录页。对,其实chrome单词的原意就是这个。

Clound_Print,谷歌云打印相关,提供谷歌浏览器页面预览打印清单。

Courgetter,谷歌提供的二进制文件对比核心算法,用于比较不同版本的二进制差异。谷歌为了方便升级,搞了套升级策略和算法。

神奇的syzygy优化。是的,谷歌也嫌chrome太大了、加载太慢了。于是他们开发了一套工具链,优化重排布PE二进制文件的算法来达到优化程序。Chrome浏览器应用了Syzygy优化之后,程序冷启动的页面调度(paging traffic)优化了80%,加载的Image的Working Set优化了40%。简单的说,谷歌为了优化启动性能,从编译器上对exe、dll开始做手脚了。

Media,Chrome的多媒体模块,支持音频播放和录音等功能。这里用到了ffmpeg。但在ffmpeg外,为了和blink配合,又是包裹了厚厚的一层,用来处理好渲染管线。另外MSE API也花了不少功夫。

swiftshader。很有趣的一个模块,用纯软件的代码,完整实现了opengl的接口。可以在没有硬件加速的机器上跑起opengl。也是个庞大的库,而且也是被收购的。看起来谷歌对图形学方面的很多工程似乎不擅长?还是不想觉得应该交给更专业的团队去做。

gn、gyp、ninja。chromium为了更方便的管理编译,自己撸了三套轮子。类似makefile、cmake,然后底层调用ninja再到vs或者clang负责具体编译其他的点还有很多很多,以后想到了再补充。

总之,以上随意一个点,要正确的实现,都是一个团队的工作量,都可以写成一本书。然而chromium把他们全部实现了,而且还在不停的加入新的功能。

看到这里,大家应该明白为啥强如微软,也放弃维护他们自己的浏览器内核了。因为需要投入的人力财力实在是太恐怖了。chromium团队,光是开发人员,都已经上千了。

假如每个人员年薪是100w 人民币,持续投入十年,这个支出就是几十亿,这还不算周边的测试、产品、UI。

最关键的是,就算微软愿意投入十亿,能保证做到chromium相同的功能吗?就算能做到相同的功能,还不是另外一套chromium,能做出其他优势吗?

于是最后微软也放弃了,干脆直接从开源的chromium上改起,把微软需要的功能融入chromium。

所以,chromium的霸权就是这么来的。看似开源免费,实则把所有开发者和对手,紧紧的捆绑在自己周围。

好了,现在吐槽开始了。

chromium称霸浏览器界以来,看起来开源,谁都可以拿去改。然而比起它的前辈,我觉得从“道德”上,chromium要“差”很多。

最让我受不了的一点是,chromium在无尽的往里面塞功能的时候,很少想过是否别人可以轻易的移除它们。

chromium代码号称模块化、高内聚低耦合,然而如果你想砍掉一些不需要的东西,对不起,没有宏控制,手动删代码吧。有几个人能有精力一点点的去掉里面这些繁琐的功能呢?

这就导致一个问题,需要chromium某一部分功能的人,必须被强塞进一堆谷歌认为你需要的东西。对比之下,为啥我说比起chromium的前辈要差很多呢,其实我指的正是webkit。webkit最让人欣赏的一点就是它在专注实现内核的同时,大部分功能都是可“拆卸”的。有宏可以关闭。甚至连svg这种排版上的小功能都有宏可以关闭。

而chromium,如果我需要排版、音视频,但不需要多进程呢?如果我需要音视频但不需要webrtc呢?对不起,谷歌没这考虑。要带就全都带上吧,不带你自己砍代码吧。

等你辛苦几个星期砍完代码,谷歌告诉你,我都更新了2、3个版本啦,你要不要更新下代码?哦?新版本chromium架构又大改了?哭了……

这也就造成现在基于chromium的一堆开发框架,如electron、cef、nwjs,全都动不动100多M的大小。因为从chromium的框架设计上,就很难把那些极其庞大复杂的细节功能排除掉。

这些功能对于谷歌作为一个浏览器来说,当然是必要的。然而回到本问题,“浏览器内核”真的需要这么复杂吗?

浏览器需要这么复杂,这是真的;然而作为一个浏览器内核提供给一些sdk给别人用,也需要这么复杂吗?我们用electron写一套进供销管理系统的客户端,你会需要带上几十M的webrtc、webgl、多媒体播放、天城文支持吗?

最后打破这个疑问的,是我很多年后进入了QQ浏览器的移动端组(其实就是x5内核,微信上被大家吐槽最多的那个)。当年的x5内核其实是基于webkit改造的。从chromium回到webkit,我突然有种豁然开朗的感觉。

回到问题开头,从浏览器内核的角度,其实没那么复杂,只要做好网络、排版、渲染,就足以应付大部分使用场景了。

这让我想起浏览器早期年代,群雄争霸的时代,那时候浏览器内核很小。从几百K到几M的浏览器都有。我记得早年的移动设备上跑的浏览器,css支持的都不好,不过特别小巧,有的才几百K而已。

然而后来组里架构调整,x5内核为了跟上时代,从webkit切回了chromium(也是因为被骂了太多了,当时x5号称移动端IE6,做过微信相关开发的人应该深有体会)。

对chromium深恶痛绝的我,当时有了一个大胆的想法。把排版引擎blink(也就是webkit在chromium里的继承者)重新从chromium里剥离出来,再补上一些周边的设施、组件,再次成为一个完整独立的浏览器内核。

当然我还是有自知之明的。一个浏览器内核而已,不可能实现chromium同样的功能。但能把排版、渲染、网络、视频实现,就差不多了。

其实我也不是想做个浏览器,而是想专注内核这块,做一个提供给第三方app嵌入的内核。作为一个内核,其实不需要上面讲的所有那一大堆功能。比如,网络层,大部分人不需要什么网络改变探测,ftp,OCSP实现,代理配置、解析、脚本获取,QUIC,socket池,SPDY什么的。大部分人仅仅需要一个http的实现,可以拉取到服务器资源。

我用300k的curl代替了十余M的chromium net库,并工作良好。少了的功能可以用插件形式补上嘛。一些和排版渲染无关的功能,我都打算做成插件。例如音视频、webgl、webrtc、多进程等。

目前这个项目已经撸了5年了,开源在github上,提供C接口方便其他语言调用。整个编译出来就是一个1-20m左右的dll(视编译选项而定),甚至还包含了一个electron的精简实现:

https://github.com/weolar/miniblink49。

欢迎围观。

(完)

点击下方图片,查看更多精彩

77ab92b659075a057f35107d8fbaed12.png

1f496dfc4913fb22853a124eec0b4a81.png

32e86b372918ea621f5f308c6619a60f.png

ddd69239c77d2fb5118d6383b1163392.png

85fd0d9d7132fb176485b7d78a475745.png

定制一款国密浏览器(1):Chromium 源码获取和构建 基于chromium定制国密浏览器第一步,获取chromium源码和构建 deb 包。 阅读详情

相关推荐

chrome浏览器及chromium操作系统最新完整源码下载的问题及下载地址

本来很简单的一句下载chrome源码,竟然花了我好久才下载下来。 git clone https://github.com/chromium/chromium.git 但是用上面的普通做法,我始终无法下载下来。 几经周转,看到国外网站上说还要加个参数, git clone https://github.com/chromium/chromium.git --depth 1 于是就用了上面那句,下载...

有问题或资源连接有缺失的可以私信公众号新潮看世界获取 2272

浏览器页面源代码

这里只显示引入的文件。

qq_46063760的博客 638

浏览器开发源码深入分析:cjylx_browser2_code项目

本文还有配套的精品资源,点击获取 简介:【cjylx_browser2_code】项目提供了关于浏览器开发的源码分享,主要包含浏览器的核心组件架构、HTML解析渲染流程、JavaScript执行机制、网络通信技术、安全性策略、Web API应用、性能优化技巧、用户界面设计、多进程架构和扩展插件支持等关键知识点。该源码可能是开源的,适合开发者学习和研究,涵盖浏览器开发的多个方...

weixin_35734408的博客 1174

2023 多功能浏览器IAPP源码

多功能浏览器IAPP源码,最早看到这个浏览器是两年前,更新没间断过,作者有技术但不多,我俩星期写的就赶超这玩意了,虽然作者不行,但现在iapp开发者普遍都不行,甚至还不如这个浏览器写的好。360加固原因,文件中小部分代码可能被替换(如部分s,f被替换成dims),需要自行修复,并不能直接使用。防追踪,资源嗅探,加载js脚本,去广告,个性化设置以及浏览器必备的功能。由于apk经过360加固,而且是原生编译打包,逆向属实不易。该浏览器开源过一个极其旧的版本,本次分享的是最新版。

784

Java浏览器源码剖析与实战应用

Java浏览器源代码是理解Java网络浏览器构建和功能实现的核心。通过深入分析源代码,开发者能够掌握浏览器运行的逻辑,包括页面加载、脚本执行、用户交互处理等关键步骤。对于想要进一步开发或优化浏览器性能的IT专业人士来说,对源代码的充分理解是必不可少的。JavaFX是一种用于构建富客户端应用程序的软件平台,它提供了一套丰富的界面组件,旨在替代Java的Swing图形用户界面工具包。JavaFX带来了更加现代和交互式的用户界面体验,它支持多种丰富的媒体类型,如视频、音频、图形和动画效果。

weixin_30765637的博客 936

monocle使用sct整合数据integration还是rna中的counts数据 轨迹分析 拟时序

【代码】monocle使用sct整合数据integration还是rna中的counts数据 轨迹分析 拟时序。

生信小博士的博客 1049

原来有那么多开源的Web浏览器

提到 Web 浏览器,耳熟能详的当数四小龙:Chrome / Firefox / Safari / 微软 Edge ,这四家浏览器占据了大部分市场份额,同时也在制定 Web 的标准。但除了这些耳熟能详的参赛选手,本期集锦中还有很多小众的开源浏览器可供大家使用~

2301_76369560的博客 2014

第六章 汇川技术InoProShop入门之modbusTCP从站协议解读

摘要:ModbusTCP从站协议是Modbus协议在TCP/IP网络上的扩展,作为服务器端被动响应主站请求。它采用MBAP+PDU帧结构,通过IP地址和502端口实现网络通信,支持标准功能码(如读/写寄存器、线圈)。相比传统串行Modbus,具有高速传输、远距离通信优势。从站需解析请求、执行操作并返回响应,同时处理错误校验和并发连接。该协议广泛应用于智能传感器、PLC等工业设备,实现高效可靠的主从数据交互。

zyfucking2010的博客 1435

[渗透]前端源码Chrome浏览器修改并运行

好久之前,就已经看到,无论什么样的加密,都是脱了裤子放屁。但是话糙理不糙。 之前只是相信,现在又被验证了。 当渗透人员跟我说这个问题后,我自己又尝试了几次,这才发现,自己辛苦增加的安全措施反而毫无作用。。。 因为修改的部分是在请求之前进行的,相当于使用开发环境。。。 接下来就还原这个流程。

让人人都会写程序 988

Informer复现 -- 完整模型

有了数据和核心的ProbAttention,接下来就可以复现完整的Informer(图1)了。图1:Informer模型结构[1]如果对图1还不太熟悉的同学,可以参考图2。由图2可知,informer与Transformer之间的差异并不大。主要区别是ProbAttention和可能的encoder最后一层的conv(源代码中用来distil)。图2:参考Transformer画的Informer模型结构。

AI_daily的博客 3492

从模拟到实战:移远EC800M单片机MQTT接入OneNet全流程解析

本文详细解析了移远EC800M单片机通过MQTT协议接入OneNet平台的全流程,涵盖环境准备、模拟设备搭建、硬件迁移、数据交互调试及性能优化等关键步骤。针对常见问题如AT指令缓冲区溢出、心跳间隔设置等提供实战解决方案,帮助开发者高效实现物联网设备稳定接入。

weixin_29215815的博客 432

上千万行,十多G源码,浏览器为什么这么“变态”?

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享转自:https://www.zhihu.com/question/290767285/answer/1200063036作者:龙泉寺扫地僧(首席浏览器架构吹牛师,全球最小chromium内核--miniblink作者)。我们来看开源的chromium,这货确实相当相当的复杂。源码拉下来就有十多G。我们...

中生代技术 731

Android14_MTK调试LCD屏功能

android14 MTK平台调试LCD屏

m0_37786046的博客 1472

这两个程序员要花100万,彻底重写世界上最复杂的软件!

世界上最复杂的软件是什么?有人认为是操作系统,有人认为是数据库,我觉得是浏览器。比如开源的Chromium,上千万行,十几G源码,那真是相当复杂。Chromium浏览器中涉及到的每一项技术,展开来说都是厚厚的一本书,比如HTTP、SSL、QUIC、WebSocket、JIT编译器、WebRTC、WebAssembly、垃圾回收、内存和CPU的性能统计等等。而Web平台的规范HTML、CSS、Jav...

码农翻身 988

OpenCV快速入门:绘制图形、图像金字塔和感兴趣区域

OpenCV是一个强大的计算机视觉库,广泛应用于图像处理、计算机视觉和机器学习等领域。本文将介绍OpenCV中的一些基础功能,包括如何绘制图形、创建图像金字塔以及如何处理感兴趣区域(ROI)。

吾家有猫名探花的博客 1962

cadence数模混合仿真反标sdf

数模混合IC设计时经常要调用一些Verilog模块(最简单的例如SPI接口),在前仿时一般直接用rtl代码来仿真,但是后仿时要关注因寄生带来的延迟,避免这些额外的延迟导致时序错误,因此不能简单地采用RTL来仿真。 一般有两种办法:1是采用由RTL综合得到的门级电路来仿真,这种方法比较简单,但是缺点是规模较大,而且只包括门延迟不包括因版图导致的线延迟;如果想要仿真更精细,就要对该这部分门电路提取寄生参数; 另一种方式是利用sdf文件(standard delay format)来进行仿真。后端工具在布局布

长河柱天的博客 7274

2023 5IUX主页极简浏览器主页搜索源码

在使用各种导航首页时,我们时常被满屏的广告和资讯所困扰,这款源码可以让你自己设计一个不受干扰的浏览器主页。通过使用5IUX搜索极简搜索主页源码,你可以轻松定制一个属于自己的浏览器主页,享受简洁、无广告的搜索体验。1.极简界面,无广告:该搜索主页拥有简洁的界面,没有任何广告的干扰,让你专注于自己的搜索体验。3.支持自定义搜索引擎:你可以根据自己的喜好添加、删除或修改搜索引擎,让你的搜索更加个性化。2.简单的前端界面:源码提供了一个简单但实用的前端界面,让你能够轻松地进行自定义设计。

719

EMC原理-传导(共模、差模)与辐射(近场、远场)详解

本文深入介绍了电磁兼容(EMC)的基本概念,包括EMI和EMS,以及如何处理传导干扰(共模、差模)和辐射干扰(近场、远场)。详细讨论了近场感应、远场辐射的原理,滤波器和屏蔽技术在抑制噪声信号中的作用。此外,探讨了差模和共模干扰的来源、影响及滤除方法,如使用差模电感、电容和共模线圈。最后,提到了穿心电容在滤除高频噪声中的应用。

让你爱上电路设计 3551

基于python的简单浏览器的制作

基于python的简单浏览器制作已经打包成代码项目,可.exe打开

qq_64470623的博客 2843

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python3GUI--浏览器By:PyQt5

本次使用PyQt5制作了一款浏览器,基本实现了一般浏览器的功能,不过还是存在一些不足,例如:1.所有网页跳转均在主窗口中进行,不支持多页显示和操作2.不支持视频播放3.设置里面的部分内容没有实现,比如:语言切换在此,提出我的解决问题方案:1.PyQt5中使用QTabwidget标签页,网页跳转时,创建新的标签页。python PyQt QtWebEngine实现本窗口跳转+ 新窗口跳转2.重新编译QtWebEngine。解决QtWebEngine无法播放H5中的mp4。

懷淰メ的博客 6729

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

浏览器查看当前网页的源码:view-source

view-source是一种协议,查看源码 在浏览器地址栏中输入 view-source:sURL 就可以查看当前网页的源码 JS用法 : window.location=“view-source:” + window.location

Jerry 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

超漂亮的纯JAVA浏览器(附源码)

因为公司某产品是客户端内嵌javaee应用,新版又想用java替代原c++客户端方案。 所以花了一个星期的时间调研了java内嵌式开源浏览器。 归结如下: MozSwing 独立运行,不依赖客户机器的浏览器版本。(目前来看最适合我们,内核是火狐的xulrunner1.9.1),官方已二年没有升级版本了。下载地址:http://sourceforge.net/projects/mozswing...

445822357 1878

谷歌浏览器的源码分析(16)

上一次说到需要调用这个OpenURLFromTab函数,那么这个函数是做什么的呢?从名称上可能猜到它是打开网页,但是是从目前TAB页里打开呢?还是新建一个?或者使用每个TAB页一个进程呢?这些疑惑,只能通过代码的分析来理解它的实现,代码如下: 这个函数的参数意思: source是TAB内容。 url是网络连接地址。 disposition是窗口打开的位置。 tran...

anjichan4261的博客 254

谷歌浏览器的源码分析(9)

为了处理字符消息实现自动完成的功能,这是怎么样实现的呢?其实是先记录字符消息响应前的字符串以及选中状态,接着再处理消息,最后才查询可能的输入,做出智能提示。 #001 void AutocompleteEdit::OnBeforePossibleChange() { #002 // Record our state. 记录当前已经输入的字符串。 #003...

anjichan4261的博客 187

来,谷歌安卓浏览器源码就在这!

谷歌浏览器安卓版源码项目 本项目是世界级的安卓架构 理清本项目业务逻辑完全可以胜任国内一线公司工程师 本项目会长期跟进并升级谷歌浏览器内核版本,欢迎star

墨镜猫 2万+
上一篇: 这款即将开源的编辑器可能是最适合程序员的文档工具!
下一篇: 人工智能应该用在这个地方!
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值