Jump to: navigation, search

Difference between revisions of "Orion/Library Independence"

(Deferred / Promise support)
Line 50: Line 50:
 
</pre>
 
</pre>
 
* <tt>dojo.place</tt>   
 
* <tt>dojo.place</tt>   
<pre>For node placement, use the addChild/appendChild/insertBefore DOM equivalents.  If placing HTML, use innerHTML, or convert to dynamic DOM node creation when security is an issue.  
+
<pre>For node placement, use the addChild/appendChild/insertBefore DOM equivalents.   
 +
If placing HTML, use innerHTML, parse HTML with a document fragment, or convert to dynamic  
 +
DOM node creation when security is an issue.  
 
</pre>
 
</pre>
 
(See bug [https://bugs.eclipse.org/bugs/show_bug.cgi?id=392469 bug 392469] for security discussion).
 
(See bug [https://bugs.eclipse.org/bugs/show_bug.cgi?id=392469 bug 392469] for security discussion).
* dojo.create
+
* <tt>dojo.create</tt>
 +
<pre>
 +
var element = document.createElement("a");  // good old dom API
 +
element.tabIndex = 0;  // set the properties directly if they were used in the create api
 +
element.setAttribute("aria-label", "foo");  // set attributes when there is not a browser standard property
 +
</pre>
 
* <tt>dojo.position</tt>
 
* <tt>dojo.position</tt>
 
<pre>
 
<pre>
Line 68: Line 75:
 
</pre>
 
</pre>
 
=== General JavaScript utilities ===
 
=== General JavaScript utilities ===
* dojo.hitch Function.bind
+
* <tt>dojo.hitch</tt>
 +
<pre>
 +
this.myFunction.bind(this);  // when referring to a function by name
 +
var self = this;
 +
window.setTimeout(function() { self.update(); }, 0);  // bind "this" to a variable when creating an anonymous function
 +
</pre>
 
* dojo.keys constants
 
* dojo.keys constants
 
<pre>
 
<pre>
 
lib.KEY.SPACE;
 
lib.KEY.SPACE;
 
</pre>
 
</pre>
* dojo.trim
 
  
 
=== hash and hash change ===
 
=== hash and hash change ===
* dojo.hash, hashchange events - use HTML5 equivalents.  ''window.location.hash contains the # whereas dojo.hash() did not''
+
* <tt>dojo.hash</tt>
 +
<pre>
 +
// window.location.hash contains the # whereas dojo.hash() did not
 +
window.addEventListener("hashchange", function() { window.location.hash; }, false); 
 +
</pre>
  
 
=== i18n utilities ===
 
=== i18n utilities ===
* dojo.string substitution (use i18nUtil.formatMessage)
+
* <tt>dojo.string substitution</tt>
 +
<pre>
 +
i18nUtil.formatMessage("this has ${0} parameters ${1}", "one", "two");
 +
// note that it's not an array like dojo.string.substitute
 +
</pre>
  
 
=== Deferred / Promise support ===
 
=== Deferred / Promise support ===
* dojo.Deferred - use orion.Deferred
+
* <tt>dojo.Deferred</tt>
* dojo.DeferredList - use orion.Deferred.all(promises, error).
+
<pre>
 +
use orion.Deferred.
 +
Note that you should use resolve, not callback.  And reject, not errback.
 +
</pre>
 +
* <tt>dojo.DeferredList</tt>
 +
<pre>
 +
  Deferred.all(promises, function(error) {return error; }).then(function(resultsArray) {});
 +
  // note that you MUST have an error handler argument or else the promises will not be processed after an error is found.
 +
  // the results array has either the result or whatever you returned in the error function. 
 +
</pre>
  
 
=== dijit Menu support ===
 
=== dijit Menu support ===
Line 94: Line 122:
  
 
=== dijit Dialogs ===
 
=== dijit Dialogs ===
* replace dijit.Dialogs with simple div-based equivalent
+
* [[Image:Ok_green.gif]] replace dijit.Dialogs with simple div-based equivalent
** client templating of content
+
** [[Image:Ok_green.gif]] client templating of content
** conversion of all existing Orion dijit dialogs (approximately 20)
+
** [[Image:progress.gif]] conversion of all existing Orion dijit dialogs (approximately 20)
 
* small js add-ons for special features
 
* small js add-ons for special features
 
** modal support
 
** modal support
** lightweight, automatic dismissal  
+
** [[Image:Ok_green.gif]]lightweight, automatic dismissal  
  
 
=== dijit Layout support  ===
 
=== dijit Layout support  ===
 
* [[Image:Ok_green.gif]] Replace common page use of dijit BorderContainer, ContentPane, Splitter  
 
* [[Image:Ok_green.gif]] Replace common page use of dijit BorderContainer, ContentPane, Splitter  
 
** [[Image:Ok_green.gif]] switch to CSS based layout
 
** [[Image:Ok_green.gif]] switch to CSS based layout
** i[[Image:Ok_green.gif]] mplement small, lightweight splitter
+
** i[[Image:Ok_green.gif]] implement small, lightweight splitter
 
* Settings page uses custom dijit layouts
 
* Settings page uses custom dijit layouts
 
* Some pages (compare, shell) use internal dijit layout such as BorderContainer
 
* Some pages (compare, shell) use internal dijit layout such as BorderContainer

Revision as of 20:44, 14 December 2012

For Orion 2.0, we are investigating client side implementations that do not depend on a particular javascript library, and instead use raw HTML5/CSS3 constructs where possible.

At the DOM manipulation level, this is made largely possible by our adoption of IE10 for Orion 2.0, since it includes many HTML5 features that were not available in in IE9. Since we no longer need to rely on shims and other workarounds for missing features, we should be able to use the browser native API for things like events, CSS class manipulation, etc.

For UI components, or widgets, that we need in the UI, we will look at existing small, library-independent implementations of the functionality, as well as considering our own implementation. Any custom implementations should be as small/simplified as possible, satisfying Orion use cases but not starting out with the intention to be an independently consumable component.

This document outlines what would be needed to reduce or eliminate our dependence on dojo in favor of these other approaches.

Advantages of library independence

  • Orion consumers wish to make their own choices regarding JavaScript libraries and UI plugins, and do not wish to bring in other libraries (such as dojo) when they depend on a different library.
  • Orion consumers who use the same libraries as us (such as dojo) wish to switch versions at their own pace.
  • Size reduction and performance improvements as we eliminate library methods that are already available in the browser, as well as eliminating JavaScript and CSS code that we no longer need.
  • Simplified learning curve for consumers
    • theming doesn't require understanding of a separate library/widget level theming mechanism
    • we don't force consumers to learn multiple conventions/life cycles in the UI (dijit lifecycle vs. Orion, dijit layout vs. raw CSS, etc.).

Existing dependencies and proposed replacements

The remainder of this document categorizes our dependencies and gives status on the replacement candidates.

DOM manipulation

We extensively use the dojo.* utility methods. Many of these are now available in our supported browser set. The following list shows method usage and replacement. A small library (orion/webui/littlelib) implements a few methods. Examples referring to "lib" are using this module.

  • dojo.byId
document.getElementById(id);
lib.node(id);  // when you aren't sure if you have an id or node, useful for inbound API calls
  • dojo.query
element.querySelector(selector, parentNode);
element.querySelectorAll(selector, parentNode);
lib.$(selector, parentNode);  // one node
lib.$$(selector, parentNode);  // node list
lib.$$array(selector.parentNode); // array of nodes
  • dojo.addClass, removeClass, toggleClass
element.classList.add('class');  // one at a time
element.classList.remove('class');
element.classList.contains('class');
element.classList.toggle('class'); 
  • dojo.connect/disconnect
element.addEventListener/removeEventListener
  • dojo.style
element.style.visibility = "hidden";
element.style.left = "1px";
  • dojo.place
For node placement, use the addChild/appendChild/insertBefore DOM equivalents.  
If placing HTML, use innerHTML, parse HTML with a document fragment, or convert to dynamic 
DOM node creation when security is an issue. 

(See bug bug 392469 for security discussion).

  • dojo.create
var element = document.createElement("a");  // good old dom API
element.tabIndex = 0;  // set the properties directly if they were used in the create api
element.setAttribute("aria-label", "foo");  // set attributes when there is not a browser standard property
  • dojo.position
lib.bounds
  • dojo.empty
lib.empty
  • dojo.attr, removeAttr
element.setAttribute();
element.getAttribute();

General JavaScript utilities

  • dojo.hitch
this.myFunction.bind(this);  // when referring to a function by name
var self = this;
window.setTimeout(function() { self.update(); }, 0);  // bind "this" to a variable when creating an anonymous function
  • dojo.keys constants
lib.KEY.SPACE;

hash and hash change

  • dojo.hash
// window.location.hash contains the # whereas dojo.hash() did not
window.addEventListener("hashchange", function() { window.location.hash; }, false);  

i18n utilities

  • dojo.string substitution
i18nUtil.formatMessage("this has ${0} parameters ${1}", "one", "two");
// note that it's not an array like dojo.string.substitute

Deferred / Promise support

  • dojo.Deferred
use orion.Deferred.
Note that you should use resolve, not callback.  And reject, not errback.
  • dojo.DeferredList
   Deferred.all(promises, function(error) {return error; }).then(function(resultsArray) {});
   // note that you MUST have an error handler argument or else the promises will not be processed after an error is found.
   // the results array has either the result or whatever you returned in the error function.  

dijit Menu support

  • Ok green.gif bug 393813
    • Ok green.gif Command service should replace dijit implementation
      • Ok green.gif Replace DropDown, MenuItem, PopupMenu with a simplified dropdown widget
      • Ok green.gif Replace dijit Tooltip with simplified tooltip
    • Ok green.gif Replace orion menu extensions
      • Ok green.gif orion.UserMenu functionality supported by new dropdown + styling

dijit Dialogs

  • Ok green.gif replace dijit.Dialogs with simple div-based equivalent
    • Ok green.gif client templating of content
    • Progress.gif conversion of all existing Orion dijit dialogs (approximately 20)
  • small js add-ons for special features
    • modal support
    • Ok green.giflightweight, automatic dismissal

dijit Layout support

  • Ok green.gif Replace common page use of dijit BorderContainer, ContentPane, Splitter
    • Ok green.gif switch to CSS based layout
    • iOk green.gif implement small, lightweight splitter
  • Settings page uses custom dijit layouts
  • Some pages (compare, shell) use internal dijit layout such as BorderContainer

Orion custom dijits

  • domain-specific widgets don't need a framework, replace with application level code
    • plugin related widgets (plugin entry, plugin list, service carousel)
    • site editor
  • settings layout widgets replaced with CSS/splitter (SettingsContainer, SplitSelectionLayout)
  • settings custom field widgets (TextField, Select, Toggles, Buttoms) replaced with HTML5 dom elements
  • settings section moved to existing Orion section support

move unused dijit-based experiments out of orion repository

  • plugin maker