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

Side by Side Diff: chrome/renderer/resources/extension_process_bindings.js

Issue 2387002: Prevent extensions from clobbering JSON implementation that extension calls use (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: arv cr changes Created 10 years, 6 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 (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 // This script contains privileged chrome extension related javascript APIs. 5 // This script contains privileged chrome extension related javascript APIs.
6 // It is loaded by pages whose URL has the chrome-extension protocol. 6 // It is loaded by pages whose URL has the chrome-extension protocol.
7 7
8 var chrome = chrome || {}; 8 var chrome = chrome || {};
9 (function() { 9 (function() {
10 native function GetExtensionAPIDefinition(); 10 native function GetExtensionAPIDefinition();
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 "message": error 85 "message": error
86 }; 86 };
87 } 87 }
88 88
89 if (request.customCallback) { 89 if (request.customCallback) {
90 request.customCallback(name, request, response); 90 request.customCallback(name, request, response);
91 } 91 }
92 92
93 if (request.callback) { 93 if (request.callback) {
94 // Callbacks currently only support one callback argument. 94 // Callbacks currently only support one callback argument.
95 var callbackArgs = response ? [JSON.parse(response)] : []; 95 var callbackArgs = response ? [chromeHidden.JSON.parse(response)] : [];
96 96
97 // Validate callback in debug only -- and only when the 97 // Validate callback in debug only -- and only when the
98 // caller has provided a callback. Implementations of api 98 // caller has provided a callback. Implementations of api
99 // calls my not return data if they observe the caller 99 // calls my not return data if they observe the caller
100 // has not provided a callback. 100 // has not provided a callback.
101 if (chromeHidden.validateCallbacks && !error) { 101 if (chromeHidden.validateCallbacks && !error) {
102 try { 102 try {
103 if (!request.callbackSchema.parameters) { 103 if (!request.callbackSchema.parameters) {
104 throw "No callback schemas defined"; 104 throw "No callback schemas defined";
105 } 105 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 // Send an API request and optionally register a callback. 170 // Send an API request and optionally register a callback.
171 function sendRequest(functionName, args, argSchemas, customCallback) { 171 function sendRequest(functionName, args, argSchemas, customCallback) {
172 var request = prepareRequest(args, argSchemas); 172 var request = prepareRequest(args, argSchemas);
173 if (customCallback) { 173 if (customCallback) {
174 request.customCallback = customCallback; 174 request.customCallback = customCallback;
175 } 175 }
176 // JSON.stringify doesn't support a root object which is undefined. 176 // JSON.stringify doesn't support a root object which is undefined.
177 if (request.args === undefined) 177 if (request.args === undefined)
178 request.args = null; 178 request.args = null;
179 179
180 // Some javascript libraries (e.g. prototype.js version <= 1.6) add a toJSON 180 var sargs = chromeHidden.JSON.stringify(request.args);
181 // serializer function on Array.prototype that is incompatible with our 181
182 // native JSON library, causing incorrect deserialization in the C++ side of
183 // StartRequest. We work around that here by temporarily removing the toJSON
184 // function.
185 var arrayToJsonTmp;
186 if (Array.prototype.toJSON) {
187 arrayToJsonTmp = Array.prototype.toJSON;
188 Array.prototype.toJSON = null;
189 }
190 var sargs = JSON.stringify(request.args);
191 if (arrayToJsonTmp) {
192 Array.prototype.toJSON = arrayToJsonTmp;
193 }
194 var requestId = GetNextRequestId(); 182 var requestId = GetNextRequestId();
195 requests[requestId] = request; 183 requests[requestId] = request;
196 var hasCallback = (request.callback || customCallback) ? true : false; 184 var hasCallback = (request.callback || customCallback) ? true : false;
197 return StartRequest(functionName, sargs, requestId, hasCallback); 185 return StartRequest(functionName, sargs, requestId, hasCallback);
198 } 186 }
199 187
200 // Send a special API request that is not JSON stringifiable, and optionally 188 // Send a special API request that is not JSON stringifiable, and optionally
201 // register a callback. 189 // register a callback.
202 function sendCustomRequest(nativeFunction, functionName, args, argSchemas) { 190 function sendCustomRequest(nativeFunction, functionName, args, argSchemas) {
203 var request = prepareRequest(args, argSchemas); 191 var request = prepareRequest(args, argSchemas);
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 // name & definition of the apiFunction. Custom handling of api functions 315 // name & definition of the apiFunction. Custom handling of api functions
328 // is implemented by adding a "handleRequest" function to the object. 316 // is implemented by adding a "handleRequest" function to the object.
329 var apiFunctions = {}; 317 var apiFunctions = {};
330 318
331 // Read api definitions and setup api functions in the chrome namespace. 319 // Read api definitions and setup api functions in the chrome namespace.
332 // TODO(rafaelw): Consider defining a json schema for an api definition 320 // TODO(rafaelw): Consider defining a json schema for an api definition
333 // and validating either here, in a unit_test or both. 321 // and validating either here, in a unit_test or both.
334 // TODO(rafaelw): Handle synchronous functions. 322 // TODO(rafaelw): Handle synchronous functions.
335 // TOOD(rafaelw): Consider providing some convenient override points 323 // TOOD(rafaelw): Consider providing some convenient override points
336 // for api functions that wish to insert themselves into the call. 324 // for api functions that wish to insert themselves into the call.
337 var apiDefinitions = JSON.parse(GetExtensionAPIDefinition()); 325 var apiDefinitions = chromeHidden.JSON.parse(GetExtensionAPIDefinition());
338 326
339 apiDefinitions.forEach(function(apiDef) { 327 apiDefinitions.forEach(function(apiDef) {
340 var module = chrome; 328 var module = chrome;
341 var namespaces = apiDef.namespace.split('.'); 329 var namespaces = apiDef.namespace.split('.');
342 for (var index = 0, name; name = namespaces[index]; index++) { 330 for (var index = 0, name; name = namespaces[index]; index++) {
343 module[name] = module[name] || {}; 331 module[name] = module[name] || {};
344 module = module[name]; 332 module = module[name];
345 }; 333 };
346 334
347 // Add types to global validationTypes 335 // Add types to global validationTypes
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 }; 590 };
603 591
604 apiFunctions["experimental.contextMenu.create"].customCallback = 592 apiFunctions["experimental.contextMenu.create"].customCallback =
605 function(name, request, response) { 593 function(name, request, response) {
606 if (chrome.extension.lastError || !response) { 594 if (chrome.extension.lastError || !response) {
607 return; 595 return;
608 } 596 }
609 597
610 // Set up the onclick handler if we were passed one in the request. 598 // Set up the onclick handler if we were passed one in the request.
611 if (request.args.onclick) { 599 if (request.args.onclick) {
612 var menuItemId = JSON.parse(response); 600 var menuItemId = chromeHidden.JSON.parse(response);
613 chromeHidden.contextMenuHandlers[menuItemId] = request.args.onclick; 601 chromeHidden.contextMenuHandlers[menuItemId] = request.args.onclick;
614 } 602 }
615 }; 603 };
616 604
617 apiFunctions["experimental.contextMenu.remove"].customCallback = 605 apiFunctions["experimental.contextMenu.remove"].customCallback =
618 function(name, request, response) { 606 function(name, request, response) {
619 // Remove any onclick handler we had registered for this menu item. 607 // Remove any onclick handler we had registered for this menu item.
620 if (request.args.length > 0) { 608 if (request.args.length > 0) {
621 var menuItemId = request.args[0]; 609 var menuItemId = request.args[0];
622 delete chromeHidden.contextMenuHandlers[menuItemId]; 610 delete chromeHidden.contextMenuHandlers[menuItemId];
(...skipping 30 matching lines...) Expand all
653 setupHiddenContextMenuEvent(extensionId); 641 setupHiddenContextMenuEvent(extensionId);
654 setupOmniboxEvents(extensionId); 642 setupOmniboxEvents(extensionId);
655 }); 643 });
656 644
657 if (!chrome.experimental) 645 if (!chrome.experimental)
658 chrome.experimental = {}; 646 chrome.experimental = {};
659 647
660 if (!chrome.experimental.accessibility) 648 if (!chrome.experimental.accessibility)
661 chrome.experimental.accessibility = {}; 649 chrome.experimental.accessibility = {};
662 })(); 650 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698