This repository was archived by the owner on Jan 16, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 10
Tech Notes
Kohei Yoshino edited this page Jun 11, 2017
·
142 revisions
This article describes some technical background of BzDeck.
- Making the most of modern Web standards: HTML5, WAI-ARIA 1.1, Microdata, CSS3, DOM4, ECMAScript 6/7, Web Components and more
- No third-party frameworks nor polyfills
- Mobile support: touch friendly UI and swipe browsing for Android phones and tablets
- Offline support: Service Workers, IndexedDB, etc.
- Performance: asynchronous and multi-process architecture using Promise and Workers
- Accessibility: complete WAI-ARIA support, comprehensive keyboard shortcuts
- Localization (l10n) and Internationalization (i18n)
- Enhanced usability: Ajaxy modern UI, attaching files with drag & drop, push notifications, "mid-air collision" prevention
- Complete wish list can be found on our issue tracker
So, what makes BzDeck awesome? Here's a comprehensive list of what and how modern Web technologies are implemented in the demonstrating BzDeck app and the underlying FlareTail.js library.
-
Canvas — Firefox 1.5 — Used in conjunction with CSS
-moz-elementto draw reordering table columns. -
Element.contentEditableproperty — Firefox 3 - Online and offline events — Firefox 3
-
hashchangeevent — Firefox 3.6 — Enables history support. -
placeholderattribute and constraint validation on forms — Firefox 4 - Sections and outlines — Firefox 4
- History API — Firefox 4 — Together, we make the history.
-
navigator.onLineproperty — Firefox 4 — Actualy it's not working due to a bug. -
window.postMessagemethod — Firefox 6 — Used as a zero timeout to enable multi-threaded script executions. -
HTMLCanvasElement.toBlobmethod — Firefox 19 -
sandboxattbute on theiframeelement — Firefox 20 — For attachment browser. -
location.originproperty — Firefox 21 -
mainelement — Firefox 21 -
timeelement — Firefox 22 -
HTMLTableElement.createTBodymethod — Firefox 25
-
document.elementFromPoint— CSSOM, Firefox 3 — Detects an element at a specified position. -
Element.childrenproperty — Firefox 3.5 -
Element.firstElementChildproperty — Firefox 3.5 -
Element.nextElementSiblingproperty — Firefox 3.5 -
Element.previousElementSiblingproperty — Firefox 3.5 -
Element.querySelectormethod — Selectors API, Firefox 3.5 -
Element.querySelectorAllmethod — Selectors API, Firefox 3.5 -
Element.classListproperty — Firefox 3.6 -
MozScrolledAreaChangedevent — Firefox 3.6, non-standard — Detect when a DOM element is resized with hidden iframes -
Element.datasetproperty — Firefox 6 -
MediaQueryListand thewindow.matchMediamethod — CSSOM, Firefox 6 — Changes the layout responsively. -
Element.parentElementproperty — Firefox 9 -
CustomEvent— Firefox 11 -
MutationObserver— Firefox 14 — Used to observe item selections on list controls and adjust the height of custom scrollbars. -
MouseEvent.buttonsproperty — Firefox 15 -
KeyboardEvent.getModifierState— Firefox 15 -
Element.scrollTopMaxproperty — Firefox 16 -
wheelevent — Firefox 17 -
Element.removemethod — Firefox 23 -
DocumentFragmentconstructor — Firefox 24 -
KeyboardEvent.key— Firefox 29 -
Element.getBoxQuadsmethod — Firefox 31 — ReplacesElement.getBoundingClientRect -
CSS.escape— CSSOM, Firefox 31 -
Iterable
StyleSheetList— Firefox 31 -
Iterable
CSSRuleList— Firefox 32 -
Element.matchesmethod — Selectors API, unprefixed with Firefox 34 -
Element.closest— Firefox 35 -
element.styleproperty accessor — CSSOM extension, Firefox 35 -
element.scrollIntoViewoptions — Firefox 36 -
Iterable
URLSearchParams— Firefox 44 -
ParentNode.prependmethod and friends — Firefox 49 -
rel=noopener— Firefox 52 -
focusin/focusoutevents — Firefox 52 -
Construct
URLSearchParamsfrom array — Firefox 53 -
Construct
URLSearchParamsfrom object — Firefox 54
-
CSS.supports— CSSOM, Firefox 23 -
navigator.languages— Firefox 32 — for better l10n - Font Loading API — Firefox 35
-
Function.callmethod — Firefox 1 -
EventListener.handleEventmethod — Firefox 1 — This is relatively obscure but convenient "catch-all" event handler. -
Date.toLocaleFormatmethod — Firefox 1, non-standard — Used to simply format dates. - Destructuring assignment — Firefox 2 — Used in an array sort function and a column reordering function.
-
Iterator— Firefox 2 — While it's not included in the latest ECMAScript 6 spec, this constructor is really useful to make any objects iterable. -
letstatement — Firefox 2 - Expression closures — Firefox 3
- Native JSON — Firefox 3.5
- Strict mode — Firefox 4
-
Object.createmethod — Firefox 4 -
Object.definePropertiesmethod — Firefox 4 -
Object.keysmethod — Firefox 4 -
Array.isArraymethod — Firefox 4 -
Function.bindmethod — Firefox 4 -
WeakMap— Firefox 6 -
Set— Firefox 13 -
Map— Firefox 13 -
for...ofstatement — Firefox 13 — This is useful but slow in Firefox. - Default parameters — Firefox 15 — Already familiar in Python, PHP, etc.
- Rest parameters — Firefox 15
-
Number.isNaNmethod — Firefox 15 - Spread operator of array — Firefox 16
-
MapandSetiteration — Firefox 17 -
String.startsWithmethod — Firefox 17 -
String.containsmethod — Firefox 18 -
Proxy— Firefox 18 — This is really useful to observe properties in objects and arrays. -
Map.keys— Firefox 20 -
Arrow functions — Firefox 22 — This is really useful, not only making functions simpler but also avoiding the hell of the
thiskeyword without having to rely onFunction.bind. -
Number.parseFloatmethod — Firefox 25 -
Number.parseIntmethod — Firefox 25 -
Array.prototype.find,Array.prototype.findIndex— Firefox 25 -
Spread operator of function calls — Firefox 27 — Replaces
Function.apply. -
Array.entries— Firefox 28 -
Promise— Firefox 29 - Internationalization API — Firefox 29
-
Array comprehensions — ES6 compliant with Firefox 30 — Replaces
Array.mapandArray.filter. - Object initializer: shorthand property names — Firefox 33
- Template Literals — Firefox 33
- Object initializer: computed property names — Firefox 34
- Object initializer: shorthand method names — Firefox 34 — in classes
-
Object.assign— Firefox 34 -
Symbol.iterator— Firefox 36 -
Object.entries— Firefox 45 - Classes — Firefox 45
- Default values in destructuring — Firefox 47
- ES6 compatible
const— Firefox 51 - Internationalization API time zone support — Firefox 52
- Async functions — Firefox 52
- Async Iteration — Firefox 55, currently Nightly only
- Modules — Firefox future
-
border-radiusproperty — Firefox 1 -
-moz-user-selectproperty — Firefox 1, non-standard -
:-moz-window-inactivepseudo-class — Firefox 1, non-standard — Behaves like native desktop apps. -
::-moz-selectionpseudo-element — Firefox 1, non-standard -
-moz-image-rectfunctional notation — Firefox 1, non-standard — Clips images easily. -
:-only-childpseudo-class — Firefox 1.5 -
rgbafunctional notation — Firefox 3 - Web fonts — Firefox 3.5
- Media queries — Firefox 3.5
- Transforms — Firefox 3.5
-
box-shadowproperty — Firefox 3.5 -
pointer-eventsproperty — Firefox 3.6 -
background-sizeproperty — Firefox 3.6 -
-moz-touch-enabledmedia feature — Firefox 3.6, non-standard — Detects touch-enabled devices. -
background-clipproperty — Firefox 4 -
:-moz-focusringpseudo-class — Firefox 4, non-standard -
:-moz-anypseudo-class — Firefox 4 -
calcfunctional notation — Firefox 4 — Remember, the never standardized JSSS spec had this feature (as well as variables and basic media queries) in 1996! A part of the black history of the Web. -
-moz-elementfunctional notation — Firefox 4 — Used in conjunction with Canvas to draw reordering table columns. That visual effect cannot be done with DOM manipulations. Really cool. -
remunit — Firefox 4 - Transitions — Firefox 4
- Animations — Firefox 4 — Used for loading icons aka throbbers.
-
text-decoration-colorproperty — Firefox 6 -
text-overflowproperty — Firefox 7 -
::-moz-placeholderpseudo-element — Firefox 19 - Flexible boxes — Firefox 22
-
box-sizingproperty — Unprefixed with Firefox 29 -
position:sticky— Firefox 31 - Variables — Firefox 31
-
filterproperty — Firefox 35 -
object-fitproperty — Firefox 36
- Multi-column layouts — Firefox 1.5
-
page-break-insideproperty — Firefox 19 — Can be used in the Settings page combined with a multi-column layout. -
background-blend-mode— Firefox 30 -
mix-blend-mode— Firefox 32 -
will-changeproperty — Firefox 36 -
display:content— Firefox 37 -
@media (pointer: coarse)— Firefox future — Detect touch devices, can replace non-standard(-moz-touch-enabled: 1) -
attrfunction — Firefox future — the CSS3 syntax allows replacing inline styles withdataattributes. -
:haspseudo class
- SVG — Firefox 1.5 — For fallback avatar images.
- Drag and drop — Firefox 3.5 — Attach files.
-
ProgressEvent— Firefox 3.5 — Attach files. - File API — Firefox 3.6 — Attach files.
-
X-Frame-OptionsHTTP response header — Firefox 3.6.9 - IndexedDB — Firefox 4
- WebSockets — Firefox 4 — Supports Bugzilla Change Notification System.
-
URL.createObjectURL— Firefox 4 - HTTP Strict Transport Security — Firefox 4
- Touch events — Firefox 6 on Android — Enables swipe browsing.
- Fullscreen API — Firefox 9
- Page Visibility API — Firefox 10 — Stop the datetime updater when the document is not visible.
-
App manifest and the
navigator.mozAppsproperty — Firefox 11, non-standard — Makes BzDeck an Open Web App. - Network Information API — Firefox 12 — Provides an option to show attachments inline only over Wi-Fi
-
Blobconstructor — Firefox 13 — Attach files. - Clipboard API — Firefox 22
- Notifications — Firefox 22 — Notifies new bugs.
-
templateelement — Web Components, Firefox 22 - Content Security Policy — Firefox 23 (updated)
-
URLconstructor — Firefox 26 -
URLSearchParams— Firefox 29 - Shared Worker — Firefox 29 — Read local files for upload; decode attachments; send XHR requests. Separate the business logic from the UI (in-progress).
- WOFF 2.0 — Firefox 35
-
MediaDevices.getUserMedia— Firefox 36 — Access camera to scan QR code for a seamless sign-in experience on mobile - Broadcast Channel API — Firefox 38
- Fetch API — Firefox 39
- Channel Messaging API — Firefox 41
- Service Worker API — Firefox 41 — Re-enable the offline support.
- Directory Upload API — Firefox 42 — Select a folder to upload all files in it.
- Permissions API — Firefox 45
-
FileReaderon worker — Firefox 46 - Web Animations API — Firefox 48 — Replace the CSS-based tricky marquee effect on the threads.
- Intersection Observer API — Firefox 54 — Defer loading of avatars and attachments.
- WAI-ARIA — This is not just an accessibility spec but also a kind of a Web application markup language. It's the heart of BzDeck. We have a variety of app widgets in the FlareTail.js library including tabs, grids, menus, trees and scrollbars. While some widgets have been added to HTML5, WAI-ARIA-driven widgets give us maximum flexibility in design and control.
- Schema.org (Microdata) — Enables structured data markup.
- Navigation Timing API — Firefox 7
- Vibration API — Firefox 11 — Notifies new bugs.
- FileHandle API — Firefox 15
- Web Audio API — Firefox 23 — Notifies new bugs.
- Canvas 2D API on worker — Firefox 47, behind a pref
- Selection Events API — Firefox 52
-
requestIdleCallback— Firefox 55 - Resize Observer API — Firefox future — for the custom scrollbar widget.
- Pointer Events API — Firefox future
- Web Components — Firefox future — This will completely change the way we build apps.
- Other WebAPIs if possible
Though Web applications should be cross-browser in nature, Firefox is the only browser currently supported by BzDeck due to the lack of resources. This decision won't be a problem for the meantime as the target user base of the app is Mozilla developers. We'll work on supporting other modern browsers once we implement the most of the planned features.
Those are our blocker bugs.
- Bug 654579 - navigator.onLine status for Offline Applications (navigator.onLine always returns true for desktop Firefox unless "work offline" is manually selected) — Fixed with Firefox 41
- Bug 656164 - dragleave/dragexit not fired when dragging leaves the window — Unresolved, a workaround available
- Bug 687758 - Any cross-origin requests fail if instantiated from offline cache even while online — Fixed with Firefox 37
- Bug 706209 - have a way to style the selection in inactive windows (apply ::-moz-selection or add similar but different way) — Unresolved
- Bug 739396 - The CSS rule "-moz-user-select: none" no longer disables text selection when using "Ctrl+a". — Fixed with Firefox 35, a workaround available
- Bug 756364 - onoffline and ononline events should fire when connection status changes — Fixed with Firefox 40
- Bug 779324 - Fullscreen requests from touch events are denied - Unresolved, breaks fullscreen support, a workaround available
- Bug 781982 - IndexedDB does not function in private browsing mode - Unresolved
- Bug 827346 - indexedDB is deactivated in WebAppRT — Fixed with Firefox 25
- Bug 841920 - SVG inside of a Blob cannot access local references via and paint-servers — Unresolved
- Bug 874580 - IonMonkey: Optimize for .. of — Fixed with Firefox 25, a performance issue
- Bug 894874 - document.selectedStyleSheetSet erroneously reports empty string — Fixed with Firefox 25, a workaround available
- Bug 895223 - Can't JSON stringify a proxy to an array — Fixed with Firefox 40, a workaround available
- Bug 895974 - document.firstElementChild is not defined — Fixed with Firefox 25, a workaround available
- Bug 927349 - Delay effective start of CSS animations and transitions till after the rendering of their first frame — Fixed with Firefox 37, a performance issue
- Bug 988993 - Ion-compile scripts containing arrow functions — Fixed with Firefox 31, a performance issue
- Bug 989204 - Don't use bound functions for arrow functions — Fixed with Firefox 31, a performance issue
- Bug 999021 - CSS position:sticky is buggy on B2G/Keon — Unresolved, a workaround available
- Bug 1089095 - CSS transition is interrupted — Fixed with Firefox 37?
- Bug 1160418 - B2G: MouseEvent.buttons now returns 0 instead of 1 — Unresolved, a workaround available
- Bug 1183897 - window.open() doesn't work on Android WebAppRT — Unresolved
BzDeck uses Bugzilla's REST API and the real-time Change Notification System.
- Bug 1032307 - Bugzfeed update command returns a wrong date format — Unresolved, a workaround available
- Bug 1078009 - Changes/history now include some wrong field names — Unresolved, a workaround available
- Bug 1079596 - bugzfeed seems broken — Unresolved
- Bug 1169040 - Cannot retrieve multiple bugs/users when one or more entries are private or not found — Unresolved
- Bug 1169181 - The bug_user_last_visit method returns an empty array for old bugs — Unresolved
- Bug 994896 - Add the ability to get comments and attachments using Bug.get
- Bug 1051056 - The REST API needs to be versioned so that new changes can be made that do not break compatibility
- Bug 1138772 - Support QR code authentication
- Bug 1175643 - Rewrite auth delegation to use a server-side POST instead of a client-side GET to delegate API Key