Background: we have two choices for embedding a web view in an iOS application: 
UIWebView, which has been there since the early days, and now with iOS8, the 
new WKWebView. The UIWebView is what for example Chrome and pretty much every 
other third-party app uses while WKWebView is what Safari (and newer third 
party apps) uses.

The UIWebView is very minimal but it gets the job done. Basically you can ask 
it to load content, handle navigation and execute JavaScript when a page has 
loaded. But, no JIT. So about 3x slower than WKWebView.

The WKWebView is new with iOS8 and exposes a much richer API. It has for 
example wonderful gesture support so you can swipe left just like in Mobile 
Safari. It also supports user scripts much better, which would allow us to 
introduce HTML5 APIs that WebKit does not know about. And it runs Nitro at full 
speed.

It seems obvious to use the new WKWebView but there is a big limitation: it is 
impossible to intercept the URL Loading System. I found this out when I was 
trying to add support for a custom header (DNT) in a little experiment.

https://github.com/st3fan/WebKitExperiments/blob/master/DoNotTrack/BasicBrowser/ViewController.swift#L6

How this works is as follows: by providing a custom NSURLProtocol class it is 
relatively trivial to intercept URL loading. In my example I simply build on 
top of the built-in NSURLConnection and the only custom thing I do there is to 
add a DNT header for outgoing requests. This same mechanism can also be used to 
inspect and modify requests for things like Mixed Content detection and would 
probably be part of Tracking Protection.

Now the sad news. Unfortunately this only works on UIWebView. I see that my 
`CustomURLProtocol.canInitWithRequest()` is being called, but other than that 
nothing happens. I assume this is because the WKWebView executes network and 
content in a remote process. Which is good for security and performance, but 
closes the door to customizations like this.

So, it seems we have to make a choice between slower UIWebView or a less 
optimal WKWebView.

Note that there is not a good product definition just yet, but because so many 
of our better features depend on access to networking, I can only assume this 
will be a problem in the long run.

I’ve been staring at this for a while now and I don’t really see a good 
workaround. I’d love to hear some suggestions or questions.

 S.

_______________________________________________
mobile-firefox-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/mobile-firefox-dev

Reply via email to