iOS 9内容过滤器替换字符串

时间:2016-03-20 12:53:43

标签: javascript ios css css-selectors safari-content-blocker

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

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

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

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

"type": "css-display-none"似乎是实现这一目标的唯一方式,因为其他类型(blockblock-cookiesignore-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

0 个答案:

没有答案
相关问题