LINUX.ORG.RU
ФорумTalks

Пофиксил в Firefox открытие внешней ссылки в указанном при запуске профиле


0

1

Коротко суть проблемы — никакое сочетание опций командной строки не позволяет добиться в Firefox следующего поведения:

  • Если указанный профиль еще не запущен, он запускается, и в нём открывается ссылка.
  • Если указанный профиль уже запущен, в нём открывается ссылка. Именно в указанном профиле, а не в первой попавшейся запущенной копии FF.

Я полагал, раз это не фиксят (и даже костылей никаких нет для обхода проблемы), значит там надо переворотить прилично кода, и проблема, возможно, лежит на уровне архитектуры одного из компонет. Оказалось — решение составляет пять срочек кода. Пять!

В общем, вот патч:

diff -r 89b5fccb0514 toolkit/xre/nsAppRunner.cpp
--- a/toolkit/xre/nsAppRunner.cpp	Thu Jul 14 12:20:34 2011 -0400
+++ b/toolkit/xre/nsAppRunner.cpp	Sat Jul 23 03:14:32 2011 +0700
@@ -461,6 +461,8 @@
       if (strimatch(aArg, arg)) {
         if (aRemArg)
           RemoveArg(curarg);
+        else
+          ++curarg;
         if (!aParam) {
           ar = ARG_FOUND;
           break;
@@ -1408,10 +1410,17 @@
   nsresult rv;
   ArgResult ar;
 
+  const char *profile = 0;
   nsCAutoString program(gAppData->name);
   ToLowerCase(program);
   const char *username = getenv("LOGNAME");
 
+  ar = CheckArg("p", PR_FALSE, &profile, PR_FALSE);
+  if (ar == ARG_BAD) {
+    PR_fprintf(PR_STDERR, "Error: argument -p requires a profile name\n");
+    return REMOTE_ARG_BAD;
+  }
+
   const char *temp = nsnull;
   ar = CheckArg("a", PR_TRUE, &temp);
   if (ar == ARG_BAD) {
@@ -1434,7 +1443,7 @@
  
   nsXPIDLCString response;
   PRBool success = PR_FALSE;
-  rv = client.SendCommandLine(program.get(), username, nsnull,
+  rv = client.SendCommandLine(program.get(), username, profile,
                               gArgc, gArgv, aDesktopStartupID,
                               getter_Copies(response), &success);
   // did the command fail?

Может я чего-то не учел, и есть какие-то технические причины, почему это не было сделано ранее? Хотя я не вижу ни одной причины. Похоже, просто не дописали код, и так его и бросили. Протестируйте, пожалуйста. И кто-нибудь, может быть, отправит это в апстрим? Я бы отправил, но у меня сейчас времени нет на общение с этими милыми ребятами, что там любят в комментариях к багрепортам писать, что багов нет, это фантастика.

Алсо, у меня в блоге чуть больше инфы и скриншот патченного браузера в качестве пруфпика. ;)

А зачем это надо?

firefox -P Main http://linux.org.ru
Профиль Main запущен, ссылка открывается в нём.

firefox -P Test --no-remote http://linux.org.ru
Профиль Test не был запущен, запускается независимый Firefox с профилем Test и ссылка открыается в нём.

firefox -P Test http://linux.org.ru
Профиль Test уже запущен, ссылка открывается в нём.

firestarter ★★★☆
()

Я понимаю, если бы годами не фиксили какое-нибудь малопопулярное приложение вроде mrain или Tomboy. Но Firefox - не понимаю...

ZenitharChampion ★★★★★
()
Ответ на: комментарий от firestarter

> А зачем это надо?

Ты бы хоть протестировал, прежде чем писать.

firefox -P Main http://linux.org.ru

Профиль Main запущен, ссылка открывается в нём.



Если уже есть запущенный FF (без -no-remote), ссылка открывается в уже запущенном профиле. Параметр -P игнорируется.

firefox -P Test --no-remote http://linux.org.ru

Профиль Test не был запущен, запускается независимый Firefox с профилем Test и ссылка открыается в нём.



А если профиль Test уже был запущен — получишь сообщение об ошибке при запуске, вместо открытия ссылки.

firefox -P Test http://linux.org.ru

Профиль Test уже запущен, ссылка открывается в нём.



От ты выше запустил -P Main и -P Test --no-remote. Знаешь, что произойдёт при выполнении этой команды? FF ищет первый попавшийся запущенный экземпляр и открывает ссылку в нём. Первым попавшимся окажется -P Main.

geekless ★★
() автор топика

а nsnull - это такой же круглый нолик, как и 0? (я просто не в теме)

а то ведь, если профиль не указывать, то до правок вызов был

rv = client.SendCommandLine(program.get(), username, nsnull,...
а после правок, без указания профиля,
rv = client.SendCommandLine(program.get(), username, 0,...

aol ★★★★★
()
Ответ на: комментарий от firestarter

Я проверил перед тем как написать. Происходило именно так как я написал.

Плохо проверил. Это, тогда, что: раз, два.

Думаешь, все эти треды на форумах, что гуглят по запросам а ля «firefox open url in already opened profile», созданы людьми, которые не осилили прочитать ман по опциям командной строки FF?

geekless ★★
() автор топика
Ответ на: комментарий от aol

а nsnull - это такой же круглый нолик, как и 0? (я просто не в теме)

Да. Как обычно бывает у Си/Си++ кордеров, они испытывают неуёмную тягу к #define. :)

vadim@host3:~/files/firefox/src$ find . -name '*.h*' | xargs grep 'define nsnull'
./obj-i686-pc-linux-gnu/dist/include/nscore.h:# define nsnull 0LL
./obj-i686-pc-linux-gnu/dist/include/nscore.h:# define nsnull 0L
./xpcom/base/nscore.h:# define nsnull 0LL
./xpcom/base/nscore.h:# define nsnull 0L
geekless ★★
() автор топика
Ответ на: комментарий от firestarter

> Ты лучше бы тормоза пофиксил.

Может мне еще свой браузер написать? Наглостеметр зашкалило и спалило.

Ютуб в html5 смотреть невозможно - слайдшоу даже при низком разрешении ролика.

flvideoreplacer тебе в руки.

geekless ★★
() автор топика
Ответ на: комментарий от firestarter

> флеш

Костыли. В системе уже установлен хороший, годный видеопроигрыватель. Сделать для него обертку для внедрения на страницы браузера — сам бог велел. Наиболее прямое и правильное решение.

geekless ★★
() автор топика
Ответ на: комментарий от firestarter

> Ага, только перестанут работать некоторые вещи, например ссылки на определенное время в ролике.

1. Ни разу ими не пользовался.
2. Может перестанут, а может и нет. В том смысле, что наверняка это не реализовано, но принципиально в этом нет ничего невозможного.

geekless ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.