OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
Matt Perry
2011/11/11 20:07:19
this file needs a rename now!
Aaron Boodman
2011/11/11 23:12:02
Done.
| |
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(); |
11 native function StartRequest(); | 11 native function StartRequest(); |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
567 for (var i = 0; i < platforms.length; i++) { | 567 for (var i = 0; i < platforms.length; i++) { |
568 if (platforms[i][0].test(navigator.appVersion)) { | 568 if (platforms[i][0].test(navigator.appVersion)) { |
569 return platforms[i][1]; | 569 return platforms[i][1]; |
570 } | 570 } |
571 } | 571 } |
572 return "unknown"; | 572 return "unknown"; |
573 } | 573 } |
574 | 574 |
575 chromeHidden.onLoad.addListener(function(extensionId, isExtensionProcess, | 575 chromeHidden.onLoad.addListener(function(extensionId, isExtensionProcess, |
576 isIncognitoProcess) { | 576 isIncognitoProcess) { |
577 if (!isExtensionProcess) | |
578 return; | |
579 | |
580 // Setup the ChromeSetting class so we can use it to construct | 577 // Setup the ChromeSetting class so we can use it to construct |
581 // ChromeSetting objects from the API definition. | 578 // ChromeSetting objects from the API definition. |
582 setupChromeSetting(); | 579 setupChromeSetting(); |
583 | 580 |
584 // Setup the ContentSetting class so we can use it to construct | 581 // Setup the ContentSetting class so we can use it to construct |
585 // ContentSetting objects from the API definition. | 582 // ContentSetting objects from the API definition. |
586 setupContentSetting(); | 583 setupContentSetting(); |
587 | 584 |
588 // |apiFunctions| is a hash of name -> object that stores the | 585 // |apiFunctions| is a hash of name -> object that stores the |
589 // name & definition of the apiFunction. Custom handling of api functions | 586 // name & definition of the apiFunction. Custom handling of api functions |
(...skipping 25 matching lines...) Expand all Loading... | |
615 // Add types to global validationTypes | 612 // Add types to global validationTypes |
616 if (apiDef.types) { | 613 if (apiDef.types) { |
617 apiDef.types.forEach(function(t) { | 614 apiDef.types.forEach(function(t) { |
618 chromeHidden.validationTypes.push(t); | 615 chromeHidden.validationTypes.push(t); |
619 if (t.type == 'object' && customBindings[t.id]) { | 616 if (t.type == 'object' && customBindings[t.id]) { |
620 customBindings[t.id].prototype.setSchema(t); | 617 customBindings[t.id].prototype.setSchema(t); |
621 } | 618 } |
622 }); | 619 }); |
623 } | 620 } |
624 | 621 |
622 // Adds a getter that throws an access denied error to object |module| | |
623 // for property |name| described by |schemaNode| if necessary. | |
624 // | |
625 // Returns true if the getter was necessary (access is disallowed), or | |
626 // false otherwise. | |
627 function addUnprivilegedAccessGetter(module, name, allowUnprivileged) { | |
628 if (allowUnprivileged || isExtensionProcess) | |
629 return false; | |
630 | |
631 module.__defineGetter__(name, function() { | |
632 throw new Error( | |
633 '"' + name + '" can only be used in extension processes. See ' + | |
634 'the content scripts documentation for more details.'); | |
635 }); | |
636 return true; | |
637 } | |
638 | |
625 // Setup Functions. | 639 // Setup Functions. |
626 if (apiDef.functions) { | 640 if (apiDef.functions) { |
627 apiDef.functions.forEach(function(functionDef) { | 641 apiDef.functions.forEach(function(functionDef) { |
628 // Module functions may have been defined earlier by hand. Don't | 642 if (functionDef.name in module || |
629 // clobber them. | 643 addUnprivilegedAccessGetter(module, functionDef.name, |
630 if (module[functionDef.name]) | 644 functionDef.unprivileged)) { |
631 return; | 645 return; |
646 } | |
632 | 647 |
633 var apiFunction = {}; | 648 var apiFunction = {}; |
634 apiFunction.definition = functionDef; | 649 apiFunction.definition = functionDef; |
635 apiFunction.name = apiDef.namespace + "." + functionDef.name; | 650 apiFunction.name = apiDef.namespace + "." + functionDef.name; |
636 apiFunctions[apiFunction.name] = apiFunction; | 651 apiFunctions[apiFunction.name] = apiFunction; |
637 | 652 |
638 module[functionDef.name] = (function() { | 653 module[functionDef.name] = (function() { |
639 var args = arguments; | 654 var args = arguments; |
640 if (this.updateArgumentsPreValidate) | 655 if (this.updateArgumentsPreValidate) |
641 args = this.updateArgumentsPreValidate.apply(this, args); | 656 args = this.updateArgumentsPreValidate.apply(this, args); |
(...skipping 17 matching lines...) Expand all Loading... | |
659 chromeHidden.validate([retval], [this.definition.returns]); | 674 chromeHidden.validate([retval], [this.definition.returns]); |
660 } | 675 } |
661 return retval; | 676 return retval; |
662 }).bind(apiFunction); | 677 }).bind(apiFunction); |
663 }); | 678 }); |
664 } | 679 } |
665 | 680 |
666 // Setup Events | 681 // Setup Events |
667 if (apiDef.events) { | 682 if (apiDef.events) { |
668 apiDef.events.forEach(function(eventDef) { | 683 apiDef.events.forEach(function(eventDef) { |
669 // Module events may have been defined earlier by hand. Don't clobber | 684 if (eventDef.name in module || |
670 // them. | 685 addUnprivilegedAccessGetter(module, eventDef.name, |
671 if (module[eventDef.name]) | 686 eventDef.unprivileged)) { |
672 return; | 687 return; |
688 } | |
673 | 689 |
674 var eventName = apiDef.namespace + "." + eventDef.name; | 690 var eventName = apiDef.namespace + "." + eventDef.name; |
675 if (apiDef.namespace == "experimental.webRequest") { | 691 if (apiDef.namespace == "experimental.webRequest") { |
676 module[eventDef.name] = new chrome.WebRequestEvent(eventName, | 692 module[eventDef.name] = new chrome.WebRequestEvent(eventName, |
677 eventDef.parameters, eventDef.extraParameters); | 693 eventDef.parameters, eventDef.extraParameters); |
678 } else { | 694 } else { |
679 module[eventDef.name] = new chrome.Event(eventName, | 695 module[eventDef.name] = new chrome.Event(eventName, |
680 eventDef.parameters); | 696 eventDef.parameters); |
681 } | 697 } |
682 }); | 698 }); |
683 } | 699 } |
684 | 700 |
685 function addProperties(m, def) { | 701 function addProperties(m, def) { |
686 // Parse any values defined for properties. | 702 // Parse any values defined for properties. |
687 if (def.properties) { | 703 if (def.properties) { |
688 forEach(def.properties, function(prop, property) { | 704 forEach(def.properties, function(prop, property) { |
705 if (prop in m || | |
706 addUnprivilegedAccessGetter(m, prop, property.unprivileged)) { | |
707 return; | |
708 } | |
709 | |
689 var value = property.value; | 710 var value = property.value; |
690 if (value) { | 711 if (value) { |
691 if (property.type === 'integer') { | 712 if (property.type === 'integer') { |
692 value = parseInt(value); | 713 value = parseInt(value); |
693 } else if (property.type === 'boolean') { | 714 } else if (property.type === 'boolean') { |
694 value = value === "true"; | 715 value = value === "true"; |
695 } else if (property["$ref"]) { | 716 } else if (property["$ref"]) { |
696 var constructor = customBindings[property["$ref"]]; | 717 var constructor = customBindings[property["$ref"]]; |
697 var args = value; | 718 var args = value; |
698 // For an object property, |value| is an array of constructor | 719 // For an object property, |value| is an array of constructor |
(...skipping 13 matching lines...) Expand all Loading... | |
712 if (value) { | 733 if (value) { |
713 m[prop] = value; | 734 m[prop] = value; |
714 } | 735 } |
715 }); | 736 }); |
716 } | 737 } |
717 } | 738 } |
718 | 739 |
719 addProperties(module, apiDef); | 740 addProperties(module, apiDef); |
720 }); | 741 }); |
721 | 742 |
743 // TODO(aa): The rest of the crap below this really needs to be factored out | |
744 // with a clean API boundary. Right now it is too soupy for me to feel | |
745 // comfortable running in content scripts. What if people are just | |
746 // overwriting random APIs? That would bypass our content script access | |
747 // checks. | |
748 if (!isExtensionProcess) | |
749 return; | |
750 | |
722 // getTabContentses is retained for backwards compatibility | 751 // getTabContentses is retained for backwards compatibility |
723 // See http://crbug.com/21433 | 752 // See http://crbug.com/21433 |
724 chrome.extension.getTabContentses = chrome.extension.getExtensionTabs; | 753 chrome.extension.getTabContentses = chrome.extension.getExtensionTabs; |
725 // TOOD(mihaip): remove this alias once the webstore stops calling | 754 // TOOD(mihaip): remove this alias once the webstore stops calling |
726 // beginInstallWithManifest2. | 755 // beginInstallWithManifest2. |
727 // See http://crbug.com/100242 | 756 // See http://crbug.com/100242 |
728 chrome.webstorePrivate.beginInstallWithManifest2 = | 757 chrome.webstorePrivate.beginInstallWithManifest2 = |
729 chrome.webstorePrivate.beginInstallWithManifest3; | 758 chrome.webstorePrivate.beginInstallWithManifest3; |
730 | 759 |
731 apiFunctions["tabs.connect"].handleRequest = function(tabId, connectInfo) { | 760 apiFunctions["tabs.connect"].handleRequest = function(tabId, connectInfo) { |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1049 | 1078 |
1050 if (!chrome.tts) | 1079 if (!chrome.tts) |
1051 chrome.tts = {}; | 1080 chrome.tts = {}; |
1052 | 1081 |
1053 if (!chrome.ttsEngine) | 1082 if (!chrome.ttsEngine) |
1054 chrome.ttsEngine = {}; | 1083 chrome.ttsEngine = {}; |
1055 | 1084 |
1056 if (!chrome.experimental.downloads) | 1085 if (!chrome.experimental.downloads) |
1057 chrome.experimental.downloads = {}; | 1086 chrome.experimental.downloads = {}; |
1058 })(); | 1087 })(); |
OLD | NEW |