chromium/chrome/test/data/extensions/platform_apps/web_view/geolocation/geolocation_access_guest.html

<!--
Copyright 2013 The Chromium Authors
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<html>
  <head>
    <script type="text/javascript">
      // A guest that requests geolocation.
      // Notifies the embedder about the result of the request (success/fail)
      // via post message. Note that the embedder has to initiate a postMessage
      // first so that guest has a reference to the embedder's window.

      // The window reference of the embedder to send post message reply.
      var embedderWindowChannel = null;

      // Url of the iframe, if set via postMessage, then the guest also loads an
      // <iframe>.
      var iframeURL;

      var g_testName = 'uninitialized';
      var expectedTotalCallbackCount;
      var successCallbackCount;
      var totalCallbackCount;
      var lastLat = -181;
      var lastLng = -181;
      var lastLatLng = [];

      var maybeNotifyEmbedder = function() {
        console.log('maybeNotifyEmbedder' +
            ', expectedTotalCallbackCount: ' + expectedTotalCallbackCount +
            ', successCallbackCount: ' + successCallbackCount +
            ', totalCallbackCount: ' + totalCallbackCount);
        if (expectedTotalCallbackCount == totalCallbackCount) {
          var status = (expectedTotalCallbackCount == successCallbackCount) ?
              'access-granted' : 'access-denied';
          var responseArray = [g_testName, status];
          if (lastLat != -181) {
            responseArray.push(lastLat);
            responseArray.push(lastLng);
          }
          notifyEmbedder(responseArray);
        }
      };

      var notifyEmbedder = function(msg_array) {
        embedderWindowChannel.postMessage(JSON.stringify(msg_array), '*');
      };

      var startTest = function() {
        totalCallbackCount = 0;
        successCallbackCount = 0;
        expectedTotalCallbackCount = 1;
        if (iframeURL) {
          // The iframe will initiate another geolocation request.
          ++expectedTotalCallbackCount;
        }

        window.console.log('Call getCurrentPosition');
        navigator.geolocation.getCurrentPosition(onGeolocationSuccess,
                                                 onGeolocationFailure);
      };


      var onGeolocationSuccess = function(position) {
        ++successCallbackCount;
        ++totalCallbackCount;
        console.log('onGeolocationSuccess, successCallbackCount: ' +
                    successCallbackCount +
                    'totalCallbackCount: ' + totalCallbackCount);

        lastLat = position.coords.latitude;
        lastLng = position.coords.longitude;
        maybeNotifyEmbedder();

        if (iframeURL) {
          document.querySelector('#iframe-container').innerHTML =
              '<iframe src="' + iframeURL + '" ' +
              '  width="100" height="100"></iframe>';
          iframeURL = '';
        }
      };

      var onGeolocationFailure = function(err) {
        ++totalCallbackCount;
        console.log('onGeolocationFailure, totalCallbackCount: ' +
                    totalCallbackCount);
        maybeNotifyEmbedder();
      };

      // Callback entry points for the <iframe>.
      window['onIframeGeolocationSuccess'] = onGeolocationSuccess;
      window['onIframeGeolocationFailure'] = onGeolocationFailure;

      var onPostMessageReceived = function(e) {
        window.console.log('guest.onPostMessageReceived');
        var data = JSON.parse(e.data);
        if (data[0] == 'check-geolocation-permission') {
          g_testName = data[1];
          iframeURL = data[2];
          embedderWindowChannel = e.source;
          // Start the test once we have |embedderWindowChannel|.
          startTest();
        }
      };
      window.addEventListener('message', onPostMessageReceived, false);
    </script>
  </head>
  <body>
    <div>This is a guest that requests geolocation.</div>
    <div id="iframe-container"></div>
    <script>
      console.log('Guest loaded');
    </script>
  </body>
</html>