- From: James Graham <james@hoppipolla.co.uk>
- Date: Tue, 13 Sep 2016 22:14:42 +0100
- To: public-browser-tools-testing@w3.org
On 12/09/16 21:55, Simon Stewart wrote:
> Hi,
>
> We spend an awful lot of time at F2F sessions on capabilities, but I
> think Jason Leyba's current suggestion nails almost all the points that
> have been raised in meetings and in person:
>
> https://github.com/w3c/webdriver/pull/327
>
> Notably:
>
> * Address the desire for simple processing of capabilities by end
> nodes, with exact matches only.
> * Makes it possible to describe several different possibilities.
> * Has a different set of blob keys, meaning that the protocol
> handshake between OSS, the original spec text, and the new spec text
> can be done unambiguously (esp. if end nodes hold to Postel's Law)
> * Makes an effort to reduce data being sent across the wire through
> the use of the "required capabilities" being merged with "first match".
>
> The biggest downside from my point of view is that this is hard to make
> 100% backward compatible with the widespread use of selenium, but we
> could handle iterating over the values on the local end until we ship
> Selenium 4.
I think this proposal looks like an improvement over the existing
design. However I have a number of concerns:
* I think continuing to describe these as "capabilities" is misleading
because the name implies semantics that are only relevant to a subset of
the features (particular around browser selection and routing). Things
like timeouts are pure configuration. We should use a more neutral term
like "parameters".
* I presume the point of passing on browser-selection parameters to the
browser itself is to enable the browser to re-match on these parameters
to select only the required subset of parameters, without requiring an
intermediary node to alter the message. But I think the design here has
two issues. One is that it is not, in general, cheap to tell which
version of a browser will be run; to do this from a proxy one needs to
actually launch the browser and parse out the version number string.
This seems relatively complicated and I would like to avoid it if
possible. Why do routing intermediaries need special consideration in
terms of not altering the parameters? The other is that the proposed
structure seems rather non-general. If I want to specify something large
like a bas64-encoded profile in a way that it only appears in the
message once, but where it applies to > 1 but not all of the firstMatch
parameter sets that isn't possible.
* It is unclear to me that hard-failing on unrecognised parameters is
the most backwards compatible thing. In particular I'm wondering about
the case where a browser introduces a new parameter related to something
like e.g. logging which is basically always optional. In the scheme
described that would require duplication for no obvious benefit. Having
said that there is no recursive validation, so it seems one could always
put browser-specific configuration under a single parameter and
implement whatever semantics inside that, without violating the letter
of the spec.
* Some details of the way the spec is set up don't make sense. This is a
holdover from the existing text, but if we are revamping this section we
should also fix the major structural issues e.g. the table that has
normative text that is not actually referenced from any section.
* It may just be that I'm bad at reading the spec as a diff, but it's
not clear that the algorithm as written actually does the right thing.
It seems like every option in matchFirst is tried and the value of the
last is used, irrespective of anything. Apologies if I'm horribly
misreading this.
So I think a design similar to this that I would prefer is:
{
"routing": [
{"browser": "firefox",
"platform": "linux"},
{"browser": "firefox"},
{"browser": "chrome"},
{}
],
"settings": [
{"timeouts": {"script": 30000},
{"match": {"browser": "firefox", "version": 49},
"firefoxOptions": {"prefs": {"dom.disable-open-during-load":false}}
},
{"match": {"browser": "firefox"},
"profile": <base64String>
},
{"match": {"browser": "chrome"},
"binary": "/usr/local/chrome"}
]
}
For any intermediary that did routing this would express a preference
for Firefox on Linux, followed by Firefox on any platform, followed by
Chrome, followed by anything.
For browser settings, the options that match would be cumulative, so any
browser would set the script timeout to 30s, any firefox would use the
same base profile, firefox 49 would set a specific pref, and Chrome
would use a specific binary. For matching with the version number one
would have to use the specified binary, if any so e.g.
{
"settings": [
{"timeouts": {"script": 30000}},
{"match": {"browser": "firefox", "version": 49},
"binary": "/home/user/firefox"}
]
}
running in firefox would only use the /home/user/firefox binary if that
binary was a firefox 49 binary (if intermediary nodes could be required
to edit the new session payload we could sidestep this complexity by
requiring that they reduce the settings to a list of length 1 with no
match clauses representing only the things that are known to work. But
that does have the problem that one can't send the same message
irrespective of whether a routing intermediary is present).
Received on Tuesday, 13 September 2016 21:15:08 UTC