1

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
4

0 に答える 0