| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 var binding = require('binding').Binding.create('printerProvider'); | 5 var binding = require('binding').Binding.create('printerProvider'); |
| 6 var printerProviderInternal = require('binding').Binding.create( | 6 var printerProviderInternal = require('binding').Binding.create( |
| 7 'printerProviderInternal').generate(); | 7 'printerProviderInternal').generate(); |
| 8 var eventBindings = require('event_bindings'); | 8 var eventBindings = require('event_bindings'); |
| 9 var blobNatives = requireNative('blob_natives'); |
| 9 | 10 |
| 10 var printerProviderSchema = | 11 var printerProviderSchema = |
| 11 requireNative('schema_registry').GetSchema('printerProvider') | 12 requireNative('schema_registry').GetSchema('printerProvider') |
| 12 var utils = require('utils'); | 13 var utils = require('utils'); |
| 13 var validate = require('schemaUtils').validate; | 14 var validate = require('schemaUtils').validate; |
| 14 | 15 |
| 15 // Custom bindings for chrome.printerProvider API. | 16 // Custom bindings for chrome.printerProvider API. |
| 16 // The bindings are used to implement callbacks for the API events. Internally | 17 // The bindings are used to implement callbacks for the API events. Internally |
| 17 // each event is passed requestId argument used to identify the callback | 18 // each event is passed requestId argument used to identify the callback |
| 18 // associated with the event. This argument is massaged out from the event | 19 // associated with the event. This argument is massaged out from the event |
| 19 // arguments before dispatching the event to consumers. A callback is appended | 20 // arguments before dispatching the event to consumers. A callback is appended |
| 20 // to the event arguments. The callback wraps an appropriate | 21 // to the event arguments. The callback wraps an appropriate |
| 21 // chrome.printerProviderInternal API function that is used to report the event | 22 // chrome.printerProviderInternal API function that is used to report the event |
| 22 // result from the extension. The function is passed requestId and values | 23 // result from the extension. The function is passed requestId and values |
| 23 // provided by the extension. It validates that the values provided by the | 24 // provided by the extension. It validates that the values provided by the |
| 24 // extension match chrome.printerProvider event callback schemas. It also | 25 // extension match chrome.printerProvider event callback schemas. It also |
| 25 // ensures that a callback is run at most once. In case there is an exception | 26 // ensures that a callback is run at most once. In case there is an exception |
| 26 // during event dispatching, the chrome.printerProviderInternal function | 27 // during event dispatching, the chrome.printerProviderInternal function |
| 27 // is called with a default error value. | 28 // is called with a default error value. |
| 28 // | 29 // |
| 29 | 30 |
| 30 // Handles a chrome.printerProvider event as described in the file comment. | 31 // Handles a chrome.printerProvider event as described in the file comment. |
| 31 // |eventName|: The event name. | 32 // |eventName|: The event name. |
| 33 // |prepareArgsForDispatch|: Function called before dispatching the event to |
| 34 // the extension. It's called with original event |args| list and callback |
| 35 // that should be called when the |args| are ready for dispatch. The |
| 36 // callbacks should report whether the argument preparation was successful. |
| 37 // The function should not change the first argument, which contains the |
| 38 // request id. |
| 32 // |resultreporter|: The function that should be called to report event result. | 39 // |resultreporter|: The function that should be called to report event result. |
| 33 // One of chrome.printerProviderInternal API functions. | 40 // One of chrome.printerProviderInternal API functions. |
| 34 function handleEvent(eventName, resultReporter) { | 41 function handleEvent(eventName, prepareArgsForDispatch, resultReporter) { |
| 35 eventBindings.registerArgumentMassager( | 42 eventBindings.registerArgumentMassager( |
| 36 'printerProvider.' + eventName, | 43 'printerProvider.' + eventName, |
| 37 function(args, dispatch) { | 44 function(args, dispatch) { |
| 38 var responded = false; | 45 var responded = false; |
| 39 | 46 |
| 40 // Validates that the result passed by the extension to the event | 47 // Validates that the result passed by the extension to the event |
| 41 // callback matches the callback schema. Throws an exception in case of | 48 // callback matches the callback schema. Throws an exception in case of |
| 42 // an error. | 49 // an error. |
| 43 var validateResult = function(result) { | 50 var validateResult = function(result) { |
| 44 var eventSchema = | 51 var eventSchema = |
| (...skipping 17 matching lines...) Expand all Loading... |
| 62 var finalResult = null; | 69 var finalResult = null; |
| 63 try { | 70 try { |
| 64 validateResult(result); // throws on failure | 71 validateResult(result); // throws on failure |
| 65 finalResult = result; | 72 finalResult = result; |
| 66 } finally { | 73 } finally { |
| 67 responded = true; | 74 responded = true; |
| 68 resultReporter(args[0] /* requestId */, finalResult); | 75 resultReporter(args[0] /* requestId */, finalResult); |
| 69 } | 76 } |
| 70 }; | 77 }; |
| 71 | 78 |
| 72 dispatch(args.slice(1).concat(reportResult)); | 79 prepareArgsForDispatch(args, function(success) { |
| 80 if (!success) { |
| 81 // Do not throw an exception since the extension should not yet be |
| 82 // aware of the event. |
| 83 resultReporter(args[0] /* requestId */, null); |
| 84 return; |
| 85 } |
| 86 dispatch(args.slice(1).concat(reportResult)); |
| 87 }); |
| 73 }); | 88 }); |
| 74 } | 89 } |
| 75 | 90 |
| 76 handleEvent('onGetPrintersRequested', printerProviderInternal.reportPrinters); | 91 // Sets up printJob.document property for a print request. |
| 92 function createPrintRequestBlobArguments(args, callback) { |
| 93 printerProviderInternal.getPrintData(args[0] /* requestId */, |
| 94 function(blobInfo) { |
| 95 if (chrome.runtime.lastError) { |
| 96 callback(false); |
| 97 return; |
| 98 } |
| 99 |
| 100 // |args[1]| is printJob. |
| 101 args[1].document = blobNatives.TakeBrowserProcessBlob( |
| 102 blobInfo.blobUuid, blobInfo.type, blobInfo.size); |
| 103 callback(true); |
| 104 }); |
| 105 } |
| 106 |
| 107 handleEvent('onGetPrintersRequested', |
| 108 function(args, callback) { callback(true); }, |
| 109 printerProviderInternal.reportPrinters); |
| 77 | 110 |
| 78 handleEvent('onGetCapabilityRequested', | 111 handleEvent('onGetCapabilityRequested', |
| 112 function(args, callback) { callback(true); }, |
| 79 printerProviderInternal.reportPrinterCapability); | 113 printerProviderInternal.reportPrinterCapability); |
| 80 | 114 |
| 81 handleEvent('onPrintRequested', printerProviderInternal.reportPrintResult); | 115 handleEvent('onPrintRequested', |
| 116 createPrintRequestBlobArguments, |
| 117 printerProviderInternal.reportPrintResult); |
| 82 | 118 |
| 83 exports.binding = binding.generate(); | 119 exports.binding = binding.generate(); |
| OLD | NEW |