Make LiveDevMultiBrowser's Launcher instance configurable via public set Launcher() method #10558

Merged
merged 2 commits into from Mar 12, 2015

Projects

None yet

3 participants

@humphd
Contributor
humphd commented Feb 10, 2015

We're working on using the new LiveDevMultiBrowser code to allow an in-browser Brackets to use an iframe-based browser and postMessage-based protocol, see https://github.com/humphd/brackets/issues/27. One of the snags we've hit is that we need a way to override how the default browser is launched, and the Launcher is currently not configurable.

This patch follows the same pattern currently in place for swapping the protocol's transport (which we also make use of in order to use postMessage to/from the iframe), and adds a setLauncher() method. If you'd consider this API change, we'd be able to get our own iframe-based launcher hooked into live dev.

cc @busykai, @sebaslv, @sedge

@sebaslv
Contributor
sebaslv commented Feb 13, 2015

@humphd, looks good to me having this mechanism to dynamically set a different Launcher instance. We have a unique launcher instance now to make it compatible with CDT-based live dev UI but, in the near future we would like to decouple launch mechanism from live dev session to better support launching multiple clients per session.

Just curious, have you consider some way of static configuration also for your use case? I mean, something like having a pref that allows setting the Launcher instance to be loaded during initialization rather than always loading DefaultLauncher and then dynamically swapping it?

@humphd
Contributor
humphd commented Feb 13, 2015

OK, great. Using this patch (which I landed on our brackets fork), we've just today been able to get Live Dev working in the browser with an iframe and postMessage--it's awesome :) It would be great if you'd take this patch upstream so we don't have to modify brackets at all to make it work.

Regarding your other question, I've been wondering about that too. I don't love the idea of doing it with prefs, since that still forces changes in brackets proper, and isn't something you can do from an extension. I like the model you have with the live dev server manager, where you can register a server with a priority. In an ideal world, it would be great if an extension could somehow provide the transport, launcher, and maybe a few other internal implementations for Live Dev, and have Live Dev's init use these instead of starting with the defaults and then being forced to switch them. It's a bit of a pain to switch them, because you have to get the timing right, or your transport/launcher get overwritten by the defaults again.

I had the same issue with swapping out my in-browser filesystem (https://github.com/filerjs/filer) for the appshell's impementation, which requires me to change the brackets source internally. It would be great if there was a way for extensions to override more of the internal code, but that's a larger issue, and I don't want to block this bug on figuring that out if possible.

@busykai
Member
busykai commented Mar 3, 2015

Sorry I haven't been able to get to this for a little while. I'll review and merge this code. We'd want to have as little diffs as possible with the mainstream Brackets. As for static configuration, we'll consider it as the next step (this one may actually help it).

@busykai busykai commented on an outdated diff Mar 3, 2015
src/LiveDevelopment/LiveDevMultiBrowser.js
@@ -800,6 +806,22 @@ define(function (require, exports, module) {
}
/**
+ * Sets the current browser launcher mechanism to be used by live development
+ * (e.g., default browser, iframe-based browser, etc.)
+ * The launcher must provide the following method:
+ *
+ * - launch(url): Launch the given URL in the appropriate browser.
+ *
+ * @param {{launch: function(string)}} launcher
+ */
+ function setLauncher(launcher) {
+ if (!(launcher && launcher.launch)) {
+ throw new Error("LiveDevMultiBrowser.setLauncher(): launcher must have `launch` method");
@busykai
busykai Mar 3, 2015 Member

We'd normally log an error instead of throwing it. However, it may still make sense to have an error to be able to trace back the origin of the call. Like so (note the commas, not concatenation):

console.log("Invalid launcher object: ", launcher, new Error("LiveDevMultiBrowser.setLauncher()");
@busykai
busykai Mar 3, 2015 Member

Well, and return from the if, of course...

@busykai
Member
busykai commented Mar 3, 2015

@humphd, looks good, only one minor comment.

@humphd
Contributor
humphd commented Mar 3, 2015

Thanks, fixed.

@busykai busykai commented on an outdated diff Mar 3, 2015
src/LiveDevelopment/LiveDevMultiBrowser.js
@@ -800,6 +806,23 @@ define(function (require, exports, module) {
}
/**
+ * Sets the current browser launcher mechanism to be used by live development
+ * (e.g., default browser, iframe-based browser, etc.)
+ * The launcher must provide the following method:
+ *
+ * - launch(url): Launch the given URL in the appropriate browser.
+ *
+ * @param {{launch: function(string)}} launcher
+ */
+ function setLauncher(launcher) {
+ if (!(launcher && launcher.launch)) {
+ console.log("Invalid launcher object: ", launcher, new Error("LiveDevMultiBrowser.setLauncher()");
@busykai
busykai Mar 3, 2015 Member

@humphd, this has a syntax error. :)

@humphd
Contributor
humphd commented Mar 3, 2015

Ugh. Fixed.

@humphd
Contributor
humphd commented Mar 9, 2015

@busykai ping?

@busykai
Member
busykai commented Mar 12, 2015

Looks good! Merging. Sorry for the delay.

@busykai busykai merged commit ddc760b into adobe:master Mar 12, 2015

1 check passed

continuous-integration/travis-ci/pr The Travis CI build passed
Details
@humphd
Contributor
humphd commented Mar 12, 2015

Great, thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment