使用 XUL 实现浏览器扩展,第 1 部分: 使用用户界面特性创建一个 Firefox 浏览器扩展...

Mozilla 项目团队很早就决定标准化 C++ 中的核心开发,但是它需要创建一个组件系统 XPCOM(Cross Platform Component Object Model),用于在不同平台之间共享核心和扩展功能。它还开发了一种为这些组件设计用户界面的方法,其中使用了一种与平台无关的语言,称为 XUL(XML User Interface Language),读作 “zool”。在 XUL 中使用 XML 没有什么特别之处,团队本来要开发一套全新的语法 ,但是认为最好将 XUL 视为一种使用 XML 作为基本语法的编程语言。XUL 利用了一些现有 Web 技术,例如 ECMAcript(其 JavaScript 实现尤为出名)、DOM 和 CSS,因此,Web 开发人员应该可以轻松地掌握。其姊妹语言 XBL (eXtensible Bindings Language)用于控制 XUL 元素的动态行为。XUL 和 XBL 功能非常强大,足以在 Mozilla 组件的基础上开发功能完整的浏览器或者其他完整的跨平台应用程序,但是对于大多数开发人员来讲,XUL 更多地用于扩展或处理现有浏览器或其他用户程序的用户界面(XUL 针对这一用例进行了精心设计)。通常,在开发浏览器扩展时,大多数 Mozilla 浏览器的终极目标就是 Firefox,它是 Mozilla 的一个非常流行的独立浏览器。Firefox 使用 XUL 和 JavaScript 构建。它演示了 XUL 的强大功能,但也支持使用 XUL 构建的扩展。

本文囊括了使用用户界面特性创建大多数扩展所需的基本知识 — XUL、CSS、JavaScript 和 DOM。本文并不是对 XUL 的简介 — 您可以通过 参考资料 中的链接找到此类介绍。本文要求您了解该语言的基本概念并展示如何应用这些内容。您还需要了解 JavaScript、DOM 和 CSS 的基本知识。

XUL 提供了直接的方式

XUL 的优点之一就是,大部分情况下,Mozilla 浏览器处理它的方式与任何其他 Web 内容并无二致。这意味着,您可以在开发阶段快速进行测试和部署,然后考虑将开发成果正确打包为应用程序或完整的扩展。一些有用的工具可用于这类快速开发 — Ted Mielczarek 的 Extension Developer's Extension(参见 参考资料), 其中包括很多有用的工具,例如允许在线编辑和预览 XUL 的 Live XUL Editor 。他还在其 Web 站点中提供了一个非常简单的 XUL 页面来执行相同的功能(但不包括应用于通过 Web 加载的 XUL 的安全限制)。大部分情况下,我倾向于对 XUL 开发周期使用更为直接的方式:使用一个良好的文本编辑器进行编辑,并且编辑器最好能够提供可以简化 XML 编写的功能,然后将 XUL 文件直接加载到 Firefox 选项卡中即可。再次进行编辑,做出调整或修补,然后为文件重新加载页面。清单 1(stats.xul)是一个简单的 XUL 示例,演示了这种语言的一些功能。该示例允许您输入一个 URL 并在一个面板中查看结果 Web 页面,而在另一个面板查看页面的统计信息。


清单 1 (stats.xul). 简单的 XUL 示例
                <?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
id="statswindow" title="View Web page stats">
<vbox flex="1">
<hbox id="toppanel">
<label value="Enter a URL:"/>
<textbox id="url" flex="1" value="http://www.ibm.com/developerworks/web"/>
<button label="Go!"/>
</hbox>
<description value="Current page:"/>
<hbox flex="1">
<iframe id="contentview" src="http://www.ibm.com/developerworks/web" flex="2"/>
<vbox>
<groupbox>
<caption label="Stats"/>
<grid flex="1">
<columns>
<column flex="1"/>
<column flex="1"/>
</columns>
<rows>
<row>
<label value="Word count"/>
<textbox class="count" id="wordcount" value="N/A" readonly="true"/>
</row>
<row>
<label value="Character count"/>
<textbox class="count" id="charcount" value="N/A" readonly="true"/>
</row>
<row>
<label value="Element count"/>
<textbox class="count" id="elemcount" value="N/A" readonly="true"/>
</row>
</rows>
</grid>
</groupbox>
<spacer flex="1"/>
</vbox>
</hbox>
</vbox>
</window>


chrome://global/skin/ 样式表声明使浏览器可以使用 chrome 包中的默认 global.css ,它提供了内置的 Firefox 感观,如果您安装了皮肤,则提供一些稍有不同的外观。该窗口使用一组嵌套的框来组织内容,但是我尽量避免对外观使用过多无用的内容(我将在下一节中进行介绍),而一直对 UI 元素进行逻辑分组。iframe 元素类似于 HTML 中的同名元素,它将创建呈现相关 Web 页面的内容框架,默认为 http://www.ibm.com/developerworks/weburl textbox 的值与此相同。这些值互相匹配才能使默认视图对用户有意义,而目前它们之间还没有联系(我将在下一节实现)。groupbox 可以方便地组织状态条目,每个条目都是只读的文本框,目前的默认值是一个虚拟值。清单 1 的结果是一个简单的静态窗口,由于使用了 iframe,因此仍然提供了非常不错的结果。将其保存到文件 “stats.xul” 中并加载到任何 Mozilla 浏览器窗口。可以使用 “file:” URL 或者是 Firefox 上的 “Open File” 按钮。得到的显示结果应如图 1 所示。


图 1. 在 Firefox 浏览器窗口中加载清单 1
在 Firefox 浏览器中查看清单 1

添加外观样式

您 可以在 XUL 中改变 UI 元素的位置,但是大多数情况下,窗口外观的具体细节最好交于样式表处理。与对 HTML 或其他 XML 应用 CSS 一样,对 XUL 应用 CSS 允许您控制常见的属性 — 颜色、字体、空间和大小。清单 2(stats.css)显示了一些声明,用于调整清单 1 中的外观。


清单 2(stats.css). 对清单 1 应用 CSS
                window {
font-family: arial, "lucida console", sans-serif;
}

description {
padding: 5px;
color: blue;
}

#toppanel {
padding: 5px;
}

#contentview {
padding: 5px;
border: thin solid black;
}

.count {
width: 5em;
}


可以看到,样式表规则使用 ID、类和元素选择器匹配清单 1 的各部分内容。通过在 XUL 文件的顶部添加额外的声明便可应用这种样式表,如清单 3 所示,其中仅显示了文件进行更新(添加新的 CSS 声明)后的前四行内容。


清单 3. 使用新添的样式表声明更新清单 1 中前面几行内容
                <?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="stats.css" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"


注意,我并没有删除对 chrome://global/skin/ 的声明。您几乎总是需要这样做,并且浏览器将把全局的皮肤与更为具体的样式表结合起来。图 2 显示将一个使用样式表更新过的 XUL 窗口加载到 Firefox 中。


图 2. Firefox 浏览器显示使用 CSS 的 XUL 窗口
Firefox 浏览器显示使用 CSS 的 XUL 窗口




回页首


通过脚本驱动应用程序工作

开发这个示例 XUL 应用程序的最后一步是使控件可以工作。可以通过将控件与行为相绑定来实现。XUL 具有一种姊妹语言 XBL,它允许您通过声明执行大部分绑定,从而减少所需的脚本数量。但是本文将使用引用 JavaScript 函数的事件属性来实现绑定。


清单 4(stats-styled-scripted.xul). 使用 CSS 和脚本声明以及脚本 hook 属性更新后的清单 1
                <?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="stats.css" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
id="statswindow" title="View Web page stats">
<script type="application/x-javascript" src="stats.js"/>
<vbox flex="1">
<hbox>
<label value="Enter a URL:"/>
<textbox id="url" flex="1" value="http://www.ibm.com/developerworks/web"/>
<button label="Go!" oncommand="change_url(event)"/>
</hbox>
<description value="Current page:"/>
<hbox flex="1">
<iframe id="contentview" src="http://www.ibm.com/developerworks/web" flex="2"/>
<vbox>
<groupbox>
<caption label="Stats"/>
<grid flex="1">
<columns>
<column flex="1"/>
<column flex="1"/>
</columns>
<rows>
<row>
<label value="Word count"/>
<textbox class="count" id="wordcount" value="N/A" readonly="true"/>
</row>
<row>
<label value="Character count"/>
<textbox class="count" id="charcount" value="N/A" readonly="true"/>
</row>
<row>
<label value="Element count"/>
<textbox class="count" id="elemcount" value="N/A" readonly="true"/>
</row>
</rows>
</grid>
</groupbox>
<spacer flex="1"/>
</vbox>
</hbox>
</vbox>
</window>

注意 window 内新增的 script 元素,以及对 “Go!” 按钮添加的属性 — oncommand="change_url(event)"。清单 5 显示的是所引用的 JavaScript 文件 “stats.js”。


清单 5(stats.js). 处理 “Go!” 按钮的 JavaScript 代码
                //Invoked in response to a click on the "Go!" button
function change_url(event)
{
//Variables for convenient access to specific elements in the XUL
var urlbox = document.getElementById("url");
var contentview = document.getElementById("contentview");
var wordcountbox = document.getElementById("wordcount");
var charcountbox = document.getElementById("charcount");
var elemcountbox = document.getElementById("elemcount");

//Setting this attribute, happens to change the visible contents of the panel
contentview.setAttribute("src", urlbox.value);

//Fake up the update code for now, to allow running in Firefox
wordcountbox.previousSibling.value += " (fake)";
wordcountbox.value = "1000";
charcountbox.previousSibling.value += " (fake)";
charcountbox.value = "100";
elemcountbox.previousSibling.value += " (fake)";
elemcountbox.value = "10";
}


清单 4 将 change_url 函数绑定到对 “Go!” 按钮的单击事件中。该函数将接收关于单击的事件信息,不过本例中并没有使用到。全局对象 document 允许您使用 DOM 访问各种 XUL 元素,本例中使用的是 getElementById,可根据惟一 ID 查找元素。XUL 元素当然具备 XML 属性,但是也提供了对象特性,并且某些时候即使这些属性和特性具有类似的名称,但进行查询和处理时却行为各异。例如,我使用代码 urlbox.value 获得 URL 文本框中的文本,而不是使用代码 urlbox.getAttribute("value")。后者通常用于读取文本框的初始内容(“http://www.ibm.com/developerworks/web”),而不管用户登录页面后输入什么内容。类似地,如果希望通过代码更新此类文本框中的可见内容,您应该使用 urlbox.value = newvalue 而不是 urlbox.setAttribute("value", newvalue)。在可以更新函数下方的 count 文本框的代码中,您可以看到这些规则的应用。XUL 参考文档中涵盖了所有这些详细内容,因此请仔细阅读有关所使用的 XUL 元素的内容。

安全性

有关属性和特性的注意事项也适用于 contentview.setAttribute("src", urlbox.value); 行。转到新 URL 的更为正确的方法是:contentview.contentDocument.location.href = urlbox.value;。但是这里存在一个问题。Firefox 对 XUL 文档提供的严格的安全模型意味着,如果您试图访问一些敏感的对象属性,包括 contentview.contentDocument,JavaScript 将抛出一个异常。您需要使用 Error Console 窗口查看错误信息,这些错误可能含混不清并且没有具体说明,例如 “Error: uncaught exception: Permission denied to create wrapper for object of class UnnamedClass”。这是直接使用 XUL 的主要问题。在下一篇文章中,我将展示如何将本文中的粗糙内容调整为一个合适的 Firefox 扩展,它将通过实现正确的 chrome 注册绕过安全限制。目前,代码修改了未受限制的 contentview(可以提供可见结果)的 src 属性,并对 count 文本框进行一些虚构的更改,以向您显示 XUL 脚本的基本设置。

转载于:https://www.cnblogs.com/ice5/archive/2009/01/16/1377004.html

07 Zabbix 微信告警 Zabbix 微信告警 1.注册企业微信 企业微信注册地址:https://work.weixin.qq.com 2.进入企业微信后台管理 2.1 添加微信成员 2.2创建应用 2.3 获取四项数据 (1)AgentID (2) Secret (3) 企业ID (4)部门ID 3.Zabbix Server配置 3.1确认脚本目录 # grep alertscripts /etc/zabbix/zabbix_server.... 阅读详情

相关推荐

Firefox扩展开发实战:XPI插件设计与实现

Firefox扩展开发的历史演进中,文件曾是连接扩展资源、声明权限和实现深度浏览器集成的核心枢纽。它不仅承担了路径注册、界面绑定、国际化支持等关键职责,还通过一套灵活的指令系统实现了对底层特权接口的访问控制。尽管现代WebExtensions架构已逐步淘汰该文件,但在维护遗留插件或深入理解Firefox扩展运行机制时,掌握的语义结构与执行逻辑仍具有不可替代的价值。是一个纯文本配置文件,位于扩展根目录下,采用行式指令语法,每行代表一条资源映射或权限声明。

weixin_42298778的博客 638

PostgreSQL中的Permission denied问题解决

想开始学习SQL和Excel那本书,觉得自己亲手去输入才是正道。发现程序后续会用到窗口函数,可是我的mysql没有窗口函数,这本书所提供的数据的导入方式比较特别,分别是MS SQL Sever和PostreSQL。上午我先安装的sql sever,可是由于比较大且在安装时出现了一些小的问题(安装缓慢,服务启动不了)。无奈选择了PostreSQL,体积小,安装顺利。导入数据比较特别,先建一个表,然后...

dufemt的博客 6万+

《组态王及 WINCC 曲线批量弹窗公共窗口操作手册》

《组态王与经典 WINCC 曲线批量弹窗公共窗口指南》是一本极具专业性和实用性的技术手册。它为用户在处理组态王与经典 WINCC 曲线批量弹窗以及公共窗口相关问题时,提供了全面而深入的指导。这本指南犹如一位知识渊博的专家,深入剖析了曲线批量弹窗和公共窗口的工作原理与实现方法。通过清晰的文字描述和直观的图表展示,用户能够轻松理解其中的复杂概念和操作流程。无论是工程师在进行系统设计与调试,还是操作人员在日常使用中遇到问题,都能从这本指南中找到有效的解决方案。它涵盖了从基础设置到高级应用的各个方面,满足不同用户的需求。手册还注重实际应用中的细节和注意事项,帮助用户避免可能出现的错误和问题。同时,它提供了丰富的案例分析,让用户能够更好地理解和掌握相关技术,提高工作效率和系统稳定性。总之,《组态王与经典 WINCC 曲线批量弹窗公共窗口指南》是一本不可或缺的技术宝典,为用户在组态王与经典 WINCC 的应用中提供了有力的支持。

Windows下创建XUL应用程序

一、基本概念 XUL一个Mozilla使用XML来描述用户界面的一种技术,使用XUL你可以快速的创建出跨平台,基于因特网的应用程序。 XULRunner是一个由Mozilla基金会开发运行时环境,用来为XUL和XPCOM应用程序提供统一的后端运行环境。所有基于XUL的应用程序都是运行在XULRunner之上的,比如我们比较常用的Firefox和Thunderbird。 ...

weixin_34195546的博客 266

XUL Explorer 使用教程

https://developer.mozilla.org/en/XUL_Explorer    XULExplorer是一个轻量级的XUL集成开发环境,建成一个XULRunner应用,提供一个简单的方式进行试验XUL。这是一个简单的编辑器,可以预览内置的XUL或在一个单独的弹出窗口。它有一个清单,代码段(小片段XULJavaScript ),可以迅速地插入到编辑

微创社(MCC) 1355

使用 XUL 实现浏览器扩展,第 1 部分使用用户界面特性创建一个 Firefox 浏览器扩展

创建超越 Web 浏览器内置功能的扩展。Mozilla 项目的 XUL 引擎是一种用户界面语言,可以用于扩展 Mozilla 浏览器或者创建独立的应用程序。XUL 可以极其轻松地构建跨平台浏览器扩展,本系列的两篇文章将演示如何实现这一过程。 Mozilla 项目团队很早就决定标准化 C++ 中的核心开发,但是它需要创建一个组件系统 XPCOM(Cross Platform Component

IBM技术期刊 799

firefox附加组件开发者指南(五)——创建一个firefox扩展(下)

开发实用的扩展一个会话管理扩展 这一节,我们将会创建一个实用新特性扩展:会话存储API。这可以让用户在任何时刻保存和恢复会话快照(浏览器窗口状态)。 第一阶段:测试安装 图12展示了会话管理扩展的接口。在工具菜单下,会话存储子菜单包含两个项——保存会话和清理会话,在它们之间是一个刚才保存可以恢复的会话清单,最近的在最前面。 图12:菜单中的会话管理扩展接口 如”会话存储API

JumuFENG's blog 7880

firefox附加组件开发者指南(三)——XUL简介(上)

这一章内容较多,故分三篇:XUL简介、XUL中可用的窗体部件、其他XUL功能。 在学习如何开发扩展之前,我们来了解XUL,基于XML的用户接口语言,XUL扩展的基本组成之一。 概述 XUL概览 XUL是一种基于XML的语言,是为mozilla浏览器的GUI标记语言而开发的。结合HTML和脚本语言去开发用户界面的早期实验经历了很长一个过程,可以认为XUL是这个过程的演化结果。用在win

JumuFENG's blog 3412

Firefox附加组件开发者指南(一)——扩展简介

https://developer.mozilla.org/En/Firefox_addons_developer_guide Chapter1: Introduction to extensions Chapter2: Technologies used in developing extensions Chapter3: Introduction to XUL—How to build

JumuFENG's blog 5939

XML用户界面语言(XUL)开发入门(2)

XPCOM和XBL 如果已经熟悉了XUL,但可能又忘记了XUL的两个重要功能:XPCOM 和 XBL。别担心,现在将介绍这些技术,而且本教程稍后还显示它的功能。您将会看到如何使用这些技术来增强所开发的应用程序的功能。首先介绍 XPCOM。 XPCOM(即跨平台组件模块)与 CORBA 和 Microsoft COM 类似。XPCOM 允许用一个 IDL 模块(就像 Java™ 或者 C# 代码

fox_lht的专栏 1388

firefox中XPCOM组建开发,不可或缺的参考资料

使用 XUL 实现浏览器扩展,第 1 部分: 使用用户界面特性创建一个 Firefox 浏览器扩展 http://tech.ddvip.com/2008-10/122325604573906_6.html Firefox Add-on - XPCOM初探 http://www.shangducms.com/post/Firefox-Extension-XPCOM.aspx

160

firefox附加组件开发者指南(二)——开发扩展过程中使用的技术

在深入阐述之前,我们快速的介绍一下用来开发firefox扩展的技术。还有为开发firefox必须了解的一些知识。 开发firefox扩展用到的技术 Firefox及其扩展都是基于当前网络开发广泛使用的技术。其结构与使用在网页中的动态HTML和windows中使用的HTML应用程序是相似的。如果你有开发动态HTML的经验,你就会发现学习开发firefox扩展的技术会相对的轻松。 各种技

JumuFENG's blog 2351

XML用户界面语言(XUL)开发入门-1

本文配套源码 开始之前 本教程适用于对桌面开发感兴趣又不想学习太多新技术的有经验的Web开发人员。XUL(发音与cool类似)使运用Web开发技能构建桌面应用程序变得很容易。它提供了丰富的UI部件集,这些工具使用的是所有Web开发人员都很熟悉的语法。使用XUL,可以直接与HTML混合使用并可大量使用JavaScriptXUL是一种基于XML的语言,因此需要对XML(特别是XML名称空间)

fox_lht的专栏 1457

three js 9 补间动画tween

如果使用了yoyo的动画,且没有加delay,会有如下问题。AI给的解释为这是已知的bug。1 加上一个极短的delay。2 改用两个动画相互调用。

吴梓穆的博客 32

AI 范式越迁:使用 XXL-BOOT SKILL 实现一句话直生业务

使用 XXL-BOOT SKILL 实现一句话直生业务,AI 自动完成需求澄清、数据建模、后端与前端开发、菜单权限配置及联调验证,AI 范式及业务交付进入新时代。

许雪里 345

基于Python的爱奇艺视频数据可视化分析系统

长视频平台剧集、评分、热度与评论数据体量大、维度多,手工汇总难以快速把握类型结构、口碑分布与主演导演影响力。系统采用 B/S 架构,后端入口为app.py,运行端口8060;数据库使用 MySQL(库名iqiyi),经 PyMySQL 访问。前台基于 Bootstrap 5、本地中的 ECharts 5 与 echarts-wordcloud,配合主题。业务表包括usersdramascommentsfavorites。数据可通过导入,或经/ 相关脚本补充样本。分析层在。

qq_35928134的博客 243

hls.js 错误日志深度分析,前端 HLS 播放器问题定位实战

读懂 hls.js 输出的错误日志,是 Web HLS 播放器开发的必备能力。很多播放故障并不是前端播放器代码 bug,而是流媒体源、CDN、鉴权、分片损坏导致。借助网页调试工具做对照复现,结合 type、details、fatal 字段,能够快速划分故障责任边界,避免盲目修改前端代码做无效调试,大幅提升 HLS 业务问题排查效率。

2608_96729545的博客 329

线上Web异常发现为什么总是滞后?一套自研Web实时异常分析监控系统整体架构拆解

<think>我们根据要求,需要生成≤150字的文章摘要。文章内容是关于Web端实时异常分析监控系统设计,包括痛点、架构、能力等。摘要需要概括核心内容。注意字数限制。</think>本文围绕Web端实时异常分析监控系统,剖析线上异常排查滞后、复现难、数据割裂等痛点,对比现有方案局限,提出自研分层架构:客户端SDK采集、IndexedDB缓存、双通道上报,后端分析、告警与闭环。系统支持多维度分析、自定义告警、问题追踪,并明确适用边界。

weixin_42268042的博客 224

进阶实战-CloudStudio云IDE远程开发/云原生开发实战(一)

CSDN 发布信息(发布时填写,不显示):- 标题:云原生开发实战(一)| 完整远程开发闭环:本地同步 → 云端编码 → 一键部署云函数- 分类:云计算- 标签:CloudStudio、云函数、腾讯云、Serverless、云原生、远程开发、CodeBuddy。

2501_93047244的博客 307

单智能体主流范式全梳理

你是 ReAct(推理+行动)智能体,必须严格按以下格式输出每一轮:Thought: 你的推理和思考过程Action: <<TOOL>>{"name":"工具名","params":{...}}<<TOOL_END>>规则:1. 每轮必须以 Thought: 开头,说明当前需要做什么、为什么这样做2. 如果需要调用工具,紧接着输出 Action: 后面紧跟 <<TOOL>>JSON<<TOOL_END>>3. 如果不需要再调用工具,以 Final Answer: 开头输出最终旅行方案。

2303_79635409的博客 302

最新大数据毕业设计选题推荐-基于大数据的电动汽车故障数据分析与可视化-大数据-Spark-Hadoop-Bigdata

<think>我们只需要根据用户提供的文章内容生成≤150字的摘要。文章主要介绍了一个基于大数据的电动汽车故障数据分析与可视化系统,包括技术栈、功能、背景、意义等。摘要应简洁概括核心内容。注意控制字数。</think>基于Hadoop与Spark的电动汽车故障数据分析可视化系统,融合Spring Boot、Vue、ECharts及MySQL,实现电池数据管理、故障概览与画像分析,以可视化看板呈现健康状态与风险趋势,为故障研判提供数据支撑,并具备技术迁移价值。

IT研究室的博客 299
上一篇: 今天复习面向对象的接口属性,猛地一看,发现一个不懂的地方。进来讨论讨论把?...
下一篇: c#冒泡排序
lceBear
博客等级 码龄11年 138粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值