text: exports.availableDocumentFeatures = [
    'FetchExternalResources',
    'ProcessExternalResources',
    'MutationEvents',
    'QuerySelector',
    'SkipExternalResources'
  ];
  
  exports.defaultDocumentFeatures = {
    "FetchExternalResources": ['script'/*, 'img', 'css', 'frame', 'link'*/],
    "ProcessExternalResources": ['script'/*, 'frame', 'iframe'*/],
    "MutationEvents": '2.0',
    "QuerySelector": false,
    "SkipExternalResources": false
  };
  
  exports.applyDocumentFeatures = function(doc, features) {
    var i, maxFeatures = exports.availableDocumentFeatures.length,
        defaultFeatures = exports.defaultDocumentFeatures,
        j,
        k,
        featureName,
        featureSource;
  
    features = features || {};
  
    for (i=0; i<maxFeatures; i++) {
      featureName = exports.availableDocumentFeatures[i];
      if (typeof features[featureName] !== 'undefined') {
        featureSource = features[featureName];
      // We have to check the lowercase version also because the Document feature
      // methods convert everything to lowercase.
      } else if (typeof features[featureName.toLowerCase()] !== 'undefined') {
        featureSource = features[featureName.toLowerCase()];
      } else if (defaultFeatures[featureName]) {
        featureSource = defaultFeatures[featureName];
      } else {
        continue;
      }
  
      doc.implementation.removeFeature(featureName);
  
      if (typeof featureSource !== 'undefined') {
        if (featureSource instanceof Array) {
          k = featureSource.length;
          for (j=0; j<k; j++) {
            doc.implementation.addFeature(featureName, featureSource[j]);
          }
        } else {
          doc.implementation.addFeature(featureName, featureSource);
        }
      }
    }
  };
  