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

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

Issue 8540012: Enable extension APIs for content scripts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month 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) 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
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
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
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
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
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 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698