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 |