Index: extensions/renderer/resources/printer_provider_custom_bindings.js |
diff --git a/extensions/renderer/resources/printer_provider_custom_bindings.js b/extensions/renderer/resources/printer_provider_custom_bindings.js |
index 9bf9fa27bf09f7a7c88208051cd20077c2d409bc..5ca459a7e33537cc556e68e0629cbe92b74d51e9 100644 |
--- a/extensions/renderer/resources/printer_provider_custom_bindings.js |
+++ b/extensions/renderer/resources/printer_provider_custom_bindings.js |
@@ -6,6 +6,7 @@ var binding = require('binding').Binding.create('printerProvider'); |
var printerProviderInternal = require('binding').Binding.create( |
'printerProviderInternal').generate(); |
var eventBindings = require('event_bindings'); |
+var blobNatives = requireNative('blob_natives'); |
var printerProviderSchema = |
requireNative('schema_registry').GetSchema('printerProvider') |
@@ -29,9 +30,15 @@ var validate = require('schemaUtils').validate; |
// Handles a chrome.printerProvider event as described in the file comment. |
// |eventName|: The event name. |
+// |prepareArgsForDispatch|: Function called before dispatching the event to |
+// the extension. It's called with original event |args| list and callback |
+// that should be called when the |args| are ready for dispatch. The |
+// callbacks should report whether the argument preparation was successful. |
+// The function should not change the first argument, which contains the |
+// request id. |
// |resultreporter|: The function that should be called to report event result. |
-// One of chrome.printerProviderInternal API functions. |
-function handleEvent(eventName, resultReporter) { |
+// One of chrome.printerProviderInternal API functions. |
+function handleEvent(eventName, prepareArgsForDispatch, resultReporter) { |
eventBindings.registerArgumentMassager( |
'printerProvider.' + eventName, |
function(args, dispatch) { |
@@ -69,15 +76,44 @@ function handleEvent(eventName, resultReporter) { |
} |
}; |
- dispatch(args.slice(1).concat(reportResult)); |
+ prepareArgsForDispatch(args, function(success) { |
+ if (!success) { |
+ // Do not throw an exception since the extension should not yet be |
+ // aware of the event. |
+ resultReporter(args[0] /* requestId */, null); |
+ return; |
+ } |
+ dispatch(args.slice(1).concat(reportResult)); |
+ }); |
}); |
} |
-handleEvent('onGetPrintersRequested', printerProviderInternal.reportPrinters); |
+// Sets up printJob.document property for a print request. |
+function createPrintRequestBlobArguments(args, callback) { |
+ printerProviderInternal.getPrintData(args[0] /* requestId */, |
+ function(blobInfo) { |
+ if (chrome.runtime.lastError) { |
+ callback(false); |
+ return; |
+ } |
+ |
+ // |args[1]| is printJob. |
+ args[1].document = blobNatives.TakeBrowserProcessBlob( |
+ blobInfo.blobUuid, blobInfo.type, blobInfo.size); |
+ callback(true); |
+ }); |
+} |
+ |
+handleEvent('onGetPrintersRequested', |
+ function(args, callback) { callback(true); }, |
+ printerProviderInternal.reportPrinters); |
handleEvent('onGetCapabilityRequested', |
+ function(args, callback) { callback(true); }, |
printerProviderInternal.reportPrinterCapability); |
-handleEvent('onPrintRequested', printerProviderInternal.reportPrintResult); |
+handleEvent('onPrintRequested', |
+ createPrintRequestBlobArguments, |
+ printerProviderInternal.reportPrintResult); |
exports.binding = binding.generate(); |