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

مدتها پیش نوشته بودم که باگی سیزده ساله در 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

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