cisen / blog

Time waits for no one.
132 stars 20 forks source link

servo 源码学习相关 #619

Open cisen opened 5 years ago

cisen commented 5 years ago

依赖模块

编译注意

windows

ubuntu 18.04

cisen commented 5 years ago

net模块源码

cookie的实现

script 模块源码

dom

service work

事件捕获/冒泡

fetch

blob

问答

requestAnimframe的实现原理是什么?

rA插入的是JS函数,如何再rust里面调用?

没有实现IdleRequestCallback ?

addeventlistener在哪里?

事件实现类似react的合成事件?

如何知道触发了addeventlistener的event?

同源策略在哪里?

sw的缓存是如何实现的?

cisen commented 4 years ago

CSS

layout

floats

问答

整个浏览器的流程是怎样的?

reflow的机制是怎样的?

reflow流程是怎样的?

尺寸和位置计算在哪里?

各个element支持的事件列表在哪里?

clientWidth/offsetWidth有何区别?

clientWidth如何取值的?

  1. element.ClientWidth通过node.client_rect()函数获取client尺寸位置
  2. node又是通过document找到window对象,然后再通过window对象的client_rect_query方法利用RPC获取
  3. client_rect_query获取rect前先reflow,再通过components\layout\query.rs的node_geometry实现rpc调用
  4. rpc执行在components\layout_thread\lib.rsrespond_to_query_if_necessary函数,它根据不同查询类型分发不同的调用,比如rect是process_node_geometry_request
  5. process_node_geometry_request是计算rect的入口,真正重点计算的是iterate_through_flow_tree_fragment_border_boxes
  6. iterate_through_flow_tree_fragment_border_boxes通过递归查询stacking_relative_position来获取尺寸和位置的,这是获取rect的关键
  7. stacking_relative_position是来自BlockFlow继承自BaseFlow(基础文档流

为什么client_rect_query在获取rect要先reflow?

stacking_relative_position是在哪里更新值的?

何时如何跟新stacking_relative_position的值?

网页开始加载是从哪里开始?

什么时候开始parse css和html的?

htmlparser的入口在哪里?

css的parser的入口在哪里?

JS的parser的入口在哪里?

css是在哪里跟html融合的?

怎么利用css生成element的clientWidth的?

css是怎么匹配到DOM的?

css的匹配入口在哪里?

cisen commented 4 years ago

servo 内部学习

为什么可用直接使用use ipc_channel? 比如这种:

use ipc_channel::ipc;
use ipc_channel::router::ROUTER;
use net_traits::request::RequestBuilder;
use net_traits::request::{Request as NetTraitsRequest, ServiceWorkersMode};