1

我正在尝试制作一个内容过滤器,通过用更好的替代品替换网页文本来自动审查网页(例如,用 $ 和 * 代替脏话)。

在创建操作扩展时,我发现这很容易做到,它可以让您非常轻松地修改网页。但是对于内容过滤器中的操作,我不确定如何执行此操作。

我认为代码需要看起来像这样:

[
    {
        "trigger": {
            "resource-type": ["script"]
        },
        "action": {
            "type": "css-display-none",
            "selector": "???"
        }
    }
]

"type": "css-display-none"这似乎是唯一可行的方法,因为其他类型(blockblock-cookiesignore-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
4

0 回答 0