// Copyright 2013 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 SendResponse = requireNative('pepper_request_natives').SendResponse; var GetAvailability = requireNative('v8_context').GetAvailability; var utils = require('utils'); var schemaRegistry = requireNative('schema_registry'); function takesCallback(targetName) { var parts = $String.split(targetName, '.'); var schemaName = $Array.join($Array.slice(parts, 0, parts.length - 1), '.'); var functionName = parts[parts.length - 1]; var functions = schemaRegistry.GetSchema(schemaName).functions; var parameters = utils.lookup(functions, 'name', functionName).parameters; return parameters.length > 0 && parameters[parameters.length - 1].type == 'function'; } function resolveName(name) { var availability = GetAvailability(name); if (!availability.is_available) throw Error(availability.message); var item = chrome; var nameComponents = $String.split(name, '.'); for (var i = 0; i < nameComponents.length; i++) { item = item[nameComponents[i]]; } return item; } function startRequest(targetName, requestId) { var args = $Array.slice(arguments, 2); try { var hasCallback = takesCallback(targetName); if (hasCallback) { args.push(function() { var error = null; if (chrome.runtime.lastError) error = chrome.runtime.lastError.message; SendResponse(requestId, $Array.slice(arguments), error); }); } var target = resolveName(targetName); var result = $Function.apply(target, null, args); if (!hasCallback) SendResponse(requestId, [result], null); } catch (e) { // TODO(sammc): Catch this from C++. return e.message; } } exports.startRequest = startRequest;