Closed
Bug 857082
Opened 12 years ago
Closed 12 years ago
TabTarget.makeRemote doesn't need any arguments
Categories
(DevTools :: Framework, defect, P2)
DevTools
Framework
Tracking
(Not tracked)
RESOLVED
FIXED
Firefox 23
People
(Reporter: past, Assigned: past)
Details
(Whiteboard: [fixed-in-fx-team])
Attachments
(1 file, 3 obsolete files)
(deleted),
patch
|
jwalker
:
review+
|
Details | Diff | Splinter Review |
makeRemote makes an existing target remote, so there is never a need to supply the (optional) options object that it expects, since the caller would have already used it to instantiate the target.
Assignee | ||
Comment 1•12 years ago
|
||
Well, that wasn't so hard. All tests pass locally and connecting to b2g works fine.
Assignee | ||
Updated•12 years ago
|
Priority: -- → P2
Comment 2•12 years ago
|
||
Comment on attachment 732349 [details] [diff] [review]
Patch v1
Review of attachment 732349 [details] [diff] [review]:
-----------------------------------------------------------------
I wonder if we should also add TargetFactory.forRemotedTab(options) -> promise(target) so we can begin the process of moving over?
It would be fairly easy to do that here, I think.
Thoughts?
Also is forRemotedTab the best name?
Attachment #732349 -
Flags: review?(jwalker) → review+
Assignee | ||
Comment 3•12 years ago
|
||
(In reply to Joe Walker [:jwalker] from comment #2)
> I wonder if we should also add TargetFactory.forRemotedTab(options) ->
> promise(target) so we can begin the process of moving over?
Good idea, I like that.
> Also is forRemotedTab the best name?
How about forRemoteTab, since this is not a regular tab that was remoted, but a remote one from the beginning?
Attachment #732349 -
Attachment is obsolete: true
Attachment #732490 -
Flags: review?(jwalker)
Comment 4•12 years ago
|
||
Comment on attachment 732490 [details] [diff] [review]
Patch v2
Review of attachment 732490 [details] [diff] [review]:
-----------------------------------------------------------------
::: browser/devtools/framework/Target.jsm
@@ +60,5 @@
> + let deferred = Promise.defer();
> + target = new TabTarget(options);
> + targets.set(options, target);
> + target.makeRemote().then( () => deferred.resolve(target) );
> + return deferred.promise;
I think we can use propagation from https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/core/promise.html
to simplify this to:
let target = targets.get(options);
if (target != null) {
return Promise.resolve(target);
}
target = new TabTarget(options);
targets.set(options, target);
return target.makeRemote().then(() => target);
However, I think there's a bug here where 2 people call this twice, in quick succession, and the second gets a resolved promise to a target that has not finished remoting yet, but where the contract says it should have.
If we were to store promises to targets in 'targets' then we could safely do:
let promise = targets.get(options);
if (promise == null) {
let target = new TabTarget(options);
promise = target.makeRemote().then(() => target);
targets.set(options, promise);
}
return promise;
But that might require us to change other code? Perhaps this is getting too complex and we should do it in a follow-up.
Attachment #732490 -
Flags: review?(jwalker)
Assignee | ||
Comment 5•12 years ago
|
||
(In reply to Joe Walker [:jwalker] from comment #4)
> let promise = targets.get(options);
> if (promise == null) {
> let target = new TabTarget(options);
> promise = target.makeRemote().then(() => target);
> targets.set(options, promise);
> }
> return promise;
>
> But that might require us to change other code? Perhaps this is getting too
> complex and we should do it in a follow-up.
Nah, this is only used in a single place (connect.js) and works fine.
Attachment #732490 -
Attachment is obsolete: true
Attachment #732691 -
Flags: review?(jwalker)
Comment 6•12 years ago
|
||
(In reply to Panos Astithas [:past] from comment #5)
> > But that might require us to change other code? Perhaps this is getting too
> > complex and we should do it in a follow-up.
>
> Nah, this is only used in a single place (connect.js) and works fine.
I meant with something like this:
let tab = ...
TargetFactory.forRemoteTab(tab).then(...);
let target = TargetFactory.forTab(tab);
// Uses target only to discover that it's a promise.
The solution, I think, is to have another WeakMap that holds promises to targets. forTab() then works as normal, but forRemoteTab() does:
* if there is a promise for the tab in promiseTargets, return it. Done.
* if don't have a target for the tab in targets, then create one.
* create a promise for the remoting of the target, store it in promiseTargets and then return it.
Updated•12 years ago
|
Attachment #732691 -
Flags: review?(jwalker)
Assignee | ||
Comment 7•12 years ago
|
||
(In reply to Joe Walker [:jwalker] from comment #6)
> The solution, I think, is to have another WeakMap that holds promises to
> targets. forTab() then works as normal, but forRemoteTab() does:
>
> * if there is a promise for the tab in promiseTargets, return it. Done.
> * if don't have a target for the tab in targets, then create one.
I agree with the rest, but this step doesn't make much sense to me. There will never be a target for the remote tab in |targets|, because the |options| object that corresponds to the remote tab is not a XUL tab and we are now going to explicitly separate the weakmaps according to object type (for values, but consequently also for keys).
> * create a promise for the remoting of the target, store it in
> promiseTargets and then return it.
Doing (1) and (3) only works for me.
Assignee | ||
Comment 8•12 years ago
|
||
Is this what you had in mind?
Attachment #732691 -
Attachment is obsolete: true
Attachment #732821 -
Flags: review?(jwalker)
Comment 9•12 years ago
|
||
(In reply to Panos Astithas [:past] from comment #7)
> (In reply to Joe Walker [:jwalker] from comment #6)
> > The solution, I think, is to have another WeakMap that holds promises to
> > targets. forTab() then works as normal, but forRemoteTab() does:
> >
> > * if there is a promise for the tab in promiseTargets, return it. Done.
> > * if don't have a target for the tab in targets, then create one.
>
> I agree with the rest, but this step doesn't make much sense to me. There
> will never be a target for the remote tab in |targets|, because the
> |options| object that corresponds to the remote tab is not a XUL tab and we
> are now going to explicitly separate the weakmaps according to object type
> (for values, but consequently also for keys).
>
> > * create a promise for the remoting of the target, store it in
> > promiseTargets and then return it.
>
> Doing (1) and (3) only works for me.
I guess I'm looking ahead to when there is only one type of target. That's ok for now.
Updated•12 years ago
|
Attachment #732821 -
Flags: review?(jwalker) → review+
Assignee | ||
Comment 10•12 years ago
|
||
Whiteboard: [fixed-in-fx-team]
Comment 11•12 years ago
|
||
Status: ASSIGNED → RESOLVED
Closed: 12 years ago
Resolution: --- → FIXED
Target Milestone: --- → Firefox 23
Updated•6 years ago
|
Product: Firefox → DevTools
You need to log in
before you can comment on or make changes to this bug.
Description
•