Preflight
Checking compatibility...


navigator.registerProtocolHandler()
, window.requestAnimationFrame()
,
Page Visibility API.




--enable-fullscreen
flag for 15.




Checking compatibility...
navigator.registerProtocolHandler()
, window.requestAnimationFrame()
,
Page Visibility API.
--enable-fullscreen
flag for 15.
-
Slides: bit.ly/edge-11
Common technique for JS animations:
window.setTimeout(function() { // move element. Call this again. }, 1000 / 60); // 60fps.
Preferred technique:
window.requestAnimationFrame = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame; var reqId_ = null; (function callback(time) { // time is the Unix time. // move element. reqId_ = window.requestAnimationFrame(callback, opt_elem /* bounding elem */); })();
display:none
)
function draw() { var now = new Date().getTime(); // update models. paintScene(canvas); window.setTimeout(draw, 10); } draw();
function draw(time) { // update models. paintScene(canvas); window.requestAnimationFrame(draw, canvas); } draw();
Determine if your app is visible or not:
document.addEventListener('visibilitychange', function(e) { console.log('hidden:' + document.hidden, 'state:' + document.visibilityState) }, false);
Prerendering pages:
<link rel="prerender" href="http://example.org/index.html">
Status:
if (navigator.onLine) { console.log('ONLINE!'); } else { console.log('Connection flaky'); }
Online/offline events:
window.addEventListener('online', function(e) { // Re-sync data with server. }, false); window.addEventListener('offline', function(e) { // Queue up events for server. }, false);
Web Intents is a framework for client-side service discovery and inter-application communication
Declare intention to handle image sharing:
<intent action="http://webintents.org/share" type="image/*" />
App says it wants to use someone's sharing functionality:
var intent = new Intent(); intent.action = 'http://webintents.org/share'; intent.type = 'image/*'; intent.data = [imgData]; window.navigator.startActivity(intent);
( 2b. user selects which awesome service to use )
Passed data ( optional ) is set on page load:
window.intent.data
Then what?
Nothing! - you have just integrated your apps and services
...but there's more!
Client:
var intent = new Intent('http://webintents.org/pick', 'image/*'); window.navigator.startActivity(intent, function(intentData) { var img = document.querySelector('img'); img.src = intentData.data[0]; });
Service: can post a callback message when it's done:
window.intent.postResult([ ... some data ... ]);
Plugin-free camera, microphone, device access.
<video autoplay controls></video> <input type="button" value="⚫" onclick="record(this)" id="start"> <input type="button" value="◼" onclick="stop(this)" id="stop" disabled>
var localMediaStream, recorder; var record = function(button) { recorder = mediaStream.recorder(); }; var stop = function(button) { mediaStream.stop(); recorder.getRecordedData(function(blob) { // Upload blob using XHR2. }); }; window.navigator.getUserMedia('video', function(stream) { document.querySelector('video').src = window.URL.createObjectURL(stream); localMediaStream = stream; }, function(e) { console.log(e); });
<video width="300" src="movie.webm" controls></video> <button onclick="enterFullscreen()">Get Huge!</button>
function enterFullscreen() { var elem = document.querySelector('body'); elem.onwebkitfullscreenchange = function(e) { console.log("Entered fullscreen!"); elem.onwebkitfullscreenchange = onFullscreenExit; }; elem.webkitRequestFullScreen(); }
Control of the entire document and elements:
document.webkitIsFullScreen ( bool ) document.webkitCurrentFullScreenElement ( DOMElement ) document.webkitFullScreenKeyboardInputAllowed ( bool ) document.webkitCancelFullScreen();
Element.webkitRequestFullScreen(); //Element.webkitRequestFullScreenWithKeys();
Control of media elements:
MediaElement.webkitSupportsFullscreen ( bool ) MediaElement.webkitDisplayingFullscreen ( bool ) MediaElement.webkitEnterFullScreen() MediaElement.webkitExitFullScreen()
The demand for RTC is real!
...all browser based. All requiring a special download or Flash
high quality real-time voice/video communication in the browser
var ctx = new window.webkitAudioContext(); function playSound(arrayBuffer) { // Obtain arrayBuffer from XHR2. ctx.decodeAudioData(arrayBuffer, function(buffer) { var src = ctx.createBufferSource(); src.buffer = buffer; src.looping = false; src.connect(ctx.destination); src.noteOn(0); // Play immediately. }, function(e) { console.log(e); }); }
Shoot:
var ctx = new webkitAudioContext(); var analyser = ctx.createAnalyser(); function initAudio(arrayBuffer) { ctx.decodeAudioData(arrayBuffer, function(buffer) { var src = ctx.createBufferSource(); src.buffer = buffer; src.connect(analyser); // src -> analyser -> destination analyser.connect(ctx.destination); render(src); }, function(e) { console.log('Error decoding audio file', e); }); } function render(src) { (function callback(timeStamp) { var byteData = new Uint8Array(analyser.frequencyBinCount); analyser.getByteFrequencyData(byteData); // draw byteData to <canvas> visualization... window.requestAnimationFrame(callback, src); })(); }
Meta tag:
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
Header:
X-UA-Compatible: IE=Edge,chrome=1