Jonas Sicking於 2011年9月17日星期六UTC+8上午5時14分51秒寫道:
> Hi All,
> 
> We had a impromptu meeting today discussing what a new Content Policy
> API would look like. We have for a long time been suffering from an
> API which provides very little convenience for code needing to do
> security checks before opening a network connection, while also
> providing very little support for people implementing the Content
> Policy API in order to block certain network loads.
> 
> Additionally the existing API works very poorly in e10s since it's
> fully synchronous and uses XPCOM component registration.
> 
> So below is what we are thinking. There's not a lot of detail yet,
> more higher-level ideas. Please do ask questions if you have concerns
> or ideas!
> 
> Here's how things would work from the point of view of someone
> implementing a content policy:
> 
> First off, we want to use normal (but chrome-only) DOM events to
> deliver the notifications. This works better with e10s as have been
> discussed at [1]. Each content policy would then register to be an
> event handler for this event.
> 
> When the event fires, a event handler can either do nothing if it
> wants to let the load proceed as normal, or it can call a function on
> the Event indicating that the load should be blocked. There should
> also be a function to indicate "I don't have an answer yet, but I'll
> call you back asynchronously to let you know my answer". We won't
> start any network traffic until everyone that requested to reply
> asynchronously has responded.
> 
> As a performance saving measure we can make the call to synchronously
> block the load also call Event.stopImmediatePropagation, which would
> prevent more of the content-policy-event-handlers from getting called.
> 
> When the event fires, we make the following information available:
> * Load type. I.e. stylesheet, document, XHR, etc. [2] is the list of
> types that we currently have
> * URI. The uri we're about to load
> * Node. The note initiating the load. In some cases when we can't
> figure out the exact node it'll be the document where the load
> happens.
> * Channel. The channel we're about to start loading.
> 
> A big change here is that we provide the channel. This will make it
> much easier to track a single load through the rest of necko. Another
> thing to note is that since we provide a reference to the node the
> event has to be fired in the e10s content process. This shouldn't be
> too hard to deal with for addons though as we have good mechanisms for
> registering event handlers in all e10s content processes as detailed
> in [1]. The principal of the loader will be trivially accessible from
> the Node.
> 
> If a redirect occurs we'll again fire an event looking exactly like
> the first event which provides the same data and additionally the old
> channel and old URI. This makes handling redirects *a lot* easier
> compared to how things work today. Again the
> content-policy-event-handler has the ability to respond synchronously
> or asynchronously and we won't hit the network for the new URI until
> everyone has responded.
> 
> We'll also provide a explicit API on the event to allow a content
> policy to redirect a load to a new URI. When that happens we'll treat
> this like a "normal" redirect and fire a new event on all content
> policy just like for a http redirect. If multiple policies want to
> redirect to different URIs we'll have to handle that somehow.
> 
> Once we have downloaded enough of the resource that we have things
> like header data we fire a second, in place of the current
> nsIContentPolicy.shouldProcess callback. Again content policies will
> have the ability to respond synchronously or asynchronously. Not until
> we have responses from all event handlers will we hand the result of
> the network request to the client.
> 
> 
> For someone wanting to call into the content policy API before
> starting a network load here's what things would look like:
> 
> First the caller creates a channel for the load. The caller then calls
> into the content policy API and provide the load type, the loading
> node and the channel (the URI can be derived from the channel) and
> flags. The flags are for things like:
> 
> * Do same-origin check
> * Is data: considered same-origin
> * Are loads from chrome: allowed
> * Other checkloaduri flags [3]
> 
> The API takes care of doing the same-origin check if requested,
> including on redirects. It also performs the CheckLoadURI check
> according to flags. If those checks pass it'll notify the content
> policy implementations by firing the above described event. Once all
> the checks have passed, which could happen asynchronously, it'll fire
> off the network load.
> 
> Even if the API doesn't synchronously know if it's safe to hit the
> network it'll still have to call AsyncOpen on the channel
> synchronously. Or at least it'll have make the channel act as if
> AsyncOpen had been called. This is important as to allow the channel
> to be canceled and to prevent SetRequestHeader and similar APIs from
> being called.
> 
> Another important aspect is that the API has to fire the event off of
> a scriptrunner. This to ensure that content-policy-event-handlers
> doesn't take any actions that we're not prepared for due to being in
> an inconsistent state.
> 
> Once we get the OnStartRequest notification from necko we'll fire the
> second event. While waiting for the response to this event (which
> could come asynchronously) we'll have to pause the channel to prevent
> OnDataAvailable calls from coming in. We also don't call
> OnStartRequest on the streamlistener.
> 
> 
> Questions:
> Is the above list of information enough to provide to the content
> policy consumers? I.e. is channel, node, uri and load type enough? We
> currently have some additional properties, but they seem mostly
> useless. The reason we want to drop them is to have to carry around
> less information in case a redirect happens.
> 
> Is the current list of load types that we have good? This is pretty
> orthogonal to the other changes proposed here, but since we're
> changing the API in backwards incompatible ways anyway, we have a good
> opportunity to make improvements.
> 
> [1] 
> http://groups.google.com/group/mozilla.dev.platform/browse_thread/thread/a0030ea69fa5fa1a/371558655716c965
> [2] 
> http://mxr.mozilla.org/mozilla-central/source/content/base/public/nsIContentPolicy.idl#57
> [3] 
> http://mxr.mozilla.org/mozilla-central/source/caps/idl/nsIScriptSecurityManager.idl#69
> 
> / Jonas

_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to