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

Chrome 插件開發指南

原創 精選
系統 瀏覽器 開發
開發插件需要使用前端技術:html css javascript。本文就從入門開始講述如何開發一款 chrome 插件。
豐富的 chrome 插件極大的提升我們的工作效率和辛福感,比如大名鼎鼎的 adblock 廣告屏蔽、GoFullPage 網頁長截圖、evernote web clipper 收藏網頁。

一般來說,插件的原理是向頁面中注入 javascript 腳本,對頁面進行處理,比如屏蔽頁面中可能的廣告元素,改變某些元素的樣式,增加一些 UI。

開發插件需要使用前端技術:html css javascript。

本文就從入門開始講述如何開發一款 chrome 插件。

注意:chrome 插件機制本身也在更新,本文講述的是目前普遍使用的 V2 插件的開發。

Manifest V3 is available beginning with Chrome 88, and the Chrome Web Store begins accepting MV3 extensions in January 2021.

插件構成

chrome 插件通常由以下幾部分組成:

manifest.json:相當于插件的 meta 信息,包含插件的名稱、版本號、圖標、腳本文件名稱等,這個文件是每個插件都必須提供的,其他幾部分都是可選的。

background script:可以調用全部的 chrome 插件 API,實現跨域請求、網頁截屏、彈出 chrome 通知消息等功能。相當于在一個隱藏的瀏覽器頁面內默默運行。

功能頁面:包括點擊插件圖標彈出的頁面(簡稱 popup)、插件的配置頁面(簡稱 options)。

content script:早期也被稱為 injected script,是插件注入到頁面的腳本,但是不會體現在頁面 DOM 結構里。content script 可以操作 DOM,但是它和頁面其他的腳本是隔離的,訪問不到其他腳本定義的變量、函數等,相當于運行在單獨的沙盒里。content script 可以調用有限的 chrome 插件 API,網絡請求收到同源策略限制。

插件的架構可以參考:https://developer.chrome.com/docs/extensions/mv2/architecture-overview/

重點說明以下幾點:

  1. browser action 和 page action:這倆我們可以理解為插件的按鈕。browser action 會固定在 chrome 的工具欄。而 page action 可以設置特定的網頁才顯示圖標,在地址欄的右端,如下圖:

圖片

大部分插件點擊之后會顯示 UI,也就是上文描述的插件功能頁面部分,一般稱為 popup 頁面,如下圖:

圖片

popup 無法通過程序打開,只能由用戶點擊打開。點擊 popup 之外的區域會導致 popup 收起。

page action 和 browser action 分別由 manifest.json 的 page_action 和 browser_action 字段配置。

  1. 由于 content script 受到同源策略的限制,所以一般網絡請求都交給 background script 處理。
  2. content script、插件功能頁面、background script 之間的通信架構如下圖:

圖片

chrome 可以打開多個瀏覽器窗口,而一個窗口會有多個 tab,所以插件的結構大致如下:

圖片

如上圖,功能頁面是每個 window 一份,但是每個 tab 都會注入 content script。

manifest.json

下文簡稱 manifest ,其中有這么幾個字段可以重點說明:

content_scripts

content_scripts 可以使用以下兩種方式注入頁面,這兩種方式并不沖突,可以結合使用。

聲明式注入

舉例如下:

{
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"run_at": "document_idle",
"js": ["content.js"]
}
]
}

在 manifest 中聲明要加載的腳本,各個字段都比較直觀。其中:

  1. matches 表示頁面 url 匹配時才加載
  2. run_at? 表示在什么時機加載,一般是 document_idle,避免 content_scripts 影響頁面加載性能。

需要注意的是,如果用戶已經打開了 N 個頁面,然后再安裝插件,這 N 個頁面除非重新刷新,否則是不會加載 manifest 聲明的 content_scripts。安裝插件之后新打開的頁面是可以加載 content_scripts 的。

所以需要在用戶點擊插件圖標時,探測頁面中的 content_scripts 是否存在(發送消息是否有響應/出錯),再提示用戶刷新頁面。

程序注入

還可以使用程序動態注入腳本,代碼如下:

chrome.tabs.executeScript({
file: "content.js",
});

比如用戶點擊插件圖標時執行注入腳本,則無需刷新頁面,代碼如下:

// 監聽插件圖標點擊事件
chrome.browserAction.onClicked.addListener(() => {
chrome.tabs.executeScript({
file: 'content.js',
});
});

值得注意的是,采用以上方式,用戶每次點擊插件圖標時,content.js 都會被執行,可能會引起錯誤。

// content.js
let loaded = false;

if (!loaded) {
// do something
loaded = true;
}

console.log(loaded);

第一次執行 content.js 會打印 false,而第二次執行 content.js 則會報錯,提示 loaded 變量已經聲明了。

由此可見 content.js 的執行會影響其所在的沙盒。

我們可以這么做:

// content.js

if (!window.contentLoaded) {
// do something
window.contentLoaded = true;
}

console.log(window.contentLoaded);

使用沙盒內的全局變量則可以避免 content.js 重復執行帶來的問題。

綜上所述:聲明式只會注入一次,缺點是可能需要刷新頁面。程序式不需要刷新頁面,缺點是可能會注入多次。

permissions

該字段是一個字符串數組,用來聲明插件需要的權限,這樣才能調用某些 chrome API,常見的有:

  1. tabs
  2. activeTab
  3. contextMenus:網頁右鍵菜單,browser_action 右鍵菜單
  4. cookies:操作 cookie,和用戶登錄態相關的功能可能會用到該權限
  5. storage:插件存儲,不是 localStorage
  6. web_accessible_resources:網頁能訪問的插件內部資源,比如插件提供 SDK 給頁面使用,如 ethereum 的 metamask 錢包插件。或者是修改 DOM 結構用到了插件的樣式、圖片、字體等資源。

permissions 中還可以聲明多個 url patterns,表示插件需要訪問這些 url,比如和 API 通信。

background script

下文簡稱 background,可以理解它是在一個隱藏的 tab 中執行,所在的頁面域名為空,這會影響對 document.cookie 的使用。

比如 background 需要和 a.com 通信。首先應該把 *://*.a.com/* 加入到 manifest 的 permissions 數組中。

當發送網絡請求時,瀏覽器會自動帶上 a.com 的 cookie,服務器的 set-cookie 也會對瀏覽器生效。這是符合預期的。

但是讀取 document.cookie 時,由于 background 所在的域名為空,a.com 被認為是第三方 cookie,會讀取不到。所以需要使用 chrome.cookies API 來讀取 cookie。

background 設置 document.cookie 時,不能指定域名,否則會設置失敗。比如:

// 會失敗,因為指定的域名和 background 所在的域名不符
document.cookie = `session=xxxxxxx; domain=a.com; max-age=9999999999; path=/`;

// 正確的做法,不要指定域名
document.cookie = `session=xxxxxxx; max-age=9999999999`;

一般不需要這么操作 cookie,但是可能依賴的 npm 包會操作 document.cookie,所以這里說明一下。

background 使用 tabs 接口操作瀏覽器的 tab 窗口,比如:

// 打開新 tab
async function open(url: string): Promise<number> {
return new Promise((resolve) => {
chrome.tabs.create(
{
url,
},
(tab) => resolve(tab.id!)
);
});
}

// 獲取活躍的 tab,通常是用戶正在瀏覽的頁面
async function getActiveTab(): Promise<chrome.tabs.Tab | null> {
return new Promise((resolve) => {
chrome.tabs.query(
{
active: true,
currentWindow: true,
},
(tabs) => {
if (tabs.length > 0) {
resolve(tabs[0]);
} else {
resolve(null);
}
}
);
});
}

// 將指定的 tab 變成活躍的
async function activate(
tabId?: number,
url?: string
): Promise<number | undefined> {
if (typeof tabId === "undefined") {
return tabId;
}

// firefox 不支持 selected 參數
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update#parameters
const options: chrome.tabs.UpdateProperties = IS_FIREFOX
? { active: true }
: { selected: true };
if (url) {
options.url = url;
}

return new Promise((resolve) => {
chrome.tabs.update(tabId, options, () => resolve(tabId));
});
}

// 打開新窗口,或者是激活窗口
async function openOrActivate(url: string): Promise<number> {
const pattern = getUrlPattern(url);
return new Promise<number>((resolve) => {
chrome.tabs.query(
{
url: pattern,
},
(tabs) => {
if (tabs.length > 0 && tabs[0].id) {
return Tabs.activate(tabs[0].id);
} else {
this.open(url).then((id) => resolve(id));
}
}
);
});
}

content scripts

下文簡稱 content,它只能使用有限的 chrome API。

由于 content 可以訪問 DOM,可以用它來選擇、修改、刪除、增加網頁元素。

但是 content 是運行在隔離的空間(類似沙盒),所以如果需要和頁面的其他腳本通信,需要采用 window.postMessage 的方式。

比如頁面內容如下:

<!-- index.html -->
<html>
<body>
<div id="app"></div>
<button id="btn" type="button">submit</button>
</body>
<script>
window.globalData = {
userId: 12345,
};
</script>
</html>

content 內容如下:

// 成功
document.getElementById("app").innerHTML = "hello chrome";

// window.globalData 是 undefined
console.log(window.globalData);

資源注入

content 可以向頁面中注入 <script>,由此給頁面提供 SDK 等功能,注入的腳本和頁面自己的腳本一樣,都無法和 content 直接通信。

注意:注入的資源要先在 menifest 的 web_accessible_resources 字段中聲明。

// content 內容
const script = document.createElement("script");
script.src = chrome.runtime.getURL("sdk.js");
document.body.appendChild(script);
// sdk.js
window.jsbridge = {
version: "1.0.1",
// ...
};

content 執行之后,可以看到頁面結構多了個 <script src="chrome-extension://xxxxxxxxxxxxx/sdk.js"></script>,xxxxxxxx 表示插件的 id,由 chrome 生成。

注意,注入的 sdk.js 腳本是可以被頁面內其他腳本訪問到的(可以看作是頁面自己的腳本,只是 origin 是 chrome-extensions://xxxxxxxxxxxxx),如下:

document.getElementById("btn").addEventListener(
"click",
() => {
console.log(window.jsbridge.version);
},
false
);

通信

content 可以和 background、popup、options 使用 chrome API 通信,參考官方文檔:https://developer.chrome.com/docs/extensions/mv2/background_pages/

常用的通信 API 是 chrome.runtime.sendMessage。

UI

content 可以向頁面中注入 UI,比如 evernote 的剪輯插件。

圖片

前面提到過,點擊 popup 之外的區域會導致 popup 收起,操作 DOM 會導致 popup 隱藏,而 popup 無法用代碼主動打開,所以 evernote 的剪輯插件的 UI 就無法用 popup 來實現了。

這時候可以把 UI 作為 iframe 插入頁面,比如:

// content
const app = document.createElement("iframe");
app.src = chrome.runtime.getURL("app.html");
document.body.appendChild(app);

神奇的是 iframe 里的 javascript 是可以像 content 一樣和 background 通信的。

background 給 iframe 發送消息時,不僅需要指定所在 tab 的 id,還需要指定 iframe 的 id。這里說的 iframe id 類似 tab id,是 chrome 分配的,而不是 iframe 標簽的 id 屬性。

功能頁面

popup/options 和 background 的關系很親密,它們甚至可以通過 chrome.extension.getBackgroundPage()? 獲取到 background 的全局變量。所以它們直接的通信花樣很多,不過一般也是用 chrome.runtime 通信。

popup/options 和 content 之間的通信方式,可以 background -> content 通信類似。

options 用來設置插件,所以一般需要調用 chrome.storage 存儲配置。

適配其他瀏覽器

目前 chrome 插件適配工作量是比較小的,因為 edge、opera 都已經切換到 chromium 內核,firefox 也支持 chrome API。

不過需要查看用到的 API 是否支持,以及 API 的入參、出參是否一致。比如前文提到 firefox chrome.tabs.update 方法第一個參數不支持 selected 屬性。

firefox 還支持 browser API,和 chrome API 不同的是 browser API 不使用回調函數,而是返回 promise。比如:

browser.tabs.query({ currentWindow: true }).then((res) => console.log(res));

chrome.tabs.query({ currentWindow: true }, (res) => {
console.log(res);
});

可以參考各瀏覽器的開發文檔:

  • firefox: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Build_a_cross_browser_extension
  • edge: https://docs.microsoft.com/zh-cn/microsoft-edge/extensions-chromium/developer-guide/port-chrome-extension
  • 360: http://open.se.360.cn/open/extension_dev/overview.html
  • 搜狗: http://ie.sogou.com/open/doc/

發布

  • chrome 發布插件需要花費 5 美元開通賬號:https://developer.chrome.com/docs/webstore/register/
  • firefox 發布文檔:https://addons.mozilla.org/en-US/developers/
  • edge:https://docs.microsoft.com/zh-cn/microsoft-edge/extensions-chromium/publish/create-dev-account

總結

總體來說,chrome 插件開發對前端工程師來說還是比較容易的。

責任編輯:未麗燕 來源: 字節跳動技術團隊
相關推薦

2012-01-04 16:21:11

2014-08-01 09:57:52

Node.jsNode.js插件

2011-07-25 16:21:22

Sencha touc

2023-11-20 09:33:43

開發指南

2023-08-17 10:20:18

RabbitMQ系統

2012-03-26 09:27:40

谷歌安卓開發谷歌安卓

2011-06-09 18:24:36

QT Wince

2023-05-15 18:44:07

前端開發

2009-06-24 16:30:21

JSF組件模型

2015-12-16 10:30:18

前端開發指南

2015-11-12 16:14:52

Python開發實踐

2010-06-13 09:27:56

Widget開發

2019-10-31 08:00:00

機器學習人工智能AI

2011-04-18 11:00:34

使用音頻BlackBerry

2012-05-18 10:08:56

TitaniumAndroid

2021-08-09 09:47:34

Blazor 路由開發

2011-12-29 10:48:49

移動Web

2021-06-21 15:21:52

鴻蒙HarmonyOS應用開發

2025-03-11 14:45:31

2011-11-29 16:38:58

Knockout
點贊
收藏

51CTO技術棧公眾號

久久精品成人一区二区三区| 色香色香欲天天天影视综合网| 91麻豆桃色免费看| 精品处破女学生| 久久99久久人婷婷精品综合| 欧美日韩美少妇| 蜜臀av性久久久久蜜臀av| 天堂中文在线观看视频| 蜜桃视频在线观看一区| 久久免费视频观看| 精品日韩在线视频| 高潮久久久久久久久久久久久久 | 欧美福利精品| 国产又粗又长又大视频| 国产一区二区三区的电影 | 欧美成人a∨高清免费观看| 女人另类性混交zo| 影音先锋在线播放| 国产日产欧美一区二区三区| 国产精品久久久久久久免费大片| 中文字幕乱伦视频| 国产一级久久| 欧美激情a在线| 911国产在线| 免费观看久久av| 亚洲的天堂在线中文字幕| 亚洲第一区第二区第三区| 成人福利视频| 亚洲va在线va天堂| 草草草视频在线观看| 777电影在线观看| 国产性色一区二区| 麻豆av福利av久久av| 懂色av蜜臀av粉嫩av分享吧| 狠狠色狠狠色综合系列| 国产精品久久久久久久久免费| 日韩美女视频网站| 国语精品一区| 久久精品国产96久久久香蕉| 亚洲第一视频区| 免费观看不卡av| 日韩经典中文字幕在线观看| 老司机免费视频| 精品国产18久久久久久二百| 欧美日韩久久久| 99视频在线视频| 高清成人在线| 欧美系列亚洲系列| 一区二区三区 日韩| 国产v综合v| 欧美在线免费播放| 国产天堂在线播放| 国产成人免费9x9x人网站视频 | 韩国精品美女www爽爽爽视频| 538任你躁在线精品视频网站| 91久久高清国语自产拍| 这里只有精品丝袜| 顶级黑人搡bbw搡bbbb搡| 99视频精品视频高清免费| 精品国产网站地址| 国产精品久久久久久久精| 欧美fxxxxxx另类| 欧美第一黄网免费网站| 久久精品这里只有精品| 亚洲小说区图片区| 欧美一区二区三区艳史| www.色国产| 日本aⅴ精品一区二区三区| 日本一区二区不卡| 中文字幕视频在线播放| 精品一区二区免费| av在线不卡观看| 午夜福利视频一区二区| 国产欧美一区二区精品性色超碰| 亚洲一区二区三区免费观看| 国产激情在线视频| 香蕉久久一区二区不卡无毒影院 | 一区二区欧美日韩| www红色一片_亚洲成a人片在线观看_| 一区二区久久久久久| 91视频 -- 69xx| 九色成人搞黄网站| 欧美一区二区三区视频免费| 国产精品嫩草69影院| 香蕉久久夜色精品国产使用方法 | 日韩精品视频在线免费观看| 中文字幕免费视频| 中文字幕亚洲综合久久五月天色无吗'' | 日本免费在线观看| 亚洲成人一区二区在线观看| 91av俱乐部| 免费观看性欧美大片无片| 日韩av综合网| 黑人狂躁日本娇小| 91久久午夜| 国产精品一区二区3区| 国产小视频免费观看| 久久看人人爽人人| 97在线免费视频观看| 精品91久久| 日韩欧美激情四射| 中文字幕在线看高清电影| 香蕉国产精品| 国产91精品最新在线播放| 国产毛片毛片毛片毛片毛片| 国产成人aaa| 久久综合一区二区三区| av毛片在线| 91国模大尺度私拍在线视频| 乱码一区二区三区| 日韩毛片视频| 1769国内精品视频在线播放| 国产人妻精品一区二区三| 久久综合九色综合欧美就去吻| 国内外成人激情免费视频| 亚洲精品一级二级| 亚洲国产成人久久综合| 免费在线观看a级片| 玖玖视频精品| 久久国产精品一区二区三区四区 | 日本最新高清不卡中文字幕| 精品人妻伦一二三区久久 | 国产成人免费在线视频| 婷婷四月色综合| 伊人久久视频| 亚洲国产成人久久| 精品视频在线观看免费| 国产精品一区二区三区99| 亚洲欧美久久234| 婷婷午夜社区一区| 日韩av综合网| 成年人免费高清视频| 成人性生交大合| 免费的一级黄色片| 欧美在线在线| 久久福利视频导航| 国产免费黄色网址| 中文字幕一区二区三区在线观看 | 日韩08精品| 久久久国产91| 国产精品女人久久久| 国产精品三级久久久久三级| 亚洲欧美另类动漫| 欧美色图一区| 国产精品网站视频| 日本中文字幕在线观看| 欧美日韩国产一级| 日本少妇aaa| 韩国精品免费视频| 免费观看亚洲视频| caoporn成人免费视频在线| 欧美日韩成人网| 蜜臀久久精品久久久久| 香蕉加勒比综合久久| 波多野结衣福利| 久久一综合视频| 三区精品视频| 国产精久久一区二区| 久久精品国产成人| 亚洲第一天堂网| 天天色天天操综合| wwwwxxxx国产| 美女看a上一区| 中文字幕精品在线播放| 久久精品九色| 高清在线视频日韩欧美| 精品福利视频导航大全| 欧美三级电影在线看| 亚洲一级生活片| 成人av免费网站| 男人的天堂99| 日韩成人免费| 99国产精品久久久久老师| 免费在线国产视频| 亚洲精品自产拍| 一区二区三区精彩视频| 亚洲成人av一区二区| 男人天堂av电影| 国产毛片精品国产一区二区三区| 欧美国产综合在线| 免费看日本一区二区| 成人激情综合网| 91www在线| 日韩中文在线视频| 日韩一级在线播放| 欧美色爱综合网| 久久久久久久久久99| 国产免费观看久久| 一区二区三区四区影院| 视频一区欧美日韩| av 日韩 人妻 黑人 综合 无码| 一本久久青青| 999国产在线| av高清一区| 欧美激情久久久久久| 国产粉嫩一区二区三区在线观看 | 欧美日韩精品在线视频| 中国1级黄色片| 99在线视频精品| 一级日本黄色片| 久久久久久一区二区| 成人黄色片免费| 成人嫩草影院| 久久久久一区二区三区| 国产在线一区不卡| 国产精品久久久久91| 51av在线| 麻豆国产va免费精品高清在线| 91在线视频观看免费| 在线视频日韩一区| 国产成人麻豆免费观看| 91网站视频在线观看| 涩多多在线观看| 日韩二区在线观看| 国产精品网站免费| 一精品久久久| 亚洲欧洲日韩综合二区| 亚洲影院天堂中文av色| 99理论电影网| 精品国产鲁一鲁****| 国产精品久久久久一区二区| 日本不卡网站| 国a精品视频大全| 色图在线观看| 久久大大胆人体| 日韩黄色影院| 中日韩美女免费视频网址在线观看 | 极品颜值美女露脸啪啪| 国产精品视频一二三| 青青草视频播放| 成人av网址在线观看| 男人的天堂免费| 国产精品456| 四虎成人在线播放| 国产在线精品国自产拍免费| 天美星空大象mv在线观看视频| 久久久久久一区二区| 男人操女人免费软件| 国产色综合网| 国精产品一区一区三区视频| 亚洲午夜伦理| 野外做受又硬又粗又大视频√| 欧美a级一区| 国产精品自拍合集| 亚洲激情午夜| 尤物av无码色av无码| 在线午夜精品| 3d动漫一区二区三区| 国产精品入口66mio| 男人添女人下面高潮视频| 亚洲美女黄色| koreanbj精品视频一区| 国产精品日本| 色诱视频在线观看| 日韩精品国产欧美| 午夜免费福利在线| 国内成人精品2018免费看| 在线视频日韩欧美| 成人午夜精品一区二区三区| 在线中文字日产幕| 91麻豆蜜桃一区二区三区| 美国黄色一级毛片| 国产视频一区在线观看| 日本精品久久久久中文| 最新久久zyz资源站| 国产免费无码一区二区视频| 亚洲成人动漫一区| www.欧美色| 欧美日韩久久一区二区| www.黄色小说.com| 亚洲国产精品99久久| 黄色网址在线播放| 综合av色偷偷网| 日本动漫理论片在线观看网站 | 性欧美18一19sex性欧美| 国产精品第3页| 成人在线日韩| 国产另类自拍| 欧美日韩精品一区二区视频| 91社在线播放| 国产精品久久久久毛片大屁完整版| 国产精品欧美激情在线观看| 麻豆成人在线观看| 秘密基地免费观看完整版中文| 久久综合久久99| 希岛爱理中文字幕| 欧美性猛交xxxx| 国产情侣在线播放| 亚洲欧洲一区二区三区久久| 成人影欧美片| 欧美中文在线字幕| 国产午夜精品一区在线观看| 精品国产乱码久久久久久久软件| 日本一区二区在线看| 国产91沈先生在线播放| 免费在线视频一区| 97人妻精品一区二区三区免费| 欧美激情一区二区三区全黄| 一区二区三区免费高清视频 | 一级黄色香蕉视频| 国产成人在线色| 国产视频三区四区| 亚洲成人免费电影| 国产精品国产精品国产专区| 亚洲欧美成人精品| 精品日韩av| 国产一区二区色| 日韩欧美天堂| 国产aaa免费视频| 久久国产剧场电影| 粉嫩av懂色av蜜臀av分享| 亚洲色图第一区| 免费又黄又爽又猛大片午夜| 亚洲韩国青草视频| h片在线播放| 国产精品视频免费在线| 亚洲第一二三区| 精品久久久久久无码中文野结衣| 精品一区二区三区久久| 国产精品密蕾丝袜| 婷婷开心激情综合| 性一交一乱一乱一视频| 超碰97人人做人人爱少妇| 成人在线黄色| 日本免费高清不卡| 免费久久99精品国产自在现线| 日本少妇xxxx| 亚洲一区中文日韩| www.成人免费视频| 久久国产天堂福利天堂| 男人天堂久久| 图片区小说区区亚洲五月| 快she精品国产999| 国产艳俗歌舞表演hd| 亚洲大片在线观看| 韩国av免费在线| 欧美激情精品久久久久久免费印度 | 在线成人免费观看| 91社区在线观看播放| 国产v综合ⅴ日韩v欧美大片| 亚洲伊人春色| 人人爽人人av| 中文字幕不卡的av| 亚洲图片欧美日韩| 亚洲系列中文字幕| 午夜无码国产理论在线| 日韩尤物视频| 美女免费视频一区| 色哟哟一一国产精品| 欧美高清视频一二三区| 成人区精品一区二区不卡| 91人成网站www| 欧美日韩爆操| 少妇一级淫免费观看| 亚洲成人一二三| 麻豆导航在线观看| 国产精品一区二区久久久久| 午夜av一区| 香蕉在线观看视频| 欧美视频精品一区| 国产福利免费在线观看| 成人在线中文字幕| 国产精品v亚洲精品v日韩精品| 动漫美女无遮挡免费| 欧美日韩性生活视频| 精品欧美不卡一区二区在线观看 | 综合久久久久久| 精品国产av一区二区| 国内外成人免费激情在线视频| 伊人久久大香线蕉av不卡| 亚洲黄色av网址| 亚洲欧美aⅴ...| 天堂av资源网| 国产精品美女网站| 欧美激情综合| 成人影视免费观看| 欧美日韩电影在线播放| 久久99亚洲网美利坚合众国| 免费看国产精品一二区视频| 另类小说欧美激情| 久久精品这里只有精品| 亚洲色图偷窥自拍| 成人在线视频国产| 国产精品专区在线| 国产精品久久久久久久久动漫| 国产高清免费在线观看| 日本精品免费一区二区三区| 亚洲精品久久| 精品人伦一区二区三电影| 日韩一级免费观看| 不卡av影片| 国产日产欧美一区二区| 久久精品一区二区三区不卡| 国产白浆在线观看| 日韩美女视频免费看| 欧美日本一区| 国产不卡在线观看视频| 精品国产一区二区三区av性色 | 波多一区二区| 亚洲精品欧美精品|