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

Side by Side Diff: extensions/renderer/resources/send_request.js

Issue 482603002: Unify logic of stack trace generation for extension errors (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update expected stack trace length Created 6 years, 4 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 unified diff | Download patch
OLDNEW
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
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
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
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;
OLDNEW
« no previous file with comments | « extensions/renderer/resources/event.js ('k') | extensions/renderer/resources/uncaught_exception_handler.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698