diff --git a/.gitignore b/.gitignore index 849ddff..73f63fc 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ dist/ +node_modules \ No newline at end of file diff --git a/openChrome.applescript b/openChrome.applescript index 3b1b5a2..c6c9c66 100644 --- a/openChrome.applescript +++ b/openChrome.applescript @@ -1,6 +1,5 @@ (* Copyright (c) 2015-present, Facebook, Inc. - This source code is licensed under the MIT license found in the LICENSE file in the root directory of this source tree. *) @@ -8,47 +7,56 @@ LICENSE file in the root directory of this source tree. property targetTab: null property targetTabIndex: -1 property targetWindow: null +property theProgram: "Google Chrome" on run argv set theURL to item 1 of argv - tell application "Chrome" + -- Allow requested program to be optional, + -- default to Google Chrome + if (count of argv) > 1 then + set theProgram to item 2 of argv + end if + + using terms from application "Google Chrome" + tell application theProgram - if (count every window) = 0 then - make new window - end if + if (count every window) = 0 then + make new window + end if - -- 1: Looking for tab running debugger - -- then, Reload debugging tab if found - -- then return - set found to my lookupTabWithUrl(theURL) - if found then - set targetWindow's active tab index to targetTabIndex - tell targetTab to reload - tell targetWindow to activate - set index of targetWindow to 1 - return - end if + -- 1: Looking for tab running debugger + -- then, Reload debugging tab if found + -- then return + set found to my lookupTabWithUrl(theURL) + if found then + set targetWindow's active tab index to targetTabIndex + tell targetTab to reload + tell targetWindow to activate + set index of targetWindow to 1 + return + end if - -- 2: Looking for Empty tab - -- In case debugging tab was not found - -- We try to find an empty tab instead - set found to my lookupTabWithUrl("chrome://newtab/") - if found then - set targetWindow's active tab index to targetTabIndex - set URL of targetTab to theURL - tell targetWindow to activate - return - end if + -- 2: Looking for Empty tab + -- In case debugging tab was not found + -- We try to find an empty tab instead + set found to my lookupTabWithUrl("chrome://newtab/") + if found then + set targetWindow's active tab index to targetTabIndex + set URL of targetTab to theURL + tell targetWindow to activate + return + end if - -- 3: Create new tab - -- both debugging and empty tab were not found - -- make a new tab with url - tell window 1 - activate - make new tab with properties {URL:theURL} + -- 3: Create new tab + -- both debugging and empty tab were not found + -- make a new tab with url + tell window 1 + activate + make new tab with properties {URL:theURL} + end tell end tell - end tell + end using terms from end run -- Function: @@ -56,28 +64,30 @@ end run -- if found, store tab, index, and window in properties -- (properties were declared on top of file) on lookupTabWithUrl(lookupUrl) - tell application "Chrome" - -- Find a tab with the given url - set found to false - set theTabIndex to -1 - repeat with theWindow in every window - set theTabIndex to 0 - repeat with theTab in every tab of theWindow - set theTabIndex to theTabIndex + 1 - if (theTab's URL as string) contains lookupUrl then - -- assign tab, tab index, and window to properties - set targetTab to theTab - set targetTabIndex to theTabIndex - set targetWindow to theWindow - set found to true + using terms from application "Google Chrome" + tell application theProgram + -- Find a tab with the given url + set found to false + set theTabIndex to -1 + repeat with theWindow in every window + set theTabIndex to 0 + repeat with theTab in every tab of theWindow + set theTabIndex to theTabIndex + 1 + if (theTab's URL as string) contains lookupUrl then + -- assign tab, tab index, and window to properties + set targetTab to theTab + set targetTabIndex to theTabIndex + set targetWindow to theWindow + set found to true + exit repeat + end if + end repeat + + if found then exit repeat end if end repeat - - if found then - exit repeat - end if - end repeat - end tell + end tell + end using terms from return found -end lookupTabWithUrl +end lookupTabWithUrl \ No newline at end of file diff --git a/package.json b/package.json index f51a7f4..af45f0d 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "format": "prettier --write \"src/**/*.js\"" }, "dependencies": { - "open": "^6.4.0" + "open": "^7.0.3" }, "devDependencies": { "@babel/cli": "^7.2.0", diff --git a/src/index.js b/src/index.js index a7f7f1f..819da7e 100644 --- a/src/index.js +++ b/src/index.js @@ -10,17 +10,16 @@ const Actions = Object.freeze({ const getBrowserEnv = () => { // Attempt to honor this environment variable. // It is specific to the operating system. - // See https://github.com/sindresorhus/opn#app for documentation. + // See https://github.com/sindresorhus/open#app for documentation. const value = process.env.BROWSER; - let action; + let action = Actions.BROWSER; if (!value) { // Default. action = Actions.BROWSER; } else if (value.toLowerCase() === 'none') { action = Actions.NONE; - } else { - action = Actions.BROWSER; } + return { action, value }; }; @@ -31,24 +30,35 @@ const startBrowserProcess = (browser, url, opts = {}) => { // requested a different browser, we can try opening // Chrome with AppleScript. This lets us reuse an // existing tab when possible instead of creating a new one. - const shouldTryOpenChromeWithAppleScript = + const shouldTryOpenChromiumWithAppleScript = process.platform === 'darwin' && (typeof browser !== 'string' || browser === OSX_CHROME); - if (shouldTryOpenChromeWithAppleScript) { - try { - // Try our best to reuse existing tab - // on OS X Google Chrome with AppleScript - execSync('ps cax | grep "Google Chrome"'); - execSync(`osascript ../openChrome.applescript "${encodeURI(url)}"`, { - cwd: __dirname, - stdio: 'ignore', - }); + if (shouldTryOpenChromiumWithAppleScript) { + // Will use the first open browser found from list + const supportedChromiumBrowsers = [ + 'Google Chrome Canary', + 'Google Chrome', + 'Microsoft Edge', + 'Brave Browser', + 'Vivaldi', + 'Chromium', + ]; + for (let chromiumBrowser of supportedChromiumBrowsers) { + try { + // Try our best to reuse existing tab + // on OSX Chromium-based browser with AppleScript + execSync('ps cax | grep "' + chromiumBrowser + '"'); + execSync(`osascript ../openChrome.applescript "${encodeURI(url)}" "${chromiumBrowser}"`, { + cwd: __dirname, + stdio: 'ignore', + }); - return Promise.resolve(true); - } catch (err) { - // Ignore errors. - // It it breaks, it will fallback to `opn` anyway + return Promise.resolve(true); + } catch (err) { + // Ignore errors. + // It it breaks, it will fallback to `opn` anyway + } } } @@ -60,10 +70,14 @@ const startBrowserProcess = (browser, url, opts = {}) => { browser = undefined; } + // If there are arguments, they must be passed as array with the browser + if (typeof browser === 'string' && args.length > 0) { + browser = [browser].concat(args); + } + // Fallback to opn // (It will always open new tab) - const options = { app: browser, ...opts }; - console.debug(options); + const options = { app: browser, url: true, ...opts }; return require('open')(url, options); }; diff --git a/yarn.lock b/yarn.lock index 686dce8..8d07c30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1605,6 +1605,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-docker@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" + integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -1677,10 +1682,10 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is-wsl@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" + integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== isarray@1.0.0, isarray@~1.0.0: version "1.0.0" @@ -2060,12 +2065,13 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -open@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" - integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== +open@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/open/-/open-7.0.3.tgz#db551a1af9c7ab4c7af664139930826138531c48" + integrity sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA== dependencies: - is-wsl "^1.1.0" + is-docker "^2.0.0" + is-wsl "^2.1.1" optionator@^0.8.2: version "0.8.2"