OLD | NEW |
---|---|
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 21 matching lines...) Expand all Loading... | |
32 return; | 32 return; |
33 } | 33 } |
34 chrome.initExtension(extensionId, false); | 34 chrome.initExtension(extensionId, false); |
35 }); | 35 }); |
36 return; | 36 return; |
37 } | 37 } |
38 | 38 |
39 if (!chrome) | 39 if (!chrome) |
40 chrome = {}; | 40 chrome = {}; |
41 | 41 |
42 function forEach(dict, f) { | |
43 for (key in dict) { | |
44 if (dict.hasOwnProperty(key)) | |
45 f(key, dict[key]); | |
46 } | |
47 } | |
48 | |
42 // Validate arguments. | 49 // Validate arguments. |
43 chromeHidden.validationTypes = []; | 50 chromeHidden.validationTypes = {}; |
44 chromeHidden.validate = function(args, schemas) { | 51 chromeHidden.validate = function(args, schemas) { |
45 if (args.length > schemas.length) | 52 if (args.length > schemas.length) |
46 throw new Error("Too many arguments."); | 53 throw new Error("Too many arguments."); |
47 | 54 |
48 for (var i = 0; i < schemas.length; i++) { | 55 for (var i = 0; i < schemas.length; i++) { |
49 if (i in args && args[i] !== null && args[i] !== undefined) { | 56 if (i in args && args[i] !== null && args[i] !== undefined) { |
50 var validator = new chromeHidden.JSONSchemaValidator(); | 57 var validator = new chromeHidden.JSONSchemaValidator(); |
51 validator.addTypes(chromeHidden.validationTypes); | 58 forEach(chromeHidden.validationTypes, function(id, type) { |
59 validator.addTypes(type); | |
60 }); | |
52 validator.validate(args[i], schemas[i]); | 61 validator.validate(args[i], schemas[i]); |
53 if (validator.errors.length == 0) | 62 if (validator.errors.length == 0) |
54 continue; | 63 continue; |
55 | 64 |
56 var message = "Invalid value for argument " + (i + 1) + ". "; | 65 var message = "Invalid value for argument " + (i + 1) + ". "; |
57 for (var i = 0, err; err = validator.errors[i]; i++) { | 66 for (var i = 0, err; err = validator.errors[i]; i++) { |
58 if (err.path) { | 67 if (err.path) { |
59 message += "Property '" + err.path + "': "; | 68 message += "Property '" + err.path + "': "; |
60 } | 69 } |
61 message += err.message; | 70 message += err.message; |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
359 var callback = function(errorMessage) { | 368 var callback = function(errorMessage) { |
360 if (errorMessage) | 369 if (errorMessage) |
361 chrome.experimental.tts.speakCompleted(requestId, errorMessage); | 370 chrome.experimental.tts.speakCompleted(requestId, errorMessage); |
362 else | 371 else |
363 chrome.experimental.tts.speakCompleted(requestId); | 372 chrome.experimental.tts.speakCompleted(requestId); |
364 }; | 373 }; |
365 chrome.Event.prototype.dispatch.apply(this, [text, options, callback]); | 374 chrome.Event.prototype.dispatch.apply(this, [text, options, callback]); |
366 }; | 375 }; |
367 } | 376 } |
368 | 377 |
378 function setupPreferences() { | |
Aaron Boodman
2011/02/11 18:33:19
You are now the second person (along with mpcomple
Aaron Boodman
2011/02/14 02:54:02
Did you see this comment?
| |
379 // We declare the constructor so that a Preference shows up as such in the | |
380 // Javascript console, but build the Preference in a separate function so | |
381 // that an extension can't construct arbitrary Preference objects. | |
382 function Preference() { | |
383 }; | |
384 | |
385 var parameters = {}; | |
386 chromeHidden.validationTypes['Preference'].functions.forEach(function(f) { | |
387 parameters[f.name] = f.parameters; | |
388 }); | |
389 | |
390 function buildPreference(prefKey, valueSchema) { | |
391 var pref = new Preference(); | |
392 var getSchema = parameters.get; | |
393 var extendedGetSchema = getSchema.slice(); | |
394 extendedGetSchema.unshift({'type': 'string'}); | |
395 pref.get = function(details, callback) { | |
396 chromeHidden.validate([details, callback], getSchema); | |
397 return sendRequest('experimental.preferences.get', | |
398 [prefKey, details, callback], | |
399 extendedGetSchema); | |
400 }; | |
401 var setSchema = parameters.set; | |
402 var extendedSetSchema = setSchema.slice(); | |
403 extendedSetSchema.unshift({'type': 'string'}); | |
404 extendedSetSchema[1].properties.value = valueSchema; | |
405 pref.set = function(details, callback) { | |
406 chromeHidden.validate([details, callback], setSchema); | |
407 return sendRequest('experimental.preferences.set', | |
408 [prefKey, details, callback], | |
409 extendedSetSchema); | |
410 }; | |
411 return pref; | |
412 } | |
413 | |
414 // TODO(bauerb): Automatically instantiate these preferences | |
415 // from chrome/common/extensions/api/extension_api.json. | |
416 chrome.experimental.contentSettings.misc.blockThirdPartyCookies = | |
417 buildPreference('blockThirdPartyCookies', {'type':'boolean'}); | |
418 } | |
419 | |
369 chromeHidden.onLoad.addListener(function (extensionId) { | 420 chromeHidden.onLoad.addListener(function (extensionId) { |
370 if (!extensionId) { | 421 if (!extensionId) { |
371 return; | 422 return; |
372 } | 423 } |
373 chrome.initExtension(extensionId, false, IsIncognitoProcess()); | 424 chrome.initExtension(extensionId, false, IsIncognitoProcess()); |
374 | 425 |
375 // |apiFunctions| is a hash of name -> object that stores the | 426 // |apiFunctions| is a hash of name -> object that stores the |
376 // name & definition of the apiFunction. Custom handling of api functions | 427 // name & definition of the apiFunction. Custom handling of api functions |
377 // is implemented by adding a "handleRequest" function to the object. | 428 // is implemented by adding a "handleRequest" function to the object. |
378 var apiFunctions = {}; | 429 var apiFunctions = {}; |
(...skipping 10 matching lines...) Expand all Loading... | |
389 var module = chrome; | 440 var module = chrome; |
390 var namespaces = apiDef.namespace.split('.'); | 441 var namespaces = apiDef.namespace.split('.'); |
391 for (var index = 0, name; name = namespaces[index]; index++) { | 442 for (var index = 0, name; name = namespaces[index]; index++) { |
392 module[name] = module[name] || {}; | 443 module[name] = module[name] || {}; |
393 module = module[name]; | 444 module = module[name]; |
394 } | 445 } |
395 | 446 |
396 // Add types to global validationTypes | 447 // Add types to global validationTypes |
397 if (apiDef.types) { | 448 if (apiDef.types) { |
398 apiDef.types.forEach(function(t) { | 449 apiDef.types.forEach(function(t) { |
399 chromeHidden.validationTypes.push(t); | 450 chromeHidden.validationTypes[t.id] = t; |
400 }); | 451 }); |
401 } | 452 } |
402 | 453 |
403 // Setup Functions. | 454 // Setup Functions. |
404 if (apiDef.functions) { | 455 if (apiDef.functions) { |
405 apiDef.functions.forEach(function(functionDef) { | 456 apiDef.functions.forEach(function(functionDef) { |
406 // Module functions may have been defined earlier by hand. Don't | 457 // Module functions may have been defined earlier by hand. Don't |
407 // clobber them. | 458 // clobber them. |
408 if (module[functionDef.name]) | 459 if (module[functionDef.name]) |
409 return; | 460 return; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
451 | 502 |
452 var eventName = apiDef.namespace + "." + eventDef.name; | 503 var eventName = apiDef.namespace + "." + eventDef.name; |
453 module[eventDef.name] = new chrome.Event(eventName, | 504 module[eventDef.name] = new chrome.Event(eventName, |
454 eventDef.parameters); | 505 eventDef.parameters); |
455 }); | 506 }); |
456 } | 507 } |
457 | 508 |
458 | 509 |
459 // Parse any values defined for properties. | 510 // Parse any values defined for properties. |
460 if (apiDef.properties) { | 511 if (apiDef.properties) { |
461 for (var prop in apiDef.properties) { | 512 forEach(apiDef.properties, function(prop, property) { |
462 if (!apiDef.properties.hasOwnProperty(prop)) | |
463 continue; | |
464 | |
465 var property = apiDef.properties[prop]; | |
466 if (property.value) { | 513 if (property.value) { |
467 var value = property.value; | 514 var value = property.value; |
468 if (property.type === 'integer') { | 515 if (property.type === 'integer') { |
469 value = parseInt(value); | 516 value = parseInt(value); |
470 } else if (property.type === 'boolean') { | 517 } else if (property.type === 'boolean') { |
471 value = value === "true"; | 518 value = value === "true"; |
472 } else if (property.type !== 'string') { | 519 } else if (property.type !== 'string') { |
473 throw "NOT IMPLEMENTED (extension_api.json error): Cannot " + | 520 throw "NOT IMPLEMENTED (extension_api.json error): Cannot " + |
474 "parse values for type \"" + property.type + "\""; | 521 "parse values for type \"" + property.type + "\""; |
475 } | 522 } |
476 module[prop] = value; | 523 module[prop] = value; |
477 } | 524 } |
478 } | 525 }); |
479 } | 526 } |
480 | 527 |
481 // getTabContentses is retained for backwards compatibility | 528 // getTabContentses is retained for backwards compatibility |
482 // See http://crbug.com/21433 | 529 // See http://crbug.com/21433 |
483 chrome.extension.getTabContentses = chrome.extension.getExtensionTabs; | 530 chrome.extension.getTabContentses = chrome.extension.getExtensionTabs; |
484 }); | 531 }); |
485 | 532 |
486 apiFunctions["tabs.connect"].handleRequest = function(tabId, connectInfo) { | 533 apiFunctions["tabs.connect"].handleRequest = function(tabId, connectInfo) { |
487 var name = ""; | 534 var name = ""; |
488 if (connectInfo) { | 535 if (connectInfo) { |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
791 if (chrome.test) { | 838 if (chrome.test) { |
792 chrome.test.getApiDefinitions = GetExtensionAPIDefinition; | 839 chrome.test.getApiDefinitions = GetExtensionAPIDefinition; |
793 } | 840 } |
794 | 841 |
795 setupPageActionEvents(extensionId); | 842 setupPageActionEvents(extensionId); |
796 setupToolstripEvents(GetRenderViewId()); | 843 setupToolstripEvents(GetRenderViewId()); |
797 setupPopupEvents(GetRenderViewId()); | 844 setupPopupEvents(GetRenderViewId()); |
798 setupHiddenContextMenuEvent(extensionId); | 845 setupHiddenContextMenuEvent(extensionId); |
799 setupOmniboxEvents(); | 846 setupOmniboxEvents(); |
800 setupTtsEvents(); | 847 setupTtsEvents(); |
848 setupPreferences(); | |
801 }); | 849 }); |
802 | 850 |
803 if (!chrome.experimental) | 851 if (!chrome.experimental) |
804 chrome.experimental = {}; | 852 chrome.experimental = {}; |
805 | 853 |
806 if (!chrome.experimental.accessibility) | 854 if (!chrome.experimental.accessibility) |
807 chrome.experimental.accessibility = {}; | 855 chrome.experimental.accessibility = {}; |
808 | 856 |
809 if (!chrome.experimental.tts) | 857 if (!chrome.experimental.tts) |
810 chrome.experimental.tts = {}; | 858 chrome.experimental.tts = {}; |
811 })(); | 859 })(); |
OLD | NEW |