九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Chrome擴(kuò)展
我的第一個(gè)Chrome擴(kuò)展:Search-faster
原文地址:http://www.aneasystone.com/archives/2015/06/my-first-chrome-extension-search-faster.html
June 7, 2015我的第一個(gè)Chrome擴(kuò)展:Search-faster
花了兩周左右的時(shí)間將Chrome擴(kuò)展的開發(fā)文檔看了一遍,把所有官方的例子也都順便一個(gè)個(gè)的安裝玩了一遍,真心感覺Chrome瀏覽器的博大精深。Chrome瀏覽器的現(xiàn)有功能已經(jīng)足夠強(qiáng)大,再配合Chrome擴(kuò)展幾乎可以說是“只有想不到,沒有做不到”。于是利用業(yè)余時(shí)間做了一個(gè)簡單的擴(kuò)展Search-faster,可以加快Google的搜索速度,算是對(duì)近一段時(shí)間學(xué)習(xí)的總結(jié)。
一、Chrome擴(kuò)展綜述
Chrome擴(kuò)展有兩種不同的表現(xiàn)形式:擴(kuò)展(Extension)和應(yīng)用(WebApp),我們這里不討論WebApp,但是擴(kuò)展的大多數(shù)技巧對(duì)于WebApp來說也是適用的。Chrome擴(kuò)展實(shí)際上就是壓縮在一起的一組文件,包括HTML,CSS,Javascript,圖片,還有其它任何需要的文件。它從本質(zhì)上來說就是一個(gè)Web頁面,可以使用所有的瀏覽器提供的API,可以與Web頁面交互,或者通過content script或cross-origin XMLHttpRequests與服務(wù)器交互。還可以訪問瀏覽器提供的內(nèi)部功能,例如標(biāo)簽或書簽等。
擴(kuò)展在Chrome瀏覽器中又有著兩種不同的表現(xiàn)形式:browser_action和page_action,browser_action在工具欄右側(cè)添加一個(gè)圖標(biāo),page_action在URL輸入欄右側(cè)添加一個(gè)圖標(biāo),如下圖所示。這兩個(gè)action唯一的區(qū)別在于:當(dāng)你的擴(kuò)展是否顯示取決于單個(gè)頁面時(shí),該使用page_action,page_action默認(rèn)是不顯示的。
1.1 manifest.json
每一個(gè)Chrome擴(kuò)展都有一個(gè)清單文件包含了這個(gè)擴(kuò)展的所有重要信息,這個(gè)文件的名稱固定為manifest.json,文件內(nèi)容為JSON格式。下面是一個(gè)manifest.json文件的實(shí)例(來自JSONView擴(kuò)展)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"background": {
"scripts": [ "background.js" ]
},
"content_scripts": [ {
"all_frames": true,
"js": [ "content.js" ],
"matches": [ "
"run_at": "document_end"
} ],
"description": "Validate and view JSON documents",
"icons": {
"128": "jsonview128.png",
"16": "jsonview16.png",
"48": "jsonview48.png"
},
"key": "...",
"manifest_version": 2,
"name": "JSONView",
"options_page": "options.html",
"permissions": [ "clipboardWrite", "
"update_url": "
"version": "0.0.32.2",
"web_accessible_resources": [
"jsonview.css", "jsonview-core.css", "content_error.css",
"options.png", "close_icon.gif", "error.gif"
]
}
其中name、version和manifest_version三個(gè)字段是必選的,每個(gè)字段的含義顯而易見,另外在當(dāng)前版本下manifest_version的值推薦為2,版本1已經(jīng)被棄用。
除這三個(gè)字段之外,description為對(duì)擴(kuò)展的一句描述,雖然是可選的,但是建議使用。
icons為擴(kuò)展的圖標(biāo),一般情況下需要提供三種不同尺寸的圖標(biāo):16*16的圖標(biāo)用于擴(kuò)展的favicon,在查看擴(kuò)展的option頁面時(shí)可以看到;48*48的圖標(biāo)在擴(kuò)展的管理頁面可以看到;128*128的圖標(biāo)用于WebApp。這三種圖標(biāo)分別如下所示:
圖標(biāo)建議都使用png格式,因?yàn)閜ng對(duì)透明的支持最好。要注意的是:icons里的圖標(biāo)和browser_action或page_action里的default_icon可能是不一樣的,default_icon顯示在工具欄或URL輸入欄右側(cè),建議采用19*19的圖標(biāo)。
key字段為擴(kuò)展的唯一標(biāo)識(shí),這個(gè)字段是瀏覽器在安裝.crx文件時(shí)自動(dòng)生成的,通常不需要手工指定。
permissions為擴(kuò)展所需要的權(quán)限列表,列表中的每一項(xiàng)要么是一個(gè)已知的權(quán)限名稱,要么是一個(gè)URL匹配模式。一些常見的權(quán)限名稱有background、bookmarks、contextMenus、cookies、experimental、geolocation、history、idle、management、notifications、tabs、unlimitedStorage等;URL匹配模式用于指定訪問特定的主機(jī)權(quán)限,譬如:"http://*.google.com/"、"http://www.baidu.com/"。關(guān)于permissions字段可以參考這里的文檔。
update_url用于擴(kuò)展的自動(dòng)升級(jí),默認(rèn)情況下Chrome瀏覽器會(huì)每隔一小時(shí)檢測一次是否需要升級(jí),也可以點(diǎn)擊擴(kuò)展管理頁面的“立即更新”按鈕強(qiáng)制升級(jí)。
另外background、content_scripts、options_page這三字段,還有這個(gè)例子里沒包含的browser_action/page_action字段是構(gòu)成Chrome擴(kuò)展的核心元素。下面分別進(jìn)行介紹。
1.2 background
背景頁通常是Javascript腳本,是一個(gè)在擴(kuò)展進(jìn)程中一直保持運(yùn)行的頁面。它在你的擴(kuò)展的整個(gè)生命周期都存在,在同一時(shí)間只有一個(gè)實(shí)例處于活動(dòng)狀態(tài)。在manifest.json中像下面這樣使用scripts字段注冊(cè)背景頁:
1
2
3
4
5
6
7
8
{
"name": "My extension",
// ...
"background": {
"scripts": ["background.js"]
},
// ...
}
也可以使用page字段注冊(cè)HTML頁面:
1
2
3
4
5
6
7
8
{
"name": "My extension",
// ...
"background": {
"page": ["background.html"]
},
// ...
}
背景頁和browser_action/page_action是運(yùn)行在同一個(gè)環(huán)境下的,可以通過chrome.extension.getBackgroundPage()和chrome.extension.getViews()進(jìn)行兩者之間的互相通信。
背景頁也常常需要和content_scripts之間進(jìn)行通信,要特別注意的是背景頁和content_scripts是運(yùn)行在兩個(gè)獨(dú)立的上下文環(huán)境中的,只能通過messages機(jī)制來通信,這個(gè)通信可以是雙向的,首先寫下消息的監(jiān)聽方:
1
2
3
4
5
chrome.extension.onRequest.addListener(function(request, sender, callback) {
console.log(JSON.stringify(request));
// deal with the request...
sendResponse({success: true});
});
然后寫下消息的發(fā)送方:
1
2
3
4
5
chrome.tabs.sendRequest(tabId, cron, function(response) {
if (response.success) {
// deal with the response...
}
});
1.3 content_scripts
content scripts是一個(gè)很酷的東西,它可以讓我們?cè)赪eb頁面上運(yùn)行我們自定義的Javascript腳本。content scripts可以訪問或操作Web頁面上的DOM元素,從而實(shí)現(xiàn)和Web頁面的交互。但是要注意的是,它不能訪問Web頁面中的Javascript變量或函數(shù),content scripts是運(yùn)行在一個(gè)獨(dú)立的上下文環(huán)境中的,類似于沙盒技術(shù),這樣不僅可以確保安全性,而且不會(huì)導(dǎo)致頁面上的腳本沖突(譬如Web頁面上使用了jquery 1.9版本,而content scripts中使用了jquery 2.0版本,這兩個(gè)版本的jquery其實(shí)運(yùn)行在兩個(gè)獨(dú)立的上下文環(huán)境中互不影響)。content scripts除了不能訪問Web頁面中Javascript變量和函數(shù)外,還有其他的一些限制:
不能使用除了chrome.extension之外的chrome.* 的接口
不能訪問它所在擴(kuò)展中定義的函數(shù)和變量
不能做cross-site XMLHttpRequests
但這些限制其實(shí)并不影響content scripts實(shí)現(xiàn)其強(qiáng)大功能,因?yàn)榭梢允褂肅hrome擴(kuò)展的messages機(jī)制來和其所在的擴(kuò)展進(jìn)行通信,從而間接的實(shí)現(xiàn)上面的功能;而且,content scripts甚至可以通過操作DOM來間接的和Web頁面進(jìn)行通信。
使用content scripts在Web頁面注入自定義腳本可以通過兩種方法來實(shí)現(xiàn):第一種方法是在manifest.json文件中使用content_scripts字段來指定,還有一種方法是通過編程的方式調(diào)用chrome.tabs.executeScript()函數(shù)動(dòng)態(tài)的注入。這里有詳細(xì)的介紹。
1.4 options_page
當(dāng)你的擴(kuò)展擁有眾多參數(shù)可供用戶選擇時(shí),可以通過選項(xiàng)頁來實(shí)現(xiàn)。選項(xiàng)頁就是一個(gè)單純的HTML文件,可以引用腳本,CSS,圖片等其他資源。這在Web開發(fā)中是家常便飯,只要你會(huì)制作網(wǎng)頁,那么制作一個(gè)選項(xiàng)頁肯定也沒問題,這并沒有什么好說的。但是,如果我們仔細(xì)想一想,當(dāng)用戶在選項(xiàng)頁點(diǎn)擊保存修改后,修改后的配置信息保存在哪兒呢?如何做到選項(xiàng)頁中的配置在重啟瀏覽器后甚至是清除瀏覽器數(shù)據(jù)后仍然存在呢?這就需要我們將配置信息保存到硬盤上的某個(gè)文件中,而瀏覽器Web腳本中的Javascript代碼很顯然是不能訪問物理文件的。
這就是chrome.storage.local的由來,chrome.storage.local是Chrome瀏覽器提供的存儲(chǔ)API,這個(gè)接口用來將擴(kuò)展中需要保存的數(shù)據(jù)寫入本地磁盤。Chrome提供的存儲(chǔ)API可以說是對(duì)localStorage的改進(jìn),它與localStorage相比有以下區(qū)別:
如果儲(chǔ)存區(qū)域指定為sync,數(shù)據(jù)可以自動(dòng)同步
在隱身模式下仍然可以讀出之前存儲(chǔ)的數(shù)據(jù)
讀寫速度更快
用戶數(shù)據(jù)可以以對(duì)象的類型保存
清除瀏覽器數(shù)據(jù)后仍然可以訪問
1.5 browser_action vs. page_action
上面已經(jīng)說過,browser_action和page_action是擴(kuò)展在Chrome瀏覽器中的兩種不同的表現(xiàn)形式,browser_action顯示在工具欄右側(cè),page_action顯示在URL輸入欄右側(cè)。下面的代碼示例說明了如何注冊(cè)一個(gè)browser_action(page_action的注冊(cè)方法類似,只要將browser_action替換成page_action即可):
1
2
3
4
5
6
7
8
9
10
{
"name": "My extension",
// ...
"browser_action": {
"default_icon": "images/icon19.png", // optional
"default_title": "Google Mail",      // optional; shown in tooltip
"default_popup": "popup.html"        // optional
},
// ...
}
一個(gè)browser_action可以擁有一個(gè)icon,一個(gè)tooltip,一個(gè)badge和一個(gè)popup,page_action沒有badge,也可以擁有一個(gè)icon,一個(gè)tooltip和一個(gè)popup。icon是action的圖標(biāo),一般情況下是一個(gè)19*19的png圖片,也可以是HTML5中的一個(gè)canvas元素可以實(shí)現(xiàn)任意的自定義圖片;tooltip是提示信息,當(dāng)鼠標(biāo)移到action圖標(biāo)上時(shí)會(huì)顯示出來;popup是當(dāng)用戶點(diǎn)擊action圖標(biāo)時(shí)彈出的窗口;badge是寫在圖標(biāo)上文字,譬如下圖中顯示在RSS Feed Reader這個(gè)擴(kuò)展圖標(biāo)上的67就是一個(gè)badge,由于badge空間有限,一般不會(huì)超過4個(gè)字符,超出部分會(huì)被截?cái)唷?div style="height:15px;">
如果在default_popup字段中指定了popup.html,當(dāng)用戶點(diǎn)擊圖標(biāo)時(shí)就會(huì)彈出來。這也是個(gè)簡單的HTML文件,可以包含自己的腳本,樣式和圖片文件。如果沒有指定popup.html,點(diǎn)擊圖標(biāo)時(shí)會(huì)觸發(fā)action的onClicked事件。如果你需要處理該事件可以在背景頁background.js中使用類似于下面的代碼:
1
2
3
chrome.browserAction.onClicked.addListener(function(tab) {
// ...
});
browser_action默認(rèn)總是顯示,除非你在擴(kuò)展管理里選擇了隱藏按鈕,而page_action默認(rèn)是不顯示的,需要使用函數(shù)chrome.pageAction.show()和chrome.pageAction.hide()來控制page_action的顯示。下面是一個(gè)簡單的示例,只有當(dāng)URL是www.baidu.com才會(huì)顯示page_action:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function update(tabId) {
if (location.host.indexOf('www.baidu.com') == -1) {
chrome.pageAction.hide(tabId);
}
else {
chrome.pageAction.show(tabId);
}
}
chrome.tabs.onUpdated.addListener(function(tabId, change, tab) {
if (change.status == "complete") {
update(tabId);
}
});
chrome.tabs.onSelectionChanged.addListener(function(tabId, info) {
update(tabId);
});
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
update(tabs[0].id);
});
二、如何調(diào)試Chrome擴(kuò)展
調(diào)試永遠(yuǎn)是軟件開發(fā)中至關(guān)重要的一步,無論是桌面應(yīng)用還是Web應(yīng)用都是如此。Chrome瀏覽器的開發(fā)者工具提供給開發(fā)人員一個(gè)近乎完美的Web調(diào)試器,不僅可以查看Web頁面的HTML源碼,分析和修改DOM樹,調(diào)試CSS樣式,查看每一個(gè)網(wǎng)絡(luò)請(qǐng)求進(jìn)行性能分析,以及強(qiáng)大的Javascript腳本調(diào)試器。Chrome擴(kuò)展和Web應(yīng)用別無二致,自然也可以使用相同的調(diào)試方法對(duì)其進(jìn)行調(diào)試,只不過要在幾點(diǎn)不同之處特別注意一下。
2.1 popup的調(diào)試
如果你的擴(kuò)展使用了popup,無論是browser_action還是page_action,都可以通過下面的方法調(diào)試popup:首先在擴(kuò)展的圖標(biāo)上點(diǎn)擊右鍵,然后選擇“審查彈出內(nèi)容”,如下圖所示:
這時(shí)會(huì)彈出開發(fā)者工具的窗口,我們選擇Sources選項(xiàng)卡,在左側(cè)就可以看到所有popup相關(guān)的HTML、Javascript以及CSS了。如下圖:
查看Javascript代碼找到我們感興趣的地方,在該處下個(gè)斷點(diǎn),然后就可以進(jìn)行調(diào)試了。如果斷點(diǎn)處的代碼是彈出窗口時(shí)就已經(jīng)執(zhí)行過了,那么可以切換到Console選項(xiàng)卡,輸入location.reload(true)執(zhí)行后popup會(huì)重新加載,并斷在斷點(diǎn)處,如下圖:
2.2 background的調(diào)試
盡管背景頁和popup是屬于同一個(gè)執(zhí)行環(huán)境下,但是點(diǎn)擊“審查彈出內(nèi)容”時(shí)并不能看到背景頁的代碼,也不能對(duì)其進(jìn)行調(diào)試。要調(diào)試背景頁,首先需要打開擴(kuò)展管理頁面,找到要調(diào)試的擴(kuò)展,如果該擴(kuò)展有背景頁,會(huì)顯示類似于如下圖所示的“檢查視圖:background.html”字樣,用戶點(diǎn)擊background.html彈出開發(fā)者工具既可以進(jìn)行調(diào)試。
和popup一樣,也可以使用在Console選項(xiàng)卡中執(zhí)行l(wèi)ocation.reload(true)這個(gè)小技巧來重新加載背景頁。
2.3 content_scripts的調(diào)試
content_scripts是注入到Web頁面中的Javascript代碼,所以調(diào)試content_scripts和調(diào)試Web頁面是完全一樣的。我們直接按F12調(diào)出開發(fā)者工具,然后切換到Sources選項(xiàng)卡,在下面的左側(cè)可以看到又有幾個(gè)小的選項(xiàng)卡:Sources、Content scripts、Snippets。我們選擇Content scripts就可以找到已經(jīng)注入到這個(gè)頁面的所有content_scripts。如下圖:
可以看出一個(gè)頁面可以被注入多個(gè)content_scripts,每一個(gè)content_scripts都有著他們自己獨(dú)立的運(yùn)行空間。找到感興趣的代碼下斷點(diǎn),然后就可以調(diào)試了。如果代碼已經(jīng)運(yùn)行過,刷新下頁面即可(當(dāng)然,如果你在Console選項(xiàng)卡中執(zhí)行l(wèi)ocation.reload(true)也是完全可以的,但這哪有F5方便呢:-))。
2.4 option.html的調(diào)試
選項(xiàng)頁就是一個(gè)靜態(tài)的HTML頁面,和調(diào)試Web頁面完全一樣。沒什么好說的了。
三、Search-faster的實(shí)現(xiàn)
通過上面的學(xué)習(xí),我們基本上已經(jīng)了解到了開發(fā)一個(gè)Chrome擴(kuò)展所需要的基本知識(shí)了。現(xiàn)在我們通過實(shí)現(xiàn)一個(gè)最最簡單的Chrome擴(kuò)展來對(duì)學(xué)到的內(nèi)容進(jìn)行鞏固。Search-faster非常簡單,寫它的目的也非常簡單:加快我們?cè)谒阉饕嫔系乃阉魉俣?。聽起來很高大上,其?shí)很簡單,我們知道在我們搜索的時(shí)候,很多搜索引擎搜出來的結(jié)果并不是直接跳轉(zhuǎn)到原網(wǎng)頁,而且先跳轉(zhuǎn)到搜索引擎自身,然后再跳轉(zhuǎn)到原網(wǎng)頁。如下圖所示,百度搜索就是這樣做的:
當(dāng)然Google也是這樣:
這樣做搜索引擎可以對(duì)每個(gè)搜索結(jié)果進(jìn)行統(tǒng)計(jì)分析然后優(yōu)化,但是對(duì)于我們用戶來說,多做一次跳轉(zhuǎn)顯然會(huì)降低我們的速度。而且在我們大天朝,通過代理訪問Google本來就已經(jīng)夠慢的了,點(diǎn)擊每個(gè)搜索結(jié)果再跳轉(zhuǎn)一次到Google實(shí)在是有點(diǎn)讓人受不了。
我本來打算對(duì)百度、Google和Bing做統(tǒng)一處理的,后來發(fā)現(xiàn)百度的跳轉(zhuǎn)鏈接是經(jīng)過加密后的,一時(shí)破解不了,而Bing的搜索結(jié)果并沒有跳轉(zhuǎn)而是直接到原網(wǎng)頁。于是這個(gè)Search-faster其實(shí)就變成了Google-search-faster了。
首先我們確定我們的擴(kuò)展類型,因?yàn)橹挥性谠L問Google搜索時(shí)才需要顯示,所以我們采用page_action而不是browser_action。然后我們確定需要哪些文件,因?yàn)橐L問Google搜索的結(jié)果頁面,所以肯定需要一個(gè)content_scripts,content_scripts的內(nèi)容是遍歷Google搜索結(jié)果頁面上的所有跳轉(zhuǎn)鏈接,獲取每個(gè)鏈接的原鏈接,然后在每個(gè)鏈接上添加一個(gè)click事件,當(dāng)用戶點(diǎn)擊該鏈接時(shí)直接跳轉(zhuǎn)到原鏈接。(本來是打算直接修改鏈接為原鏈接的,但是發(fā)現(xiàn)Google的代碼中有檢測功能,會(huì)自動(dòng)將跳轉(zhuǎn)鏈接替換回來,所以使用click事件的方法最為保險(xiǎn))。最后我們需要一個(gè)背景頁,檢測瀏覽器選項(xiàng)卡的變動(dòng),當(dāng)用戶切換選項(xiàng)卡或選項(xiàng)卡有變動(dòng)時(shí)執(zhí)行content_scripts。
manifest.json的代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"name": "Search-faster",
"version": "1.0",
"description": "Replace the search engine redirect url to direct url when searching baidu, google, etc.",
"background": { "scripts": ["background.js"] },
"content_scripts": [{
"matches": [""js": ["jquery.min.js", "content_script.js"]
}],
"page_action": {
"default_icon" : "icons/google.png",
"default_title" : "It works!"
},
"permissions" : ["tabs"],
"manifest_version": 2
}
content_scripts的關(guān)鍵代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
chrome.extension.onRequest.addListener(function(req, sender, sendResponse) {
var response = doReplace();
sendResponse(response);
});
/**
* replace the redirect url to direct url
*/
function doReplace() {
// url not match
if(location.host.indexOf('www.google.com') == -1) {
return null;
}
// get the keyword
var lstib = $('#lst-ib');
if(lstib.length == 0) {
return null;
}
// get the links & add a click event
var links = $('.srg .g h3.r a');
links.on('click', function(e) {
var href = $(e.target).attr('data-href');
window.open(href);
return false;
});
return {
keyword: lstib[0].value,
replace_cnt: links.length
};
}
background的關(guān)鍵代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function updateSearch(tabId) {
chrome.tabs.sendRequest(tabId, {}, function(search) {
searches[tabId] = search;
if (!search) {
chrome.pageAction.hide(tabId);
} else {
chrome.pageAction.show(tabId);
if (selectedId == tabId) {
updateSelected(tabId);
}
}
});
}
chrome.tabs.onUpdated.addListener(function(tabId, change, tab) {
if (change.status == "complete") {
updateSearch(tabId);
}
});
chrome.tabs.onSelectionChanged.addListener(function(tabId, info) {
selectedId = tabId;
updateSelected(tabId);
});
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
updateSearch(tabs[0].id);
});
完整的代碼在
這里。
參考
綜述--擴(kuò)展開發(fā)文檔
Chrome 擴(kuò)展程序、應(yīng)用開發(fā)文檔(非官方中文版)
Sample Extensions - Google Chrome
Chrome插件(Extensions)開發(fā)攻略
手把手教你開發(fā)chrome擴(kuò)展一:開發(fā)Chrome Extenstion其實(shí)很簡單
手把手教你開發(fā)Chrome擴(kuò)展二:為html添加行為
手把手教你開發(fā)Chrome擴(kuò)展三:關(guān)于本地存儲(chǔ)數(shù)據(jù)
Chrome.storage和HTML5中l(wèi)ocalStorage的差異
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
chrome插件編寫中需要了解的幾個(gè)概念和一些方法 | IT宅.com
小技巧 | Get 到一個(gè) Web 自動(dòng)化方案,絕了!
chrome插件 DIY
Chrome擴(kuò)展開發(fā)指南(3)——Browser Action(擴(kuò)展圖標(biāo))
開發(fā)谷歌瀏覽器Chrome Extenstion其實(shí)很就是這么簡單
chrome manifest
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服