diff --git a/platform/platform-impl/src/com/intellij/ui/CustomProtocolHandler.java b/platform/platform-impl/src/com/intellij/ui/CustomProtocolHandler.java deleted file mode 100644 index e84cc61c6b1c..000000000000 --- a/platform/platform-impl/src/com/intellij/ui/CustomProtocolHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ui; - -import com.intellij.ide.CommandLineProcessor; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.util.SmartList; -import com.intellij.util.containers.ContainerUtil; -import io.netty.handler.codec.http.QueryStringDecoder; -import org.jetbrains.annotations.NotNull; - -import java.net.URI; -import java.util.List; -import java.util.Map; - -/** - * @author Dennis.Ushakov - */ -public class CustomProtocolHandler { - public static final String LINE_NUMBER_ARG_NAME = "--line"; - public static final String COLUMN_NUMBER_ARG_NAME = "--column"; - - private static final Logger LOG = Logger.getInstance(CustomProtocolHandler.class); - - public boolean openLink(@NotNull URI uri) { - LOG.info("CustomProtocolHandler.openLink"); - final List args = getOpenArgs(uri); - return !args.isEmpty() && CommandLineProcessor.processExternalCommandLine(args, null).getFirst() != null; - } - - @NotNull - public List getOpenArgs(@NotNull URI uri) { - Map> parameters = new QueryStringDecoder(uri).parameters(); - String file = ContainerUtil.getFirstItem(parameters.get("file")); - String line = ContainerUtil.getFirstItem(parameters.get("line")); - String column = ContainerUtil.getFirstItem(parameters.get("column")); - - List args = new SmartList<>(); - if (file != null) { - if (line != null) { - args.add(LINE_NUMBER_ARG_NAME); - args.add(line); - } - if (column != null) { - args.add(COLUMN_NUMBER_ARG_NAME); - args.add(column); - } - args.add(file); - } - return args; - } -} diff --git a/platform/platform-impl/src/com/intellij/ui/mac/MacOSApplicationProvider.java b/platform/platform-impl/src/com/intellij/ui/mac/MacOSApplicationProvider.java index f85aaf2d45cc..e7ac0ead9111 100644 --- a/platform/platform-impl/src/com/intellij/ui/mac/MacOSApplicationProvider.java +++ b/platform/platform-impl/src/com/intellij/ui/mac/MacOSApplicationProvider.java @@ -5,6 +5,7 @@ import com.apple.eawt.AppEvent; import com.apple.eawt.Application; import com.apple.eawt.OpenURIHandler; import com.intellij.diagnostic.LoadingState; +import com.intellij.ide.CommandLineProcessor; import com.intellij.ide.DataManager; import com.intellij.ide.actions.AboutAction; import com.intellij.ide.actions.ShowSettingsAction; @@ -23,16 +24,20 @@ import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.util.BuildNumber; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.wm.IdeFocusManager; -import com.intellij.ui.CustomProtocolHandler; import com.intellij.ui.mac.foundation.Foundation; import com.intellij.ui.mac.foundation.ID; +import com.intellij.util.SmartList; +import com.intellij.util.containers.ContainerUtil; import com.sun.jna.Callback; +import io.netty.handler.codec.http.QueryStringDecoder; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.io.File; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; public final class MacOSApplicationProvider { @@ -179,11 +184,33 @@ public final class MacOSApplicationProvider { ID mainBundle = Foundation.invoke("NSBundle", "mainBundle"); ID urlTypes = Foundation.invoke(mainBundle, "objectForInfoDictionaryKey:", Foundation.nsString("CFBundleURLTypes")); if (!urlTypes.equals(ID.NIL)) { - CustomProtocolHandler handler = new CustomProtocolHandler(); Application.getApplication().setOpenURIHandler(new OpenURIHandler() { @Override public void openURI(AppEvent.OpenURIEvent event) { - handler.openLink(event.getURI()); + Map> parameters = new QueryStringDecoder(event.getURI()).parameters(); + String file = ContainerUtil.getFirstItem(parameters.get("file")); + if (file != null) { + if (LoadingState.COMPONENTS_LOADED.isOccurred()) { + String line = ContainerUtil.getFirstItem(parameters.get("line")); + String column = ContainerUtil.getFirstItem(parameters.get("column")); + List args = new SmartList<>(); + if (line != null) { + args.add("--line"); + args.add(line); + } + if (column != null) { + args.add("--column"); + args.add(column); + } + args.add(file); + ApplicationManager.getApplication().invokeLater( + () -> CommandLineProcessor.processExternalCommandLine(args, null), + ModalityState.NON_MODAL); + } + else { + ApplicationLoader.openFilesOnLoading(Collections.singletonList(new File(file))); + } + } } }); } diff --git a/platform/platform-tests/testSrc/com/intellij/ui/CustomProtocolHandlerTest.java b/platform/platform-tests/testSrc/com/intellij/ui/CustomProtocolHandlerTest.java deleted file mode 100644 index 367893ff2bde..000000000000 --- a/platform/platform-tests/testSrc/com/intellij/ui/CustomProtocolHandlerTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.intellij.ui; - -import junit.framework.TestCase; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.List; - -/** - * @author Dennis.Ushakov - */ -public class CustomProtocolHandlerTest extends TestCase { - public void testOpenOurLink() throws URISyntaxException { - final URI uri = new URI("x-mine://open?file=/Users/denofevil/RubymineProjects/JRubyRails/app/assets/javascripts/application.js.coffee&line=2"); - final List args = new CustomProtocolHandler().getOpenArgs(uri); - assertTrue(args.contains("--line")); - assertTrue(args.contains("2")); - assertTrue(args.contains("/Users/denofevil/RubymineProjects/JRubyRails/app/assets/javascripts/application.js.coffee")); - } -}