在网页中经常会用到local storage的技术,我看了一下它在chromium源码中的实现。
打开一个网页,在js调用local storage接口时,比如localStorage.getItem(key)。首先会从leveldb数据库中获取当前网站之前存储的数据信息把他放到内存DOMStorageMap中,然后读取的时候就直接从DOMStorageMap类的std::map成员获取item。setItem的时候会把数据写到leveldb中。leveldb里面kv的存储内容为key:url+itemKey value:itemValue。加载leveldb数据的时候会筛选出当前网站的local storage通过判断它的key的前缀,这样就做到了对于不同网站的local storage数据存储的隔离。
画了里面涉及到的类的时序图:
js的调用的browser里面是在renderer进程,对leveldb数据库的操作是在browser进程,这两个进程之间的通信依靠mojom。mojom IPC在linux平台的底层实现是通过domain socket实现的。