On Tue, Jul 21, 2009 at 10:27 AM, Drew Wilson <atwil...@chromium.org> wrote:

> Sigh. I keep sending this with the wrong email address. I wish Gmail would
> just use the address from the last time I replied to the thread.


Settings -> Accounts -> When receiving a message:Reply from the same address
the message was sent to


>
> -=-=-
>
> It seems like that would have some undesirable side-effects, aside from the
> fact that WebKit frowns on using virtual functions unnecessarily.
> So, let's imagine that I have two derived classes, SharedWorkerContext and
> DedicatedWorkerContext. DedicatedWorkerContext wants to expose postMessage()
> as a public callable function, but SharedWorkerContext would not.
>
> If we only have a single V8 "class" for both of these (WORKERCONTEXT) then
> that implies:
>
> 1) I have to define postMessage() as a virtual function on the base WebCore
> class (WorkerContext). In fact, WorkerContext ends up containing the union
> of all exposed APIs for every future derived class, which seems ugly.
>
> 2) From javascript, if I have a SharedWorkerContext, and I do this "typeof
> postMessage", it should return "undefined" (since SharedWorkerContext does
> not define this attribute) - however, since SharedWorkerContext is actually
> just a vanilla WORKERCONTEXT behind the scenes, it would return "function",
> which violates the spec.
>
> It seems like the right way to do this is to actually have separate V8
> items. The alternative is to have just a single WORKERCONTEXT, but instead
> of using polymorphism have custom getters/setters for every attribute that
> check the type of the impl class and do the appropriate thing. But it seems
> like the whole point of having the V8ClassIndex enum is to avoid this kind
> of manual polymorphism.
>
> -atw
>
> On Mon, Jul 20, 2009 at 8:22 PM, Jeremy Orlow <jor...@chromium.org> wrote:
>
>> In other words, make all workers appear the same to V8 (i.e. as a
>> WORKERCONTEXT) and then implement polymorphism in the implementations being
>> wrapped by V8.
>>
>> On Mon, Jul 20, 2009 at 8:19 PM, Jeremy Orlow <jor...@chromium.org>wrote:
>>
>>> Sorry if this is a dumb question, but why woudn't you simply have a
>>> WORKERCONTEXT and let virtual dispatch do its job for the rest?  Shared
>>> methods can be implemented on the base class and the rest can be purely
>>> virtual with implementations in the sub classes.
>>>
>>> J
>>>
>>> On Mon, Jul 20, 2009 at 3:21 PM, Drew Wilson <atwil...@chromium.org>wrote:
>>>
>>>> Following up on this. Let's imagine that I don't define a V8ClassIndex
>>>> enum for the common base class (so, in my case, I get rid of WORKERCONTEXT,
>>>> and have only DEDICATEDWORKERCONTEXT and SHAREDWORKERCONTEXT (the derived
>>>> classes).
>>>> Now, let's say I'm defining an ACCESSOR_GETTER on the base class - the
>>>> first thing I want to do is get a pointer to the native object. I don't 
>>>> know
>>>> which concrete class the native object is (DedicatedWorkerContext or
>>>> SharedWorkerContext), but I do know that it's guaranteed to be an instance
>>>> of the base native class (WorkerContext).
>>>>
>>>> Currently I'm doing this:
>>>>
>>>>     WorkerContext* workerContext =
>>>> V8DOMWrapper::convertToNativeObject<WorkerContext>(V8ClassIndex::WORKERCONTEXT,
>>>> info.Holder());
>>>>
>>>> If I remove V8ClassIndex::WORKERCONTEXT, then I can't pass that in to
>>>> convertToNativeObject. It looks like the passed-in enum is only used for
>>>> error checking currently, so I guess what I should use instead is
>>>> convertDOMWrapperToNative()?:
>>>>
>>>> WorkerContext* workerContext =
>>>> V8DOMWrapper::convertDOMWrapperToNative<WorkerContext>(info.Holder());
>>>>
>>>> Is that the general pattern people use for cases like this?
>>>>
>>>> -atw
>>>>
>>>> On Mon, Jul 20, 2009 at 3:21 PM, Drew Wilson <atwil...@chromium.org>wrote:
>>>>
>>>>> <resending from correct acct>:
>>>>>
>>>>> Currently, Web Workers have a class (WorkerContext) which represents
>>>>> the global scope for a worker. The custom V8 bindings for this class are
>>>>> defined in V8WorkerContextCustom, and we also define
>>>>> V8ClassIndex::WORKERCONTEXT for the wrapper object.
>>>>> I'm refactoring the WebCore impl class, so WorkerContext becomes
>>>>> (essentially) an abstract base class, and the actual worker context will 
>>>>> be
>>>>> one of two derived classes: DedicatedWorkerContext or SharedWorkerContext.
>>>>> In my refactoring, I've only implemented a single derived class
>>>>> (DedicatedWorkerContext) for now.
>>>>>
>>>>> I'm trying to figure out the correct way to structure the V8 bindings -
>>>>> I've already made a pass at it that passes all of the unit tests:
>>>>>
>>>>> https://bugs.webkit.org/show_bug.cgi?id=27420
>>>>>
>>>>> I've defined V8ClassIndex::DEDICATEDWORKERCONTEXT, but I'm not certain
>>>>> if I need to remove V8ClassIndex::WORKERCONTEXT or not, since there
>>>>> shouldn't ever be a wrapper object created for that base class. Are the
>>>>> wrapper types defined in V8Index.h only for actually instantiable wrapper
>>>>> objects (in which case I should only define them for the "leaves" of the
>>>>> tree), or is it used for other things like instanceof?
>>>>>
>>>>> -atw
>>>>>
>>>>>
>>>>
>>>> >>>>
>>>>
>>>
>>
>

--~--~---------~--~----~------------~-------~--~----~
Chromium Developers mailing list: chromium-dev@googlegroups.com 
View archives, change email options, or unsubscribe: 
    http://groups.google.com/group/chromium-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to