精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

你不知道的 JS 沙箱隔離

開發(fā) 前端
本文接下來的內(nèi)容,將介紹我在探索基于 Web Worker 實現(xiàn) JavaScript 沙箱隔離方案過程中的一些資料收集、理解以及我的踩坑和思考的過程。

[[442801]]

 自從 2014 年 HTML5 正式推薦標準發(fā)布以來,HTML5 增加了越來越多強大的特性和功能,而在這其中,工作線程(Web Worker)概念的推出讓人眼前一亮,但未曾隨之激起多大的浪花,并被在其隨后工程側(cè)的 Angular、Vue、React 等框架的「革命」浪潮所淹沒。

當然,我們總會偶然看過一些文章介紹,或出于學習的目的做過一些應用場景下的練習,甚或在實際項目中的涉及大量數(shù)據(jù)計算場景中真的使用過。但相信也有很多人和我一樣茫然,找不到這種高大上的技術(shù)在實際項目場景中能有哪些能起到廣泛作用的應用。

究其原因,Web Worker 獨立于 UI 主線程運行的特性使其被大量考慮進行性能優(yōu)化方面的嘗試(比如一些圖像分析、3D 計算繪制等場景),以保證在進行大量計算的同時,頁面對用戶能有及時的響應。

而這些性能優(yōu)化的需求在前端側(cè)一方面涉及頻率低,另一方面也能通過微任務或服務端側(cè)處理來解決,它并不能像 Web Socket 這種技術(shù)為前端頁面下的輪詢場景的優(yōu)化能帶來質(zhì)的改變。

直至 2019 年爆火的微前端架構(gòu)的出現(xiàn),基于微應用間 JavaScript 沙箱隔離的需求,Web Worker 才得以重新從邊緣化的位置躍入到我的中心視野。

根據(jù)我已經(jīng)了解到的 Web Worker 的相關(guān)知識,我知道了 Web Worker 是工作在一個獨立子線程下(雖然這個子線程比起 Java 等編譯型語言的子線程實現(xiàn)得還有點弱,如無法加鎖等),線程之間自帶隔離的特性,那基于這種「物理」性的隔離,能不能實現(xiàn) JavaScript 運行時的隔離呢?

本文接下來的內(nèi)容,將介紹我在探索基于 Web Worker 實現(xiàn) JavaScript 沙箱隔離方案過程中的一些資料收集、理解以及我的踩坑和思考的過程。雖然可能整篇文章內(nèi)容都在「炒冷飯」,但還是希望我的探索方案的過程能對正在看這篇文章的你有所幫助。

JavaScript 沙箱

在探索基于 Web Worker 的解決方案之前,我們先要對當前要解決的問題——JavaScript 沙箱有所了解。

提到沙箱,我會先想到出于興趣玩過的沙盒游戲,但我們要探索的 JavaScript 沙箱不同于沙盒游戲,沙盒游戲注重對世界基本元素的抽象、組合以及物理力系統(tǒng)的實現(xiàn)等,而 JavaScript 沙箱則更注重在使用共享數(shù)據(jù)時對操作狀態(tài)的隔離。

在現(xiàn)實與 JavaScript 相關(guān)的場景中,我們知道平時使用的瀏覽器就是一個沙箱,運行在瀏覽器中的 JavaScript 代碼無法直接訪問文件系統(tǒng)、顯示器或其他任何硬件。

Chrome 瀏覽器中每個標簽頁也是一個沙箱,各個標簽頁內(nèi)的數(shù)據(jù)無法直接相互影響,接口都在獨立的上下文中運行。而在同一個瀏覽器標簽頁下運行 HTML 頁面,有哪些更細節(jié)的、對沙箱現(xiàn)象有需求的場景呢?

當我們作為前端開發(fā)人員較長一段時間后,我們很輕易地就能想到在同一個頁面下,使用沙箱需求的諸多應用場景,譬如:

  1.  執(zhí)行從不受信的源獲取到的第三方 JavaScript 代碼時(比如引入插件、處理 jsonp 請求回來的數(shù)據(jù)等)。
  2.  在線代碼編輯器場景(比如著名的 codesandbox)。
  3.  使用服務端渲染方案。
  4.  模板字符串中的表達式的計算。
  5.  ... ...

這里我們先回到開頭,先將前提假設(shè)在我正在面對的微前端架構(gòu)設(shè)計下。在微前端架構(gòu)中,其最關(guān)鍵的一個設(shè)計便是各個子應用間的調(diào)度實現(xiàn)以及其運行態(tài)的維護,而運行時各子應用使用全局事件監(jiān)聽、使全局 CSS 樣式生效等常見的需求在多個子應用切換時便會成為一種污染性的副作用,為了解決這些副作用,后來出現(xiàn)的很多微前端架構(gòu)(如 乾坤)有著各種各樣的實現(xiàn)。

譬如 CSS 隔離中常見的命名空間前綴、Shadow DOM、 乾坤 sandbox css 的運行時動態(tài)增刪等,都有著確實行之有效的具體實踐,而這里最麻煩棘手的,還是微應用間的 JavaScript 的沙箱隔離。

在微前端架構(gòu)中,JavaScript 沙箱隔離需要解決如下幾個問題:

  1.  掛在 window 上的全局方法/變量(如 setTimeout、滾動等全局事件監(jiān)聽等)在子應用切換時的清理和還原。
  2.  Cookie、LocalStorage 等的讀寫安全策略限制。
  3.  各子應用獨立路由的實現(xiàn)。
  4.  多個微應用共存時相互獨立的實現(xiàn)。

在 乾坤 架構(gòu)設(shè)計中,關(guān)于沙箱有兩個入口文件需要關(guān)注,一個是 proxySandbox.ts,另一個是 snapshotSandbox.ts,他們分別基于 Proxy 實現(xiàn)代理了 window 上常用的常量和方法以及不支持 Proxy 時降級通過快照實現(xiàn)備份還原。

結(jié)合其相關(guān)開源文章分享,簡單總結(jié)下其實現(xiàn)思路:起初版本使用了快照沙箱的概念,模擬 ES6 的 Proxy API,通過代理劫持 window ,當子應用修改或使用 window 上的屬性或方法時,把對應的操作記錄下來,每次子應用掛載/卸載時生成快照,當再次從外部切換到當前子應用時,再從記錄的快照中恢復,而后來為了兼容多個子應用共存的情況,又基于 Proxy 實現(xiàn)了代理所有全局性的常量和方法接口,為每個子應用構(gòu)造了獨立的運行環(huán)境。

另外一種值得借鑒的思路是阿里云開發(fā)平臺的 Browser VM,其核心入口邏輯在 Context.js 文件中。它的具體實現(xiàn)思路是這樣的:

    1. 借鑒 with 的實現(xiàn)效果,在 webpack 編譯打包階段為每個子應用代碼包裹一層代碼(見其插件包 breezr-plugin-os 下相關(guān)文件),創(chuàng)建一個閉包,傳入自己模擬的 window、document、location、history 等全局對象(見 根目錄下 相關(guān)文件)。

    2. 在模擬的 Context 中,new 一個 iframe 對象,提供一個和宿主應用空的(about:blank) 同域 URL 來作為這個 iframe 初始加載的 URL(空的 URL 不會發(fā)生資源加載,但是會產(chǎn)生和這個 iframe 中關(guān)聯(lián)的 history 不能被操作的問題,這時路由的變換只支持 hash 模式),然后將其下的原生瀏覽器對象通過 contentWindow 取出來(因為 iframe 對象天然隔離,這里省去了自己 Mock 實現(xiàn)所有 API 的成本)。

    3. 取出對應的 iframe 中原生的對象之后,繼續(xù)對特定需要隔離的對象生成對應的 Proxy,然后對一些屬性獲取和屬性設(shè)置,做一些特定的實現(xiàn)(比如 window.document 需要返回特定的沙箱 document 而不是當前瀏覽器的document 等)。

    4. 為了文檔內(nèi)容能夠被加載在同一個 DOM 樹上,對于 document,大部分的 DOM 操作的屬性和方法仍舊直接使用宿主瀏覽器中的 document 的屬性和方法處理等。

總的來說,在 Browser VM 的實現(xiàn)中, 可以看出其實現(xiàn)部分還是借鑒了 乾坤 或者說其他微前端架構(gòu)的思路,比如常見全局對象的代理和攔截。并且借助 Proxy 特性,針對 Cookie、LocalStorage 的讀寫同樣能做一些安全策略的實現(xiàn)等。

但其最大的亮點還是借助 iframe 做了一些取巧的實現(xiàn),當這個為每個子應用創(chuàng)建的 iframe 被移除時,寫在其下 window 上的變量和 setTimeout、全局事件監(jiān)聽等也會一并被移除;另外基于 Proxy,DOM 事件在沙箱中做記錄,然后在宿主中生命周期中實現(xiàn)移除,能夠以較小的開發(fā)成本實現(xiàn)整個 JavaScript 沙箱隔離的機制。

除了以上現(xiàn)在比較火的方案,最近我也了解到了 UI 設(shè)計領(lǐng)域的 Figma 產(chǎn)品也基于其插件系統(tǒng)產(chǎn)出了一種隔離方案。起初 Figma 同樣是將插件代碼放入 iframe 中執(zhí)行并通過 postMessage 與主線程通信,但由于易用性以及 postMessage 序列化帶來的性能等問題,F(xiàn)igma 選擇還是將插件放入主線程去執(zhí)行。

Figma 采用的方案是基于目前還在草案階段 Realm API,并將 JavaScript 解釋器的一種 C++ 實現(xiàn) Duktape 編譯到了 WebAssembly,然后將其嵌入到 Realm 上下文中,實現(xiàn)了其產(chǎn)品下的三方插件的獨立運行。這種方案和探索的基于 Web Worker 的實現(xiàn)可能能夠結(jié)合得更好,持續(xù)關(guān)注中。

Web Worker 與 DOM 渲染

在了解了 JavaScript 沙箱的「前世今生」之后,我們將目光投回本文的主角——Web Worker 身上。

正如本文開頭所說,Web Worker 子線程的形式也是一種天然的沙箱隔離,理想的方式,是借鑒 Browser VM 的前段思路,在編譯階段通過 Webpack 插件為每個子應用包裹一層創(chuàng)建 Worker 對象的代碼,讓子應用運行在其對應的單個 Worker 實例中,比如: 

  1. __WRAP_WORKER__(`/* 打包代碼 */ }`);  
  2. function __WRAP_WORKER__(appCode) {  
  3.  var blob = new Blob([appCode]);  
  4.  var appWorker = new Worker(window.URL.createObjectURL(blob));  
  5. }  

但在了解過微前端下 JavaScript 沙箱的實現(xiàn)過程后,我們不難發(fā)現(xiàn)幾個在 Web Worker 下去實現(xiàn)微前端場景的 JavaScript 沙箱必然會遇到的幾個難題:

  1.   出于線程安全設(shè)計考慮,Web Worker 不支持 DOM 操作,必須通過 postMessage 通知 UI 主線程來實現(xiàn)。
  2.   Web Worker 無法訪問 window、document 之類的瀏覽器全局對象。

其他諸如 Web Worker 無法訪問頁面全局變量和函數(shù)、無法調(diào)用 alert、confirm 等 BOM API 等問題,相對于無法訪問 window、document 全局對象已經(jīng)是小問題了。不過可喜的是,Web Worker 中可以正常使用 setTimeout、setInterval 等定時器函數(shù),也仍能發(fā)送 ajax 請求。

所以,當先要解決問題,便是在單個 Web Worker 實例中執(zhí)行 DOM 操作的問題了。首先我們有一個大前提:Web Worker 中無法渲染 DOM,所以,我們需要基于實際的應用場景,將 DOM 操作進行拆分。

React Worker DOM

因為我們微前端架構(gòu)中的子應用局限在 React 技術(shù)棧下,我先將目光放在了基于 React 框架的解決方案上。

在 React 中,我們知道其將渲染階段分為對 DOM 樹的改變進行 Diff 和實際渲染改變頁面 DOM 兩個階段這一基本事實,那能不能將 Diff 過程置于 Web Worker 中,再將渲染階段通過 postMessage 與主線程進行通信后放在主線程進行呢?簡單一搜,頗為汗顏,已經(jīng)有大佬在 5、6 年前就有嘗試了。這里我們可以參考下 react-worker-dom 的開源代碼。

react-worker-dom 中的實現(xiàn)思路很清晰。其在 common/channel.js 中統(tǒng)一封裝了子線程和主線程互相通信的接口和序列化通信數(shù)據(jù)的接口,然后我們可以看到其在 Worker 下實現(xiàn) DOM 邏輯處理的總?cè)肟谖募?worker 目錄下,

從該入口文件順藤摸瓜,可以看到其實現(xiàn)了計算 DOM 后通過 postMessage 通知主線程進行渲染的入口文件 WorkerBridge.js 以及其他基于 React 庫實現(xiàn)的 DOM 構(gòu)造、Diff 操作、生命周期 Mock 接口等相關(guān)代碼,而接受渲染事件通信的入口文件在 page 目錄下,該入口文件接受 node 操作事件后再結(jié)合 WorkerDomNodeImpl.js 中的接口代碼實現(xiàn)了 DOM 在主線程的實際渲染更新。

簡單做下總結(jié)。基于 React 技術(shù)棧,通過在 Web Worker 下實現(xiàn) Diff 與渲染階段的進行分離,可以做到一定程度的 DOM 沙箱,但這不是我們想要的微前端架構(gòu)下的 JavaScript 沙箱。

先不談拆分 Diff 階段與渲染階段的成本與收益比,首先,基于技術(shù)棧框架的特殊性所做的這諸多努力,會隨著這個框架本身版本的升級存在著維護升級難以掌控的問題;其次,假如各個子應用使用的技術(shù)棧框架不同,要為這些不同的框架分別封裝適配的接口,擴展性和普適性弱;最后,最為重要的一點,這種方法暫時還是沒有解決 window 下資源共享的問題,或者說,只是啟動了解決這個問題的第一步。

接下來,我們先繼續(xù)探討 Worker 下實現(xiàn) DOM 操作的另外一種方案。

AMP WorkerDOM

在我開始糾結(jié)于如 react-worker-dom 這種思路實際落地開發(fā)的諸多「天塹」問題的同時,瀏覽過其他 DOM 框架因為同樣具備插件機制偶然迸進了我的腦海,它是 Google 的 AMP。

AMP 開源項目 中除了如 amphtml 這種通用的 Web 組件框架,還有很多其他工程采用了 Shadow DOM、Web Component 等新技術(shù),在項目下簡單刷了一眼后,我欣喜地看到了工程 worker-dom。

粗略翻看下 worker-dom 源碼,我們在 src 根目錄下可以看到 main-thread 和 worker-thread 兩個目錄,分別打開看了下后,可以發(fā)現(xiàn)其實現(xiàn)拆分 DOM 相關(guān)邏輯和 DOM 渲染的思路和上面的 react-worker-dom 基本類似,但 worker-dom 因為和上層框架無關(guān),其下的實現(xiàn)更為貼近 DOM 底層。

先看 worker-thread DOM 邏輯層的相關(guān)代碼,可以看到其下的 dom 目錄 下實現(xiàn)了基于 DOM 標準的所有相關(guān)的節(jié)點元素、屬性接口、document 對象等代碼,上一層目錄中也實現(xiàn)了 Canvas、CSS、事件、Storage 等全局屬性和方法。

接著看 main-thread,其關(guān)鍵功能一方面是提供加載 worker 文件從主線程渲染頁面的接口,另一方面可以從 worker.ts 和 nodes.ts 兩個文件的代碼來理解。

在 worker.ts 中像我最初所設(shè)想的那樣包裹了一層代碼,用于自動生成 Worker 對象,并將代碼中的所有 DOM 操作都代理到模擬的 WorkerDOM 對象上: 

  1. const code = `  
  2.       'use strict';  
  3.       (function(){  
  4.         ${workerDOMScript}  
  5.         self['window'] = self;  
  6.         var workerDOM = WorkerThread.workerDOM;  
  7.         WorkerThread.hydrate(  
  8.           workerDOM.document,  
  9.           ${JSON.stringify(strings)},  
  10.           ${JSON.stringify(skeleton)}, 
  11.           ${JSON.stringify(cssKeys)},  
  12.           ${JSON.stringify(globalEventHandlerKeys)},  
  13.           [${window.innerWidth}, ${window.innerHeight}],  
  14.           ${JSON.stringify(localStorageInit)},  
  15.           ${JSON.stringify(sessionStorageInit)}  
  16.         );  
  17.         workerDOM.document[${TransferrableKeys.observe}](this);  
  18.         Object.keys(workerDOM).forEach(function(k){self[k]=workerDOM[k]});  
  19. }).call(self);  
  20. ${authorScript}  
  21. //# sourceURL=${encodeURI(config.authorURL)}`;  
  22. this[TransferrableKeys.worker] = new Worker(URL.createObjectURL(new Blob([code]))); 

在 nodes.ts 中,實現(xiàn)了真實元素節(jié)點的構(gòu)造和存儲(基于存儲數(shù)據(jù)結(jié)構(gòu)是否以及如何在渲染階段有優(yōu)化還需進一步研究源碼)。

同時,在 transfer 目錄下的源碼,定義了邏輯層和 UI 渲染層的消息通信的規(guī)范。

總的來看,AMP WorkerDOM 的方案拋棄了上層框架的約束,通過從底層構(gòu)造了 DOM 所有相關(guān) API 的方式,真正做到了與框架技術(shù)棧無關(guān)。

它一方面完全可以作為上層框架的底層實現(xiàn),來支持各種上層框架的二次封裝遷移(如工程 amp-react-prototype),另一方面結(jié)合了當前主流 JavaScript 沙箱方案,通過模擬 window、document 全局方法的并代理到主線程的方式實現(xiàn)了部分的 JavaScript 沙箱隔離(暫時沒看到路由隔離的相關(guān)代碼實現(xiàn))。

當然,從我個人角度來看,AMP WorkerDOM 也有其當前在落地上一定的局限性。一個是對當前主流上層框架如 Vue、React 等的遷移成本及生態(tài)的適配成本,另一個是其在單頁應用下的尚未看到有相關(guān)實現(xiàn)方案,在大型 PC 微前端應用的支持上還無法找到更優(yōu)方案。

其實,在了解完 AMP WorkerDOM 的實現(xiàn)方案之后,基于 react-worker-dom 思路的后續(xù)方案也可以有個大概方向了:渲染通信的后續(xù)過程,可考慮結(jié)合 Browser VM 的相關(guān)實現(xiàn),在生成 Worker 對象的同時,也生成一個 iframe 對象,然后將 DOM 下的操作都通過 postMessage 發(fā)送到主線程后,以與其綁定的 iframe 兌現(xiàn)來執(zhí)行,同時,通過代理將具體的渲染實現(xiàn)再轉(zhuǎn)發(fā)給原 WorkerDomNodeImpl.js 邏輯來實現(xiàn) DOM 的實際更新。

小結(jié)與一些個人前瞻

首先聊一聊個人的一些總結(jié)。Web Worker 下實現(xiàn)微前端架構(gòu)下的 JavaScript 沙箱最初是出于一點個人靈光的閃現(xiàn),在深入調(diào)研后,雖然最終還是因為這樣那樣的問題導致在方案落地上無法找到最優(yōu)解從而放棄采用通用方案,但仍不妨礙我個人對 Web Worker 技術(shù)在實現(xiàn)插件類沙箱應用上的持續(xù)看好。

插件機制在前端領(lǐng)域一直是津津樂道的一種設(shè)計,從 Webpack 編譯工具到 IDE 開發(fā)工具,從 Web 應用級的實體插件到應用架構(gòu)設(shè)計中插件擴展設(shè)計,結(jié)合 WebAssembly 技術(shù),Web Worker 無疑將在插件設(shè)計上占據(jù)舉足輕重的地位。

其次是一些個人的一些前瞻思考。其實從 Web Worker 實現(xiàn) DOM 渲染的調(diào)研過程中可以看到,基于邏輯與 UI 分離的思路,前端后續(xù)的架構(gòu)設(shè)計有很大機會能夠產(chǎn)生一定的變革。

目前不管是盛行的 Vue 還是 React 框架,其框架設(shè)計不論是 MVVM 還是結(jié)合 Redux 之后的 Flux,其本質(zhì)上仍舊還是由 View 層驅(qū)動的框架設(shè)計(個人淺見),其具備靈活性的同時也產(chǎn)生著性能優(yōu)化、大規(guī)模項目層級升上后的協(xié)作開發(fā)困難等問題,而基于 Web Worker 的邏輯與 UI 分離,將促使數(shù)據(jù)獲取、處理、消費整個流程的進一步的業(yè)務分層,從而固化出一整套的 MVX 設(shè)計思路。 

 

責任編輯:龐桂玉 來源: 前端大全
相關(guān)推薦

2021-11-16 08:51:29

Node JavaScript變量類型

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2024-02-05 11:55:41

Next.js開發(fā)URL

2009-12-10 09:37:43

2022-10-13 11:48:37

Web共享機制操作系統(tǒng)

2021-02-01 23:23:39

FiddlerCharlesWeb

2011-09-15 17:10:41

2010-08-23 09:56:09

Java性能監(jiān)控

2020-12-14 07:51:16

JS 技巧虛值

2022-11-04 08:19:18

gRPC框架項目

2020-09-15 08:35:57

TypeScript JavaScript類型

2021-10-17 13:10:56

函數(shù)TypeScript泛型

2021-12-22 09:08:39

JSON.stringJavaScript字符串

2015-06-19 13:54:49

2020-08-11 11:20:49

Linux命令使用技巧

2012-11-23 10:57:44

Shell

2019-11-20 10:25:06

sudoLinux

2017-03-02 14:05:42

AndroidAndroid Stu調(diào)試技巧

2023-12-21 14:40:09

Python編程語言
點贊
收藏

51CTO技術(shù)棧公眾號

日韩美女一区二区三区| 久久99久久99| 亚洲人成电影在线观看天堂色| 妓院一钑片免看黄大片| а√资源新版在线天堂| 99久精品国产| 国产在线观看不卡| 日韩熟女精品一区二区三区| 日本一区二区三区视频| 精品国产乱子伦一区| 国产超碰在线播放| 成全电影大全在线观看| 国产精品沙发午睡系列990531| 国产高清在线一区| 伊人精品一区二区三区| 99xxxx成人网| 欧美xxxx做受欧美.88| 新91视频在线观看| 成人直播在线观看| 91麻豆精品国产91久久久使用方法 | 国产久一一精品| 亚洲欧美在线视频免费| 欧美一区二区三区久久精品| 在线观看欧美视频| jlzzjizz在线播放观看| 深夜福利一区| 欧美挠脚心视频网站| 国产成人久久婷婷精品流白浆| 亚洲小说区图片| 中文字幕一区二区三中文字幕| 欧美精品亚洲| 性xxxfllreexxx少妇| 国产成人激情av| 成人av在线天堂| 中国女人真人一级毛片| 美女精品在线| 欧美专区在线观看| 日韩久久精品视频| 亚洲视频中文| 久久久久久久久久国产精品| 久久久久久久久毛片| 亚洲成人日韩| 久久精品中文字幕一区| 影音先锋男人资源在线观看| 青青草97国产精品麻豆| 亚洲欧美日韩在线高清直播| 亚洲欧美色图视频| 校花撩起jk露出白色内裤国产精品| 精品日韩一区二区三区免费视频| 老司机av网站| www国产精品| 亚洲高清久久久久久| wwwxx日本| 美女扒开腿让男人桶爽久久动漫| 亚洲大胆人体视频| 五十路六十路七十路熟婆| 欧美成人一区在线观看| 精品视频偷偷看在线观看| 欧美 变态 另类 人妖| 亚洲成人一品| 亚洲丝袜av一区| 美女福利视频网| 亚洲香蕉av| 欧美极品在线播放| 日本少妇做爰全过程毛片| 国产欧美精品| 国产精品国产福利国产秒拍 | 国产高清视频色在线www| 亚洲成人动漫在线观看| 免费在线观看毛片网站| 国精品产品一区| 粉嫩av免费一区二区三区| 国产精品无码在线| 日韩系列在线| 永久免费精品影视网站| 国产农村妇女精品一区| 欧美一区激情| 97免费中文视频在线观看| 国产婷婷色一区二区在线观看| 日韩一区精品字幕| 亚洲在线观看视频| 头脑特工队2在线播放| 欧美国产日韩a欧美在线观看| 超碰免费在线公开| 国产探花在线观看| 91福利在线导航| 亚洲欧美日韩网站| 日本成人7777| 久久精品国产亚洲7777| 日本三级欧美三级| 免费成人美女在线观看.| av一区二区在线看| 国产视频网站在线| 亚洲线精品一区二区三区| 黄色aaa级片| 国产成人高清精品免费5388| 尤物tv国产一区| 国产在线视频第一页| 免费在线一区观看| 国产一区免费| 97精品国产99久久久久久免费| 蜜桃在线一区二区三区| 2019国产精品视频| 深夜福利视频一区| 亚洲日本成人在线观看| 无码人妻精品一区二区三区在线| 国产第一亚洲| 亚洲精品99久久久久中文字幕| 日韩中文字幕av| 国产免费一区二区三区四区| 手机电影在线观看| 少妇一区二区三区| 日韩在线欧美在线国产在线| 国产午夜小视频| 极品销魂美女一区二区三区| 欧美一区二区三区在线免费观看| 久久久久黄久久免费漫画| 欧美性受xxxx黑人xyx性爽| 精品少妇人妻av一区二区三区| 欧美电影免费观看高清| 日韩美女在线播放| 天天在线女人的天堂视频| 亚洲少妇30p| 国产一伦一伦一伦| 国产亚洲一卡2卡3卡4卡新区| 久久露脸国产精品| 精品国产免费无码久久久| 中文字幕乱码一区二区免费| 亚洲熟妇av日韩熟妇在线| 亚洲精品国产九九九| 久久久国产一区二区| 夜夜躁很很躁日日躁麻豆| 国产清纯美女被跳蛋高潮一区二区久久w | 久久久久久久久久婷婷| 国产精品无码久久久久成人app| 国产色综合久久| 免费黄色日本网站| 亚洲免费专区| 欧美一级大片在线观看| 少妇av一区二区| 亚洲电影在线免费观看| 美女流白浆视频| 激情一区二区| 国产精品青青草| cao在线视频| 亚洲黄页视频免费观看| 在线观看国产亚洲| 久久久久久久电影| jizz欧美激情18| 日韩美女一区二区三区在线观看| 国产精品一区电影| 午夜在线小视频| 51久久夜色精品国产麻豆| 久久久久久久久久97| 韩国成人福利片在线播放| 亚洲最新免费视频| 国产一区二区三区精品在线观看| 乱亲女秽乱长久久久| www夜片内射视频日韩精品成人| 亚洲一区二区在线观看视频| 北京富婆泄欲对白| 亚洲女人av| 日韩色妇久久av| 四虎在线精品| 欧美高清第一页| 日本午夜在线| 欧美色综合久久| 69av视频在线| 91免费在线视频观看| 青青草精品视频在线观看| 久久在线播放| 国产精品一区二区欧美| 超级碰碰久久| 俺去了亚洲欧美日韩| 亚洲成人中文字幕在线| 欧美体内谢she精2性欧美| 娇妻被老王脔到高潮失禁视频| 激情久久久久久久久久久久久久久久| 黄色一级片国产| 综合伊思人在钱三区| 国产日韩视频在线观看| 精品日韩av| 一本色道久久88精品综合| 国产免费叼嘿网站免费| 精品久久久久久久久久ntr影视| av手机在线播放| 国产精品一级片| 国产美女三级视频| 国产精品国产一区| 久久草.com| 日韩一级特黄| 日本久久久久亚洲中字幕| av激情在线| 一区二区三区四区视频| 黄色av免费观看| 欧美日韩电影在线播放| 国产极品在线播放| 中文字幕色av一区二区三区| 北岛玲一区二区| 国产麻豆精品在线观看| 激情内射人妻1区2区3区| 欧美久色视频| 亚洲免费视频一区| 老司机成人在线| 亚洲tv在线观看| 91亚洲视频| 欧美自拍视频在线| 岛国片av在线| 久色乳综合思思在线视频| 国产一级在线观看| 亚洲成人在线视频播放| 国产强被迫伦姧在线观看无码| 在线一区二区三区做爰视频网站| 日韩精品久久久久久久| 亚洲欧美乱综合| 少妇太紧太爽又黄又硬又爽小说 | 91精品在线观看入口| 国产乱码77777777| 大伊人狠狠躁夜夜躁av一区| 日本福利片在线观看| 国产欧美日韩一区二区三区在线观看| 午夜男人的天堂| 国产aⅴ精品一区二区三区色成熟| 在线观看av网页| 日日夜夜精品视频天天综合网| 人人妻人人做人人爽| 欧美黄色一区二区| 中文字幕精品—区二区日日骚| 欧洲杯什么时候开赛| 欧美另类高清视频在线| 天堂日韩电影| 国内精品国语自产拍在线观看| 视频一区中文字幕精品| 亚洲一区亚洲二区亚洲三区| 亚洲欧美在线人成swag| 国产日韩欧美视频在线| 天天综合在线观看| 成人xvideos免费视频| 激情小说亚洲| 成人福利视频网| 日韩久久99| 91在线观看免费高清| 精品一区二区三区四区五区 | 日本一道高清一区二区三区| 国产日韩三区| 天堂成人娱乐在线视频免费播放网站| 国产视频精品网| 欧美人与动xxxxz0oz| 久久爱av电影| 国产亚洲欧美日韩在线观看一区二区| 涩涩涩999| 日韩在线综合| 久久久久久久久久久久久国产| 亚洲乱码免费伦视频| 91麻豆天美传媒在线| 国产在线欧美| 天堂…中文在线最新版在线| 久久成人精品| 日日干夜夜操s8| 国产激情一区二区三区| 超碰caoprom| 久久综合色鬼综合色| 91麻豆制片厂| 怡红院av一区二区三区| 中文在线观看免费网站| 第一福利永久视频精品| 国产精品午夜一区二区| 538prom精品视频线放| 成人免费视频国产| 亚洲欧美国产日韩天堂区| 香蕉视频网站在线观看| 欧美国产日韩二区| 裤袜国产欧美精品一区| 国产一区二区丝袜高跟鞋图片| 日本在线观看视频网站| 亚洲福利电影| 北条麻妃视频在线| 黑人巨大精品欧美黑白配亚洲| 免费啪视频在线观看| 久久色中文字幕| 亚洲二区在线播放| 欧美性生交xxxxxdddd| 国产永久免费视频| 亚洲成人av资源网| 在线播放毛片| 午夜精品久久久久久久白皮肤| www成人在线视频| 97伦理在线四区| 免费欧美激情| 无码人妻精品一区二区蜜桃百度| 亚洲欧美日韩精品一区二区| 日韩精品视频网址| 久久精品人人做人人综合| 2021亚洲天堂| 欧美性videosxxxxx| 乱精品一区字幕二区| 中文字幕一区日韩电影| 久久久男人天堂| 亚洲free嫩bbb| 欧美三级三级| 国产极品在线视频| 国产一区二区影院| 黄色av免费播放| 午夜精品久久久| 国产特级黄色片| 原创国产精品91| 色戒汤唯在线观看| av色综合网| 99久久99热这里只有精品| 久久婷婷国产精品| 白白色 亚洲乱淫| 亚洲女人久久久| 在线影视一区二区三区| 污视频网站在线播放| 欧美国产日韩一区二区| 欧美黄色a视频| 日韩精品久久一区二区三区| 亚洲精品偷拍| 国产精品二区视频| 亚洲男人的天堂网| 91 中文字幕| 尤物精品国产第一福利三区| 美女福利一区二区| 精品日本一区二区三区在线观看| 综合一区在线| 手机av在线免费| 国产精品灌醉下药二区| 免费在线不卡av| 一二美女精品欧洲| 男人最爱成人网| 蜜桃成人免费视频| 一区二区三区国产在线| 香港三级日本三级| 亚洲va欧美va天堂v国产综合| 成人h动漫精品一区二区无码| 久久成人免费视频| 巨大黑人极品videos精品| 神马影院我不卡午夜| 丝袜美腿高跟呻吟高潮一区| 女人被狂躁c到高潮| 懂色av影视一区二区三区| 午夜av免费在线观看| 91精品国产91久久久久福利| 欧美精品中文字幕亚洲专区| 亚洲中文字幕无码av永久| 91丝袜呻吟高潮美腿白嫩在线观看| 日韩免费在线视频观看| 亚洲精品国产品国语在线| 美女视频在线免费| 欧美亚洲国产免费| 日日夜夜精品免费视频| 欧美性猛交xxxx乱大交少妇| 欧美男男青年gay1069videost| 国产人成网在线播放va免费| 91手机在线播放| 亚洲激情网址| 深爱五月激情网| 精品视频一区二区三区免费| 黄色动漫在线| 成人综合av网| 久久高清国产| 精品少妇一区二区三区密爱| 欧美一二三区在线| 国产乱码午夜在线视频| 日韩和欧美的一区二区| 极品美女销魂一区二区三区| 久久国产免费观看| 精品夜色国产国偷在线| 欧美日韩精品一区二区三区视频| 亚洲午夜精品一区二区| 成人一区二区三区视频| 日韩欧美在线观看免费| 久久精品国产成人| 国产精品99久久免费观看| 成年人网站大全| 亚洲精品免费一二三区| 亚洲aaa在线观看| 国产精品人人做人人爽| 欧美激情综合| 色噜噜日韩精品欧美一区二区| 精品视频一区二区三区免费| 久久一卡二卡| 日韩电影在线播放| 国产成人免费视| 亚洲欧美日韩激情| 久久香蕉国产线看观看网| 天天做夜夜做人人爱精品| 日韩av一卡二卡三卡| 福利视频一区二区| 黄色免费在线看| 欧美日韩综合久久| 国产精品中文字幕日韩精品| 亚洲黄色免费观看| 欧美老女人性生活| 精品高清久久| www.555国产精品免费| 精品婷婷伊人一区三区三| h片在线观看视频免费免费| 亚洲一区二区三区午夜| av电影在线观看一区|