精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美日韩一区免费| 日韩av二区在线播放| 欧美成人精品福利| 欧美黄色免费影院| 免费**毛片在线| 丁香一区二区三区| 国产z一区二区三区| www色aa色aawww| 欧洲精品一区| 制服丝袜成人动漫| 国产精品自拍片| 欧美jizz18hd性欧美| 成人爱爱电影网址| 国产精品视频最多的网站| 中文字幕在线2021| 久久不见久久见国语| 日韩一区国产二区欧美三区| 黑森林福利视频导航| 快射av在线播放一区| 91香蕉视频mp4| 亚洲一区中文字幕| 亚洲欧美日韩激情| 欧美成人中文| 自拍偷拍亚洲精品| 亚洲男人在线天堂| 日韩精品久久久久久久软件91| 91搞黄在线观看| 加勒比成人在线| 国产最新在线| 国产精品久久久久影院老司| 久久精品第九区免费观看| 国产精品一区二区免费视频| 亚洲一区日韩| 欧美激情亚洲自拍| 人妻少妇精品一区二区三区| 成人在线丰满少妇av| 日韩精品在线观看一区| 免费黄色在线播放| 国产麻豆一区二区三区| 欧美日韩一级片网站| 午夜肉伦伦影院| xxxx成人| 亚洲午夜电影在线观看| 国产在线拍揄自揄拍无码| 992tv免费直播在线观看| 久久老女人爱爱| 精品国产一区二区三区日日嗨| 国产福利小视频| 久久99精品久久久久久| 日韩av手机在线观看| 日韩精品在线免费视频| 国产欧美二区| 日本免费久久高清视频| 亚洲综合久久网| 午夜宅男久久久| 欧美怡红院视频一区二区三区| 日本少妇全体裸体洗澡| 欧美日韩调教| 蜜月aⅴ免费一区二区三区| 波兰性xxxxx极品hd| 成人精品影院| 日韩性生活视频| 伊人在线视频观看| 综合激情一区| 欧美成人免费播放| 国产亚洲精品女人久久久久久| 欧美性色综合| 97成人超碰免| 日韩国产成人在线| 美女精品自拍一二三四| 91久久精品美女| 成人av免费播放| eeuss鲁片一区二区三区在线观看 eeuss影院一区二区三区 | 亚洲综合国产| 国产成人精彩在线视频九色| 中文字幕人妻互换av久久| 老司机免费视频一区二区三区| 91精品久久久久久久久久久久久 | 国产一区二区免费看| 亚洲va欧美va国产综合剧情| 男人天堂一区二区| 99精品一区二区三区| 欧美日韩电影一区二区| 9191在线观看| 玉米视频成人免费看| 亚洲中文字幕无码专区| 色香欲www7777综合网| 欧美人成免费网站| 国产69视频在线观看| 视频福利一区| 最近2019年日本中文免费字幕| 四虎影院中文字幕| 国产欧美不卡| 91在线无精精品一区二区| 黄色av中文字幕| 国产亚洲综合性久久久影院| 日本一本草久p| 深夜成人在线| 欧美一区二区三区四区高清| 999精品免费视频| 欧美色图在线播放| 欧美成人一区二区三区电影| 国产在线观看黄色| 国产毛片精品国产一区二区三区| 精品国产乱码久久久久软件 | 性色av蜜臀av| 国产丝袜欧美中文另类| 韩国无码av片在线观看网站| 欧美日韩不卡| 欧美大片拔萝卜| 18啪啪污污免费网站| 亚洲精品四区| 国产精品伦理一区二区| 亚洲精品xxx| 国产黄色片在线| 最新日韩欧美| 91精品在线影院| 可以直接在线观看的av| 一区二区三区四区蜜桃 | 成人性生活av| 亚洲第一中文字幕| 久久噜噜色综合一区二区| 欧美一级久久| 鬼打鬼之黄金道士1992林正英| aaa在线观看| 色综合欧美在线视频区| 天天躁日日躁狠狠躁免费麻豆| 天天射综合网视频| 国产成人亚洲综合青青| 亚洲av成人精品日韩在线播放| 洋洋成人永久网站入口| 日韩av自拍偷拍| 日本成人小视频| 欧美乱大交xxxxx另类电影| 亚洲性生活大片| 欧美经典三级视频一区二区三区| 免费国产黄色网址| 88久久精品| 久久99精品国产99久久6尤物| 91精品国产乱码久久久| 亚洲国产精品激情在线观看| 国产成人精品视频ⅴa片软件竹菊| 奇米777国产一区国产二区| 久久久久久久久电影| 亚洲av综合色区无码一二三区| 亚洲视频精选在线| 亚洲在线观看网站| 中文字幕日韩欧美精品高清在线| 91精品国产综合久久香蕉的用户体验 | 亚洲精品国产免费| 欧美日韩中文视频| 成人黄色小视频在线观看| 欧美图片激情小说| 国产伦精品一区二区三区在线播放| 欧美精品video| 亚洲黄色小说网址| 亚洲大片精品永久免费| 免费黄色三级网站| 另类图片国产| 亚洲欧美精品| 国产精品白丝久久av网站| 欧美老女人在线视频| 性生活视频软件| 午夜精品一区在线观看| 国产吞精囗交久久久| 久久午夜视频| 一本一道久久a久久综合精品| 日韩国产大片| 欧美激情久久久久| 污污网站免费在线观看| 色成人在线视频| 亚洲少妇xxx| 国产mv日韩mv欧美| 国产精品无码专区av在线播放| 精品免费av| 91免费版网站入口| 激情国产在线| 色噜噜国产精品视频一区二区| 国产精品毛片久久久久久久av| 亚洲综合在线观看视频| av小说在线观看| 激情成人综合网| 欧美乱大交xxxxx潮喷l头像| 伊甸园亚洲一区| 91九色在线视频| 国产欧洲在线| 日韩最新av在线| 色窝窝无码一区二区三区成人网站| 欧美视频专区一二在线观看| 国产精品suv一区二区88| 一区二区三区影视| 久久xxxx| 午夜在线视频免费观看| 国产三级精品三级在线观看国产| 国产精品678| 麻豆福利在线观看| 中文字幕在线成人| 亚洲av无码乱码在线观看性色| 色8久久精品久久久久久蜜 | 午夜精品成人在线视频| 久久久免费看片| 成人精品免费看| 黄大色黄女片18第一次| 亚洲天堂激情| 先锋影音男人资源| 国产精品免费大片| 粉嫩高清一区二区三区精品视频| 影视一区二区三区| 午夜精品美女自拍福到在线| 黄色小网站在线观看| 亚洲美女av在线| 国模无码一区二区三区| 欧美日韩精品三区| 人妻巨大乳一二三区| 欧美一区二区三区激情| 欧美性69xxxx肥| 欧产日产国产v| 中文在线一区二区| 第四色在线视频| 国产成人综合在线| 三上悠亚在线一区| 日韩国产欧美在线观看| 国产午夜福利100集发布| 欧美.www| 中国黄色录像片| 久久综合国产| 亚洲国产精品一区二区第四页av| 蜜桃一区av| 国产精品国产精品国产专区蜜臀ah| 亚洲毛片在线免费| 国产精品久久久999| 九色porny丨国产首页在线| 欧美精品情趣视频| 国产丝袜在线| 少妇精69xxtheporn| 成年人在线观看| 伊人精品在线观看| 极品白浆推特女神在线观看| 亚洲精品一区中文| 日韩电影网址| 亚洲欧美国产日韩中文字幕| 三级视频在线看| 精品国产乱码久久久久久蜜臀| 亚洲精品一区二区三区不卡| 日韩欧美久久久| 午夜精品一二三区| 精品福利在线导航| 日韩在线视频观看免费| 亚洲国产三级网| 熟妇人妻中文av无码| 亚洲精品久久久一区二区三区 | 91国内精品白嫩初高生| 91九色视频导航| 日韩影片在线观看| 粉嫩精品一区二区三区在线观看| 亚洲福利合集| 国产精品国模大尺度私拍| 精品成人自拍视频| 免费久久一级欧美特大黄| 国产精品片aa在线观看| 亚洲精品成人a8198a| 久久精品亚洲欧美日韩精品中文字幕| 男人j进女人j| 午夜日韩激情| 久在线观看视频| 日韩精品亚洲专区| 欧美在线aaa| 国产美女av一区二区三区| 国产xxx在线观看 | 久久riav二区三区| 国产精品一国产精品| 亚洲亚洲精品三区日韩精品在线视频| 99热国内精品| 东北少妇不带套对白| 乱码第一页成人| 一区二区三区欧美精品| 福利视频网站一区二区三区| 免费a级黄色片| 最新国产の精品合集bt伙计| 国产亚洲欧美久久久久| 色天天综合色天天久久| 国产精品无码久久av| 精品国产乱码久久久久久夜甘婷婷| 视频在线不卡| www.亚洲成人| 超免费在线视频| 国产精品人成电影| 欧美一级大片在线视频| 精品国产乱码一区二区三区四区| 日韩一区二区在线免费| 97视频在线免费| 久久成人羞羞网站| 久久久午夜精品福利内容| 国产欧美日韩视频在线观看| 深夜福利影院在线观看| 91成人免费电影| 丁香花免费高清完整在线播放| 亚洲天堂成人在线| 女人天堂av在线播放| 国产a∨精品一区二区三区不卡| 国产亚洲高清一区| 久久涩涩网站| 欧美精品二区| 国产乱女淫av麻豆国产| 91原创在线视频| 午夜免费激情视频| 欧洲精品一区二区| 人妻中文字幕一区| 久久久国产精品一区| 欧美大胆性生话| 国产一区二区视频在线免费观看 | 国产日韩三级| 99精品一区二区三区的区别| 久久亚洲色图| 男女一区二区三区| 一区二区三区中文字幕精品精品 | 亚洲精品久久久久中文字幕二区| 国产在线69| 国产精品视频资源| 精品中文一区| 黄色免费视频大全| 国产91富婆露脸刺激对白| 国产极品美女在线| 欧美亚洲国产一区在线观看网站| 亚洲三区在线观看无套内射| 欧美第一黄色网| 日本在线视频一区二区三区| 在线不卡日本| 美女网站在线免费欧美精品| 国产毛片欧美毛片久久久| 欧美性xxxxhd| 亚洲人成色777777精品音频| 久久琪琪电影院| 成人搞黄视频| 久久精品国产sm调教网站演员| 高清不卡一区二区| 国产亚洲成人精品| 精品精品欲导航| 成人超碰在线| 精品999在线观看| 一区二区毛片| 不卡一区二区在线观看| 午夜精品福利一区二区三区蜜桃| 欧美一级特黄aaaaaa大片在线观看| 九九久久国产精品| 日韩最新av| 加勒比成人在线| 99久久国产免费看| 亚洲免费在线视频观看| 亚洲男子天堂网| 国产精品伦一区二区| 亚洲精品美女久久7777777| 久久国产免费看| 国产大片免费看| 欧美大片在线观看一区二区| 福利影院在线看| 欧美影视一区二区| 免费高清在线视频一区·| 青花影视在线观看免费高清| 日韩一区二区三区免费看| 欧美野外wwwxxx| 久久国产精品一区二区三区| 蜜桃久久av| 国产又粗又猛又爽又黄的视频小说| 欧美剧情片在线观看| av毛片在线| 国产一区二区精品在线| 久久久久久久波多野高潮日日| 国产传媒在线看| 欧美一级生活片| 国产社区精品视频| 日韩av高清| 国产精品自在欧美一区| 韩国av免费观看| 一区二区欧美久久| 欧美日韩黄色| 黄色片视频在线播放| 国产精品传媒视频| 国产成人无码www免费视频播放| 51ⅴ精品国产91久久久久久| 青草国产精品| 国产精品成人免费一区久久羞羞| 大桥未久av一区二区三区| av影片免费在线观看| 9a蜜桃久久久久久免费| 午夜一级在线看亚洲| 国产精品视频一区二区三| 亚洲精品国产精品国自产观看浪潮 | 亚州成人在线电影| 国产一区二区三区福利| 91亚洲精品一区| 午夜亚洲性色视频| 欧美三级免费看| 亚洲夜晚福利在线观看| av日韩在线播放| 日本一二区免费| 欧美特级www| 欧美色图天堂| 一区二区国产日产| 91天堂素人约啪|