On Wed, Feb 22, 2012 at 10:48 AM, Maciej Stachowiak <[email protected]> wrote:
>
> On Feb 21, 2012, at 5:40 PM, Hajime Morrita wrote:
>
>> Hi, Thanks for starting this discussion!
>>
>> To summarize, there is a rough consensus which is like:
>>
>> * A. LayoutTestController (LTC) is for control test harness.
>> dumpAsText() and waitUntilDone() is great example of this.
>>
>> * B. EventSender and some other stuff are for emulating external
>> events like user input.
>> keyDown() is good example.
>>
>> * C. Internals is for inspecting WebCore internal state which isn't
>> available from WebKit API.
>> Inspecting spellcheck markers is one typical example.
>>
>> But I found that there are some test-specific APIs which don't fit
>> well in any of listed categories:
>>
>> * D. Changing Settings and RuntimeFeatures values.
>> Inspecting flags in these objects is a good fit for Internals. But how
>> about changing these values? I feel that it's no longer "inspecting".
>> On the other hand, we know that adding new WebKit and LTC API for each
>> these flags is certainly tedious work especially the flag is just for
>> disabling/enabling half-baked features. Currently we have several flag
>> setters on Internals object but I worry a bit this as a start of
>> abusing Internals.
>>
>> My feeling is that it's OK to use Internals family assuming that
>> getting/setting flags are "trivial" enough so that we don't need to
>> worry about unexpected side-effects. We already have InternalsSettings
>> for this purpose.
>>
>> * E. Invoking some WebCore API which implements "portable" WebKit API.
>> This is one step forward from D. There are some WebKit APIs which just
>> call corresponding WebCore methods. A good example of WebCore side is
>> WebCore::Page::setDeviceScaleFactor(): There is a discussion to
>> whether we should add a wrapper API for this to Internals:
>> http://wkb.ug/74014.
>>
>> This API is less trivial than changing settings since this isn't just
>> a parameter setting but has a side effect. On the other hand, some API
>> like this has no platform-specific part. WebKit API just calls this.
>> It could be felt as a waste of abstraction if we add LTC API for that
>> - it will just stack a few more call frames.
>>
>> I think we could cover this usecase by some Internals-like object. But
>> it should never be Internals itself and ideally a wrapper of WebCore
>> object. For example, we could have something like PageWrapper for
>> WebCore::Page which could be implemented in the same way as Internals.
>>
>> Or, we could employ the controller-client pattern to have IDL
>> generated class in shared WebCoreTestSupport and let each DRT to
>> implement the client. This could eliminate the need for hand-written
>> bindings even though we need to have some per-port stuff.
>>
>> * F. Purely for testing, but "portable" mechanism.
>> Mocking some clients are primary example of this. Mock objects are
>> rarely platform specific and implementing it in each platform is
>> nothing more than coding practice IMHO. I understand that there are
>> some controversy around mock itself. But we have some features which
>> are hard to test in automated manner without mock.
>>
>> For this, we could do same as E.
>>
>> I think LTC isn't good place for neither D, E or F. But Internals also isn't.
>> What do you think?
>
> For D, E and F, I think the methods should be split up into object by purpose 
> rather than by how they'd be implemented. I agree that these methods 
> shouldn't be piled onto a single LayoutTestController object.

That's right.

>
> One concern I have about settings: poking through the WebKit API layer to set 
> settings directly in WebCore may not necessarily work as expected in all 
> WebKit ports, or at least it will violate implementation invariants. For 
> example, in WebKit2 (currently using the WebKitTestRunner tool which is 
> separate from DumpRenderTree at present), both the WebProcess and the UI 
> process need to know about settings. This makes me think that settings (at 
> least ones surfaced at the API level) should actually go through the WebKit 
> API rather than poking directly into WebCore via the internals object.
>

Good point. I wasn't aware of this.

In my understanding, the problem here is that these states can be
out-of-sync. Considering so, we can move a part of Settings parameters
to RuntimeFeatures, which doesn't need to be updated dynamically. I
guess there is a certain numer of flags in Settings which are't
changed from the default outside the test.

Thanks for pointing this out.

Bests,
--
morrita

> Regards,
> Maciej
>
>
>
>
>
_______________________________________________
webkit-dev mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev

Reply via email to