Web ページのテキストをより適切な代替手段 (たとえば、罵倒語の代わりに $ と *) に置き換えることにより、Web ページを自動的に検閲するコンテンツ フィルターを作成しようとしています。
アクション拡張機能を作成すると、Web ページを非常に簡単に変更できるため、これは非常に簡単に実行できることがわかりました。しかし、コンテンツ フィルターのアクションについては、これを行う方法がわかりません。
コードは次のようにする必要があると思います。
[
{
"trigger": {
"resource-type": ["script"]
},
"action": {
"type": "css-display-none",
"selector": "???"
}
}
]
"type": "css-display-none"
block
他のタイプ ( 、block-cookies
、およびignore-previous-rules
) はここでは関係ないように見えるため、これが機能する唯一の方法のようです。ただし、CSS セレクターを使用してテキストを置き換える方法がわかりません。
Apple が参照しているこのCSS セレクターの Web サイトを見ましたが、解決策が思いつきませんでした。
編集
CSS の代わりに Javascript を使用して、アクション拡張機能のしくみに似た別のアプローチを試みています。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