1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file.
4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)(function() {
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  'use strict';
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  /**
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * A map of view ID (which identifies a particular PDF viewer instance) to
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * stream object.
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * @type {Object.<string, Object>}
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   */
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var streams = {};
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /**
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * A map of view ID (which identifies a particular PDF viewer instance) to
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * initialization function for that view.
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * @type {Object.<string, Function>}
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   */
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var pluginInitFunctions = {};
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /**
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * If we have received a stream object and an initialization function for a
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * particular PDF viewer instance we know that the extension has loaded in
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * and we can pass it the stream. We can then delete the corresponding map
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * entries.
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * @param {string} viewId The ID of the view to initialize with a stream.
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   */
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function flush(viewId) {
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (viewId in streams && viewId in pluginInitFunctions) {
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pluginInitFunctions[viewId](streams[viewId]);
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delete streams[viewId];
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delete pluginInitFunctions[viewId];
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /**
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * This is called when loading a document with the PDF mime type and passes a
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * stream that points to the PDF file. This may be run before or after we
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * receive a message from the PDF viewer with its initialization function.
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   */
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  chrome.streamsPrivate.onExecuteMimeTypeHandler.addListener(
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    function(streamDetails) {
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Store the stream until we are contacted by the PDF viewer that owns the
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // stream.
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      streams[streamDetails.viewId] = streamDetails;
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      flush(streamDetails.viewId);
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  );
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /**
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * This is called when we receive a message from the PDF viewer indicating
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * it has loaded and is ready to receive a stream of the data.
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   */
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chrome.runtime.onMessage.addListener(
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    function(request, sender, responseFunction) {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Store the initialization function until we receive the stream which
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // corresponds to the PDF viewer.
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pluginInitFunctions[request.viewId] = responseFunction;
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      flush(request.viewId);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  );
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}());
64