chrome extensions 开发

前端时间看到别人博客上面写的chrome扩展开发,自己也想动手试下,就顺便写了一个小例子(为公司的测试环境设置cookie),现在记录下来。方便下次开发的时候能快速回忆起来

目录结构

目录结构

index.html -> 点击插件后的弹窗
图片 -> 发布插件和插件栏显示所用
manifest.json 配置文件
script 脚本文件

下面从manifest.json开始解释

{
   "browser_action": {
      "default_icon": "48.jpg",
      "default_popup": "index.html"
   },
   "content_scripts": [ {
      "js": [ "scripts/lib/jquery-1.7.2.min.js", "scripts/main.js" ],
      "matches": [ "http://*/*", "https://*/*" ]
   } ],
   "description": "Company test environment cookie settings(公司预发布环境cookie设置)",
   "icons": {
      "16": "16.jpg",
      "48": "48.jpg",
      "128":"128.jpg"
   },
   "manifest_version": 2,
   "name": "预发布环境设置",
   "permissions": ["webRequest","notifications", "cookies", "tabs", "http://*/*", "https://*/*","http://www.zaful.com/","<all_urls>" ],
   "version": "1.1.0",
   "background": { "scripts": ["scripts/lib/jquery-1.7.2.min.js", "scripts/background.js"] }
}

browser_action 插件栏的图标,指定弹出模板(注意,现在browser_action和page_action不能一起使用了)
content_scripts 指定和页面进行交互的脚本,并且可以调用chrome API和background_script进行交互
descriptions 插件描述
icons 发布时有用
manifest_versions 版本,现在都是使用2
name 插件名称
permissions 一些功能的权限(cookie,弹窗之类的)
background 弹窗里面的脚本

然后是index.html 弹窗模板

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>预发布环境设置</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Cache-Control" content="no-cache"/>
<script type='text/javascript' src='scripts/lib/jquery-1.7.2.min.js'></script>
<script type='text/javascript' src='scripts/background.js'></script>
<script type='text/javascript' src='scripts/main.js'></script>

<style type=text/css>
    .wrapper{width: 100px;}
</style>
<body>
<div class=wrapper id=top>

    <div>
        <input id="savehm" name="savehm" type="checkbox"> 预发布
    </div>
</div>
</body></html>

这个很明显了,就不多做解释了

background.js 弹窗里面的脚本 主要是定义一些chrome通知的方法



function inYuFaBu() {
    
        var notification = new Notification('预发布提示', {
            icon: 'http://cdn.sstatic.net/stackexchange/img/logos/so/so-icon.png',
            body: "已经进入预发布环境",
        });
    

}


function outYuFaBu() {
    
        var notification = new Notification('预发布提示', {
            icon: 'http://cdn.sstatic.net/stackexchange/img/logos/so/so-icon.png',
            body: "退出预发布环境",
        });
    

}

通知

这里主要是调用chrome自带的通知方法 Notification 需要在配置文件里面设置permissions

main.js 主要逻辑都在这个里面

var  url = '';
var domain = '';
var $body = '';


function getHost(url)
{
    var host = "null";
    if(typeof url == "undefined"|| null == url) {
        url = window.location.href;
        $body = $('body');
    }
    var regex = /^\w+\:\/\/([^\/]*).*/;
    var match = url.match(regex);
    if(typeof match != "undefined" && null != match) {
        host = match[1];
        domain = host.split('.');
        domain.shift();
        domain = '.' + domain.join('.');
    }
    return 'http://'+host;
}

function setCookie() {
  chrome.cookies.set({
      domain: domain,
      expirationDate: 1505720700, 
      httpOnly: false,
      name:"staging",
      path: "/",
      secure: false, 
      url: url,
      value: "true"
  },function(cookie){
      chrome.extension.getBackgroundPage().inYuFaBu();
  });
}

function removeCookie(url){
    chrome.cookies.remove({
        'url':url,
        'name':'staging'
    },function () {
        chrome.extension.getBackgroundPage().outYuFaBu();
    });
}

function initCookie(url) {

  var str="";
  chrome.cookies.get({"name": "staging","url":url },function(cookie){
      if(cookie){
          str=cookie.value;
      }
        if(""!=str){
            $('#savehm').attr("checked",true);
            chrome.extension.getBackgroundPage().inYuFaBu();

        }
  });
}

function init(){
    chrome.tabs.getSelected(null, function(tab) {
        if(tab){
            url = getHost(tab.url);
            initCookie(url);
        }
    });

  $('#savehm').click(function() {
      if($('#savehm').attr('checked')) {
          setCookie();
      }else{
          removeCookie(url);
      }
    
  });

  $('#savemm').click(function() {
     if($('#savemm').attr('checked')){
        $('#savehm').attr("checked",true);
     }else{
        $('#savehm').attr("checked",false);
     }
  });
  
}
document.addEventListener('DOMContentLoaded', function () {
  init(); 
});


document.addeventListener 监听点击插件后,加载完成开始初始化 init()
init() 里面有一个chrome.tab的接口 大概就是监听chrome的标签页的一系列接口,在这个里面我们会拿当前页面的url并且匹配主域名,然后初始化cookie initCookie()
initCookie() 主要就是拿当前域名下面 看有没有一个叫staging的cookie 如果有,就通过chrome.extension的接口调用background.js 里面定义好的通知方法
setCookie() removeCookie() 就是设置cookie和删除cookie了 也都是调用了chrome自带的接口

下面说一下调试的tips

调试

我们可以点击右键,然后审查弹出内容,就可以查看源码和调试了 (如果有某个功能自己不能实现,可以去chrome应用中心找到类似的功能的插件,然后打断点研究)

插件ID
已安装插件

可以通过已安装插件的id,在本地chrome的插件里面查找,文件夹里面就是源码了

打包,上传

ssa.gif
Paste_Image.png

选中开发者模式 然后打包扩展程序 然后就会生成一个.crx文件 把这个文件拖到扩展程序这个页面就可以装上去了,另外一个.pem的文件是一个密匙文件,(下次重新打包如果有的话就需要选择,也可以直接删掉,就不用选择了)

上传页面
上传成功

发布的时候不能够发布crx文件,需要压缩成zip文件,然后按照上面的目录结构基本可以通过审核

发布地址

发布之前需要交5美元的保护费-_- 可以办一个双币信用卡 然后地址填香港就可以了

自己的第一个插件大概就是这样了,其实里面还有一些东西没有弄清楚。但是学一个东西最开始最好就是动手开始做,做出来后就会有一个大概的轮廓,如果再需要继续研究也会方便很多。

源码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • chrome扩展开发入门教程 最近在开发chrome插件,看到一篇非常适合入门的教程,特记录一下 注:转载 本文首...
    谢大见阅读 6,413评论 1 25
  • Chrome扩展开发 标签(空格分隔): Chrome扩展 1、写在前面 Chrome插件是一个用Web技术开发...
    记忆的时间差阅读 6,025评论 0 15
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,464评论 25 707
  • 架构 总括:Manifest:程序清单Background:插件运行环境/主程序Pop up:弹出页面Conten...
    程序员小逗逼阅读 10,329评论 2 18
  • 冬天快到了,蚊子绝大部分都在冬眠,绝小部分还在捣蛋,下面我就做一件愚不可及的蠢事。 它飞到我的脸上用她今天的口器,...
    雨中漫步55阅读 745评论 0 0