/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; const { XPCOMUtils } = ChromeUtils.importESModule( "resource://gre/modules/XPCOMUtils.sys.mjs" ); const lazy = {}; XPCOMUtils.defineLazyModuleGetters(lazy, { shortURL: "resource://activity-stream/lib/ShortURL.jsm", }); /** * A subset of the most visited sites according to Alexa. Used as a fallback if * a site doesn't expose site_name metadata. Maps a site's hostname (not * including `www.`) to its common name. */ const CUSTOM_NAMES = new Map([ ["adobe.com", "Adobe"], ["adp.com", "ADP"], ["airbnb.com", "Airbnb"], ["alibaba.com", "Alibaba"], ["aliexpress.com", "AliExpress"], ["aliexpress.ru", "AliExpress.ru"], ["allegro.pl", "Allegro"], ["amazon.ca", "Amazon.ca"], ["amazon.co.jp", "Amazon.co.jp"], ["amazon.co.uk", "Amazon.co.uk"], ["amazon.com", "Amazon"], ["amazon.de", "Amazon.de"], ["amazon.es", "Amazon.es"], ["amazon.fr", "Amazon.fr"], ["amazon.in", "Amazon.in"], ["amazon.it", "Amazon.it"], ["amazonaws.com", "AWS"], ["americanexpress.com", "American Express"], ["ameritrade.com", "TD Ameritrade"], ["aol.com", "AOL"], ["apple.com", "Apple"], ["archive.org", "Internet Archive"], ["ask.com", "Ask.com"], ["att.com", "AT&T"], ["aws.amazon.com", "AWS"], ["bankofamerica.com", "Bank of America"], ["bbc.co.uk", "BBC"], ["bbc.com", "BBC"], ["bestbuy.com", "Best Buy"], ["bing.com", "Bing"], ["blogger.com", "Blogger"], ["bloomberg.com", "Bloomberg"], ["bluehost.com", "Bluehost"], ["booking.com", "Booking.com"], ["bscscan.com", "BscScan"], ["businessinsider.com", "Insider"], ["ca.gov", "California State Portal"], ["canada.ca", "Government of Canada"], ["canva.com", "Canva"], ["capitalone.com", "Capital One"], ["cdc.gov", "CDC.gov"], ["chase.com", "Chase"], ["chess.com", "Chess.com"], ["citi.com", "Citi.com"], ["cj.com", "CJ Affiliate"], ["cnbc.com", "CNBC"], ["cnet.com", "CNET"], ["cnn.com", "CNN"], ["cnnindonesia.com", "CNN Indonesia"], ["coingecko.com", "CoinGecko"], ["coinmarketcap.com", "CoinMarketCap"], ["constantcontact.com", "Constant Contact"], ["coursera.org", "Coursera"], ["cowin.gov.in", "CoWIN"], ["craigslist.org", "Craigslist"], ["dailymail.co.uk", "Daily Mail"], ["dailymotion.com", "Dailymotion"], ["deepl.com", "DeepL"], ["dell.com", "Dell"], ["discord.com", "Discord"], ["disneyplus.com", "Disney+"], ["docs.google.com", "Google Docs"], ["docusign.net", "DocuSign"], ["drive.google.com", "Google Drive"], ["dropbox.com", "Dropbox"], ["duckduckgo.com", "DuckDuckGo"], ["ebay.co.uk", "eBay"], ["ebay.com", "eBay"], ["ebay.de", "eBay"], ["espn.com", "ESPN"], ["etherscan.io", "Etherscan"], ["etrade.com", "E*TRADE"], ["etsy.com", "Etsy"], ["evernote.com", "Evernote"], ["expedia.com", "Expedia"], ["facebook.com", "Facebook"], ["fandom.com", "Fandom"], ["fast.com", "Fast.com"], ["fedex.com", "FedEx"], ["feedly.com", "Feedly"], ["fidelity.com", "Fidelity"], ["fiverr.com", "Fiverr"], ["flickr.com", "Flickr"], ["flipkart.com", "Flipkart"], ["force.com", "Salesforce"], ["foxnews.com", "Fox News"], ["freshdesk.com", "Freshdesk"], ["geeksforgeeks.org", "GeeksforGeeks"], ["github.com", "GitHub"], ["glassdoor.com", "Glassdoor"], ["gmail.com", "Gmail"], ["godaddy.com", "GoDaddy"], ["goodreads.com", "Goodreads"], ["google.az", "Google"], ["google.ca", "Google"], ["google.cn", "Google"], ["google.co.id", "Google"], ["google.co.in", "Google"], ["google.co.jp", "Google"], ["google.co.th", "Google"], ["google.co.uk", "Google"], ["google.com", "Google"], ["google.com.ar", "Google"], ["google.com.au", "Google"], ["google.com.br", "Google"], ["google.com.eg", "Google"], ["google.com.hk", "Google"], ["google.com.mx", "Google"], ["google.com.sa", "Google"], ["google.com.sg", "Google"], ["google.com.tr", "Google"], ["google.com.tw", "Google"], ["google.de", "Google"], ["google.es", "Google"], ["google.fr", "Google"], ["google.it", "Google"], ["google.pl", "Google"], ["google.ru", "Google"], ["googlevideo.com", "Google Video"], ["grammarly.com", "Grammarly"], ["hbomax.com", "HBO Max"], ["healthline.com", "Healthline"], ["homedepot.com", "The Home Depot"], ["hootsuite.com", "Hootsuite"], ["hostgator.com", "HostGator"], ["hotstar.com", "Hotstar"], ["hp.com", "HP"], ["hulu.com", "Hulu"], ["icicibank.com", "ICICI Bank"], ["ikea.com", "IKEA"], ["ilovepdf.com", "iLovePDF"], ["imdb.com", "IMDb"], ["imgur.com", "Imgur"], ["indeed.com", "Indeed"], ["indiamart.com", "IndiaMART"], ["indiatimes.com", "Indiatimes"], ["instagram.com", "Instagram"], ["instructure.com", "Instructure"], ["intuit.com", "Intuit"], ["investing.com", "Investing.com"], ["iqbroker.com", "IQ Option"], ["irs.gov", "IRS.gov"], ["istockphoto.com", "iStock"], ["japanpost.jp", "Japan Post"], ["kayak.com ", "Kayak"], ["linkedin.com", "LinkedIn"], ["linktr.ee", "Linktree"], ["live.com", "Live"], ["loom.com", "Loom"], ["mail.google.com", "Gmail"], ["mailchimp.com", "Mailchimp"], ["manage.wix.com", "Wix"], ["maps.google.com", "Google Maps"], ["marca.com", "MARCA"], ["mediafire.com", "MediaFire"], ["mercadolibre.com.mx", "Mercado Libre"], ["mercadolivre.com.br", "Mercado Livre"], ["mercari.com", "Mercari"], ["microsoft.com", "Microsoft"], ["mlb.com", "MLB.com"], ["moneycontrol.com", "moneycontrol.com"], ["mozilla.org", "Mozilla"], ["msn.com", "MSN"], ["myshopify.com", "Shopify"], ["myworkdayjobs.com", "Workday"], ["naukri.com", "Naukri.com"], ["ndtv.com", "NDTV.com"], ["netflix.com", "Netflix"], ["nih.gov", "National Institutes of Health (NIH)"], ["nike.com", "Nike"], ["nordstrom.com", "Nordstrom"], ["notion.so", "Notion"], ["nypost.com", "New York Post"], ["nytimes.com", "New York Times"], ["office.com", "Office"], ["office365.com", "Office 365"], ["olympics.com", "Olympics"], ["onlinesbi.com", "State Bank of India"], ["orange.fr", "Orange"], ["patreon.com", "Patreon"], ["paypal.com", "PayPal"], ["pinterest.com", "Pinterest"], ["primevideo.com", "Prime Video"], ["quora.com", "Quora"], ["rakuten.co.jp", "Rakuten"], ["rakuten.com", "Rakuten"], ["realtor.com", "Realtor.com"], ["redd.it", "Reddit"], ["reddit.com", "Reddit"], ["redfin.com", "Redfin"], ["researchgate.net", "ResearchGate"], ["reuters.com", "Reuters"], ["reverso.net", "Reverso"], ["roblox.com", "Roblox"], ["rt.com", "RT"], ["salesforce.com", "Salesforce"], ["samsung.com", "Samsung"], ["scribd.com", "Scribd"], ["sheets.google.com", "Google Sheets"], ["shein.com", "Shein"], ["shutterstock.com", "Shutterstock"], ["skype.com", "Skype"], ["slides.google.com", "Google Slides"], ["slideshare.net", "SlideShare"], ["soundcloud.com", "SoundCloud"], ["speedtest.net", "Speedtest"], ["spotify.com", "Spotify"], ["squarespace.com", "Squarespace"], ["stackexchange.com", "Stack Exchange"], ["stackoverflow.com", "Stack Overflow"], ["steampowered.com", "Steam"], ["taboola.com", "Taboola.com"], ["target.com", "Target"], ["td.com", "TD Bank"], ["telegram.org", "Telegram"], ["theguardian.com", "The Guardian"], ["tiktok.com", "TikTok"], ["tmall.com", "Tmall"], ["tokopedia.com", "Tokopedia"], ["trello.com", "Trello"], ["tripadvisor.com", "Tripadvisor"], ["trustpilot.com", "Trustpilot"], ["twitch.tv", "Twitch"], ["twitter.com", "Twitter"], ["udemy.com", "Udemy"], ["unsplash.com", "Unsplash"], ["ups.com", "UPS"], ["upwork.com", "Upwork"], ["usps.com", "USPS"], ["vimeo.com", "Vimeo"], ["w3schools.com", "W3Schools"], ["walmart.com", "Walmart"], ["washingtonpost.com", "Washington Post"], ["wayfair.com", "Wayfair"], ["weather.com", "The Weather Channel"], ["webmd.com", "WebMD"], ["wellsfargo.com", "Wells Fargo"], ["wetransfer.com", "WeTransfer"], ["whatsapp.com", "WhatsApp"], ["wikihow.com", "wikiHow"], ["wikimedia.org", "Wikimedia Commons"], ["wikipedia.org", "Wikipedia"], ["wildberries.ru", "Wildberries"], ["wordpress.org", "WordPress.org"], ["worldometers.info", "Worldometer"], ["wsj.com", "Wall Street Journal"], ["xfinity.com", "Xfinity"], ["y2mate.com", "Y2mate"], ["yahoo.co.jp", "Yahoo Japan"], ["yahoo.com", "Yahoo"], ["yandex.ru", "Yandex"], ["yelp.com", "Yelp"], ["youtube.com", "YouTube"], ["zendesk.com", "Zendesk"], ["zerodha.com", "Zerodha"], ["zillow.com", "Zillow"], ["zoom.us", "Zoom"], ]); // The number of "." to search backwards for when matching hostname to // CUSTOM_NAMES. const MAX_HOSTNAME_PARTS = 2; /** * A class that exposes a static method to return a site's "common name". This * is ideally the site's brand name with appropriate spacing and capitalization. * For example, the common name for stackoverflow.com is "Stack Overflow". If * a common name cannot be fetched, the origin is returned with its TLD * stripped, e.g. "stackoverflow". */ export class CommonNames { /** * Returns a snapshot's common name. * * @param {Snapshot} snapshot * The snapshot for which to fetch a common name. See Snapshots.jsm for a * definition. * @returns {string} The snapshot's common name. */ static getName(snapshot) { return snapshot.siteName ?? CommonNames.getURLName(new URL(snapshot.url)); } static getURLName(url) { // To ignore subdomains work from the end of the hostname backwards and // progressively try longer hostnames at the "." separators. const hostname = url.hostname; // We can skip the first check since it will be the last part of the TLD // which won't match anything in the custom names list e.g. ".com". let dot = hostname.lastIndexOf("."); if (dot === -1) { return lazy.shortURL({ url }); } let bestName = null; for (let i = 0; i < MAX_HOSTNAME_PARTS; i++) { dot = hostname.lastIndexOf(".", dot - 1); const partialHostname = hostname.substring(dot + 1); const name = CUSTOM_NAMES.get(partialHostname); if (name) { bestName = name; } if (dot === -1) { break; } } return bestName ?? lazy.shortURL({ url }); } }