[platform] inlining macOS protocol handler; making it work at launch time

GitOrigin-RevId: efaa671da3a866252a098d62b1cf2ecc8525a920
This commit is contained in:
Roman Shevchenko
2019-12-17 21:33:47 +00:00
committed by intellij-monorepo-bot
parent d780cd2b94
commit 4876d4057f
3 changed files with 30 additions and 74 deletions
@@ -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<String> args = getOpenArgs(uri);
return !args.isEmpty() && CommandLineProcessor.processExternalCommandLine(args, null).getFirst() != null;
}
@NotNull
public List<String> getOpenArgs(@NotNull URI uri) {
Map<String, List<String>> 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<String> 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;
}
}
@@ -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<String, List<String>> 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<String> 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)));
}
}
}
});
}
@@ -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<String> 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"));
}
}