我正在尝试制作一个内容过滤器,通过用更好的替代品替换网页文本来自动审查网页(例如,用 $ 和 * 代替脏话)。
在创建操作扩展时,我发现这很容易做到,它可以让您非常轻松地修改网页。但是对于内容过滤器中的操作,我不确定如何执行此操作。
我认为代码需要看起来像这样:
[
{
"trigger": {
"resource-type": ["script"]
},
"action": {
"type": "css-display-none",
"selector": "???"
}
}
]
"type": "css-display-none"
这似乎是唯一可行的方法,因为其他类型(block
、block-cookies
和ignore-previous-rules
)在这里似乎不相关。但是,我不知道如何使用 CSS 选择器替换文本。
我查看了 Apple 引用的这个CSS 选择器网站,但找不到解决方案。
编辑
我正在尝试使用 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