| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 handleUncaughtException = require('uncaught_exception_handler').handle; | 5 var exceptionHandler = require('uncaught_exception_handler'); |
| 6 var lastError = require('lastError'); | 6 var lastError = require('lastError'); |
| 7 var logging = requireNative('logging'); | 7 var logging = requireNative('logging'); |
| 8 var natives = requireNative('sendRequest'); | 8 var natives = requireNative('sendRequest'); |
| 9 var processNatives = requireNative('process'); | |
| 10 var validate = require('schemaUtils').validate; | 9 var validate = require('schemaUtils').validate; |
| 11 | 10 |
| 12 // All outstanding requests from sendRequest(). | 11 // All outstanding requests from sendRequest(). |
| 13 var requests = {}; | 12 var requests = {}; |
| 14 | 13 |
| 15 // Used to prevent double Activity Logging for API calls that use both custom | 14 // Used to prevent double Activity Logging for API calls that use both custom |
| 16 // bindings and ExtensionFunctions (via sendRequest). | 15 // bindings and ExtensionFunctions (via sendRequest). |
| 17 var calledSendRequest = false; | 16 var calledSendRequest = false; |
| 18 | 17 |
| 19 // Runs a user-supplied callback safely. | 18 // Runs a user-supplied callback safely. |
| 20 function safeCallbackApply(name, request, callback, args) { | 19 function safeCallbackApply(name, request, callback, args) { |
| 21 try { | 20 try { |
| 22 $Function.apply(callback, request, args); | 21 $Function.apply(callback, request, args); |
| 23 } catch (e) { | 22 } catch (e) { |
| 24 var errorMessage = "Error in response to " + name + ": " + e; | 23 exceptionHandler.handle('Error in response to ' + name, e, request.stack); |
| 25 if (request.stack && request.stack != '') | |
| 26 errorMessage += "\n" + request.stack; | |
| 27 handleUncaughtException(errorMessage, e); | |
| 28 } | 24 } |
| 29 } | 25 } |
| 30 | 26 |
| 31 // Callback handling. | 27 // Callback handling. |
| 32 function handleResponse(requestId, name, success, responseList, error) { | 28 function handleResponse(requestId, name, success, responseList, error) { |
| 33 // The chrome objects we will set lastError on. Really we should only be | 29 // The chrome objects we will set lastError on. Really we should only be |
| 34 // setting this on the callback's chrome object, but set on ours too since | 30 // setting this on the callback's chrome object, but set on ours too since |
| 35 // it's conceivable that something relies on that. | 31 // it's conceivable that something relies on that. |
| 36 var callerChrome = chrome; | 32 var callerChrome = chrome; |
| 37 | 33 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 console.error("Unchecked runtime.lastError while running " + | 82 console.error("Unchecked runtime.lastError while running " + |
| 87 (name || "unknown") + ": " + error + | 83 (name || "unknown") + ": " + error + |
| 88 (request.stack ? "\n" + request.stack : "")); | 84 (request.stack ? "\n" + request.stack : "")); |
| 89 } | 85 } |
| 90 } finally { | 86 } finally { |
| 91 delete requests[requestId]; | 87 delete requests[requestId]; |
| 92 lastError.clear(chrome); | 88 lastError.clear(chrome); |
| 93 if (callerChrome !== chrome) | 89 if (callerChrome !== chrome) |
| 94 lastError.clear(callerChrome); | 90 lastError.clear(callerChrome); |
| 95 } | 91 } |
| 96 }; | |
| 97 | |
| 98 function getExtensionStackTrace(call_name) { | |
| 99 var stack = $String.split(new Error().stack, '\n'); | |
| 100 var id = processNatives.GetExtensionId(); | |
| 101 | |
| 102 // Remove stack frames before and after that weren't associated with the | |
| 103 // extension. | |
| 104 return $Array.join(stack.filter(function(line) { | |
| 105 return line.indexOf(id) != -1; | |
| 106 }), '\n'); | |
| 107 } | 92 } |
| 108 | 93 |
| 109 function prepareRequest(args, argSchemas) { | 94 function prepareRequest(args, argSchemas) { |
| 110 var request = {}; | 95 var request = {}; |
| 111 var argCount = args.length; | 96 var argCount = args.length; |
| 112 | 97 |
| 113 // Look for callback param. | 98 // Look for callback param. |
| 114 if (argSchemas.length > 0 && | 99 if (argSchemas.length > 0 && |
| 115 argSchemas[argSchemas.length - 1].type == "function") { | 100 argSchemas[argSchemas.length - 1].type == "function") { |
| 116 request.callback = args[args.length - 1]; | 101 request.callback = args[args.length - 1]; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 133 // - nativeFunction: the v8 native function to handle the request, or | 118 // - nativeFunction: the v8 native function to handle the request, or |
| 134 // StartRequest if missing. | 119 // StartRequest if missing. |
| 135 // - forIOThread: true if this function should be handled on the browser IO | 120 // - forIOThread: true if this function should be handled on the browser IO |
| 136 // thread. | 121 // thread. |
| 137 // - preserveNullInObjects: true if it is safe for null to be in objects. | 122 // - preserveNullInObjects: true if it is safe for null to be in objects. |
| 138 function sendRequest(functionName, args, argSchemas, optArgs) { | 123 function sendRequest(functionName, args, argSchemas, optArgs) { |
| 139 calledSendRequest = true; | 124 calledSendRequest = true; |
| 140 if (!optArgs) | 125 if (!optArgs) |
| 141 optArgs = {}; | 126 optArgs = {}; |
| 142 var request = prepareRequest(args, argSchemas); | 127 var request = prepareRequest(args, argSchemas); |
| 143 request.stack = getExtensionStackTrace(); | 128 request.stack = exceptionHandler.getExtensionStackTrace(); |
| 144 if (optArgs.customCallback) { | 129 if (optArgs.customCallback) { |
| 145 request.customCallback = optArgs.customCallback; | 130 request.customCallback = optArgs.customCallback; |
| 146 } | 131 } |
| 147 | 132 |
| 148 var nativeFunction = optArgs.nativeFunction || natives.StartRequest; | 133 var nativeFunction = optArgs.nativeFunction || natives.StartRequest; |
| 149 | 134 |
| 150 var requestId = natives.GetNextRequestId(); | 135 var requestId = natives.GetNextRequestId(); |
| 151 request.id = requestId; | 136 request.id = requestId; |
| 152 requests[requestId] = request; | 137 requests[requestId] = request; |
| 153 | 138 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 165 } | 150 } |
| 166 | 151 |
| 167 function clearCalledSendRequest() { | 152 function clearCalledSendRequest() { |
| 168 calledSendRequest = false; | 153 calledSendRequest = false; |
| 169 } | 154 } |
| 170 | 155 |
| 171 exports.sendRequest = sendRequest; | 156 exports.sendRequest = sendRequest; |
| 172 exports.getCalledSendRequest = getCalledSendRequest; | 157 exports.getCalledSendRequest = getCalledSendRequest; |
| 173 exports.clearCalledSendRequest = clearCalledSendRequest; | 158 exports.clearCalledSendRequest = clearCalledSendRequest; |
| 174 exports.safeCallbackApply = safeCallbackApply; | 159 exports.safeCallbackApply = safeCallbackApply; |
| 175 exports.getExtensionStackTrace = getExtensionStackTrace; | |
| 176 | 160 |
| 177 // Called by C++. | 161 // Called by C++. |
| 178 exports.handleResponse = handleResponse; | 162 exports.handleResponse = handleResponse; |
| OLD | NEW |