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

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

Issue 2754014: Merge 48667 - Prevent extensions from clobbering JSON implementation that ext... (Closed) Base URL: svn://svn.chromium.org/chrome/branches/375/src/
Patch Set: 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 | Annotate | Revision Log
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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 "message": error 74 "message": error
75 }; 75 };
76 } 76 }
77 77
78 if (request.customCallback) { 78 if (request.customCallback) {
79 request.customCallback(name, request, response); 79 request.customCallback(name, request, response);
80 } 80 }
81 81
82 if (request.callback) { 82 if (request.callback) {
83 // Callbacks currently only support one callback argument. 83 // Callbacks currently only support one callback argument.
84 var callbackArgs = response ? [JSON.parse(response)] : []; 84 var callbackArgs = response ? [chromeHidden.JSON.parse(response)] : [];
85 85
86 // Validate callback in debug only -- and only when the 86 // Validate callback in debug only -- and only when the
87 // caller has provided a callback. Implementations of api 87 // caller has provided a callback. Implementations of api
88 // calls my not return data if they observe the caller 88 // calls my not return data if they observe the caller
89 // has not provided a callback. 89 // has not provided a callback.
90 if (chromeHidden.validateCallbacks && !error) { 90 if (chromeHidden.validateCallbacks && !error) {
91 try { 91 try {
92 if (!request.callbackSchema.parameters) { 92 if (!request.callbackSchema.parameters) {
93 throw "No callback schemas defined"; 93 throw "No callback schemas defined";
94 } 94 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 // Send an API request and optionally register a callback. 166 // Send an API request and optionally register a callback.
167 function sendRequest(functionName, args, argSchemas, customCallback) { 167 function sendRequest(functionName, args, argSchemas, customCallback) {
168 var request = prepareRequest(args, argSchemas); 168 var request = prepareRequest(args, argSchemas);
169 if (customCallback) { 169 if (customCallback) {
170 request.customCallback = customCallback; 170 request.customCallback = customCallback;
171 } 171 }
172 // JSON.stringify doesn't support a root object which is undefined. 172 // JSON.stringify doesn't support a root object which is undefined.
173 if (request.args === undefined) 173 if (request.args === undefined)
174 request.args = null; 174 request.args = null;
175 175
176 // Some javascript libraries (e.g. prototype.js version <= 1.6) add a toJSON 176 var sargs = chromeHidden.JSON.stringify(request.args);
177 // serializer function on Array.prototype that is incompatible with our 177
178 // native JSON library, causing incorrect deserialization in the C++ side of
179 // StartRequest. We work around that here by temporarily removing the toJSON
180 // function.
181 var arrayToJsonTmp;
182 if (Array.prototype.toJSON) {
183 arrayToJsonTmp = Array.prototype.toJSON;
184 Array.prototype.toJSON = null;
185 }
186 var sargs = JSON.stringify(request.args);
187 if (arrayToJsonTmp) {
188 Array.prototype.toJSON = arrayToJsonTmp;
189 }
190 var requestId = GetNextRequestId(); 178 var requestId = GetNextRequestId();
191 requests[requestId] = request; 179 requests[requestId] = request;
192 var hasCallback = (request.callback || customCallback) ? true : false; 180 var hasCallback = (request.callback || customCallback) ? true : false;
193 return StartRequest(functionName, sargs, requestId, hasCallback); 181 return StartRequest(functionName, sargs, requestId, hasCallback);
194 } 182 }
195 183
196 // Send a special API request that is not JSON stringifiable, and optionally 184 // Send a special API request that is not JSON stringifiable, and optionally
197 // register a callback. 185 // register a callback.
198 function sendCustomRequest(nativeFunction, functionName, args, argSchemas) { 186 function sendCustomRequest(nativeFunction, functionName, args, argSchemas) {
199 var request = prepareRequest(args, argSchemas); 187 var request = prepareRequest(args, argSchemas);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 // name & definition of the apiFunction. Custom handling of api functions 305 // name & definition of the apiFunction. Custom handling of api functions
318 // is implemented by adding a "handleRequest" function to the object. 306 // is implemented by adding a "handleRequest" function to the object.
319 var apiFunctions = {}; 307 var apiFunctions = {};
320 308
321 // Read api definitions and setup api functions in the chrome namespace. 309 // Read api definitions and setup api functions in the chrome namespace.
322 // TODO(rafaelw): Consider defining a json schema for an api definition 310 // TODO(rafaelw): Consider defining a json schema for an api definition
323 // and validating either here, in a unit_test or both. 311 // and validating either here, in a unit_test or both.
324 // TODO(rafaelw): Handle synchronous functions. 312 // TODO(rafaelw): Handle synchronous functions.
325 // TOOD(rafaelw): Consider providing some convenient override points 313 // TOOD(rafaelw): Consider providing some convenient override points
326 // for api functions that wish to insert themselves into the call. 314 // for api functions that wish to insert themselves into the call.
327 var apiDefinitions = JSON.parse(GetExtensionAPIDefinition()); 315 var apiDefinitions = chromeHidden.JSON.parse(GetExtensionAPIDefinition());
328 316
329 apiDefinitions.forEach(function(apiDef) { 317 apiDefinitions.forEach(function(apiDef) {
330 var module = chrome; 318 var module = chrome;
331 var namespaces = apiDef.namespace.split('.'); 319 var namespaces = apiDef.namespace.split('.');
332 for (var index = 0, name; name = namespaces[index]; index++) { 320 for (var index = 0, name; name = namespaces[index]; index++) {
333 module[name] = module[name] || {}; 321 module[name] = module[name] || {};
334 module = module[name]; 322 module = module[name];
335 }; 323 };
336 324
337 // Add types to global validationTypes 325 // Add types to global validationTypes
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 }; 580 };
593 581
594 apiFunctions["experimental.contextMenu.create"].customCallback = 582 apiFunctions["experimental.contextMenu.create"].customCallback =
595 function(name, request, response) { 583 function(name, request, response) {
596 if (chrome.extension.lastError || !response) { 584 if (chrome.extension.lastError || !response) {
597 return; 585 return;
598 } 586 }
599 587
600 // Set up the onclick handler if we were passed one in the request. 588 // Set up the onclick handler if we were passed one in the request.
601 if (request.args.onclick) { 589 if (request.args.onclick) {
602 var menuItemId = JSON.parse(response); 590 var menuItemId = chromeHidden.JSON.parse(response);
603 chromeHidden.contextMenuHandlers[menuItemId] = request.args.onclick; 591 chromeHidden.contextMenuHandlers[menuItemId] = request.args.onclick;
604 } 592 }
605 }; 593 };
606 594
607 apiFunctions["experimental.contextMenu.remove"].customCallback = 595 apiFunctions["experimental.contextMenu.remove"].customCallback =
608 function(name, request, response) { 596 function(name, request, response) {
609 // Remove any onclick handler we had registered for this menu item. 597 // Remove any onclick handler we had registered for this menu item.
610 if (request.args.length > 0) { 598 if (request.args.length > 0) {
611 var menuItemId = request.args[0]; 599 var menuItemId = request.args[0];
612 delete chromeHidden.contextMenuHandlers[menuItemId]; 600 delete chromeHidden.contextMenuHandlers[menuItemId];
(...skipping 29 matching lines...) Expand all
642 setupPopupEvents(GetRenderViewId()); 630 setupPopupEvents(GetRenderViewId());
643 setupHiddenContextMenuEvent(extensionId); 631 setupHiddenContextMenuEvent(extensionId);
644 }); 632 });
645 633
646 if (!chrome.experimental) 634 if (!chrome.experimental)
647 chrome.experimental = {}; 635 chrome.experimental = {};
648 636
649 if (!chrome.experimental.accessibility) 637 if (!chrome.experimental.accessibility)
650 chrome.experimental.accessibility = {}; 638 chrome.experimental.accessibility = {};
651 })(); 639 })();
OLDNEW
« no previous file with comments | « chrome/renderer/resources/event_bindings.js ('k') | chrome/renderer/resources/renderer_extension_bindings.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698