Gecko (bộ máy trình bày)

Gecko
Phát triển bởiMozilla Foundation, Mozilla Corporation, Adobe Systems, và những người đóng góp khác
Kho mã nguồn
Viết bằngC++, JavaScript, Rust
Thể loạiBộ máy trình bày
Giấy phépMPL 2.0[1][2]
Websitedeveloper.mozilla.org/en-US/docs/Gecko

Gecko là một bộ máy trình bày được phát triển bởi Mozilla. Nó được sử dụng trong trình duyệt Firefox, email client Thunderbird và nhiều dự án khác

Gecko được thiết kế để hỗ trợ chuẩn Internet mở, và được dùng bởi những ứng dụng khác nhau để hiển thị trang web và, trong một số trường hợp chính giao diện người dùng của ứng dụng (bằng cách render XUL). cung cấp API lập trình phong phú giúp nó phù hợp với nhiều vai trò khác nhau trong các ứng dụng hỗ trợ Internet, như trình duyệt web, trình bày nội dung và client/server.[3]

Gecko được viết bằng C++JavaScript,[4][5] và từ năm 2016, bổ sung thêm Rust.[6][7] Nó là phần mềm tự do nguồn mở tuân theo các điều khoản của Mozilla Public License v2.[8] Mozilla chính thức hỗ trợ nó trên Android, Linux, macOS, và Windows.[9]

Lịch sử

[sửa | sửa mã nguồn]

Việc phát triển công cụ bố trí hiện được gọi là Gecko bắt đầu tại Netscape năm 1997, sau khi công ty này mua DigitalStyle. Công cụ kết xuất Netscape hiện tại, ban đầu được viết cho Netscape Navigator 1.0 và nâng cấp qua nhiều năm, là chậm chạp, không tuân thủ các tiêu chuẩn W3C, và hỗ trợ cho hạn chế HTML động và thiếu các tính năng như phản xạ tăng dần (khi công cụ bố trí sắp xếp lại các yếu tố trên màn hình dưới dạng dữ liệu mới đã được tải xuống và thêm vào trang). Công cụ bố trí mới được phát triển song song với cái cũ, với ý định tích hợp nó vào Netscape Communicator khi nó trưởng thành và ổn định. Ít nhất một phiên bản chính nữa của Netscape dự kiến sẽ được phát hành với công cụ bố trí cũ trước khi chuyển đổi.

Sau khi khởi động dự án Mozilla vào đầu năm 1998, mã nguồn công cụ trình bày mới đã được phát hành theo giấy phép nguồn mở. Ban đầu được tiết lộ là Raptor, tên gọi được đổi thành NGLayout (next generation layout) do các vấn đề về thương hiệu. Netscape sau đó đổi thương hiệu NGLayout thành Gecko. Trong khi Mozilla Organisation (tiền thân của Mozilla Foundation) ban đầu tiếp tục sử dụng tên NGLayout (Gecko là nhãn hiệu của Netscape),[10] cuối cùng thương hiệu Gecko đã chiến thắng.

Tháng 10 năm 1998, Netscape tuyên bố rằng trình duyệt tiếp theo của nó sẽ sử dụng Gecko (vẫn được gọi là NGLayout vào thời điểm đó) chứ không phải là công cụ trình bày cũ, yêu cầu phải viết lại phần lớn ứng dụng. Mặc dù quyết định này rất được ủng hộ bởi những người ủng hộ tiêu chuẩn web, nhưng nó hầu như không được ủng hộ bởi các nhà phát triển Netscape, họ không hài lòng với sáu tháng được đưa ra để viết lại.[11] Điều đó cũng có nghĩa là hầu hết các công việc được thực hiện cho Netscape Communicator 5.0 (bao gồm cả việc phát triển các cải tiến của Mariner cho công cụ trình bày cũ) đã phải từ bỏ. Netscape 6, bản phát hành Netscape đầu tiên kết hợp với Gecko, được phát hành vào tháng 11 năm 2000 (tên Netscape 5 không bao giờ được sử dụng).

Khi Gecko tiếp tục phát triển, các ứng dụng và hệ thống nhúng khác bắt đầu sử dụng nó. America Online, vào thời điểm này, công ty mẹ của Netscape, cuối cùng đã chấp nhận sử dụng nó CompuServe 7.0 và AOL cho Mac OS X (những sản phẩm này đã nhúng Internet Explorer trước đó). Tuy nhiên, ngoại trừ một vài beta, Gecko không bao giờ được sử dụng trong ứng dụng khách Microsoft Windows AOL chính.

Ngày 15 tháng 7 năm 2003, AOL đã sa thải các nhà phát triển Gecko còn lại và Quỹ Mozilla (được thành lập cùng ngày) trở thành người quản lý chính cho sự phát triển của Gecko. Ngày nay, Gecko được phát triển bởi các nhân viên của Tập đoàn Mozilla, nhân viên của các công ty đóng góp cho dự án Mozilla và các tình nguyện viên.

Tháng 10 năm 2016, Mozilla đã công bố Quantum, một dự án đang tiếp tục bao gồm một số nỗ lực phát triển phần mềm để "xây dựng công cụ web thế hệ tiếp theo cho người dùng Firefox". Nó bao gồm nhiều cải tiến cho Gecko, được lấy từ dự án thử nghiệm Servo.[12][13] Firefox 57, còn được gọi là "Firefox Quantum", phát hành lần đầu vào tháng 11 năm 2017, là phiên bản đầu tiên bao gồm các thành phần chính từ các dự án Quantum/Servo được kích hoạt. Chúng bao gồm gia tăng hiệu trong các thành phần kết xuất CSSGPU. Các thành phần bổ sung sẽ được hợp nhất từ Servo sang Gecko tăng dần trong các phiên bản trong tương lai.

Tháng 9 năm 2018, Mozilla đã công bố GeckoView, nền tảng của thế hệ sản phẩm di động tiếp theo của Mozilla dựa trên thư viện phần mềm giúp Gecko có thể tái sử dụng cho Android, bao gồm các nỗ lực phát triển phần mềm mới hơn để "tách rời công cụ khỏi giao diện người dùng và dễ dàng nhúng vào các ứng dụng khác". Firefox Focus 7.0, được xuất xưởng trong cùng tháng[14], là phiên bản ban đầu được giới thiệu GeckoView, với hiệu suất tăng trong tải trang trung bình.[15][16] Firefox Reality cũng được xây dựng với GeckoView. Tháng 6 năm 2019, Mozilla đã công bố Firefox Preview là một dự án đang diễn ra tập trung vào việc xây dựng trình duyệt web Android với GeckoView.[17]

Tiêu chuẩn hỗ trợ

[sửa | sửa mã nguồn]

Ngay từ đầu, Gecko đã được thiết kế để hỗ trợ các tiêu chuẩn Internet mở. Một số tiêu chuẩn mà Gecko hỗ trợ bao gồm:

  • CSS Level 2.1 (hỗ trợ một phần cho CSS 3)[18]
  • DOM Level 1 và 2 (hỗ trợ một phần cho DOM 3)
  • HTML 4 (hỗ trợ một phần cho HTML5)
  • JavaScript 1.8.5 (hỗ trợ ECMAScript 5.1 đầy đủ),[19] triển khai trong SpiderMonkey
  • Toán học
  • RDF
  • XForms (thông qua một phần mở rộng chính thức)
  • XHTML 1.0
  • XML 1.0
  • XSLT và XPath, được triển khai trong TransforMiiX

Gecko cũng hỗ trợ một phần SVG 1.1.[20] Phông chữ SVG, cấu hình màu, hình động, chế độ xem và mô-đun con trỏ vẫn chưa được triển khai và các mô-đun bộ lọc và văn bản chỉ được thực hiện một phần. Các mô-đun mở rộng cũng được thực hiện nhưng hiện đang bị vô hiệu hóa.

Để hỗ trợ các trang web được thiết kế cho các phiên bản kế thừa của Netscape và Internet Explorer, Gecko hỗ trợ chuyển đổi DOCTYPE. Các tài liệu có DOCTYPE hiện đại được hiển thị ở chế độ tuân thủ tiêu chuẩn, tuân thủ nghiêm ngặt các tiêu chuẩn W3C. Các tài liệu không có DOCTYPE hoặc DOCTYPE cũ hơn được hiển thị ở chế độ quirks, mô phỏng một số điểm kỳ lạ không chuẩn của Netscape Communicator 4.x; tuy nhiên, một số tính năng 4.x (như layers) không được hỗ trợ.

Gecko cũng hỗ trợ hạn chế cho một số tính năng Internet Explorer không chuẩn, chẳng hạn như phần tử marquee và thuộc tính document.all (mặc dù các trang kiểm tra rõ ràng cho document.all sẽ được thông báo rằng nó không được hỗ trợ).[21]

Sử dụng

[sửa | sửa mã nguồn]

Gecko chủ yếu được sử dụng trong các trình duyệt web, sớm nhất là Netscape 6 và Mozilla Suite (sau đổi tên thành SeaMonkey). Nó cũng được sử dụng trong các dẫn xuất trình duyệt web khác của Mozilla như FirefoxFirefox cho thiết bị di động và việc triển khai bản sao Internet Explorer là một phần của Wine.[22] Mozilla cũng sử dụng nó trong ứng dụng email Thunderbird của họ.

Các trình duyệt web khác sử dụng Gecko bao gồm GNU IceCat,[23] Waterfox, K-Meleon, Lunascape, Portable Firefox, Conkeror, Classilla, TenFourFox.

Các sản phẩm khác sử dụng Gecko bao gồm Nightingale, Instantbird và phần mềm tổ chức hình ảnh của Google Picasa (dành cho Linux).[24]

Gecko cũng được Sugar sử dụng cho máy tính OLPC XO-1.[25] Gecko được sử dụng như là một triển khai hoàn chỉnh của XUL (Ngôn ngữ giao diện người dùng XML). Gecko hiện đang định nghĩa đặc tả XUL.

Người dùng trước đây

[sửa | sửa mã nguồn]

Các sản phẩm đã sử dụng Gecko trong lịch sử bao gồm Pale Moon (hiện đang sử dụng Goanna), Songbird, Epiphany (hiện được gọi là Gnome Web) và Gnome DevHelp đều đã thay thế Gecko bằng WebKitGTK, Sunbird (lịch) và các trình duyệt web khác bao gồm Swiftfox, Flock, Galeon, Camino, Minimo, Beonex Communicator, Kazehakase và MicroB.

Phụ thuộc độc quyền

[sửa | sửa mã nguồn]

Trên Windows và các nền tảng khác, Gecko phụ thuộc vào trình biên dịch độc quyền.[26] Do đó, các bản phân phối FOSS của Linux không thể bao gồm gói Gecko được sử dụng trong Wine.

Sau Gecko 2.0, số phiên bản được tăng lên 5.0 để phù hợp với Firefox 5 và từ đó trở đi đã được giữ đồng bộ với số phiên bản chính cho cả Firefox và Thunderbird,[27] để phản ánh thực tế rằng nó không còn là một thành phần riêng biệt.[28]

Trong kỷ nguyên Netscape, sự kết hợp của các quyết định quản lý và kỹ thuật kém dẫn đến sự phình to của phần mềm Gecko.[11][29] Do đó, vào năm 2001, Apple đã chọn rẽ nhánh KHTML chứ không phải Gecko để tạo công cụ WebKit cho trình duyệt Safari của mình.[30] Tuy nhiên, đến năm 2008, Mozilla đã giải quyết một số vấn đề khó khăn, dẫn đến cải thiện hiệu suất lớn cho Gecko.[31]

Quantum là một dự án Mozilla bao gồm một số nỗ lực phát triển phần mềm để "xây dựng công cụ web thế hệ tiếp theo cho người dùng Firefox". Nó bao gồm nhiều cải tiến cho Gecko, phần lớn được kết hợp từ dự án Servo thử nghiệm. Quantum cũng bao gồm các sàng lọc cho giao diện người dùng và các tương tác.[12][32]

Firefox 57, được phát hành vào tháng 11 năm 2017, là phiên bản đầu tiên có kịch hoạt thành phần Servo. Mozilla đặt tên cho phiên bản này và các kế hoạch phát hành trong tương lai là "Firefox Quantum".[33][34]

Bối cảnh

[sửa | sửa mã nguồn]

Năm 2013, Mozilla đã bắt đầu dự án Servo thử nghiệm, đây là một công cụ được thiết kế từ đầu với mục tiêu cải thiện tính đồng thời và song song đồng thời giảm các lỗ hổng an toàn bộ nhớ. Một yếu tố quan trọng là viết Servo bằng ngôn ngữ lập trình Rust, cũng được tạo bởi Mozilla, được thiết kế để tạo mã được biên dịch với độ an toàn bộ nhớ, đồng thời và song song tốt hơn so với mã C++ được biên dịch.[5]

Kể từ tháng 4 năm 2016, Servo cần ít nhất vài năm phát triển để trở thành một công cụ trình bày đầy đủ tính năng.[35] Do đó, họ quyết định bắt đầu dự án Quantum để đưa các phần Servo ổn định vào Firefox.

Thành phần

[sửa | sửa mã nguồn]

Dự án Quantum bao gồm một số tiểu dự án.[12]

  • CSS: Hệ thống CSS song song của Servo được tích hợp vào Gecko. Điểm chuẩn cho thấy hiệu năng quy mô tuyến tính với số lượng lõi CPU.[36] Điều này đã được phát hành trong Firefox 57.[34]
  • Render: Kiến trúc kết xuất của Servo, được gọi là WebRender, được tích hợp vào Gecko. WebRender thay thế mô hình vẽ chế độ tức thời bằng mô hình chế độ giữ lại được GPU tăng tốc dễ dàng hơn bằng cách tận dụng sự tương tự của CSS/DOM với biểu đồ cảnh. Kết xuất tình huống xấu nhất trong thử nghiệm vượt quá 60 khung hình mỗi giây.[37]
  • Compositor: Bộ tổng hợp hiện tại của Gecko đã chuyển sang quy trình riêng của mình, cách ly các tab trình duyệt khỏi các sự cố liên quan đến trình điều khiển đồ họa. Vì các sự cố của bộ tổng hợp sẽ không làm giảm quá trình nội dung trình duyệt, quá trình tổng hợp có thể được khởi động lại một cách minh bạch mà không làm mất dữ liệu người dùng. Nó đã được phát hành trong Firefox 53.[38]
  • DOM: Lấy cảm hứng cơ bản từ kiến trúc Constellation của Servo[39] và công cụ Presto của Opera,[40] DOM lượng tử sử dụng các luồng được lên lịch hợp tác trong DOM để tăng khả năng phản hồi mà không làm tăng số lượng quá trình và do đó, sử dụng bộ nhớ.
  • Flow: Một chiếc ô cho người dùng cải thiện hiệu suất có thể nhìn thấy được điều khiển bởi một nhóm làm việc trên các thành phần của Gecko. Hiện tại tập trung vào cải tiến hiệu suất người dùng thực trên các ứng dụng web lớn, chủ yếu là G SuiteFacebook.[41]
  • Photon: Làm mới giao diện người dùng của toàn bộ ứng dụng, tập trung mạnh vào việc cải thiện hiệu suất UI. Được coi là một dự án chị em với Quantum Flow.[42] Nó đã được phát hành trong Firefox 57.[33]
  • Mạng: Cải thiện hiệu suất của Necko, lớp mạng của Gecko, bằng cách di chuyển thêm hoạt động mạng ra khỏi luồng chính, ưu tiên phụ thuộc vào ngữ cảnh của các luồng mạng và chạy đua lớp bộ đệm với mạng.[43] Tính năng này đã được phát hành trong Firefox 59.[44]

Dự án Mozilla Azure là API trừu tượng hóa đồ họa cấp thấp không trạng thái được sử dụng trong Firefox.[45] Dự án có một số mục tiêu bao gồm khả năng tương thích Direct2D chính xác hơn, khả năng tương tác trạng thái được tối ưu hóa và kiểm soát cải thiện các đặc tính và lỗi hiệu suất. Azure cung cấp khả năng tăng tốc phần cứng 2D trên backend đồ họa 3D. Firefox bắt đầu sử dụng Azure thay vì Cairo năm 2012.[46][47] Nó được viết bằng C++ và được dùng bởi Servo.[48] Tên gọi Azure là một sự ca ngợi người sáng lập Netscape James H. Clark và công việc trước đây của anh tại SGI. Jim Clark sáng chế ra Geometry Engine tại Stanford University năm 1979, đây là GPU đầu tiên. Silicon Graphics cũng là nhà phát triển ban đầu của OpenGL.[49]

Chú thích

[sửa | sửa mã nguồn]
  1. ^ “Mozilla Foundation End-User Licensing Agreements”. Mozilla.
  2. ^ “Mozilla Licensing Policies”. mozilla.org. Truy cập ngày 26 tháng 3 năm 2013.
  3. ^ “Embedding Mozilla”. Mozilla.org. ngày 25 tháng 10 năm 2012. Truy cập ngày 31 tháng 10 năm 2012.
  4. ^ “Simple Firefox for Android build”. Bản gốc lưu trữ ngày 29 tháng 9 năm 2019. Truy cập ngày 9 tháng 10 năm 2019. Gecko is implemented using C++ and JavaScript.
  5. ^ a b Bergstrom, Lars; và đồng nghiệp (tháng 5 năm 2016). “Engineering the Servo Web Browser Engine using Rust” (PDF). Proceedings of the International Conference on Software Engineering.
  6. ^ “Google Groups”. groups.google.com.
  7. ^ Yegulalp, Serdar (ngày 3 tháng 2 năm 2017). “Mozilla binds Firefox's fate to the Rust language”. InfoWorld.
  8. ^ “MPL 2 Upgrade”. Truy cập ngày 18 tháng 8 năm 2012.
  9. ^ “Gecko FAQ”. MDN Web Docs. Bản gốc lưu trữ ngày 8 tháng 10 năm 2019. Truy cập ngày 9 tháng 10 năm 2019.
  10. ^ “nglayout project: identity crisis”. Mozilla.org. Bản gốc lưu trữ ngày 29 tháng 6 năm 2011. Truy cập ngày 31 tháng 10 năm 2012.
  11. ^ a b Jorge O. Castro (ngày 15 tháng 6 năm 2004). “Ars Technica sits down with Scott Collins from Mozilla.org”. Ars Technica. Truy cập ngày 16 tháng 2 năm 2017.
  12. ^ a b c “Quantum”. Mozilla Wiki. Truy cập ngày 20 tháng 4 năm 2017.
  13. ^ Cimpanu, Catalin. “Mozilla Announces Quantum, a New Browser Engine for Firefox”. softpedia. Truy cập ngày 7 tháng 11 năm 2016.
  14. ^ “Firefox Focus 7.0 enters beta, Switches to GeckoView (Gecko Engine)”. Bản gốc lưu trữ ngày 31 tháng 7 năm 2020. Truy cập ngày 9 tháng 10 năm 2019.
  15. ^ “Firefox Focus with GeckoView”. Mozilla Hacks. ngày 13 tháng 9 năm 2018. Truy cập ngày 4 tháng 9 năm 2019.
  16. ^ “What's new in Firefox Focus for Android (version 7) | Firefox Focus Help”. support.mozilla.org (bằng tiếng Anh). Truy cập ngày 4 tháng 9 năm 2019.
  17. ^ “GeckoView in 2019”. Mozilla Hacks. ngày 27 tháng 6 năm 2019. Truy cập ngày 4 tháng 9 năm 2019.
  18. ^ “Mozilla CSS support chart”. Developer.mozilla.org. ngày 4 tháng 8 năm 2012. Bản gốc lưu trữ ngày 5 tháng 4 năm 2014. Truy cập ngày 31 tháng 10 năm 2012.
  19. ^ “ECMAScript 5 support in Mozilla”. Developer.mozilla.org. ngày 14 tháng 11 năm 2013. Bản gốc lưu trữ ngày 5 tháng 4 năm 2014. Truy cập ngày 2 tháng 12 năm 2013.
  20. ^ “Mozilla SVG Status”. Mozilla.org. ngày 25 tháng 8 năm 2012. Truy cập ngày 31 tháng 10 năm 2012.
  21. ^ “Mozilla Adds Undetectable document.all Support, Part of New Novell Linux Distribution?”. Developer.mozilla.org. ngày 23 tháng 7 năm 2004. Truy cập ngày 7 tháng 2 năm 2018.
  22. ^ “IE Uses Gecko Under Wine”. Wine Wiki. Truy cập ngày 14 tháng 9 năm 2009.
  23. ^ sdubois (ngày 24 tháng 6 năm 2010). “Gecko”. Free Software Foundation. Truy cập ngày 23 tháng 5 năm 2019.
  24. ^ “Picasa 3.0 for Linux”. Google. Bản gốc lưu trữ ngày 7 tháng 1 năm 2009. Truy cập ngày 28 tháng 12 năm 2008.
  25. ^ Martens, China (ngày 3 tháng 1 năm 2007). “One Laptop Per Child readies 'Sugar' interface”. IDG News Service. Bản gốc lưu trữ ngày 18 tháng 1 năm 2008. Truy cập ngày 28 tháng 12 năm 2007.
  26. ^ “Building Firefox for Windows”. MDN Web Docs. Bản gốc lưu trữ ngày 9 tháng 10 năm 2019. Truy cập ngày 9 tháng 10 năm 2019.
  27. ^ “Gecko versions and application versions”. MDN. Bản gốc lưu trữ ngày 31 tháng 10 năm 2020. Truy cập ngày 18 tháng 11 năm 2013.
  28. ^ “Not much in new Thunderbird 5, but roadmap looks promising”. Ars Technica. Truy cập ngày 7 tháng 2 năm 2018.
  29. ^ David Baron (ngày 9 tháng 1 năm 2003). “Thursday 2003-01-09”. David Baron's weblog. self-published. Bản gốc lưu trữ ngày 28 tháng 7 năm 2009. Truy cập ngày 16 tháng 2 năm 2017.
  30. ^ Paul Festa (ngày 14 tháng 1 năm 2003). “Apple snub stings Mozilla”. CNET Networks. Bản gốc lưu trữ ngày 25 tháng 10 năm 2012. Truy cập ngày 16 tháng 2 năm 2017.
  31. ^ Ryan Paul (ngày 9 tháng 9 năm 2008). “Why Mozilla is committed to Gecko as WebKit popularity grows”. Truy cập ngày 16 tháng 2 năm 2017.
  32. ^ Cimpanu, Catalin. “Mozilla Announces Quantum, a New Browser Engine for Firefox”. softpedia. Truy cập ngày 17 tháng 2 năm 2017.
  33. ^ a b “Firefox 57.0, See All New Features, Updates and Fixes”. Mozilla. Truy cập ngày 30 tháng 10 năm 2018.
  34. ^ a b “Introducing the New Firefox: Firefox Quantum – The Mozilla Blog”. The Mozilla Blog. Truy cập ngày 30 tháng 10 năm 2018.
  35. ^ “Servo remaining work”. GitHub. Truy cập ngày 17 tháng 2 năm 2017.
  36. ^ “The Changelog”. The Changelog. Truy cập ngày 28 tháng 3 năm 2017.
  37. ^ “Bay Area Rust Meetup February 2016”. Air Mozilla. Truy cập ngày 28 tháng 3 năm 2017.
  38. ^ “Firefox faster and more stable with the first big bytes of Project Quantum, simpler with compact themes and permissions redesign”. Mozilla Blog. Truy cập ngày 27 tháng 4 năm 2017.
  39. ^ “Servo Architecture”. YouTube. Truy cập ngày 28 tháng 3 năm 2017.
  40. ^ “Mozilla's Quantum Project”. Bill McCloskey's Blog. ngày 27 tháng 10 năm 2016. Truy cập ngày 28 tháng 3 năm 2017.
  41. ^ “Quantum Flow”. Mozilla Wiki. Truy cập ngày 28 tháng 3 năm 2017.
  42. ^ dolske (ngày 18 tháng 5 năm 2017). “Photon Engineering Newsletter #1”. Dolske's blog. Truy cập ngày 4 tháng 7 năm 2017.
  43. ^ “TPE Necko/Projects - MozillaWiki”. wiki.mozilla.org. Truy cập ngày 4 tháng 7 năm 2017.
  44. ^ “Firefox 59 Release Notes”. www.mozilla.org. Truy cập ngày 16 tháng 1 năm 2019.
  45. ^ “Platform/GFX/Moz2D - MozillaWiki”.
  46. ^ Parfeni, Lucian. “Firefox Now Uses the Azure Graphics API for Canvas on All Platforms”.
  47. ^ “Azure Replacing Cairo In Mozilla Firefox - Phoronix”.
  48. ^ Willis, Nathan (ngày 17 tháng 6 năm 2015). “Parallel page rendering with Mozilla Servo”. LWN.net. Truy cập ngày 27 tháng 6 năm 2015.
  49. ^ “Introducing the Azure project - JOEDREW!”. Bản gốc lưu trữ ngày 8 tháng 9 năm 2016. Truy cập ngày 9 tháng 10 năm 2019.

Liên kết ngoài

[sửa | sửa mã nguồn]
Chúng tôi bán
Bài viết liên quan