فایرفاکس در دست تعمیر
مدتها پیش نوشته بودم که باگی سیزده ساله در 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
که بیلد دیباگ را فعال میکند. اگر بیلد دیباگ نباشد دستورات خاص دیباگ و پرینتها و خیلی موارد مشابه حذف میشوند.
جدیدا خداروشکر فایرفاکس داره راه خوبی رو طی میکنه امیدوارم بتونن بهینه اش کنن جایی خونده بودم یکی از دلایلی که کروم اول از وبکیت استفاده کرد و از Gecko استفاده نکرد این بوده که کلا Gecko از زمانی که موزیلا این موتور رو از Netscape به ارث بود کمی دچار پیچیدگی زیاد از حد کدها بوده :) راستی قبلا وبلاگ شما رو خونده بودم ولی هرچقدر فکرمیکردم اسم خودتون و وبلاگ رو یادم نمیومد هر کاری کردم با سرچ باگ راست به چپ و … پیدا کنم نشد تا آخر به زور از وبلاگ جادی پیدا کردم :)))
او! ممنون که اینقدر وقت گذاشتی وبسایت رو پیدا کنی، وبلاگصاحاب ازت تشکر مخصوص میکنه! 😁 از قضا امروز بعد از ناقابل شش ماه این مطلب رو نوشته بودم و گفتم شاید از طریق خبرنامه یا فید اینقدر سریع مطلع شدی! بهرحال. کدهای بخش Gecko واقعا پیچیده است. البته بهتره بگم مستندات کافی نداره. سرچ توی اینترنت هم مقالات زمان نتاسکیپ و کلی نتیجه بدردنخور برمیگردونه. اما پرسش روی irc و درخواست info روی باگها کمک میکنه چون افراد مطلع کم نیستند. ولی حجم کار عظیمه. یعنی براوزر خیلی خیلی پروژهی بزرگیه و ظاهرا کروم چون جدیدتر نوشته شده خوشدستتر بوده. اما موزیلا هم از وقتی پروژهی سیستمعامل رو رها کرد دوباره شروع کرد به بهبود اساسی فایرفاکس که خیلی بهتر شده و بخشهایی هم به تدریج در دوبارهنویسی با rust هستند. برای کامپایل فایرفاکس هم باید rust و ملحقات اون نصب باشه که بالا فراموش کردم بنویسم.
درود؛ مشکل خیلی بنیادیتر از این حرفهاست! این استاندارد UAX 9 یونیکد در هیچکدام از مرورگرها کار نمیکند. مثلاً من در زیر یک متن دوجهته مینویسم: این یک متن دوجهته که به انگلیسی Bidirection (OR BiDi) به آن میگویند. این رو عیناً در gedit تایپ کن و ببین چه میشود.
میتونی بیشتر توضیح بدی که منظورت از اینکه کار نمیکنه چیه؟ من مشکلی در تایپ در gedit نداشتم، یعنی همه چیز همونطوریه که انتظار داشتم. در فایرفاکس هم مشکلی من دارم روش کار میکنم فقط مربوط به انتخاب و هایلایت کردن متن فارسی (و عربی و عبری) با صفحه کلید میشه. مسئله اینه که ترکیب متن rtl و ltr به شکل ذاتی مشکلآفرینه و براش هم راهحلی وجود نداره. ما فقط میتونیم به شکلی کلی تجربه کاربر دوزبانه رو بهبود ببخشیم. به قول انگلیسیها silver bullet نداریم :)
مثلاً جهت متن که سمت راست باشد فقط در فایرفاکس کار میکند؛ این لینک را نگاه کنید: https://tools.wmflabs.org/paste/view/raw/4625f46a
من لینک رو در فایرفاکس و کرومیوم روی لینوکسم نگاه کردم. در هر دو مرورگر متن درست نمایش داده میشه (مثلا نقطه انتهای سمت چپ قرار داره). منتها فایرفاکس متن رو از سمت راست شروع میکنه ولی کروم نه. ولی این لزوما یک خرابی بنیادی نیست، اتفاقا سطحی است. فایرفاکس (مثل GTK) با خواندن مقداری از عبارت جهت آن زبان رو تشخیص میده ولی کرومیوم هرچند درست نمایش میده اما جهت رو تغییر نمیده که این هم احتمالا انتخاب خود برنامهنویسها بوده یا اینکه از برنامهنویسانی که این مشکل رو حس کردند کسی تابحال داوطلب نشده مشکل رو رفع کنه.
درودی مجدد؛ آیا GTK این کار رو انجام میده یا Freebidi «۱»؟ چون من میدونم که حرفباز این کار رو نمیکنه «۲». http://fribidi.org/ https://harfbuzz.github.io/what-harfbuzz-doesnt-do.html
در مورد GTK میدونم که pango جهت رو تشخیص رو از روی بخش ابتدایی هر خط تشخیص میده، اینکه به نوبهی خودش از چه چیزی استفاده کنه نگاه نکردم.
بسیار عالی
سلام لینک rr صحیح نیست قسمتی از آدرس سایت خودتونم هست.
سلام. ممنون که خبر دادی، درستش کردم.
بررسی این مشکل در فایرفاکس نسخه 75 مقدار پیشفرض bidi.edit.caret_movement_style 2
اولا باید این مطلبو تقسیم کنم. ۱) مطالب فارسی و انگلیسی نوشته شده (بدون قابلیت ویرایش) مثلا متون همین پست در وبلاگ شما جهت حرکت صحیح است. (برعکس نیست) ۲) این اشکال فقط در قسمتهایی با قابلیت ویرایش پیش میآید. مثلا همین باکس مربوط به کامنتها.
که همانطور که اشاره کردین باتغییر مورد نظر به یک رفع شد.
چرا از ابتدا این مقدار روی 1 نیست. درواقع چه اشکالی ایجاد میکرده که روی 2 تنظیم شده؟
نکته معترضه کلیدهای ترکیبی Ctrl+X جهت متن را عوض میکنند.
در مدتی دنبال رفع این مشکل بودم و مقداری رو آیآرسی و همینطور باگ تراکر سوال کردم کسی نمیدونست. ظاهرا هم این کانفیگ جای خاصی استفاده نشده. نکته اینجاست که پیدا کردن آدم مطلع سخت بود، کد هم فهمش آسون نبود. به همین خاطر من با پیدا کردن همین کانفیگ قانع شدم و ادامه ندادم.