Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3195)

Unified Diff: chrome/renderer/resources/extensions/certificate_provider_custom_bindings.js

Issue 1232553003: Add new certificateProvider extension API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/resources/extensions/certificate_provider_custom_bindings.js
diff --git a/chrome/renderer/resources/extensions/certificate_provider_custom_bindings.js b/chrome/renderer/resources/extensions/certificate_provider_custom_bindings.js
new file mode 100644
index 0000000000000000000000000000000000000000..6089677b2a8f6e7a1db4bbc2c091e46f0e3105fc
--- /dev/null
+++ b/chrome/renderer/resources/extensions/certificate_provider_custom_bindings.js
@@ -0,0 +1,81 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+var binding = require('binding').Binding.create('certificateProvider');
+var certificateProviderInternal = require('binding').Binding.create(
+ 'certificateProviderInternal').generate();
+var eventBindings = require('event_bindings');
+
+var certificateProviderSchema =
+ requireNative('schema_registry').GetSchema('certificateProvider')
+var utils = require('utils');
+var validate = require('schemaUtils').validate;
+
+// Custom bindings for chrome.certificateProvider API.
+// The bindings are used to implement callbacks for the API events. Internally
+// each event is passed a requestId argument used to identify the callback
+// associated with the event. This argument is massaged out from the event
+// arguments before dispatching the event to consumers. A callback is appended
+// to the event arguments. The callback wraps an appropriate
+// chrome.certificateProviderInternal API function that is used to report the
+// event result from the extension. The function is passed the requestId and
+// values provided by the extension. It validates that the values provided by
+// the extension match chrome.certificateProvider event callback schemas. It
+// also ensures that a callback is run at most once. In case there is an
+// exception during event dispatching, the chrome.certificateProviderInternal
+// function is called with a default error value.
+
+// Handles a chrome.certificateProvider event as described in the file comment.
+// |eventName|: The event name. The first argument of the event must be a
+// request id.
+// |internalReportFunc|: The function that should be called to report results in
+// reply to an event. The first argument of the function must be the request
+// id that was received with the event.
+function handleEvent(eventName, internalReportFunc) {
+ var eventSchema =
+ utils.lookup(certificateProviderSchema.events, 'name', eventName);
+ var callbackSchema = utils.lookup(eventSchema.parameters, 'type', 'function');
+
+ eventBindings.registerArgumentMassager(
+ 'certificateProvider.' + eventName,
+ function(args, dispatch) {
+ var responded = false;
+
+ // Function provided to the extension as the event callback argument.
+ // The extension calls this to report results in reply to the event.
+ // It throws an exception if called more than once and if the provided
+ // results don't match the callback schema.
+ var reportFunc = function(reportArg1, reportArg2) {
+ if (responded) {
+ throw new Error(
+ 'Event callback must not be called more than once.');
+ }
+
+ var reportArgs = [reportArg1];
+ if (reportArg2 !== undefined)
+ reportArgs.push(reportArg2);
+ var finalArgs = [];
+ try {
+ // Validates that the results reported by the extension matche the
+ // callback schema of the event. Throws an exception in case of an
+ // error.
+ validate(reportArgs, callbackSchema.parameters);
+ finalArgs = reportArgs;
+ } finally {
+ responded = true;
+ internalReportFunc.apply(
+ null, [args[0] /* requestId */].concat(finalArgs));
+ }
+ };
+ dispatch(args.slice(1).concat(reportFunc));
+ });
+}
+
+handleEvent('onCertificatesRequested',
+ certificateProviderInternal.reportCertificates);
+
+handleEvent('onSignDigestRequested',
+ certificateProviderInternal.reportSignature);
+
+exports.binding = binding.generate();
« no previous file with comments | « chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc ('k') | chrome/renderer/resources/renderer_resources.grd » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698