`
ahuango
  • 浏览: 56807 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Firefox 截图插件开发

 
阅读更多
在浏览网页的时候,看到好的内容都想保存下来,但是有些网页是禁止拷贝的,当然我们可以hack它以达到copy的目的,更快捷的方式则是截屏。于是想到了在Firefox下做一个截图软件,部分参考了screengrab这个插件。

这个插件用于我们一个网页兼容性测试结果比较和在GILD上存题使用,替GILD打个广告,技术人员可以在上面参与答题竞赛,可以拿到一些奖品的,如ipad、ipod等。

言归正传,开始插件开发

1. 老生长谈之插件目录结构

xxxcapture
   |
   | ---- chrome
             |--content
                    | -- overlay.xul
                    | -- options.xul
                    | -- gild.js
   | -- defaults
             | -- preferences
                    | -- pref.js
   | -- chrome.manifest
   | -- install.rdf     

install.rdf
这个是安装描述文件,
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
    <Description about="urn:mozilla:install-manifest">
        <em:id>dev@gild.com</em:id>
        <em:version>1.0</em:version> 
        <em:type>2</em:type>
       
        <em:targetApplication>
            <Description>
                <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
                <em:minVersion>1.5</em:minVersion>
                <em:maxVersion>3.6.*</em:maxVersion>
            </Description>
        </em:targetApplication>
       
        <em:name>Gild Capture</em:name>
        <em:description>Gild Certification Screen capture</em:description>
        <em:creator>Jay</em:creator>
        <em:homepageURL>http://www.example.com/</em:homepageURL>
    </Description>            
</RDF>

这里主要的是<em:minVersion>和<em:maxVersion>表示所支持的Gecko的版本范围

  
chrome.manifest
这个文件里的内容主要包括了两个作用,
  • 定义文件的相对路径
  • 定义一些界面文件的位置

如:
content GildCapture chrome/content/
overlay chrome://browser/content/browser.xul chrome://GildCapture/content/overlay.xul

剩下的就是实现方面的了,主要是overlay.xul和gild.js

2. 定义插件菜单

界面重写部分在overlay.xul文件中,我们在status bar上定义一个弹出菜单

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://dev.webtest/content/overlay.css" type="text/css"?>

<overlay id="dev@gild.com" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">


<!-- Init Javascript
====================================================================== -->
<script src="gild.js"/>


<!-- Status Bar
======================================================================
- for more dynamic status bar, ref: adblockplus/overlay.xul
====================================================================== -->
<statusbar id="status-bar">

<statusbarpanel id="gild-status"
tooltiptext="Gild Capture"
insertafter="page-report-button,security-button"
context="gild-status-popup">
<image id="gild-status-img" src="chrome://GildCapture/content/paolo.png" style="width:16px;height:16px;cursor:pointer;"/>
</statusbarpanel>

</statusbar>


<!-- Popups -->
<popupset id="mainPopupSet">
<popup id="gild-status-popup" position="after_start">
<menuitem id="gild-menuitem-start" label="Begin" accesskey="b" oncommand="this.myCommand(event)"/>
<menuitem id="gild-menuitem-stop" label="End" accesskey="e" oncommand="this.myCommand(event)" />
<menuitem id="gild-menuitem-options" label="Options..." accesskey="o" oncommand="this.myCommand(event)"/>
<menuitem id="gild-menuitem-result" label="Show result" oncommand="this.myCommand(event)" />
</popup>
</popupset>

</overlay>




3.实现截图

截图部分有三个主要部分选取窗口区域,捕获图片和输出到文件。

选取窗口区域
此插件是截取整个document的内容所以会考虑到有滚动条的情况,并且考虑到有些document是按照quirks mode渲染的,此时其宽度和高度将从根元素上获得
getVisibleRegion:function() {
		var win = window.top.getBrowser().selectedBrowser.contentWindow;
		var htmlWin = win.content.window;
		var htmlDoc = win.document;
		var r = {};
		r.x = htmlWin.scrollX;
		r.y = htmlWin.scrollY;

		if(htmlDoc.compatMode == "CSS1Compat") {
			//standard mode
			r.width = htmlDoc.documentElement.clientWidth;
			r.height = htmlDoc.documentElement.clientHeight;
		} else {
			r.width = htmlDoc.body.clientWidth;
			r.height = htmlDoc.body.clientHeight;
		}
	
		return r;
	}


捕获图片

图片的获取是通过canvas这个元素,FF 从1.5就已经支持它了,虽然在HTML5中才公开支持。

var r = this.getScrollRegion();
		var canvas = document.createElementNS("http://www.w3.org/1999/xhtml", "html:canvas");
		canvas.width = r.width;
		canvas.height = r.height;
		canvas.style.width = canvas.style.maxwidth = r.width + 'px';
		canvas.style.height = canvas.style.maxheight = r.height + 'px';

		var context = canvas.getContext("2d");
		context.clearRect(r.x,r.y,r.width,r.height);
		context.save();

		context.drawWindow(window._content,r.x,r.y,r.width,r.height,"rgb(255,255,255)");

保存图片到文件
保存图片则是通过文件的一些I/O Api和nsWebBrowserPersist输出到文件,
var dir = this.getSaveFolder();
		dir.append(this.serial++ + ".jpg");
		dir.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE,0666);

		var f = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
		f.initWithPath(dir.path);
		
		var io = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
		var source = io.newURI(canvas.toDataURL("image/jpeg","quality=60"),"UTF8",null);
		var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Components.interfaces.nsIWebBrowserPersist);
		persist.persistFlags = Components.interfaces.nsIWebBrowserPersist.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
		persist.persistFlags |= Components.interfaces.nsIWebBrowserPersist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
		persist.saveURI(source,null,null,null,null,f);

分享到:
评论
1 楼 sonichy 2015-04-07  
我最近正在研究firefox截图,你的现在已经不兼容37,而且代码太复杂,还能精简么?

相关推荐

    firefox插件开发,firefox plugin 开发 firefox 扩展 开发

    火狐浏览器(Firefox)插件开发涉及一系列技术与步骤,主要目标是创建增强或定制浏览器功能的软件组件。以下是对标题和描述中提及知识点的详细解释: 1. **开发环境搭建**: - 使用`-no-remote -P develop`参数...

    firefox插件开发文档

    Firefox 插件开发是Web开发领域的一个重要分支,它允许开发者为Mozilla Firefox浏览器创建自定义功能,以增强用户的浏览体验。Firefox插件通常被称为“扩展”或“附加组件”,它们可以实现从简单的小工具到复杂的...

    Firefox(火狐)浏览器 插件开发 DEMO VC6

    标题中的“Firefox(火狐)浏览器 插件开发 DEMO VC6”指的是使用Visual C++ 6.0(简称VC6)开发Firefox浏览器插件的一个示例项目。这个项目可能是为了帮助开发者理解如何在Firefox中创建自定义功能,增强浏览器的使用...

    firefox插件开发教程

    ### 知识点一:Firefox 插件开发环境设置 在深入进行 Firefox 插件开发之前,设置一个适合开发的计算机环境是至关重要的。由于 Firefox 扩展具有平台独立性,开发者可以在自己最熟悉的操作系统上(如 Windows、Mac ...

    firefox插件开发

    Firefox插件开发是一个涵盖多个技术领域的话题,主要涉及如何为Mozilla Firefox浏览器创建和定制功能增强的扩展。在本文中,我们将深入探讨Firefox插件开发的关键概念、工具和步骤,以便帮助开发者构建自己的Firefox...

    firefox翻译插件

    标题 "Firefox翻译插件" 指的是在Mozilla Firefox浏览器中使用的扩展程序,这些插件旨在帮助用户方便地翻译网页内容。...而这些插件的开发涉及到Firefox扩展机制、Web API的使用以及与翻译服务的接口集成等技术。

    Firefox NPAPI插件开发实例

    《Firefox NPAPI插件开发实例》 NPAPI(Netscape Plugin Application Programming Interface)是一种用于在Web浏览器中实现跨平台的插件技术,它允许浏览器加载外部代码来增强功能,如播放多媒体、运行Java applet...

    我的Firefox插件开发之旅——从零开始

    知识点一:Firefox插件开发入门 作者在本篇文章中介绍了他的Firefox插件开发之旅,这是他首次尝试开发Firefox扩展,之前在IE浏览器中使用ActiveX技术实现了类似功能。作者开始时对于Firefox插件开发一无所知,因此在...

    火狐工具 web插件

    火狐工具Web插件是Firefox浏览器中用于增强和定制浏览体验的一种重要资源。这些插件是由开发者创建的,可以提供各种功能,从提高生产力到增强安全性,甚至改变浏览器的整个界面。以下是一些关于火狐工具Web插件的...

    Firefox Debug插件 免安装

    标题中的“Firefox Debug插件免安装”指的是Firefox浏览器的一个调试工具,它允许开发者在无需正式安装的情况下使用。这种工具对于Web开发人员来说尤其有用,因为它简化了插件的测试和调试过程,使得开发者可以快速...

    firefox 插件开发sdk

    Firefox插件开发SDK,全称为Firefox Add-on SDK,是一个用于创建Firefox浏览器扩展的强大工具集。这个SDK基于JavaScript和C++,使得开发者可以使用高级语言来编写插件,同时也能利用C++进行性能关键部分的优化。在...

    FireFox支持OCX插件

    标题中的“Firefox支持OCX插件”意味着Mozilla Firefox这款开源网络浏览器可以运行OCX(ActiveX Control)组件,这是微软Windows平台下的一种交互式对象技术。通常,OCX插件用于增强网页的功能,如播放媒体、执行...

    Firefox 插件开发指南

    ### Firefox 插件开发指南知识点概述 #### 一、开发概览 本教程专为希望为 Mozilla Firefox 浏览器开发全面扩展功能的个人而设计。教程构建为一个循序渐进的指导过程,提供了丰富的示例、解释及外部参考资料,帮助...

    Firefox插件开发Demo

    Firefox插件Demo #include "npapi.h" #include "npruntime.h" typedef int int16; class CPlugin { private: NPP m_pNPInstance; #ifdef XP_WIN HWND m_hWnd; #endif NPWindow * m_Window; NPStream *...

    Firefox 火狐 插件大全

    在这个压缩包中,我们看到的文件名称列表可能代表了一些与火狐插件相关的组件或库: 1. NPSWF32.dll:这是一个与Adobe Flash Player相关的文件,因为火狐浏览器曾经广泛使用Flash插件来播放视频和动画。不过,随着...

    火狐ActiveX插件安装

    不同操作系统下,火狐插件目录的位置可能有所不同。通常位于`C:\Program Files\Mozilla Firefox\plugins`(Windows)或`/Applications/Firefox/Plugins`(macOS)。 - **注意事项**:确保解压路径正确无误,避免出现...

Global site tag (gtag.js) - Google Analytics