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