Web APIs – expand what the Web can do

Preview:

DESCRIPTION

Expand what a web application can do with Web APIs. Make your applications more "native". Slides of my talk at code.talks 2014 in Hamburg/Germany

Citation preview

Web APIsexpand what the web can do...

Carsten Sandtner ( ) 2014 - code.talks 14@casarock

Who am I?Carsten Sandtner

Head of Development at //mediaman GmbHMozilla representative

Javascript enthusiast and web developer since 1998.

The first browser war...

Microsoft vs. Netscape!

Arms race of featuresEveryone invented new and "better" features!

support other features? Hell, NO!

And this happened...

Standards? What standards?W3C - ignored..."We know what you want!"

And Web Developers?Implemented pretty good browser detection

And Browser vendors?Browser Vendors wanted to be "supported"

... and this happened:

Faking User AgentsMosaic/0.9 // grandmother of all!Mozilla/2.02 [fr] (WinNT; I) // Netscapes first!Mozilla/4.0 (compatible; MSIE 4.0; Windows 98) // IE4!

Funny? There is more...

Faking User Agents - part 2Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11 // Firefox!Mozilla/5.0 (compatible; Konqueror/Version; OS-or-CPU) KHTML/KHTMLVersion (like Gecko) // KonquerorMozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1 // Safari!

And Chrome?Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13

But Opera?Opera/8.0 (Windows NT 5.1; U; en)

<9 ... >9 has...Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 OPR/15.0.1147.153

*sigh*

At the end: Everything is aMozilla...

and Internet Explorer won the first browser war

Internet Explorer wonDevelopment stopped for 5 years!"Optimized for IE 6!"Standards? IE was the standard!

The second browser war...

The rise of the others

The othersOther browser vendors raised

They keep standards in mind and develop them togetherMozilla (Firefox)KonquerorSafariOperaChrome

Standards, everywhere standards!There is not only one "tool" for the internet

New Feature: Implemented a STANDARD!

Competition?Still exisits, but:Performance!Security!Release cycles!

BenchmarksStandardized

Unique characteristic?Add ons, technical features, developer tools etc..

Developers are being targeted.

“Make the Internet a better place”

The web won!

The "mobile" Web

eh? no.

The "real" mobile Web

Everything changes...We want ...

... access to hardware features

... access Calendar, Addressbooketc.

We got it!But: Lessons learned from the past

Standards!

New technologies need newAPIs

Vendors work togetherService Workers (Google&Mozilla)Web Components (Google&Mozilla)WebGL etc.

“The web is everywhere”

“The web in your hands”

Mobiles need new APIsiPhone 2007: No SDK, just HTML5!A smartphone without a browser? Unbelieveable!Smartphones pushed HTML5

HTML5 based OS

HTML5 OS needs new APIsFirefox OS is open source and with standards in mind

Mozilla introduced new APIs for mobile devicesConsistent use of APIs

APIs submitted to W3CAdopted by other mobile browsers ...

... and desktop browsers

more features, more fun!

Web APIstell me more

Definition“WebAPI is a term used to refer to a suite of devicecompatibility and access APIs that allow Web apps

and content to access device hardware (such asbattery status or the device vibration hardware), as

well as access to data stored on the device (such asthe calendar or contacts list).

By adding these APIs, we hope to expand what theWeb can do today and only proprietary platforms

were able to do in the past.”

DisclaimerSome WebAPIs are not (yet) a standard

I've marked them with a *

CategoriesWeb APIs could be categorized

CommunicationDatamanagementHardware access"other"

CommunicationNetwork Information API.

Bluetooth*, Mobile Connection API*, Network Stats API*, TCP SocketAPI*, Telephony*, WebSMS*, WiFi Information API*.

DatamanagementIndexedDB, Contacts API.

FileHandle API*, Device Storage API*, Settings API*.

Hardware accessLight events, Battery status, Geolocation, Pointer Lock, Proximity,Device orientation, Screen orientation, Vibration API.

WebFM API*, Camera API*, Power Management API*.

"Other"Alarm API, Simple Push API, Web Notifications, Idle API.

Apps API*, Web Activities*, WebPayment API*, Browser API*,Permissions API*, Time/Clock API*.

Examples?

Network ConnectionInformation about the system's connection

var connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;var type = connection.type;

function updateConnectionStatus() { console.log("Connection type is change from " + type + " to " + connection.type); type = connection.type;}

connection.addEventListener('typechange', updateConnectionStatus);

Firefox 12+, Firefox Mobile, Firefox OS, Android 2.2+

IndexedDB“IndexedDB is an API for client-side storage of

significant amounts of structured data and for highperformance searches on this data using indexes. ”

NoSQL DB for Browsers...Deserves an own talk... too complex for this one...

Supported by: Every major Browser on Desktop and every major mobilebrowser ...

... excepted: Safari on iOS < 8

Notification// At first, let's check if we have permission for notification// If not, let's ask for itif (Notification && Notification.permission !== "granted") { Notification.requestPermission(function (status) { if (Notification.permission !== status) { Notification.permission = status; }});}

if (Notification && Notification.permission === "granted") { var n = new Notification("Hi!");}

Notify me!

Desktop: Chrome 5+, Firefox 4+, Opera 25, Safari 6+Mobile: Firefox Mobile 4+, Firefox OS

Light EventsGet current ambient light intensity

window.ondevicelight = function (event) { // Read out the lux value console.log(event.value);};

Current lux: 0Desktop: Firefox 22+

Mobile: Firefox Mobile

Battery StatusInformation about the system's battery charge level and lets you be

notified by events that are sent when the battery level changesvar battery = navigator.battery || navigator.mozBattery || navigator.webkitBattery, info = { charging: battery.charging, chargingTime: parseInt(battery.chargingTime / 60, 10), dischargingTime: parseInt(battery.dischargingTime / 60, 10), level: Math.round(battery.level * 100) };

function updateBatteryStatus() { batterylevel.innerHTML = battery.level * 100 + " %"; batterystatus.innerHTML = battery.charging ? "" : "not";}

battery.addEventListener("chargingchange", updateBatteryStatus);battery.addEventListener("levelchange", updateBatteryStatus);

Battery: Level is and it's charging.Desktop: Firefox 10+ Mobile: Firefox Mobile 10+

Proximity EventsThe proximity events are a handy way to know when a user is close to a

devicewindow.addEventListener('userproximity', function(event) { if (event.near) { console.log('Phone probably on users ear...'); } else { console.log('phone in your hand...'); }});

Detecting device orientationDetection orientation and motion events

window.addEventListener("deviceorientation", handleOrientation, true);

function handleOrientation(event) { var alpha = event.alpha; // Z-Axis var beta = event.beta; // Y-Axis var gamma = event.gamma; // X-Axis

// Do stuff with the new orientation data}

window.addEventListener("devicemotion", handleMotion, true);

function handleMotion(event) { var x = event.accelerationIncludingGravity.x; var y = event.accelerationIncludingGravity.y; var z = event.accelerationIncludingGravity.z; var r = event.rotationRate;}

Information about the speed of changes for the device's position andorientation.

Desktop: Chrome 7+, 3.6+Mobile: Android 3.0, Firefox Mobile 3.6+, Safari Mobile 4.2+

Vibration APIRumble in your pocket!

var pattern = [200, 100, 200, 200, 100],goodVibration = navigator.vibrate(pattern);

Mobile: Android, Firefox Mobile 11+

Screen orientationListening orientation change

screen.addEventListener("orientationchange", function () { console.log("The orientation of the screen is: " + screen.orientation);});

Preventing orientation changescreen.lockOrientation('landscape');

Support is complex: This API is experimental and currently available onFirefox OS and Firefox for Android with a moz prefix, and for Internet

Explorer on Windows 8.1 and above with a ms prefix.

Pointer LockRequest pointer lock on an element

canvas.requestPointerLock = canvas.requestPointerLock || canvas.mozRequestPointerLock || canvas.webkitRequestPointerLock;canvas.requestPointerLock();

Listen for changesdocument.addEventListener('pointerlockchange', lockChangeAlert, false);document.addEventListener('mozpointerlockchange', lockChangeAlert, false);document.addEventListener('webkitpointerlockchange', lockChangeAlert, false);

Exit pointer lockdocument.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock || document.webkitExitPointerLock;

// Attempt to unlockdocument.exitPointerLock();

Desktop: Chrome, Firefox

Page visibilityThe Page Visibility API lets you know when a webpage is visible or in

focusif (document.hidden) { // stop video etc.}

document.addEventListener("visibilitychange", handleVisibilityChange, false);

function handleVisibilityChange() { if (document.hidden) { // stop something. e.g. stop a video, audio etc... } else { // do something else ;) play video, audio... you got it? }}

Currently prefixed (moz, webkit, ms)Desktop: Chrome, Firefox 30+, Safari 7+, Opera 24+, IE10+

Mobile: Chrome Android, Android 4.4+, Firefox Mobile, Firefox OS

*Yawn* Nice...

... but these examples are just....... examples

OKSome live examples...

But first...... some real world examples

BBC NewsNetwork Information API

Warns when cellular connection detected and video should be played

Firefox MarketplaceNetwork Information API

Paying via carrier billing - Cellular detected

Firefox Marketplace 2Network Information API

When WIFI is detected

Confirmation code via SMS

Mozilla Reps - EventsGeolocation

OKNOW! Some live examples...

Ambient lightAmbient Light Demo

NotificationsNotifications Demo

And of course: Have FUN!Fun, fun, fun

Install via AppInstall* APIAppInstall

And on a DeviceVideo

ConclusionStandards are coolWebAPIs allow us to build cooler web appsWebAPIs are not a "mobile"-thingyThe "Web" becomes (more) "native"

Thank you!Carsten Sandtner

Slides & Examples:

@casarock

casarock.github.io

Recommended