فایرفاکس در دست تعمیر

جمعه ۱۳ اردیبهشت ۱۳۹۸
۴ دقیقه مطالعه

مدتها پیش نوشته بودم که باگی سیزده ساله در GTK را با حمایت بچه‌های GNOME تعمیر کرده‌ام. بعدها این مشکل را در فایرفاکس هم مشاهده کردم و تصمیم گرفتم آن را تعمیر کنم. باگ تعمیر نشده اما راه‌حلی برای رفع آن در سیستم‌های لینوکسی هست.

قبل از اینکه زیاده‌نویسی را شروع کنم اصل مطلب را همین اول می‌گویم که بروید و برای خودتان امتحان کنید. در فایرفاکس هنگام فشار دادن همزمان کلید شیفت و کنترل و حرکت به چپ و راست روی متن فارسی جهت انتخاب متن برعکس است. این همان مشکلی است که در GTK وجود داشت و آنرا تعمیر کردیم. برای رفع آن روی فایرفاکس نسخه لینوکسی کافیست about:config را باز کنید و مقدار کلید bidi.edit.caret_movement_style را به 1 تغییر بدهید و فایرفاکس را مجددا اجرا کنید.

در فایرفاکس هنگام فشار دادن همزمان کلید شیفت و کنترل و حرکت به چپ و راست روی متن فارسی جهت انتخاب متن برعکس است. این همان مشکلی است که در GTK وجود داشت و آنرا تعمیر کردیم. برای رفع آن روی فایرفاکس نسخه لینوکسی کافیست about:config را باز کنید و مقدار کلید bidi.edit.caret_movement_style را به 1 تغییر بدهید و فایرفاکس را مجددا اجرا کنید.

زمانی که باگ مربوط به راست‌به‌چپ‌نویسی را در ایشوتراکر موزیلا ثبت کردم فکر نمی‌کردم رفع آن چندان مشکل باشد. خیلی زود به اشتباهم پی بردم. فایرفاکس پروژه‌ای به مراتب بزرگتر و پیچیده‌تر از GTK است و کار با آن به مراتب سخت‌تر. برای درک بزرگی پروژه کافی است بدانیم که سورس‌کد فایرفاکس از ریپازیتوری mozilla-unified حدود سیصد و سیزده‌هزار فایل را شامل می‌شود! تنها دریافت و کامپایل آن روی یک مک‌بوک‌پرو آخرین مدل ۲۰۱۸ با بالاترین تنظیمات (۱۶ گیگ رم و سی‌پی‌یو i7 و هارد ssd) بیش از یک ساعت زمان می‌برد. یک جستجوی ساده بسته به ادیتور شما ممکن است چندین ثانیه طول بکشد یا اگر از IDE مثل xcode برای دیباگ استفاده کنیم شاهد تلاش رقت آور برنامه برای اجرا و دیباگ فایرفاکس خواهیم بود.

در ابتدا به کمک xcode روی مک‌بوک‌پرو توانستم با دنبال کردن یک راهنما از سایت موزیلا فایرفاکس را کامپایل و اجرا و دیباگ کنم. هرچند به علت کندی بیش از حد این پروسه قید این کار را زدم. بعدها با کمک احسان از بچه‌های موزیلا متوجه شدم که می‌توانم با rr فایرفاکس و هر پروژه‌ی c++ دیگر را براحتی دیباگ کنم. با rr می‌شود اجرای یک برنامه را ضبط کرد و بعد همان بخش را به دفعات عینا اجرا و دیباگ کرد. منتها rr فقط روی لینوکس و در حال حاضر فقط سی‌پی‌یوهای اینتل کار می‌کند. روی لپ‌تاپ من استفاده از rr هم منتفی بود چرا که کامپایل فایرفاکس دو ساعت طول می‌کشید!

نکته‌ای در مورد کامپایل فایرفاکس

از جایی که فایرفاکس خیلی بزرگ است راه‌هایی برای کامپایل سریع‌تر آن اندیشیده شده. اگر باگی که قصد کار روی آن را داریم مربوط به بخش‌هایی خارج از core فایرفاکس باشد موقع تنظیمات اولیه می‌شود مود کامپایل سریع را انتخاب کرد که در اینصورت بخش‌هایی که از پیش کامپایل شده‌اند از اینترنت دانلود می‌شود و اینکار سرعت کامپایل را به طرز چشمگیری افزایش می‌دهد.

متاسفانه من نمی‌توانم از این امکان استفاده کنم. چرا که باگ ما در هسته‌ی فایرفاکس است و باید با هر تغییر هسته دوباره کامپایل بشود. همین کندی‌ها باعث شد که بروم و یک کامپیوتر دسکتاپ جدید بخرم. یعنی کندی کامپایل فایرفاکس مجبورم کرد! با کامپیوتر جدید در ۱۵ دقیقه از صفر تا صد همه چیز کامپیال می‌شود.😎 البته بعد از خرید فهمیدم rr فقط با اینتل کار می‌کند ولی چندان مهم نیست.

دریافت کد

سورس کد هم تعداد فایل زیادی دارد هم حجیم است. برای دریافت آن هم باید از Mercurial استفاده کنیم. البته اسکریپت دانلود گیت را هم پشتیبانی می‌کند که من امتحان نکرده‌ام. بسته به سرعت اینترنت هم ممکن است دانلود کد مدت خیلی زیادی طول بکشد. برای من با اینترنت ۶۰ مگ یک ربع بیشتر طول کشید. راهنمای کامل هم روی سایت موزیلا در دسترس است.

یک اسکرپیت دارند که باید دانلود و با پایتون ۲ اجرا کرد (راستی پایتون ۲ در حال مرگ است). احتمالا مجبور بشوید حجم عظیمی پیشنیاز روی کامپیوتر نصب کنید. اینکه این اسکریپت بتوان همه چیز را نصب کند البته به سیستم‌عامل بستگی دارد. بچه‌های آرچ‌لینوکس از کوزه شکسته آب می‌خورند و بهمین خاطر من کلی چیز را جداگانه نصب کردم که الان یادم نیست! 😁

➜  mkdir src && cd src
➜  wget https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py
➜  python2.7 bootstrap.py  # or: python bootstrap.py --vcs=git

برای دانلود مستقیم سورس هم دستور زیر کافیست (اگر اینترنت سریع در دسترس نباشد ممکن است ساعت‌ها طول بکشد):

➜  hg clone https://hg.mozilla.org/mozilla-central

بعد از انجام مراحل بالا نوبت کامپال است. برای اینکار از اسکریپت mach که همراه سورس دانلود شده استفاده می‌کنیم (ماخ به آلمانی یعنی «انجام بده!»):

➜  ./mach build
➜  ./mach run

و اجرا. با اجرای ./mach help شرح دستورات فراوان ماخ را ببینید. برای دستکاری نحوه‌ی بیلد یک فایل بنام mozconfig در همان فولدر سورس کد بسازید. مثلا محتوای فایل من اینگونه است:

# My first mozilla config
ac_add_options --enable-debug

که بیلد دیباگ را فعال می‌کند. اگر بیلد دیباگ نباشد دستورات خاص دیباگ و پرینت‌ها و خیلی موارد مشابه حذف می‌شوند.

سورس

دیدگاه‌ها

علی   ۱۳ اردیبهشت ۱۳۹۸   پاسخ 5cccb3de9a2f7538bb618e55

جدیدا خداروشکر فایرفاکس داره راه خوبی رو طی میکنه امیدوارم بتونن بهینه اش کنن جایی خونده بودم یکی از دلایلی که کروم اول از وبکیت استفاده کرد و از Gecko استفاده نکرد این بوده که کلا Gecko از زمانی که موزیلا این موتور رو از Netscape به ارث بود کمی دچار پیچیدگی زیاد از حد کدها بوده :) راستی قبلا وبلاگ شما رو خونده بودم ولی هرچقدر فکرمیکردم اسم خودتون و وبلاگ رو یادم نمیومد هر کاری کردم با سرچ باگ راست به چپ و … پیدا کنم نشد تا آخر به زور از وبلاگ جادی پیدا کردم :)))

وبلاگ‌صاحاب   ۱۳ اردیبهشت ۱۳۹۸   پاسخ 5cccbb3ac04ba3d4c44101e5

او!‌ ممنون که اینقدر وقت گذاشتی وبسایت رو پیدا کنی، وبلاگ‌صاحاب ازت تشکر مخصوص می‌کنه! 😁 از قضا امروز بعد از ناقابل شش ماه این مطلب رو نوشته بودم و گفتم شاید از طریق خبرنامه یا فید اینقدر سریع مطلع شدی! بهرحال. کدهای بخش Gecko واقعا پیچیده است. البته بهتره بگم مستندات کافی نداره. سرچ توی اینترنت هم مقالات زمان نت‌اسکیپ و کلی نتیجه بدردنخور برمی‌گردونه. اما پرسش روی irc و درخواست info روی باگ‌ها کمک می‌کنه چون افراد مطلع کم نیستند. ولی حجم کار عظیمه. یعنی براوزر خیلی خیلی پروژه‌ی بزرگیه و ظاهرا کروم چون جدیدتر نوشته شده خوش‌دست‌تر بوده. اما موزیلا هم از وقتی پروژه‌ی سیستم‌عامل رو رها کرد دوباره شروع کرد به بهبود اساسی فایرفاکس که خیلی بهتر شده و بخش‌هایی هم به تدریج در دوباره‌نویسی با rust هستند. برای کامپایل فایرفاکس هم باید rust و ملحقات اون نصب باشه که بالا فراموش کردم بنویسم.

علی   ۱۳ اردیبهشت ۱۳۹۸

جدیدا خداروشکر فایرفاکس داره راه خوبی رو طی میکنه امیدوارم بتونن بهینه اش کنن جایی خونده بودم یکی از دلایلی که کروم اول از وبکیت استفاده کرد و از Gecko استفاده نکرد این بوده که کلا Gecko از زمانی که موزیلا این موتور رو از Netscape به ارث بود کمی دچار پیچیدگی زیاد از حد کدها بوده :) راستی قبلا وبلاگ شما رو خونده بودم ولی هرچقدر فکرمیکردم اسم خودتون و وبلاگ رو یادم نمیومد هر کاری کردم با سرچ باگ راست به چپ و … پیدا کنم نشد تا آخر به زور از وبلاگ جادی پیدا کردم :)))

امیرحسین   ۱۵ اردیبهشت ۱۳۹۸   پاسخ 5cce8363b08761a37389d4f0

‫درود؛ مشکل خیلی بنیادی‌تر از این حرف‌هاست! این استاندارد ‪UAX 9‬ یونیکد در هیچ‌کدام از مرورگرها کار نمی‌کند. مثلاً من در زیر یک متن دوجهته می‌نویسم:‬ ‫این یک متن دوجهته که به انگلیسی ‪Bidirection (OR BiDi)‬ به آن می‌گویند. این رو عیناً در ‪gedit‬ تایپ کن و ببین چه می‌شود.‬

وبلاگ‌صاحاب   ۱۵ اردیبهشت ۱۳۹۸   پاسخ 5cced7549b2a33a112081bb9

می‌تونی بیشتر توضیح بدی که منظورت از اینکه کار نمی‌کنه چیه؟ من مشکلی در تایپ در gedit نداشتم، یعنی همه چیز همونطوریه که انتظار داشتم. در فایرفاکس هم مشکلی من دارم روش کار می‌کنم فقط مربوط به انتخاب و هایلایت کردن متن فارسی (و عربی و عبری)‌ با صفحه کلید می‌شه. مسئله اینه که ترکیب متن rtl و ltr به شکل ذاتی مشکل‌آفرینه و براش هم راه‌حلی وجود نداره. ما فقط می‌تونیم به شکلی کلی تجربه کاربر دوزبانه رو بهبود ببخشیم. به قول انگلیسی‌ها silver bullet نداریم :)

امیرحسین   ۱۵ اردیبهشت ۱۳۹۸

‫درود؛ مشکل خیلی بنیادی‌تر از این حرف‌هاست! این استاندارد ‪UAX 9‬ یونیکد در هیچ‌کدام از مرورگرها کار نمی‌کند. مثلاً من در زیر یک متن دوجهته می‌نویسم:‬ ‫این یک متن دوجهته که به انگلیسی ‪Bidirection (OR BiDi)‬ به آن می‌گویند. این رو عیناً در ‪gedit‬ تایپ کن و ببین چه می‌شود.‬

امیرحسین   ۱۵ اردیبهشت ۱۳۹۸   پاسخ 5ccf17869b2a331418081bb9

‫مثلاً جهت متن که سمت راست باشد فقط در فایرفاکس کار می‌کند؛ این لینک را نگاه کنید:‬ ‪https://tools.wmflabs.org/paste/view/raw/4625f46a‬

وبلاگ‌صاحاب   ۱۵ اردیبهشت ۱۳۹۸

می‌تونی بیشتر توضیح بدی که منظورت از اینکه کار نمی‌کنه چیه؟ من مشکلی در تایپ در gedit نداشتم، یعنی همه چیز همونطوریه که انتظار داشتم. در فایرفاکس هم مشکلی من دارم روش کار می‌کنم فقط مربوط به انتخاب و هایلایت کردن متن فارسی (و عربی و عبری)‌ با صفحه کلید می‌شه. مسئله اینه که ترکیب متن rtl و ltr به شکل ذاتی مشکل‌آفرینه و براش هم راه‌حلی وجود نداره. ما فقط می‌تونیم به شکلی کلی تجربه کاربر دوزبانه رو بهبود ببخشیم. به قول انگلیسی‌ها silver bullet نداریم :)

مهدی   ۱۵ اردیبهشت ۱۳۹۸   پاسخ 5ccf57fb5aff37222b83a41a

من لینک رو در فایرفاکس و کرومیوم روی لینوکسم نگاه کردم. در هر دو مرورگر متن درست نمایش داده می‌شه (مثلا نقطه انتهای سمت چپ قرار داره). منتها فایرفاکس متن رو از سمت راست شروع می‌کنه ولی کروم نه. ولی این لزوما یک خرابی بنیادی نیست، اتفاقا سطحی است. فایرفاکس (مثل GTK) با خواندن مقداری از عبارت جهت آن زبان رو تشخیص می‌ده ولی کرومیوم هرچند درست نمایش می‌ده اما جهت رو تغییر نمی‌ده که این هم احتمالا انتخاب خود برنامه‌نویس‌ها بوده یا اینکه از برنامه‌نویسانی که این مشکل رو حس کردند کسی تابحال داوطلب نشده مشکل رو رفع کنه.

امیرحسین   ۱۵ اردیبهشت ۱۳۹۸

‫مثلاً جهت متن که سمت راست باشد فقط در فایرفاکس کار می‌کند؛ این لینک را نگاه کنید:‬ ‪https://tools.wmflabs.org/paste/view/raw/4625f46a‬

امیرحسین   ۱۶ اردیبهشت ۱۳۹۸   پاسخ 5ccfdc00c950774a673533f3

‫درودی مجدد؛ آیا ‪GTK‬ این کار رو انجام می‌ده یا ‪Freebidi‬ ‫«۱»؟ چون من می‌دونم که حرف‌باز این کار رو نمی‌کنه «۲».‬‬‬ ‪http://fribidi.org/‬ ‪https://harfbuzz.github.io/what-harfbuzz-doesnt-do.html‬

مهدی   ۱۵ اردیبهشت ۱۳۹۸

من لینک رو در فایرفاکس و کرومیوم روی لینوکسم نگاه کردم. در هر دو مرورگر متن درست نمایش داده می‌شه (مثلا نقطه انتهای سمت چپ قرار داره). منتها فایرفاکس متن رو از سمت راست شروع می‌کنه ولی کروم نه. ولی این لزوما یک خرابی بنیادی نیست، اتفاقا سطحی است. فایرفاکس (مثل GTK) با خواندن مقداری از عبارت جهت آن زبان رو تشخیص می‌ده ولی کرومیوم هرچند درست نمایش می‌ده اما جهت رو تغییر نمی‌ده که این هم احتمالا انتخاب خود برنامه‌نویس‌ها بوده یا اینکه از برنامه‌نویسانی که این مشکل رو حس کردند کسی تابحال داوطلب نشده مشکل رو رفع کنه.

مهدی   ۲۴ اردیبهشت ۱۳۹۸   پاسخ 5cda6b7114fc4ca6a0573525

در مورد GTK می‌دونم که pango جهت رو تشخیص رو از روی بخش ابتدایی هر خط تشخیص می‌ده، اینکه به نوبه‌ی خودش از چه چیزی استفاده کنه نگاه نکردم.

امیرحسین   ۱۶ اردیبهشت ۱۳۹۸

‫درودی مجدد؛ آیا ‪GTK‬ این کار رو انجام می‌ده یا ‪Freebidi‬ ‫«۱»؟ چون من می‌دونم که حرف‌باز این کار رو نمی‌کنه «۲».‬‬‬ ‪http://fribidi.org/‬ ‪https://harfbuzz.github.io/what-harfbuzz-doesnt-do.html‬

esmaeelE   ۰۱ شهریور ۱۳۹۸   پاسخ 5d60279a747f94e90b031ea1

سلام لینک rr صحیح نیست قسمتی از آدرس سایت خودتونم هست.

esmaeelE   ۰۱ شهریور ۱۳۹۸

سلام لینک rr صحیح نیست قسمتی از آدرس سایت خودتونم هست.