reader/android: adds zoom capability

A first pass at zooming into the PDF using:

    window.client.zoom(<value>)

The initial scale is set based on the document dimensions and viewport width.
The value passed into client.zoom(...) can be changed in the future to match any
value and constraints required by the Android code.

This commit closes #44, any future requirements around the PDF web view should
have their own issues created.

Change-Id: Ibc4ca1261bd784b2665e2e98816de7fb59b7f9fc
diff --git a/web/browser/pdf-web-view.js b/web/browser/pdf-web-view.js
index af1f231..62fae6a 100644
--- a/web/browser/pdf-web-view.js
+++ b/web/browser/pdf-web-view.js
@@ -34,6 +34,9 @@
     },
     page: function pagePDF(number) {
       page(atom, { number: number });
+    },
+    zoom: function zoomPDF(value) {
+      zoom(atom, { value: value });
     }
   };
 
@@ -60,7 +63,8 @@
     height: hg.value(window.innerHeight),
     channels: {
       open: open,
-      page: page
+      page: page,
+      zoom: zoom
     }
   });
 
@@ -140,6 +144,26 @@
   }
 }
 
+function zoom(state, data) {
+  assert.ok(data.value, 'data.value is required');
+
+  // Ignore if the page object is unavailable.
+  if (!state.pdf.page()) {
+    return;
+  }
+
+  debug('zooming from "%s" to "%s"', state.scale(), data.value);
+
+  var page = state.pdf.page();
+  var viewport = page.getViewport(data.value);
+
+  // NOTE: By default this will zoom from the center of the viewport, some extra
+  // work will be required zoom from the center location of a pinch gesture.
+  state.width.set(viewport.width);
+  state.height.set(viewport.height);
+  state.scale.set(data.value);
+}
+
 function render(state) {
   return h('.pdf-viewer', [
     canvas(draw, state)