SlideShare a Scribd company logo
Workshop: Taichung

Hsiao-Ting Yu “Littlebtc”
MozTW member / Jetpack Ambassador
Mozilla
What is Mozilla?



• Non-profit organization
• Support for better Internet: an open web
 • Open Source Software
 • Open Web Standard
• Major Products: Firefox & Thunderbird
Mozilla Labs?

• “Labs” in Mozilla
• Crazy ideas
• Explore future of the web
Jetpack Ambassadors
MozTW?



  •   Mozilla communities in Taiwan


  •   Group for Mozilla “fans”


  •   Localize Mozilla products


  •   Promote Mozilla product & web
      standard


  •   Our mascot: Foxmosa
Jetpack Introduction
Your Firefox, customized
Old-type Mozilla Extension

• XUL: user interface
• JavaScript: code
• CSS: styling
• XBL: binding
• XPCOM: core

• ... So much hard things :(
Faster, faster and faster
What is Jetpack?



   •   Simple-to-use API to develop
       new-type extensions


   •   HTML, CSS and JavaScript


   •   JavaScript libraries available


   •   Fast to develop, test and deploy


   •   Extensible API
                                          Photo by www.rocketman.org, CC-BY-2.5
                                          http://en.wikipedia.org/wiki/File:Rose-4.jpg
Jetpack: Now and Future

• Old: Jetpack Prototype 0.8 (standalone extension)
 • Experimental Prototype
 • Jetpack as single JavaScript file
• Very Near Future: Jetpack SDK (Jetpack Reboot)
 • Distributed as a development kit
 • Jetpack as XPI extension bundle
 • Future version of Firefox will have Jetpack API
    supported included
Jetpack Prototype 0.8
Guides
Jetpack Prototype extension
https://addons.mozilla.org/zh-TW/firefox/addon/12025
Firebug
https://addons.mozilla.org/zh-TW/firefox/addon/1843
Go about:jetpack
Try it out!
Prepare a testing
extension
Procedure

• Prepare a .js file and a .htm file in the same folder
• in .htm file, add the following data:
  <html>
  <head>
    <title>Jetpack Workshop Example</title>
    <link rel="jetpack" href="example.js">
  </head>
  <body>
  </body>
  </html>


• in the .js file: add oneworld!');
  console.log('Hello
                           line


• Open the .htm file to "Install" the Jetpack
Refresh?
Refresh: the dirty way




• For local files only(?)
• Go to or refresh the about:jetpack page
Jetpack 0.8 APIs:
UI Related
Everyone needs a “Hello World”

• Log: Use Error Console (preferred) or Firebug Console
• Go “Develop” Tab
• Type
  • console.log("Hello   World!");
Notifications



• Simple Type
  jetpack.notifications.show("Hello World!");


• Complex Type
  jetpack.notifications.show( {
    title: "Hi Jetpack!",
    body: "         ",
    icon: "https://jetpack.mozillalabs.com/images/jetpack.png"

  } );
Menu (I)

• Import from future:
  jetpack.future.import("menu");


• Create new menu to a dummy menu object
  (does nothing)
  jetpack.menu.add("Aloha!");


• Create new menu to tools
  jetpack.menu.tools.add("Aloha!");
Menu (II)
•   What menu?

    •   jetpack.menu.file

    •   jetpack.menu.edit

    •   jetpack.menu.view

    •   jetpack.menu.history

    •   jetpack.menu.bookmarks

    •   jetpack.menu.tools

•   Context Menu: Somehow complex

    •   jetpack.menu.context.browser for browser UI

    •   jetpack.menu.context.page for page
Menu (III)
•   Object-type to allow more options

•   How about command? => command

•   Submenu? => menu

•   Details: https://developer.mozilla.org/en/Jetpack/UI/Menu


 jetpack.future.import("menu");
 jetpack.menu.context.page.add({
   label: "Ice Cream",
   icon: "https://jetpack.mozillalabs.com/images/
 jetpack.png",
   menu: new jetpack.Menu(["Vanilla", "Chocolate",
 "Pistachio", null, "None"]),
   command: function (menuitem)
 { jetpack.notifications.show(menuitem.label) }
 });
Slidebar (I)

• It is not the sidebar! :D
• Import from future:
  jetpack.future.import("slideBar");


• Append the slidebar with HTML content:
  jetpack.slideBar.append(
  {
    icon: "https://jetpack.mozillalabs.com/images/jetpack.png",
    html: "<html><body>Hello!</body></html>"
  });



• Or a given URL:
  jetpack.slideBar.append(
  {
    icon: "https://jetpack.mozillalabs.com/images/jetpack.png",
    url: "http://moztw.org"

  });
Slidebar (II)


• Events:
 • onReady: when feature("slidebar page") is loaded
 • onClick: when its icon is clicked
 • onSelect: when featured is selected
• Options:
 • autoReload: reload every time selected
Slidebar (III): Tips


• onReady, onSelect:
 • Will have a slider object as a parameter
 • You can use slider.contentDocument to access
    the document

  • Jetpack 0.8 is jQuery enabled, so:
    function ready(slider) {
      var _doc = slider.contentDocument;
      $("body", _doc).html("..."); // Have fun!
    }
    jetpack.slider.append( {... , 'onReady': ready})
Slidebar (IV): Tips again

• You can use E4X hack to write HTML code:
  var html = <>
  <html>
  <head>
    <style type="text/css">
    <![CDATA[
    ...
    ]]>
    </style>
    <base target="_blank" /> <!-- Dirty Hack, very dirty -->
  </head>
  <body>
  ...
  </body></html></>.toXMLString();
  jetpack.slideBar.append({html: html});


• Another dirty hack: set target to _blank to make
  links to open in the new tab, instead of in the
  slidebar content
Toolbar
•   https://wiki.mozilla.org/Labs/Jetpack/JEP/21#Initial_Implementation_API

•   Import from future
    jetpack.future.import("toolbar");


•   Which Toolbar?

    •   jetpack.toolbar.navigation

    •   jetpack.toolbar.bookmarks

•   Toolbar options
    var myButton = {
      id: "goMozTW",
      label: "Go MozTW",
      tooltip: "Access MozTW Website",
      image: "http://www.mozilla.org/favicon.ico",
      onclick: function(event) { jetpack.tabs.open('http://moztw.org/'); }
    }


•   Append And Remove
    jetpack.toolbar.navigation.append(myButton);
    jetpack.toolbar.navigation.remove("goMozTW");
Statusbar
•   Somehow like slidebar, HTML-based

•   Parameters: width, html

•   onReady when HTML item is loaded

    •   widget, its HTML document as a parameter

•   Example
    jetpack.statusBar.append({
      html: "<strong>Hi!</strong>",
      width: 100,
      onReady: function(widget) {
        $("strong", widget).text("Jetpack rocks?");
        $(widget).click(function()
        { jetpack.notifications.show("Yes!"); }
        );
      }
    });
A complex slidebar
example
The Target
In RSS
Code and result

• http://gist.github.com/323081
Hacks in the code



• $("<a />") to create element: not working
 • Use _doc.createElement("a") instead
• Some Regex to fetch the real title
• jQuery.ajax to fetch the content:
  http://api.jquery.com/jQuery.ajax/
Another example:
JetPlurk by irvinfly
http://go.sto.tw/jetplurk
Jetpack 0.8 APIs:
Not (so much) UI
related
Selection
•   https://developer.mozilla.org/en/Jetpack/UI/Selection

•   Import from future
    jetpack.future.import("selection");


•   Get Selection

    •   jetpack.selection.text as plain text

    •   jetpack.selection.html as HTML


•   Event: onSelection

•   Example
    jetpack.future.import("selection");
    jetpack.selection.onSelection(function(){
        jetpack.notifications.show(jetpack.selection.text);
        jetpack.selection.html = "<b>" + jetpack.selection.html +
    "</b>";
    });
Tabs (I)


• jetpack.tabs
• open(): open new tab
  jetpack.tabs.open("http://www.example.com");


• Array-like operations:
 • jetpack.tabs[0]: first tab
 • length: number of tabs
Tabs (II)

• Events:
 • onReady: (inherited document is fully loaded)
 • onFocus: focus changed
• Example
  jetpack.tabs.onReady(
    function(doc) {
      console.log('ok');
    }
  );
Simple Storage
• Simple Storage: implemented as JSON files
• Future namespace should be used:
  jetpack.future.import("storage.simple");  
  var myStorage = jetpack.storage.simple; 


• You can put some simple items: string, number, array,
  into myStorage:
  myStorage.group = 'moztw';
  myStorage.members = ['littlebtc', 'bobchao', 'irvinfly'];


• So
  console.log(myStorage.members[0])

  is littlebtc!

• sync() to force writing, open() to force reading
  (beware!)
Settings (I)

• Import from future is needed
• Need some manifest:
 • https://developer.mozilla.org/en/Jetpack/Storage/
    Settings

• Resulting interface in about:jetpack:
Settings (II)



• Setting types: text, password, boolean, range
• Available options: default, min (for range), max (for
  range)

• Read/Write the setting is simple:
  jetpack.storage.settings.facebook.username =
  'jen';
  music.volume = jetpack.storage.settings.volume;
Me, the extension



• Use "me":
  jetpack.future.import("me");  


• For first run purpose:
  jetpack.me.onFirstRun(function () {  
    jetpack.tabs.open("http://moztw.org/");
    jetpack.notifications.show('Welcome!');   
  });  
more...
https://wiki.mozilla.org/Labs/Jetpack/
JEP
https://developer.mozilla.org/en/Jetpack
After finished...
Go Jetpack Gallery!
http://jetpackgallery.mozillalabs.com/
Jetpack SDK:
Jetpack rebooted
Review of Jetpack Prototype
    https://                   •   Wrong things
    jetpack.mozillalabs.com/
    prototype.html
                                    •   Scope

•   Right things
                                    •   Quality

     •   Usability
                                    •   Non-Systemic API

     •   Web Technologies
                                    •   Document

     •   JEPs
                                    •   jQuery only

     •   Quick Release


     •   Tools integration
New "Jetpack" Architecture


   Before                         After
    jetpack   jetpack   jetpack      jetpack             jetpack


                                    Jetpack          Jetpack
         Jetpack API                 Core             Core




              Firefox                          Firefox
New "Jetpack SDK"

• Python SDK, with features enabled:
 • Testing
 • XPI Packaging
• "Package-based"
• CommonJS based scripting
• http://mozillalabs.com/jetpack/2010/03/09/
  announcing-the-jetpack-sdk/

• https://jetpack.mozillalabs.com/sdk/0.1/docs/
"Packaging"



• One package, one directory
• Every package directory should contain a
  mainfest.json at least

  • Description, Dependency, ...
• JS files, known as "module", used for some reusable
  code, can be pulled in lib/xxx.js
"Packaging" (II): CommonJS
•   Export a functions in my-module.js:
    exports.foo = function() {
      return "work!"
    }
    exports.add = funciton(a, b) {
      return a + b;
    }

•   Use and test it in main.js:
    var myModule = require("my-module");
    exports.main = function(options, callbacks) {
      myModule.foo();
      callbacks.quit();
    }

•   "main" function exported from "main" module (main.js)
    will be called as your program "activate"s
Testing


• Create lib/test-my-module.js:
    var myModule = require("my-module");
    exports.ensureAdditionWorks = function
    (test) {
      test.assertEqual(myModule.add(1, 1), 2, "1
    + 1 = 2");
    };

•   cfx test --verbose to test!
cfx works!

• After grab the SDK, run in OSX/Linux:
    source bin/activate
    In Windows
    (Python and Python for Windows extension is required):
    source bin/activate

•   cfx testall      : Sanity Check

• Run in the package directory:
•   cfx test --verbose         : test module

•   cfx xpi     : make Jetpack XPI
Jetpack-based extensions

• Jetpack as an API
• Jetpack-based extension will:
 • Require no restart to take effect
 • Have automatic update
 • And better security model
• No difference for users compared with traditional
  extensions

• Hosted on AMO too
Extension manager redesign
FlightDeck
Instant development!
What about JEPs?
https://wiki.mozilla.org/Labs/Jetpack/Reboot/JEP
Future: it's your turn!

More Related Content

What's hot

Play framework 2 : Peter Hilton
Play framework 2 : Peter HiltonPlay framework 2 : Peter Hilton
Play framework 2 : Peter Hilton
JAX London
 
Drupal 8 - Build Week Update
Drupal 8 - Build Week UpdateDrupal 8 - Build Week Update
Drupal 8 - Build Week Update
Angela Byron
 
How Browser Works?
How Browser Works?How Browser Works?
How Browser Works?
Vova Voyevidka
 
Lessons Learned with Unity and WebGL
Lessons Learned with Unity and WebGLLessons Learned with Unity and WebGL
Lessons Learned with Unity and WebGL
Lior Tal
 
Dojo javascript toolkit
Dojo javascript toolkit Dojo javascript toolkit
Dojo javascript toolkit
Predhin Sapru
 
Automated ui-testing
Automated ui-testingAutomated ui-testing
Automated ui-testing
Slobodan Lohja
 
Utilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino APIUtilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino API
Oliver Busse
 
Telosys project booster Paris Open Source Summit 2019
Telosys project booster Paris Open Source Summit 2019Telosys project booster Paris Open Source Summit 2019
Telosys project booster Paris Open Source Summit 2019
Laurent Guérin
 
Introducing CrossWorlds for IBM Domino
Introducing CrossWorlds for IBM DominoIntroducing CrossWorlds for IBM Domino
Introducing CrossWorlds for IBM Domino
Daniele Vistalli
 
Beyond Domino Designer
Beyond Domino DesignerBeyond Domino Designer
Beyond Domino Designer
Paul Withers
 
Heroes of Paragon: publishing Unity WebGL game on Facebook
Heroes of Paragon: publishing Unity WebGL game on FacebookHeroes of Paragon: publishing Unity WebGL game on Facebook
Heroes of Paragon: publishing Unity WebGL game on Facebook
DevGAMM Conference
 
How To Build a Multi-Field Search Page For Your XPages Application
How To Build a Multi-Field Search Page For Your XPages ApplicationHow To Build a Multi-Field Search Page For Your XPages Application
How To Build a Multi-Field Search Page For Your XPages Application
Michael McGarel
 
Play! Framework for JavaEE Developers
Play! Framework for JavaEE DevelopersPlay! Framework for JavaEE Developers
Play! Framework for JavaEE Developers
Teng Shiu Huang
 
Drupal 8 Vocab Lesson
Drupal 8 Vocab LessonDrupal 8 Vocab Lesson
Drupal 8 Vocab Lesson
Mediacurrent
 
Xitrum HOWTOs
Xitrum HOWTOsXitrum HOWTOs
Xitrum HOWTOsNgoc Dao
 
CollabSphere 2018 - Java in Domino After XPages
CollabSphere 2018 - Java in Domino After XPagesCollabSphere 2018 - Java in Domino After XPages
CollabSphere 2018 - Java in Domino After XPages
Jesse Gallagher
 
Dojo, from scratch to result
Dojo, from scratch to resultDojo, from scratch to result
Dojo, from scratch to result
Nikolai Onken
 
Deview 2013 mobile browser internals and trends_20131022
Deview 2013 mobile browser internals and trends_20131022Deview 2013 mobile browser internals and trends_20131022
Deview 2013 mobile browser internals and trends_20131022NAVER D2
 
Deploying WO on Windows
Deploying WO on WindowsDeploying WO on Windows
Deploying WO on WindowsWO Community
 

What's hot (20)

Play framework 2 : Peter Hilton
Play framework 2 : Peter HiltonPlay framework 2 : Peter Hilton
Play framework 2 : Peter Hilton
 
Drupal 8 - Build Week Update
Drupal 8 - Build Week UpdateDrupal 8 - Build Week Update
Drupal 8 - Build Week Update
 
How Browser Works?
How Browser Works?How Browser Works?
How Browser Works?
 
Lessons Learned with Unity and WebGL
Lessons Learned with Unity and WebGLLessons Learned with Unity and WebGL
Lessons Learned with Unity and WebGL
 
Dojo javascript toolkit
Dojo javascript toolkit Dojo javascript toolkit
Dojo javascript toolkit
 
Automated ui-testing
Automated ui-testingAutomated ui-testing
Automated ui-testing
 
Utilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino APIUtilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino API
 
Telosys project booster Paris Open Source Summit 2019
Telosys project booster Paris Open Source Summit 2019Telosys project booster Paris Open Source Summit 2019
Telosys project booster Paris Open Source Summit 2019
 
Introducing CrossWorlds for IBM Domino
Introducing CrossWorlds for IBM DominoIntroducing CrossWorlds for IBM Domino
Introducing CrossWorlds for IBM Domino
 
Beyond Domino Designer
Beyond Domino DesignerBeyond Domino Designer
Beyond Domino Designer
 
Heroes of Paragon: publishing Unity WebGL game on Facebook
Heroes of Paragon: publishing Unity WebGL game on FacebookHeroes of Paragon: publishing Unity WebGL game on Facebook
Heroes of Paragon: publishing Unity WebGL game on Facebook
 
How To Build a Multi-Field Search Page For Your XPages Application
How To Build a Multi-Field Search Page For Your XPages ApplicationHow To Build a Multi-Field Search Page For Your XPages Application
How To Build a Multi-Field Search Page For Your XPages Application
 
Play! Framework for JavaEE Developers
Play! Framework for JavaEE DevelopersPlay! Framework for JavaEE Developers
Play! Framework for JavaEE Developers
 
Drupal 8 Vocab Lesson
Drupal 8 Vocab LessonDrupal 8 Vocab Lesson
Drupal 8 Vocab Lesson
 
Xitrum HOWTOs
Xitrum HOWTOsXitrum HOWTOs
Xitrum HOWTOs
 
CollabSphere 2018 - Java in Domino After XPages
CollabSphere 2018 - Java in Domino After XPagesCollabSphere 2018 - Java in Domino After XPages
CollabSphere 2018 - Java in Domino After XPages
 
Dojo, from scratch to result
Dojo, from scratch to resultDojo, from scratch to result
Dojo, from scratch to result
 
Deview 2013 mobile browser internals and trends_20131022
Deview 2013 mobile browser internals and trends_20131022Deview 2013 mobile browser internals and trends_20131022
Deview 2013 mobile browser internals and trends_20131022
 
Deploying WO on Windows
Deploying WO on WindowsDeploying WO on Windows
Deploying WO on Windows
 
Django
DjangoDjango
Django
 

Similar to MozTW Jetpack Workshop: Taichung

How to start developing apps for Firefox OS
How to start developing apps for Firefox OSHow to start developing apps for Firefox OS
How to start developing apps for Firefox OSbenko
 
Porting Flashblock to Jetpack Platform (draft)
Porting Flashblock to Jetpack Platform (draft)Porting Flashblock to Jetpack Platform (draft)
Porting Flashblock to Jetpack Platform (draft)
Thomas Bassetto
 
How dojo works
How dojo worksHow dojo works
How dojo works
Amit Tyagi
 
Masterin Large Scale Java Script Applications
Masterin Large Scale Java Script ApplicationsMasterin Large Scale Java Script Applications
Masterin Large Scale Java Script Applications
Fabian Jakobs
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
Doris Chen
 
e10sとアプリ間通信
e10sとアプリ間通信e10sとアプリ間通信
e10sとアプリ間通信
Makoto Kato
 
JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)
jeresig
 
Hacking iBooks and ePub3 with JavaScript!
Hacking iBooks and ePub3 with JavaScript!Hacking iBooks and ePub3 with JavaScript!
Hacking iBooks and ePub3 with JavaScript!
Jim McKeeth
 
Dojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, FastDojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, Fast
Gabriel Hamilton
 
HTML5, just another presentation :)
HTML5, just another presentation :)HTML5, just another presentation :)
HTML5, just another presentation :)
François Massart
 
Html5 Brown Bag
Html5 Brown BagHtml5 Brown Bag
Html5 Brown Bag
stuplum
 
How to make Ajax Libraries work for you
How to make Ajax Libraries work for youHow to make Ajax Libraries work for you
How to make Ajax Libraries work for you
Simon Willison
 
JavaScript Libraries (Ajax Exp 2006)
JavaScript Libraries (Ajax Exp 2006)JavaScript Libraries (Ajax Exp 2006)
JavaScript Libraries (Ajax Exp 2006)jeresig
 
JavaScript!
JavaScript!JavaScript!
JavaScript!
RTigger
 
Selenium with java
Selenium with javaSelenium with java
Selenium with java
Satyam Pandey
 
The Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQueryThe Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQuery
colinbdclark
 
Intro JavaScript
Intro JavaScriptIntro JavaScript
Intro JavaScript
koppenolski
 
Advancing JavaScript with Libraries (Yahoo Tech Talk)
Advancing JavaScript with Libraries (Yahoo Tech Talk)Advancing JavaScript with Libraries (Yahoo Tech Talk)
Advancing JavaScript with Libraries (Yahoo Tech Talk)
jeresig
 

Similar to MozTW Jetpack Workshop: Taichung (20)

How to start developing apps for Firefox OS
How to start developing apps for Firefox OSHow to start developing apps for Firefox OS
How to start developing apps for Firefox OS
 
Porting Flashblock to Jetpack Platform (draft)
Porting Flashblock to Jetpack Platform (draft)Porting Flashblock to Jetpack Platform (draft)
Porting Flashblock to Jetpack Platform (draft)
 
How dojo works
How dojo worksHow dojo works
How dojo works
 
Masterin Large Scale Java Script Applications
Masterin Large Scale Java Script ApplicationsMasterin Large Scale Java Script Applications
Masterin Large Scale Java Script Applications
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
 
e10sとアプリ間通信
e10sとアプリ間通信e10sとアプリ間通信
e10sとアプリ間通信
 
JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)
 
Hacking iBooks and ePub3 with JavaScript!
Hacking iBooks and ePub3 with JavaScript!Hacking iBooks and ePub3 with JavaScript!
Hacking iBooks and ePub3 with JavaScript!
 
Dojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, FastDojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, Fast
 
HTML5, just another presentation :)
HTML5, just another presentation :)HTML5, just another presentation :)
HTML5, just another presentation :)
 
Html5 Brown Bag
Html5 Brown BagHtml5 Brown Bag
Html5 Brown Bag
 
How to make Ajax Libraries work for you
How to make Ajax Libraries work for youHow to make Ajax Libraries work for you
How to make Ajax Libraries work for you
 
JavaScript Libraries (Ajax Exp 2006)
JavaScript Libraries (Ajax Exp 2006)JavaScript Libraries (Ajax Exp 2006)
JavaScript Libraries (Ajax Exp 2006)
 
JavaScript!
JavaScript!JavaScript!
JavaScript!
 
Selenium with java
Selenium with javaSelenium with java
Selenium with java
 
Jquery fundamentals
Jquery fundamentalsJquery fundamentals
Jquery fundamentals
 
The Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQueryThe Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQuery
 
Intro JavaScript
Intro JavaScriptIntro JavaScript
Intro JavaScript
 
Advancing JavaScript with Libraries (Yahoo Tech Talk)
Advancing JavaScript with Libraries (Yahoo Tech Talk)Advancing JavaScript with Libraries (Yahoo Tech Talk)
Advancing JavaScript with Libraries (Yahoo Tech Talk)
 
bcgr3-jquery
bcgr3-jquerybcgr3-jquery
bcgr3-jquery
 

More from littlebtc

FURP12-Snappy
FURP12-SnappyFURP12-Snappy
FURP12-Snappylittlebtc
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學
littlebtc
 
Jetpack and Jetpack Reboot
Jetpack and Jetpack RebootJetpack and Jetpack Reboot
Jetpack and Jetpack Rebootlittlebtc
 
COSCUP Jetpack Lighting Talk
COSCUP Jetpack Lighting TalkCOSCUP Jetpack Lighting Talk
COSCUP Jetpack Lighting Talklittlebtc
 
090807social
090807social090807social
090807sociallittlebtc
 
MoZH propose
MoZH proposeMoZH propose
MoZH propose
littlebtc
 
Mozilla Firefox Extension Development, Course 1: Basic
Mozilla Firefox Extension Development, Course 1: BasicMozilla Firefox Extension Development, Course 1: Basic
Mozilla Firefox Extension Development, Course 1: Basic
littlebtc
 
MozTW YZU CSE Lecture
MozTW YZU CSE LectureMozTW YZU CSE Lecture
MozTW YZU CSE Lecturelittlebtc
 
Something about Wikipedia
Something about WikipediaSomething about Wikipedia
Something about Wikipedialittlebtc
 

More from littlebtc (10)

FURP12-Snappy
FURP12-SnappyFURP12-Snappy
FURP12-Snappy
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學
 
Jetpack and Jetpack Reboot
Jetpack and Jetpack RebootJetpack and Jetpack Reboot
Jetpack and Jetpack Reboot
 
COSCUP Jetpack Lighting Talk
COSCUP Jetpack Lighting TalkCOSCUP Jetpack Lighting Talk
COSCUP Jetpack Lighting Talk
 
090807social
090807social090807social
090807social
 
MoZH propose
MoZH proposeMoZH propose
MoZH propose
 
Ext 0523
Ext 0523Ext 0523
Ext 0523
 
Mozilla Firefox Extension Development, Course 1: Basic
Mozilla Firefox Extension Development, Course 1: BasicMozilla Firefox Extension Development, Course 1: Basic
Mozilla Firefox Extension Development, Course 1: Basic
 
MozTW YZU CSE Lecture
MozTW YZU CSE LectureMozTW YZU CSE Lecture
MozTW YZU CSE Lecture
 
Something about Wikipedia
Something about WikipediaSomething about Wikipedia
Something about Wikipedia
 

Recently uploaded

Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Ramesh Iyer
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxIOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
Abida Shariff
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
Product School
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
DianaGray10
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 

Recently uploaded (20)

Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxIOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 

MozTW Jetpack Workshop: Taichung

  • 1. Workshop: Taichung Hsiao-Ting Yu “Littlebtc” MozTW member / Jetpack Ambassador
  • 3. What is Mozilla? • Non-profit organization • Support for better Internet: an open web • Open Source Software • Open Web Standard • Major Products: Firefox & Thunderbird
  • 4. Mozilla Labs? • “Labs” in Mozilla • Crazy ideas • Explore future of the web
  • 6.
  • 7. MozTW? • Mozilla communities in Taiwan • Group for Mozilla “fans” • Localize Mozilla products • Promote Mozilla product & web standard • Our mascot: Foxmosa
  • 10. Old-type Mozilla Extension • XUL: user interface • JavaScript: code • CSS: styling • XBL: binding • XPCOM: core • ... So much hard things :(
  • 12. What is Jetpack? • Simple-to-use API to develop new-type extensions • HTML, CSS and JavaScript • JavaScript libraries available • Fast to develop, test and deploy • Extensible API Photo by www.rocketman.org, CC-BY-2.5 http://en.wikipedia.org/wiki/File:Rose-4.jpg
  • 13. Jetpack: Now and Future • Old: Jetpack Prototype 0.8 (standalone extension) • Experimental Prototype • Jetpack as single JavaScript file • Very Near Future: Jetpack SDK (Jetpack Reboot) • Distributed as a development kit • Jetpack as XPI extension bundle • Future version of Firefox will have Jetpack API supported included
  • 20. Procedure • Prepare a .js file and a .htm file in the same folder • in .htm file, add the following data: <html> <head> <title>Jetpack Workshop Example</title> <link rel="jetpack" href="example.js"> </head> <body> </body> </html> • in the .js file: add oneworld!'); console.log('Hello line • Open the .htm file to "Install" the Jetpack
  • 22. Refresh: the dirty way • For local files only(?) • Go to or refresh the about:jetpack page
  • 24. Everyone needs a “Hello World” • Log: Use Error Console (preferred) or Firebug Console • Go “Develop” Tab • Type • console.log("Hello World!");
  • 25. Notifications • Simple Type jetpack.notifications.show("Hello World!"); • Complex Type jetpack.notifications.show( { title: "Hi Jetpack!", body: " ", icon: "https://jetpack.mozillalabs.com/images/jetpack.png" } );
  • 26. Menu (I) • Import from future: jetpack.future.import("menu"); • Create new menu to a dummy menu object (does nothing) jetpack.menu.add("Aloha!"); • Create new menu to tools jetpack.menu.tools.add("Aloha!");
  • 27. Menu (II) • What menu? • jetpack.menu.file • jetpack.menu.edit • jetpack.menu.view • jetpack.menu.history • jetpack.menu.bookmarks • jetpack.menu.tools • Context Menu: Somehow complex • jetpack.menu.context.browser for browser UI • jetpack.menu.context.page for page
  • 28. Menu (III) • Object-type to allow more options • How about command? => command • Submenu? => menu • Details: https://developer.mozilla.org/en/Jetpack/UI/Menu jetpack.future.import("menu"); jetpack.menu.context.page.add({ label: "Ice Cream", icon: "https://jetpack.mozillalabs.com/images/ jetpack.png", menu: new jetpack.Menu(["Vanilla", "Chocolate", "Pistachio", null, "None"]), command: function (menuitem) { jetpack.notifications.show(menuitem.label) } });
  • 29. Slidebar (I) • It is not the sidebar! :D • Import from future: jetpack.future.import("slideBar"); • Append the slidebar with HTML content: jetpack.slideBar.append( { icon: "https://jetpack.mozillalabs.com/images/jetpack.png", html: "<html><body>Hello!</body></html>" }); • Or a given URL: jetpack.slideBar.append( { icon: "https://jetpack.mozillalabs.com/images/jetpack.png", url: "http://moztw.org" });
  • 30. Slidebar (II) • Events: • onReady: when feature("slidebar page") is loaded • onClick: when its icon is clicked • onSelect: when featured is selected • Options: • autoReload: reload every time selected
  • 31. Slidebar (III): Tips • onReady, onSelect: • Will have a slider object as a parameter • You can use slider.contentDocument to access the document • Jetpack 0.8 is jQuery enabled, so: function ready(slider) { var _doc = slider.contentDocument; $("body", _doc).html("..."); // Have fun! } jetpack.slider.append( {... , 'onReady': ready})
  • 32. Slidebar (IV): Tips again • You can use E4X hack to write HTML code: var html = <> <html> <head> <style type="text/css"> <![CDATA[ ... ]]> </style> <base target="_blank" /> <!-- Dirty Hack, very dirty --> </head> <body> ... </body></html></>.toXMLString(); jetpack.slideBar.append({html: html}); • Another dirty hack: set target to _blank to make links to open in the new tab, instead of in the slidebar content
  • 33. Toolbar • https://wiki.mozilla.org/Labs/Jetpack/JEP/21#Initial_Implementation_API • Import from future jetpack.future.import("toolbar"); • Which Toolbar? • jetpack.toolbar.navigation • jetpack.toolbar.bookmarks • Toolbar options var myButton = { id: "goMozTW", label: "Go MozTW", tooltip: "Access MozTW Website", image: "http://www.mozilla.org/favicon.ico", onclick: function(event) { jetpack.tabs.open('http://moztw.org/'); } } • Append And Remove jetpack.toolbar.navigation.append(myButton); jetpack.toolbar.navigation.remove("goMozTW");
  • 34. Statusbar • Somehow like slidebar, HTML-based • Parameters: width, html • onReady when HTML item is loaded • widget, its HTML document as a parameter • Example jetpack.statusBar.append({ html: "<strong>Hi!</strong>", width: 100, onReady: function(widget) { $("strong", widget).text("Jetpack rocks?"); $(widget).click(function() { jetpack.notifications.show("Yes!"); } ); } });
  • 38. Code and result • http://gist.github.com/323081
  • 39. Hacks in the code • $("<a />") to create element: not working • Use _doc.createElement("a") instead • Some Regex to fetch the real title • jQuery.ajax to fetch the content: http://api.jquery.com/jQuery.ajax/
  • 40. Another example: JetPlurk by irvinfly http://go.sto.tw/jetplurk
  • 41. Jetpack 0.8 APIs: Not (so much) UI related
  • 42. Selection • https://developer.mozilla.org/en/Jetpack/UI/Selection • Import from future jetpack.future.import("selection"); • Get Selection • jetpack.selection.text as plain text • jetpack.selection.html as HTML • Event: onSelection • Example jetpack.future.import("selection"); jetpack.selection.onSelection(function(){ jetpack.notifications.show(jetpack.selection.text); jetpack.selection.html = "<b>" + jetpack.selection.html + "</b>"; });
  • 43. Tabs (I) • jetpack.tabs • open(): open new tab jetpack.tabs.open("http://www.example.com"); • Array-like operations: • jetpack.tabs[0]: first tab • length: number of tabs
  • 44. Tabs (II) • Events: • onReady: (inherited document is fully loaded) • onFocus: focus changed • Example jetpack.tabs.onReady( function(doc) { console.log('ok'); } );
  • 45. Simple Storage • Simple Storage: implemented as JSON files • Future namespace should be used: jetpack.future.import("storage.simple");   var myStorage = jetpack.storage.simple;  • You can put some simple items: string, number, array, into myStorage: myStorage.group = 'moztw'; myStorage.members = ['littlebtc', 'bobchao', 'irvinfly']; • So console.log(myStorage.members[0]) is littlebtc! • sync() to force writing, open() to force reading (beware!)
  • 46. Settings (I) • Import from future is needed • Need some manifest: • https://developer.mozilla.org/en/Jetpack/Storage/ Settings • Resulting interface in about:jetpack:
  • 47. Settings (II) • Setting types: text, password, boolean, range • Available options: default, min (for range), max (for range) • Read/Write the setting is simple: jetpack.storage.settings.facebook.username = 'jen'; music.volume = jetpack.storage.settings.volume;
  • 48. Me, the extension • Use "me": jetpack.future.import("me");   • For first run purpose: jetpack.me.onFirstRun(function () {   jetpack.tabs.open("http://moztw.org/"); jetpack.notifications.show('Welcome!');    });  
  • 53. Review of Jetpack Prototype https:// • Wrong things jetpack.mozillalabs.com/ prototype.html • Scope • Right things • Quality • Usability • Non-Systemic API • Web Technologies • Document • JEPs • jQuery only • Quick Release • Tools integration
  • 54. New "Jetpack" Architecture Before After jetpack jetpack jetpack jetpack jetpack Jetpack Jetpack Jetpack API Core Core Firefox Firefox
  • 55. New "Jetpack SDK" • Python SDK, with features enabled: • Testing • XPI Packaging • "Package-based" • CommonJS based scripting • http://mozillalabs.com/jetpack/2010/03/09/ announcing-the-jetpack-sdk/ • https://jetpack.mozillalabs.com/sdk/0.1/docs/
  • 56. "Packaging" • One package, one directory • Every package directory should contain a mainfest.json at least • Description, Dependency, ... • JS files, known as "module", used for some reusable code, can be pulled in lib/xxx.js
  • 57. "Packaging" (II): CommonJS • Export a functions in my-module.js: exports.foo = function() { return "work!" } exports.add = funciton(a, b) { return a + b; } • Use and test it in main.js: var myModule = require("my-module"); exports.main = function(options, callbacks) { myModule.foo(); callbacks.quit(); } • "main" function exported from "main" module (main.js) will be called as your program "activate"s
  • 58. Testing • Create lib/test-my-module.js: var myModule = require("my-module"); exports.ensureAdditionWorks = function (test) { test.assertEqual(myModule.add(1, 1), 2, "1 + 1 = 2"); }; • cfx test --verbose to test!
  • 59. cfx works! • After grab the SDK, run in OSX/Linux: source bin/activate In Windows (Python and Python for Windows extension is required): source bin/activate • cfx testall : Sanity Check • Run in the package directory: • cfx test --verbose : test module • cfx xpi : make Jetpack XPI
  • 60. Jetpack-based extensions • Jetpack as an API • Jetpack-based extension will: • Require no restart to take effect • Have automatic update • And better security model • No difference for users compared with traditional extensions • Hosted on AMO too
  • 61.