{"id":920,"date":"2009-09-04T07:40:44","date_gmt":"2009-09-04T14:40:44","guid":{"rendered":"http:\/\/blog.mozilla.org\/addons\/?p=920"},"modified":"2009-09-04T07:40:44","modified_gmt":"2009-09-04T14:40:44","slug":"fennec-%e2%80%93-handling-add-on-options","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/","title":{"rendered":"Fennec \u2013 Handling Add-on Options"},"content":{"rendered":"<p><em>This was originally posted on <a href=\"http:\/\/starkravingfinkle.org\/blog\/\">Mark Finkle&#8217;s blog<\/a>. Mark is a member of the Fennec mobile team.<\/em><\/p>\n<p>The add-on (extension) mechanism built into the Mozilla platform is very powerful. One of the optional features is support for options (preferences) dialogs. As discussed in my <a href=\"http:\/\/starkravingfinkle.org\/blog\/2009\/09\/fennec-prompts-alerts-and-dialogs-oh-my\/\">last post<\/a>, Fennec doesn&#8217;t like dialogs. In addition, Fennec has a simple, clean preference system. While designing the Fennec Add-ons Manager, we discussed how we would support add-on options. We didn&#8217;t want popup dialogs of random and complicated XUL.<\/p>\n<p>After brainstorming a few ideas, we settled on a simple idea. Fennec uses special <code>&lt;setting&gt;<\/code> XUL tags to create it&#8217;s list of preferences. Add-ons would be forced to use the same tags. The options would be merged into the Fennec Add-on Manager, not displayed as a popup dialog. Of course, add-ons can support more than one application, so we needed to make sure that the options XUL for Fennec could coexist with the options XUL for other applications. Let&#8217;s take a look at how this all works:<\/p>\n<p><strong>Install Manifest<\/strong><\/p>\n<p>Add-ons use install.rdf to identify the XUL used for displaying the preferences. This is optional.<br \/>\n<code><br \/>\n&lt;em:optionsURL&gt;chrome:\/\/myaddon\/content\/options.xul&lt;\/em:optionsURL&gt;<br \/>\n<\/code><\/p>\n<p>This is needed for any add-on that wants to use an options dialog.<\/p>\n<p><strong>Chrome Manifest<\/strong><\/p>\n<p>Add-ons use the <a href=\"https:\/\/developer.mozilla.org\/en\/Chrome_Registration\">chrome manifest<\/a> to selectively <a href=\"https:\/\/developer.mozilla.org\/en\/Chrome_Registration#override\">override<\/a> XUL, and other resources, between different applications using the <a href=\"https:\/\/developer.mozilla.org\/en\/Chrome_Registration#application\">application flags<\/a><\/p>\n<p><code>override chrome:\/\/myaddon\/content\/options.xul chrome:\/\/myaddon\/content\/fennec-options.xul application={a23983c0-fd0e-11dc-95ff-0800200c9a66}<\/code><\/p>\n<p>This will tell Mozilla to use <code>fennec-options.xul<\/code> anytime the <code>options.xul<\/code> resource is requested.<\/p>\n<p><strong>Options XUL<\/strong><\/p>\n<p>As I said, the XUL allowed for the Fennec options system is limited to a <a href=\"http:\/\/mxr.mozilla.org\/mobile-browser\/source\/chrome\/content\/preferences\/setting.xml\">few new tags<\/a>. Here is an example of a Fennec options dialog:<\/p>\n<pre><code>\r\n&lt;?xml version=\"1.0\"?&gt;\r\n\r\n&lt;!DOCTYPE mydialog SYSTEM \"chrome:\/\/myextension\/locale\/mydialog.dtd\"&gt;\r\n\r\n&lt;vbox xmlns=\"http:\/\/www.mozilla.org\/keymaster\/gatekeeper\/there.is.only.xul\"&gt;\r\n  &lt;setting pref=\"extensions.myaddon.debugging\" type=\"boolint\" on=\"1\" off=\"2\" \r\ntitle=\"Enable debugging\"\/&gt;\r\n  &lt;setting pref=\"extensions.myaddon.profiling\" type=\"bool\" title=\"Enable profiling\"&gt;\r\n    Profiling can affect the performance of the application\r\n  &lt;\/setting&gt;\r\n\r\n  &lt;setting pref=\"extensions.myaddon.logging\" type=\"bool\" title=\"Save logs\"\/&gt;\r\n  &lt;setting pref=\"extensions.myaddon.logging.path\" type=\"string\" title=\"Log folder\"\/&gt;\r\n  &lt;setting type=\"button\" title=\"Clear logs\"&gt;\r\n    &lt;button label=\"Clear\" oncommand=\"MyAddon.clearLogs();\"\/&gt;\r\n  &lt;\/setting&gt;\r\n&lt;\/vbox&gt;\r\n\r\n<\/code><\/pre>\n<p>Note that we don&#8217;t have any <code>&lt;script&gt;<\/code> support and we are limited to <code>&lt;setting&gt;<\/code> tags. The root <code>&lt;vbox&gt;<\/code> just acts as a container, it isn&#8217;t merged into the main window. Here is how the options look in Fennec:<\/p>\n<p><a href=\"http:\/\/blog.mozilla.org\/addons\/files\/2009\/09\/fennec-addon-options-sample.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/blog.mozilla.org\/addons\/files\/2009\/09\/fennec-addon-options-sample-300x187.png\" alt=\"fennec-addon-options-sample\" title=\"fennec-addon-options-sample\" width=\"300\" height=\"187\" class=\"alignnone size-medium wp-image-922\" srcset=\"https:\/\/blog.mozilla.org\/addons\/files\/2009\/09\/fennec-addon-options-sample-300x187.png 300w, https:\/\/blog.mozilla.org\/addons\/files\/2009\/09\/fennec-addon-options-sample.png 800w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>As always, we appreciate your feedback. I&#8217;m in the process of updating the <a href=\"https:\/\/wiki.mozilla.org\/Mobile\/Fennec\/Extensions\/BestPractices\">Fennec Best Practices<\/a> documents with this information.<\/p>\n<p>A big <strong>thank you<\/strong> goes out to Vivien Nicolas, a Mozilla intern in the Paris office, for turning my <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=512882\">super-great design<\/a> into a reality. Shaver told me there&#8217;d be days like this!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This was originally posted on Mark Finkle&#8217;s blog. Mark is a member of the Fennec mobile team. The add-on (extension) mechanism built into the Mozilla platform is very powerful. One &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/\">Read more<\/a><\/p>\n","protected":false},"author":120,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[44],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Fennec \u2013 Handling Add-on Options - Mozilla Add-ons Community Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-\u2013-handling-add-on-options\/\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/\",\"name\":\"Fennec \u2013 Handling Add-on Options - Mozilla Add-ons Community Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/blog.mozilla.org\/addons\/files\/2009\/09\/fennec-addon-options-sample-300x187.png\",\"datePublished\":\"2009-09-04T14:40:44+00:00\",\"dateModified\":\"2009-09-04T14:40:44+00:00\",\"author\":{\"@id\":\"\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/#primaryimage\",\"url\":\"http:\/\/blog.mozilla.org\/addons\/files\/2009\/09\/fennec-addon-options-sample-300x187.png\",\"contentUrl\":\"http:\/\/blog.mozilla.org\/addons\/files\/2009\/09\/fennec-addon-options-sample-300x187.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.mozilla.org\/addons\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fennec \u2013 Handling Add-on Options\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#website\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/\",\"name\":\"Mozilla Add-ons Community Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.mozilla.org\/addons\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/author\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Fennec \u2013 Handling Add-on Options - Mozilla Add-ons Community Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-\u2013-handling-add-on-options\/","twitter_misc":{"Written by":"","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/","url":"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/","name":"Fennec \u2013 Handling Add-on Options - Mozilla Add-ons Community Blog","isPartOf":{"@id":"https:\/\/blog.mozilla.org\/addons\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/#primaryimage"},"image":{"@id":"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/#primaryimage"},"thumbnailUrl":"http:\/\/blog.mozilla.org\/addons\/files\/2009\/09\/fennec-addon-options-sample-300x187.png","datePublished":"2009-09-04T14:40:44+00:00","dateModified":"2009-09-04T14:40:44+00:00","author":{"@id":""},"breadcrumb":{"@id":"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/#primaryimage","url":"http:\/\/blog.mozilla.org\/addons\/files\/2009\/09\/fennec-addon-options-sample-300x187.png","contentUrl":"http:\/\/blog.mozilla.org\/addons\/files\/2009\/09\/fennec-addon-options-sample-300x187.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.mozilla.org\/addons\/2009\/09\/04\/fennec-%e2%80%93-handling-add-on-options\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.mozilla.org\/addons\/"},{"@type":"ListItem","position":2,"name":"Fennec \u2013 Handling Add-on Options"}]},{"@type":"WebSite","@id":"https:\/\/blog.mozilla.org\/addons\/#website","url":"https:\/\/blog.mozilla.org\/addons\/","name":"Mozilla Add-ons Community Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.mozilla.org\/addons\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"","url":"https:\/\/blog.mozilla.org\/addons\/author\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts\/920"}],"collection":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/users\/120"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/comments?post=920"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts\/920\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/media?parent=920"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/categories?post=920"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/tags?post=920"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}