我正在尝试制作一个内容过滤器,通过用更好的替代方案替换网页文本来自动审查网页(例如,$' s和*代替咒骂)。
我在创建动作扩展时发现这很容易,这使您可以非常轻松地修改网页。但对于内容过滤器中的操作,我不确定如何执行此操作。
我认为代码需要看起来像这样:
[
{
"trigger": {
"resource-type": ["script"]
},
"action": {
"type": "css-display-none",
"selector": "???"
}
}
]
"type": "css-display-none"
似乎是实现这一目标的唯一方式,因为其他类型(block
,block-cookies
和ignore-previous-rules
)似乎并不重要。但是,我无法弄清楚如何使用CSS选择器替换文本。
我查看了Apple引用的CSS selectors website,但无法提出解决方案。
修改
我正在尝试使用Javascript而不是CSS的不同方法,更像是动作扩展的工作原理。我将Javascript原型作为NSExtensionJavaScriptPreprocessingFile添加到Info.plist中。
出于某种原因,这段代码似乎无能为力。为什么动作扩展中的相同代码在内容过滤器中不起作用?
class ActionRequestHandler: NSObject, NSExtensionRequestHandling {
var extensionContext: NSExtensionContext?
func beginRequestWithExtensionContext(context: NSExtensionContext) {
self.extensionContext = context
for item: AnyObject in context.inputItems {
let inputItem = item as! NSExtensionItem
for provider: AnyObject in inputItem.attachments! {
let itemProvider = provider as! NSItemProvider
if itemProvider.hasItemConformingToTypeIdentifier(kUTTypePropertyList as String) {
itemProvider.loadItemForTypeIdentifier(kUTTypePropertyList as String, options: nil, completionHandler: { [unowned self] (result, error) in
if let dictionary = result as? NSDictionary {
self.itemLoadCompletedWithPreprocessingResults(dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as! [NSObject: AnyObject])
}
})
}
}
}
}
func itemLoadCompletedWithPreprocessingResults(javaScriptPreprocessingResults: [NSObject: AnyObject]) {
let pageContent = javaScriptPreprocessingResults["content"] as! NSString
let fixedContent = pageContent.stringByReplacingOccurrencesOfString("Bad Word", withString: "Good Word")
self.doneWithResults(["content": fixedContent])
}
func doneWithResults(resultsForJavaScriptFinalizeArg: [NSObject: AnyObject]?) {
if let resultsForJavaScriptFinalize = resultsForJavaScriptFinalizeArg {
let resultsDictionary = [NSExtensionJavaScriptFinalizeArgumentKey: resultsForJavaScriptFinalize]
let resultsProvider = NSItemProvider(item: resultsDictionary, typeIdentifier: String(kUTTypePropertyList))
let resultsItem = NSExtensionItem()
resultsItem.attachments = [resultsProvider]
self.extensionContext!.completeRequestReturningItems([resultsItem], completionHandler: nil)
} else {
self.extensionContext!.completeRequestReturningItems([], completionHandler: nil)
}
self.extensionContext = nil
}
}
Javascript操作:
var Action = function() {};
Action.prototype = {
run: function(arguments) {
arguments.completionFunction({"content": document.body.innerHTML});
},
finalize: function(arguments) {
document.body.innerHTML = arguments["content"];
}
};
var ExtensionPreprocessingJS = new Action