Labs/Jetpack/Reboot/JEP/110: Difference between revisions

From MozillaWiki
< Labs‎ | Jetpack‎ | Reboot‎ | JEP
Jump to navigation Jump to search
(make the set of changes discussed in the forum)
Line 18: Line 18:
tabs is an immutable array of Tab objects
tabs is an immutable array of Tab objects
**/
**/
tabs = require("tabs");
tabs = require("tabs").tabs;
 
When the following methods are called, the "this" of the method is the tab in question.
 
/**
A method called when a tab is shown.
@param event {Event} the event
**/
tabs.onShow(event)


/**
/**
  These are global callbacks that come into affect when
  A method called when a tab is hidden.
any of these happen to any tab.
  @param event {Event} the event
  @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 );
tabs.onHide(event)


/**
/**
  Unbinds the event handler
  A method called when a tab is opened.
Without any arguments, all bound events are removed. You can also unbind
  @param event {Event} the event
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.unbind( eventName, func );
tabs.onOpen(event)


/**
/**
  This causes an event to occur or a message to be sent to all tabs.
  A method called when a tab is closed.
  @param eventName {string}
  @param event {Event} the event
        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 )
tabs.onClose(event)
 
/**
A method called when a tab's content is loaded.
@param event {Event} the event
**/
tabs.onLoad(event)
 
/**
A method called when a tab's content is ready.
@param event {Event} the event
**/
tabs.onDOMReady(event)
 
/**
A method called when a tab's content has been painted.
@param event {Event} the event
**/
tabs.onMozAfterPaint(event)
 
/**
Open a new tab.
@param url {URL} the URL to load in the tab; optional;
        if not provided, about:blank will be loaded in the tab
@param window {Window} the window in which to open the tab;
        optional; if not provided, the tab will be opened
        in the most recent application window
**/
tabs.open(url, window)


/**
/**
Line 67: Line 85:


/**
/**
  Same as for tabs, but effects the particular tab in question.
  A method called when the tab is shown.
@param event {Event} the event
**/
**/
tab.bind( eventName, callback )
tab.onShow(event)


/**
/**
  Same as for tabs, but effects the particular tab in question.
  A method called when the tab is hidden.
@param event {Event} the event
**/
**/
tab.unbind( eventName, callback )
tab.onHide(event)


/**
/**
  Mostly the same as for the tabs case, the only difference being:
  A method called when the tab is closed.
  @param eventName {string}
  @param event {Event} the event
        Is one of focus, close, load, move
**/
**/
tab.trigger( eventName, data, otherData )
tab.onClose(event)
 
/**
A method called when the tab's content is loaded.
@param event {Event} the event
**/
tab.onLoad(event)
 
/**
A method called when the tab's content is ready.
@param event {Event} the event
**/
tab.onDOMReady(event)
 
/**
A method called when the tab's content has been painted.
@param event {Event} the event
**/
tab.onPaint(event)
 
/**
Make this the active tab.
**/
tab.activate()
 
/**
Close the tab.
**/
tab.close()
 
/**
Load a URL in the tab.
@param url {URL} the URL to load in the tab
**/
tab.load(url)
 
/**
Move the tab to a new location in the tab set.
@param index {Number} the new location in the tab set
@param window {Window}
        the new window; optional if moving to a new location
        within the existing window
**/
tab.move(index, window)


/**
/**
Line 95: Line 157:
  @prop contentWindow {window}
  @prop contentWindow {window}
  @prop [ownerWindow] {jetpack window} The window the tab belongs to
  @prop [ownerWindow] {jetpack window} The window the tab belongs to
  @prop [thumbnail] {canvas} A thumbnail of the currently displayed page  
  @prop [thumbnail] {canvas} A thumbnail of the currently displayed page
@prop onShow {Function} event handler to call when a tab is activated
@prop onHide {Function} event handler to call when a tab is deactivated
**/
**/
tab.property
tab.property


</pre>
== Sugar Functions ==
<pre class="brush:js">
// 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
</pre>
</pre>



Revision as of 01:16, 6 April 2010

JEP 110 - Tabs

  • Champion: Aza Raskin - aza@mozilla.com
  • Status: Info Needed
  • 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").tabs;

When the following methods are called, the "this" of the method is the tab in question.

/**
 A method called when a tab is shown.
 @param event {Event} the event
**/
tabs.onShow(event)

/**
 A method called when a tab is hidden.
 @param event {Event} the event
**/
tabs.onHide(event)

/**
 A method called when a tab is opened.
 @param event {Event} the event
**/
tabs.onOpen(event)

/**
 A method called when a tab is closed.
 @param event {Event} the event
**/
tabs.onClose(event)

/**
 A method called when a tab's content is loaded.
 @param event {Event} the event
**/
tabs.onLoad(event)

/**
 A method called when a tab's content is ready.
 @param event {Event} the event
**/
tabs.onDOMReady(event)

/**
 A method called when a tab's content has been painted.
 @param event {Event} the event
**/
tabs.onMozAfterPaint(event)

/**
 Open a new tab.
 @param url {URL} the URL to load in the tab; optional;
        if not provided, about:blank will be loaded in the tab
 @param window {Window} the window in which to open the tab;
        optional; if not provided, the tab will be opened 
        in the most recent application window
**/
tabs.open(url, window)

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

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

/**
 A method called when the tab is shown.
 @param event {Event} the event
**/
tab.onShow(event)

/**
 A method called when the tab is hidden.
 @param event {Event} the event
**/
tab.onHide(event)

/**
 A method called when the tab is closed.
 @param event {Event} the event
**/
tab.onClose(event)

/**
 A method called when the tab's content is loaded.
 @param event {Event} the event
**/
tab.onLoad(event)

/**
 A method called when the tab's content is ready.
 @param event {Event} the event
**/
tab.onDOMReady(event)

/**
 A method called when the tab's content has been painted.
 @param event {Event} the event
**/
tab.onPaint(event)

/**
 Make this the active tab.
**/
tab.activate()

/**
 Close the tab.
**/
tab.close()

/**
 Load a URL in the tab.
 @param url {URL} the URL to load in the tab
**/
tab.load(url)

/**
 Move the tab to a new location in the tab set.
 @param index {Number} the new location in the tab set
 @param window {Window} 
        the new window; optional if moving to a new location
        within the existing window
**/
tab.move(index, window)

/**
 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 contentDocument {document}
 @prop contentWindow {window}
 @prop [ownerWindow] {jetpack window} The window the tab belongs to
 @prop [thumbnail] {canvas} A thumbnail of the currently displayed page
 @prop onShow {Function} event handler to call when a tab is activated
 @prop onHide {Function} event handler to call when a tab is deactivated
**/
tab.property

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?


Use Cases

  • Move a tab to be the first tab, or re-order tabs based on semantic grouping
  • Close a set of tabs
  • Open a new tab to a contextually aware location
  • Change the background color of the currently active tab
  • Change the color of the background of a tab-handle
  • Show the Delicious tab-o-meter of the current tab