Labs/Jetpack/Reboot/JEP/110

< Labs‎ | Jetpack‎ | Reboot‎ | JEP
Revision as of 22:09, 5 February 2010 by Aza (talk | contribs)

JEP 110 - Tabs

  • Champion: Aza Raskin - aza@mozilla.com
  • Status: Accepted/In-Queue
  • Bug Ticket:
  • Type: API


Proposal

Tabs are a fundamental unit of the browser (for now). We need reasonable ways of interacting with them.

Import lives in the "tabs" module.

/**
/* tabs is an immutable array of Tab objects
/**/
tabs = require("tabs");

/**
/* These are global callbacks that come into affect when
/* any of these happen to any tab.
/* @param eventName {string}
/*        Is one of focus, blur, close, open, load, domready, mozafterpaint,
/*        move
/* @param callback {function}
/*        The function gets passed an "event" object and the the "this" of
/*        that function is the tab in question.
/**
tabs.bind( eventName, callback );

/**
/* Unbinds the event handler
/* Without any arguments, all bound events are removed. You can also unbind 
/* custom events registered with bind. If the type is provided, all bound 
/* events of that type are removed. If the function that was passed to bind is
/* provided as the second argument, only that specific event handler is 
/* removed.
/* @param [eventName] {string}
/* @param [func] {function}
/**
tabs.bind( eventName, func );

/**
/* This causes an event to occur or a message to be sent to all tabs.
/* @param eventName {string}
/*        The event to trigger. For now this is only "open"
/* @param data {string|object}
/*        In the case of open this is the URL, if this is a dictionary
/*        then otherData won't be needed.
/* @param [otherData] {object}
/*        Other data to be passed to the event handler.
/**
tabs.trigger( eventName, data, otherData )

/**
/* The properties of the tab.
/* @prop activeTab {Tab}
/*       The currently active tab
/**
tabs.property

// Get one of the tab objects
var tab = tab[0];

/**
/* Same as for tabs, but effects the particular tab in question.
/**
tab.bind( eventName, callback )

/**
/* Same as for tabs, but effects the particular tab in question.
/**
tab.unbind( eventName, callback )

/**
/* Mostly the same as for the tabs case, the only difference being:
/* @param eventName {string}
/*        Is one of focus, close, load, move
/**
tab.trigger( eventName, data, otherData )

/**
/* The properties for the tabs.
/* @prop style {cssStyleString}
/*       The css style string for the tab.
/* @prop index {integer}
/*       The index the tab is displayed at in its parent window
/* @prop location {url} URL of the tab
/* @prop title {string} The title of the page
/* @prop favicon {url} URL of the displayed favicon
/* @prop [window] {jetpack window} The window the tab belongs to
/* @prop [thumbnail] {canvas} A thumbnail of the currently displayed page    
/**
tab.property

Sugar Functions


// Sugar for tabs.on functionality
tabs.onFocus( function )
tabs.onBlur( function )
tabs.onClose( function )
tabs.onOpen( function )
tabs.onLoad( function )
tabs.onDomReady( function )
...
// and the same for each Tab instance.

// Sugar for tabs.trigger functionality
tabs.open( url, options )
...
// And the same for each Tab instance, plus
tab.move( index, options )
// index = absolute index, "+3"/"-1" for relative
// options for moving to other windows

Difficulty

This is a medium difficulty to implement, but made easier by a pre-existing implementation.

Key Issues

Dependencies & Requirements

  • Are there any Firefox platform bugs blocking it?
  • Does other Jetpack platform code need to be modified or added?
  • Does its implementation affect any other projects or code?


Internal Methods

  • What methods, mechanisms, or resources does this provide internally within the Jetpack platform code.


API Methods

  • What are the pretty API wrapped methods externally exposed to Jetpack developers?