Bug 142422 - Content extensions need triggers dependent on 3rd party and content type
Summary: Content extensions need triggers dependent on 3rd party and content type
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: WebCore Misc. (show other bugs)
Version: 528+ (Nightly build)
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Alex Christensen
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-03-06 17:46 PST by Alex Christensen
Modified: 2015-03-11 18:04 PDT (History)
5 users (show)

See Also:


Attachments
Patch (30.27 KB, patch)
2015-03-06 17:50 PST, Alex Christensen
no flags Details | Formatted Diff | Diff
Patch (38.72 KB, patch)
2015-03-11 13:44 PDT, Alex Christensen
no flags Details | Formatted Diff | Diff
Patch (43.72 KB, patch)
2015-03-11 14:26 PDT, Alex Christensen
no flags Details | Formatted Diff | Diff
Patch (44.40 KB, patch)
2015-03-11 15:56 PDT, Alex Christensen
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Alex Christensen 2015-03-06 17:46:44 PST
This is one of many ways to implement this.  Some of them are:

1) Prepending non-ascii characters to the url containing the flags.  This is 
2) Putting the flags in the compiled action description.  This would create many false positives that would be filtered out after interpreting.
3) Make many smaller DFAs for each combination of flags.
4) Put the flags in the byte code if needed.  This is similar to 2.

I implemented number 4.  Comments?
Comment 1 Alex Christensen 2015-03-06 17:50:50 PST
Created attachment 248123 [details]
Patch
Comment 2 Benjamin Poulain 2015-03-06 21:22:45 PST
Comment on attachment 248123 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=248123&action=review

> Source/WebCore/contentextensions/ContentExtensionParser.cpp:80
> +    JSValue imagesOnlyObject = triggerObject.get(&exec, Identifier(&exec, "images-only"));
> +    if (imagesOnlyObject && !exec.hadException() && imagesOnlyObject.isBoolean())
> +        trigger.imageOnly = imagesOnlyObject.toBoolean(&exec);
> +    
> +    JSValue thirdPartyObject = triggerObject.get(&exec, Identifier(&exec, "third-party"));
> +    if (thirdPartyObject && !exec.hadException() && thirdPartyObject.isBoolean())
> +        trigger.thirdPartyOnly = thirdPartyObject.toBoolean(&exec);

I am unconvinced we should handle flags at the top level. Say you have "image-only:true" and "stylesheet-only:true", what should that match?

Maybe we should have:
    resourceType: ["image", "stylesheet", "script"]
    loadType: ["first-party", "third-party", ""]

> Source/WebCore/contentextensions/DFABytecode.h:49
> +    // The flags to check before appending (1 byte),

I think we'll need more than that :)

> Source/WebCore/loader/ResourceLoadInfo.cpp:33
> +ResourceType toResourceType(CachedResource::Type type)

Sam had a clear spec somewhere giving all the types we should expose.

> Source/WebCore/loader/ResourceLoadInfo.cpp:70
> +    // This definition of third party needs to be refined. This is just a proof-of-concept.

My guess is we should the exact same definition we use for cookies.
Comment 3 Benjamin Poulain 2015-03-06 21:26:28 PST
Sam, do you know if we defer to some CFNetwork API to know if a request is third party?
Comment 4 Sam Weinig 2015-03-06 21:34:13 PST
(In reply to comment #2)
> Comment on attachment 248123 [details]
> > Source/WebCore/loader/ResourceLoadInfo.cpp:33
> > +ResourceType toResourceType(CachedResource::Type type)
> 
> Sam had a clear spec somewhere giving all the types we should expose.

https://fetch.spec.whatwg.org/#concept-request-context
Comment 5 Sam Weinig 2015-03-06 21:36:36 PST
(In reply to comment #3)
> Sam, do you know if we defer to some CFNetwork API to know if a request is
> third party?

For third party cookie blocking, yes, but only because that is where cookies are handled. For this, I think we should just do it based on the same origin policy. That means, that if the SecurityOrigin of the resource being requested does not match the SecurityOrigin of the top level frame, it is third party. We can revise the meaning later if necessary.
Comment 6 Alex Christensen 2015-03-11 13:44:47 PDT
Created attachment 248445 [details]
Patch
Comment 7 Alex Christensen 2015-03-11 14:26:50 PDT
Created attachment 248448 [details]
Patch
Comment 8 Alex Christensen 2015-03-11 14:28:00 PDT
Rebased patch.  Tests conflicted with http://trac.webkit.org/changeset/181405
Comment 9 Benjamin Poulain 2015-03-11 15:00:59 PDT
Comment on attachment 248445 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=248445&action=review

Ok, I may be wrong but from a quick look I think this is incorrect.

Since you are merging the flags into the actions at the machine level, you need to differentiate 2 actions of same type with different conditions.
Say I have 2 rules:
    1) BLock *.swf on thirdparty
    2) Block foobar.pdf always

When you merge the actions in serializeActions(), you must differentiate those two.
Since now you are adding the flags after merging the rules, both filters would be conditional on third-party.

> Source/WebCore/contentextensions/ContentExtensionParser.cpp:49
> +static bool getTypeFlags(ExecState& exec, const JSValue& typeValue, ResourceFlags& flags, uint16_t(*reader)(const String&))

reader -> stringToType?

> Source/WebCore/contentextensions/ContentExtensionParser.cpp:56
> +        WTFLogAlways("Invalid array");

We'll have to improve those error messages. Here is it not clear which array is invalid.

> Source/WebCore/contentextensions/DFABytecode.h:51
> +    AppendConditionalAction,

A bit weird to have "Conditional Action"

AppendActionConditionallyOnFlags
TestFlagsAndAppendAction

?

> Source/WebCore/loader/ResourceLoadInfo.cpp:38
> +    case CachedResource::SVGDocumentResource:

You don't use the SVGDocument type?

> Source/WebCore/loader/ResourceLoadInfo.cpp:62
> +    case CachedResource::TextTrackResource:
> +        return ResourceType::Media;

Hum, I don't know if that's right.

> Source/WebCore/loader/cache/CachedResourceLoader.cpp:513
> +    URL mainDocumentURL;
> +    if (frame() && frame()->document())
> +        mainDocumentURL = frame()->document()->url();

If you are in a embedded frame (e.g. iFrame), shouldn't mainDocumentURL be the one of the top level frame?
Comment 10 Alex Christensen 2015-03-11 15:48:37 PDT
Comment on attachment 248445 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=248445&action=review

>> Source/WebCore/loader/ResourceLoadInfo.cpp:38
>> +    case CachedResource::SVGDocumentResource:
> 
> You don't use the SVGDocument type?

Oops.  You're right.

>> Source/WebCore/loader/ResourceLoadInfo.cpp:62
>> +        return ResourceType::Media;
> 
> Hum, I don't know if that's right.

It seems like TextTrackResource would always be related to media, which we would need a separate device to block.

>> Source/WebCore/loader/cache/CachedResourceLoader.cpp:513
>> +        mainDocumentURL = frame()->document()->url();
> 
> If you are in a embedded frame (e.g. iFrame), shouldn't mainDocumentURL be the one of the top level frame?

I think so.  Should we also use the mainFrame's userContentController?
Comment 11 Alex Christensen 2015-03-11 15:51:02 PDT
(In reply to comment #9)
> Ok, I may be wrong but from a quick look I think this is incorrect.
> 
> Since you are merging the flags into the actions at the machine level, you
> need to differentiate 2 actions of same type with different conditions.
> Say I have 2 rules:
>     1) BLock *.swf on thirdparty
>     2) Block foobar.pdf always
> 
> When you merge the actions in serializeActions(), you must differentiate
> those two.
> Since now you are adding the flags after merging the rules, both filters
> would be conditional on third-party.
The conditionality is in the trigger in the DFA byte code.  In this case it would behave correctly: It would append the block action unconditionally for foobar.pdf and it would append the same block action after testing flags for *.swf.
That is a good test case, though.  I'm including it.
Comment 12 Alex Christensen 2015-03-11 15:56:39 PDT
Created attachment 248460 [details]
Patch
Comment 13 WebKit Commit Bot 2015-03-11 18:04:14 PDT
Comment on attachment 248460 [details]
Patch

Clearing flags on attachment: 248460

Committed r181421: <http://trac.webkit.org/changeset/181421>
Comment 14 WebKit Commit Bot 2015-03-11 18:04:18 PDT
All reviewed patches have been landed.  Closing bug.