├── CONTRIBUTING.md ├── ISSUE_TEMPLATE.md ├── LICENSE.txt ├── PULL_REQUEST_TEMPLATE.md ├── README.md └── Source ├── content_script.js ├── icon128.png ├── icon16.png ├── icon32.png ├── icon48.png └── manifest.json /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Things I would like help with 2 | 3 | - Optimizing the regexes used for the text replacement 4 | - Helping the extension work with edge cases on popular sites 5 | - Changing initial instances of "snake people" back to "millennials" 6 | 7 | 8 | ## Things I am aware of 9 | 10 | - Text replacement is aggressive and does not discriminate on what domains it runs on 11 | - More than just the term "millennials" gets replaced 12 | - There is a lack of a glossary, even though terms are well documented in [the source](https://github.com/ericwbailey/millennials-to-snake-people/blob/master/Source/content_script.js) 13 | - I'll sometimes allow new terms, but not on any given schedule or via any published criteria 14 | - There is no indication that the extension is running other than text has been replaced 15 | - There is no count of how many words have been changed, either on a given page or historically 16 | - The hypothesis of linguistic determinism is now generally agreed to be false 17 | - I'm an arrogant, humorless hipster 18 | - Open source is a prison -------------------------------------------------------------------------------- /ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Please review the guidelines for contributing to this repository: 2 | https://github.com/ericwbailey/millennials-to-snake-people/blob/master/CONTRIBUTING.md -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) 2004 Sam Hocevar 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. 14 | -------------------------------------------------------------------------------- /PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Please review the [guidelines for contributing](https://github.com/ericwbailey/millennials-to-snake-people/blob/master/CONTRIBUTING.md) to this repository. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![No Maintenance Intended](http://unmaintained.tech/badge.svg)](http://unmaintained.tech/) 2 | 3 | > [!NOTE] 4 | > This project is no longer maintained due to [Manifest V3's user-hostile, anticompetitive policies](https://www.eff.org/deeplinks/2021/12/chrome-users-beware-manifest-v3-deceitful-and-threatening). 5 | 6 | # Millennials to Snake People 7 | 8 | Browser extension that reveals the *real* truth behind Millennials. 9 | 10 | 11 | ## Installation 12 | 13 | 1. Add the extension to your browser of choice: 14 | - [Chrome](https://chrome.google.com/webstore/detail/millennials-to-snake-peop/jhkibealmjkbkafogihpeidfcgnigmlf) 15 | - [Firefox](https://addons.mozilla.org/en-US/firefox/addon/millennials-to-snake-people/) 16 | - [Safari](https://github.com/a2/millennials-to-snake-people/releases) 17 | - [Free your mind](https://www.google.com/search?q=Millennials) 18 | 19 | 20 | ## Also 21 | 22 | - Need headlines automatically converted and tweeted? Follow [@snakepeople_bot](https://twitter.com/snakepeople_bot) on Twitter, courtesy of [jimkang](https://github.com/jimkang)'s [hail-ants-bot](https://github.com/jimkang/hail-ants-bot) 23 | - Uncomfortable that a non-compulsory, intentionally subversive browser extension uses language to affect your worldview, but still want a laugh? Try [Millennials to Snake People Pure](https://chrome.google.com/webstore/detail/millennials-to-snake-peop/ekkcdmnckghgcbgkdfbafpgepbmkjhnd?hl=en-US) 24 | - Addicted to text replacement plugins? Check out [Cloud to Butt Plus](https://chrome.google.com/webstore/detail/cloud-to-butt-plus/apmlngnhgbnjpajelfkmabhkfapgnoai?hl=en), [SJW to Skeleton](https://chrome.google.com/webstore/detail/sjw-to-skeleton/kckodmjikeoncekpplppkkcjolofmacc?hl=en), [Millennials Begone!](https://chrome.google.com/webstore/detail/millennials-begone/dlgjecnejicmpdknhangcbeahbgipolf?hl=en), [Billionaire-to-oligarch replacer](https://chrome.google.com/webstore/detail/billionaire-to-oligarch-r/ealafelnipmdnebociefhhkgoocplidj) 25 | 26 | 27 | ## Thanks 28 | 29 | Huge thank you to the following people for their help: 30 | 31 | - Ports 32 | - [a2](https://github.com/a2) for the Safari port 33 | - [pselle](https://github.com/pselle) for the Firefox port 34 | - Assistance and advice 35 | - [samford](https://github.com/samford) 36 | - [vandahm](https://github.com/vandahm) 37 | - DraftJSapocalypse 38 | - [flarnie](https://github.com/flarnie) 39 | - [drewski3420](https://github.com/drewski3420) 40 | - [hguiney](https://github.com/hguiney) 41 | - [redbassett](https://github.com/redbassett) 42 | - [roshkins](https://github.com/roshkins) 43 | - [SnoopJeDi](https://github.com/SnoopJeDi) 44 | - [spicyj](https://github.com/spicyj) 45 | 46 | 47 | ## How to disable 48 | 49 | Don't worry! The extension can be re-enabled after ~~it destroys your blog post~~ it is disabled. 50 | 51 | ### Chrome 52 | 53 | `Preferences` > `Extensions` > Uncheck `Enable` 54 | 55 | ### Firefox 56 | 57 | `Tools` > `Add-ons` > `Extensions` > Click `Disable` 58 | 59 | ### Safari 60 | 61 | `Preferences` > `Extensions` > Uncheck checkbox next to `Millennials to Snake People` 62 | 63 | 64 | ## Screenshots 65 | 66 | ### Google Search Results 67 | [![Google Search Results](https://i.imgur.com/GTBOuEr.png)](https://www.google.com/search?q=Millennials) 68 | 69 | ### The Atlantic 70 | [![The Atlantic](https://i.imgur.com/LDFOsrO.png)](http://www.theatlantic.com/politics/archive/2013/08/the-outsiders-how-can-millennials-change-washington-if-they-hate-it/278920/) 71 | 72 | ### BuzzFeed 73 | [![BuzzFeed](https://i.imgur.com/PT1NWX5.png)](http://www.buzzfeed.com/sapna/what-public-companies-are-telling-wall-street-about-millenni) 74 | 75 | ### Installed Extensions 76 | #### Chrome 77 | ![](https://i.imgur.com/xAzfhw8.png) 78 | 79 | #### Firefox 80 | ![](http://i.imgur.com/ro9zkDl.png) 81 | 82 | #### Safari 83 | ![](https://camo.githubusercontent.com/e244891000642e281c202b4fbd07b14fcf2bf4d7/687474703a2f2f61322e642e70722f477757712e706e67) 84 | -------------------------------------------------------------------------------- /Source/content_script.js: -------------------------------------------------------------------------------- 1 | function walk(rootNode) 2 | { 3 | // Find all the text nodes in rootNode 4 | var walker = document.createTreeWalker( 5 | rootNode, 6 | NodeFilter.SHOW_TEXT, 7 | null, 8 | false 9 | ), 10 | node; 11 | 12 | // Modify each text node's value 13 | while (node = walker.nextNode()) { 14 | handleText(node); 15 | } 16 | } 17 | 18 | function handleText(textNode) { 19 | textNode.nodeValue = replaceText(textNode.nodeValue); 20 | } 21 | 22 | function replaceText(v) 23 | { 24 | // Fix some misspellings 25 | v = v.replace(/\b(M|m)illienial(s)?\b/g, "$1illennial$2"); 26 | v = v.replace(/\b(M|m)illenial(s)?\b/g, "$1illennial$2"); 27 | v = v.replace(/\b(M|m)ilennial(s)?\b/g, "$1illennial$2"); 28 | v = v.replace(/\b(M|m)ilenial(s)?\b/g, "$1illennial$2"); 29 | 30 | // Millennial Generation 31 | v = v.replace( 32 | /\b(?:Millennial Generation)|(?:Generation Millennial)\b/g, 33 | "Plissken Faction" 34 | ); 35 | v = v.replace( 36 | /\b(?:millennial generation)|(?:generation millennial)\b/g, 37 | "Plissken faction" 38 | ); 39 | 40 | // Millennialism 41 | v = v.replace(/\bMillennialism\b/g, "Reptilianism"); 42 | v = v.replace(/\bmillennialism\b/g, "reptilianism"); 43 | 44 | // Gendered Millennials 45 | v = v.replace(/\bMillennial (M|m)(e|a)n('s)?\b/g, "Snake $1$2n$3"); 46 | v = v.replace(/\bmillennial m(e|a)n('s)?\b/g, "snake m$1n$2"); 47 | v = v.replace(/\bMillennial (B|b)oy('s|s(?:')?)?\b/g, "Snake $1oy$2"); 48 | v = v.replace(/\bmillennial boy('s|s(?:')?)?\b/g, "snake boy$1"); 49 | v = v.replace(/\bMillennial (G|g)uy('s|s(?:')?)?\b/g, "Snake $1uy$2"); 50 | v = v.replace(/\bmillennial guy('s|s(?:')?)?\b/g, "snake guy$1"); 51 | v = v.replace(/\bMillennial (W|w)om(e|a)n('s)?\b/g, "Snake $1om$2n$3"); 52 | v = v.replace(/\bmillennial wom(e|a)n('s)?\b/g, "snake wom$1n$2"); 53 | v = v.replace(/\bMillennial (G|g)irl('s|s(?:')?)?\b/g, "Snake $1irl$2"); 54 | v = v.replace(/\bmillennial girl('s|s(?:')?)?\b/g, "snake girl$1"); 55 | v = v.replace(/\bMillennial (G|g)al('s|s(?:')?)?\b/g, "Snake $1al$2"); 56 | v = v.replace(/\bmillennial gal('s|s(?:')?)?\b/g, "snake gal$1"); 57 | 58 | // Aged Millennials 59 | v = v.replace(/\bMillennial Child('s)?\b/g, "Snakelet$1"); 60 | v = v.replace(/\b[Mm]illennial child('s)?\b/g, "snakelet$1"); 61 | v = v.replace(/\bMillennial Children(?:(')s)?\b/g, "Snakelets$1"); 62 | v = v.replace(/\b[Mm]illennial children(?:(')s)?\b/g, "snakelets$1"); 63 | v = v.replace( 64 | /\bMillennial [Tt]een(?:ager)?('s)?\b/g, 65 | "proto-Snake Person$1" 66 | ); 67 | v = v.replace(/\bmillennial teen(?:ager)?('s)?\b/g, "proto-snake person$1"); 68 | v = v.replace( 69 | /\bMillennial [Tt]een(?:ager)?(?:(s)\b(')|s\b)/g, 70 | "proto-Snake People$2$1" 71 | ); 72 | v = v.replace( 73 | /\bmillennial teen(?:ager)?(?:(s)\b(')|s\b)/g, 74 | "proto-snake people$2$1" 75 | ); 76 | v = v.replace(/\bMillennial (A|a)dult('s)?\b/g, "$1dult Snake Person$2"); 77 | v = v.replace(/\bmillennial adult('s)?\b/g, "adult snake person$1"); 78 | v = v.replace( 79 | /\bMillennial (A|a)dult(?:(s)\b(')|s\b)/g, 80 | "$1dult Snake People$3$2" 81 | ); 82 | v = v.replace( 83 | /\bmillennial adult(?:(s)\b(')|s\b)/g, 84 | "adult snake people$2$1" 85 | ); 86 | 87 | // Definition 88 | v = v.replace(/\bmil·len·nial\b/g, "snake peo·ple"); 89 | v = v.replace(/\bmiˈlenēəl\b/g, "snāk ˈpēpəl"); 90 | 91 | // Millennial 92 | v = v.replace(/\bMillennial\b/g, "Snake Person"); 93 | v = v.replace(/\bmillennial\b/g, "snake person"); 94 | v = v.replace(/\bMillennial(?:(s)\b(')|s\b)/g, "Snake People$2$1"); 95 | v = v.replace(/\bmillennial(?:(s)\b(')|s\b)/g, "snake people$2$1"); 96 | 97 | // The Great Recession 98 | v = v.replace(/\bGreat Recession\b/g, "Time of Shedding and Cold Rocks"); 99 | v = v.replace(/\bgreat recession\b/g, "time of shedding and cold rocks"); 100 | 101 | // The Great Depression 102 | v = v.replace(/\bGreat Depression\b/g, "Clutch Plague"); 103 | v = v.replace(/\bgreat depression\b/g, "clutch plague"); 104 | 105 | // Occupy Wall Street 106 | v = v.replace( 107 | /\b(?:the )?(?:(?:(?:occupy|ows) movement)|(?:occupy wall (?:street|st\.?)(?: movement)?))(?!\w)/gi, 108 | "The Great Ape-Snake War" 109 | ); 110 | v = v.replace(/\bOWS\b/g, "GA-SW"); 111 | v = v.replace(/\bows\b/g, "ga-sw"); 112 | 113 | // Helicopter Parents 114 | v = v.replace(/\bHelicopter Parent(?:(s)\b(')|s\b)/g, "Thulsa Doom$2$1"); 115 | v = v.replace(/\b[Hh]elicopter parent(?:(s)\b(')|s\b)/g, "Thoth-Amon$2$1"); 116 | 117 | // Trophy Kids 118 | v = v.replace(/\bTrophy Kid(?:(s)\b(')|s\b)/g, "Quetzalcoatl's Chosen$2$1"); 119 | v = v.replace(/\btrophy kid(?:(s)\b(')|s\b)/g, "Quetzalcoatl's chosen$2$1"); 120 | 121 | // Digital Natives 122 | v = v.replace(/\bDigital Native(s)?\b/g, "Parseltongue$1"); 123 | v = v.replace(/\bdigital native(s)?\b/g, "parseltongue$1"); 124 | 125 | // Generation Z 126 | v = v.replace(/\bGeneration Z\b/g, "The Zolom's Children"); 127 | v = v.replace(/\bgeneration Z\b/g, "the Zolom's children"); 128 | v = v.replace(/\bZ Generation\b/g, "Children of the Zolom"); 129 | v = v.replace(/\bz generation\b/g, "children of the Zolom"); 130 | 131 | // Tweens 132 | // The replacement syntax here emulates a negative lookbehind to avoid replacing `'tween` 133 | v = v.replace( /(')?\bTween(s)?\b/g, function ($0, $1, $2) { return ($1 ? $0 : $2 ? "Neonates" : "Neonate") }); 134 | v = v.replace( /(')?\btween(s)?\b/g, function ($0, $1, $2) { return ($1 ? $0 : $2 ? "neonates" : "neonate") }); 135 | 136 | // Generation Y 137 | v = v.replace(/\b(?:Generation Y)|(?:Generation Why)\b/g, 138 | "Serpent Society"); 139 | v = v.replace(/\bgen(?:eration)? ?(?:wh)?y\b/g, "serpent society"); 140 | v = v.replace(/\bGen Y\b/g, "Society of the Serpent"); 141 | 142 | // Generation We 143 | v = v.replace(/\bGeneration We\b/g, "Caduceus Cult"); 144 | v = v.replace(/\bgeneration we\b/g, "caduceus cult"); 145 | v = v.replace(/\bWe Generation\b/g, "Cult of the Caduceus"); 146 | v = v.replace(/\bwe generation\b/g, "cult of the caduceus"); 147 | 148 | // Generation Me 149 | v = v.replace(/\bGeneration Me\b/g, "The Cult of the Serpent"); 150 | v = v.replace(/\bgeneration me\b/g, "the cult of the serpent"); 151 | 152 | // Global Generation 153 | v = v.replace(/\bGlobal Generation\b/g, "Tannin's Horde"); 154 | v = v.replace(/\bglobal generation\b/g, "Tannin's horde"); 155 | v = v.replace(/\bGeneration Global\b/g, "Horde of Tannin"); 156 | v = v.replace(/\bgeneration global\b/g, "horde of Tannin"); 157 | 158 | // Generation Next 159 | v = v.replace(/\bGeneration Next\b/g, "Time of Nidhogg"); 160 | v = v.replace(/\bgeneration next\b/g, "time of Nidhogg"); 161 | 162 | // Net Generation 163 | v = v.replace(/\bNet Generation\b/g, "Damballa's Coils"); 164 | v = v.replace(/\bnet generation\b/g, "Damballa's coils"); 165 | v = v.replace(/\bGeneration Net\b/g, "Coils of Damballa"); 166 | v = v.replace(/\bgeneration net\b/g, "Coils of Damballa"); 167 | 168 | // Echo Boomers 169 | v = v.replace(/\bEcho Boomers\b/g, "Crotalids"); 170 | v = v.replace(/\becho Boomers\b/g, "crotalids"); 171 | 172 | // Parennials 173 | v = v.replace(/\bParennial\b/g, "Clutchmaster"); 174 | v = v.replace(/\bParennial\b/g, "clutchmaster"); 175 | 176 | // New Boomers 177 | v = v.replace(/\bNew Boomer(?:(s)\b(')|s\b)/g, "Jörmungandr's Circle$2$1"); 178 | v = v.replace(/\bnew Boomer(?:(s)\b(')|s\b)/g, "Jörmungandr's circle$2$1"); 179 | 180 | // Generation Flux 181 | v = v.replace(/\b(?:Generation Flux)|(?:Flux Generation)\b/g, "Hiss Club"); 182 | v = v.replace(/\b(?:generation flux)|(?:flux generation)\b/g, "hiss club"); 183 | 184 | // Generation Sell 185 | v = v.replace(/\bGeneration Sell\b/g, "Kaa Tribe"); 186 | v = v.replace(/\bgeneration sell\b/g, "Kaa tribe"); 187 | v = v.replace(/\bSell Generation\b/g, "Tribe of Kaa"); 188 | v = v.replace(/\bsell generation\b/g, "tribe of Kaa"); 189 | 190 | // Boomerang Generation 191 | v = v.replace( 192 | /\b(?:Boomerang Generation)|(?:Generation Boomerang)\b/g, 193 | "Ouroboros Society" 194 | ); 195 | v = v.replace( 196 | /\b(?:boomerang generation)|(?:generation boomerang)\b/g, 197 | "ouroboros society" 198 | ); 199 | 200 | // Peter Pan Generation 201 | v = v.replace(/\bPeter Pan Generation\b/g, "Neheb-Kau Cult"); 202 | v = v.replace(/\b(?:P|p)eter (?:P|p)an generation\b/g, "Neheb-Kau cult"); 203 | v = v.replace(/\bGeneration Peter Pan\b/g, "Cult of Neheb-Kau"); 204 | v = v.replace(/\bgeneration (?:P|p)eter (?:P|p)an\b/g, "cult of Neheb-Kau"); 205 | 206 | // Generation 911 207 | v = v.replace(/\bGen(?:eration)? 9\/?11\b/g, "Kaa Tribe"); 208 | v = v.replace(/\bgen(?:eration)? 9\/?11\b/g, "Kaa tribe"); 209 | v = v.replace(/\b9\/?11 Generation\b/g, "Tribe of the Kaa"); 210 | v = v.replace(/\b9\/?11 generation\b/g, "tribe of the Kaa"); 211 | 212 | // Cohorts 213 | v = v.replace(/\b(S|s)truggling (A|a)spirationals\b/g, "Struggling (with) Pythons"); 214 | v = v.replace(/\b(S|s)uccessful (H|h)omeowners\b/g, "Viper Stripers"); 215 | v = v.replace(/\b(A|a)ctive (A|a)ffluents\b/g, "Activated Boas"); 216 | v = v.replace(/\b(C|c)omfortable (?:tv|Tv|TV) (W|w)atchers\b/g, "Cozy Cobras"); 217 | 218 | // The Generation of €700 219 | v = v.replace( 220 | /\b(?:The Generation of €700)|(?:€700 Generation)\b/g, 221 | "Ophion" 222 | ); 223 | v = v.replace( 224 | /\b(?:the generation of €700)|(?:€700 generation)\b/g, 225 | "ophion" 226 | ); 227 | 228 | // Mileurista 229 | v = v.replace(/\b(?:M|m)ill?eurista\b/g, "Nagual"); 230 | 231 | // Precarious Generation 232 | v = v.replace( 233 | /\b(?:Precarious Generation)|(?:Generation Precarious)\b/g, 234 | "Gargouille" 235 | ); 236 | v = v.replace( 237 | /\b(?:precarious generation)|(?:generation precarious)\b/g, 238 | "gargouille" 239 | ); 240 | 241 | // Foodmood: https://twitter.com/drewtoothpaste/status/1062721114953187328 242 | v = v.replace(/\b(?:F|f)oodmood\b/g, "hunger"); 243 | 244 | return v; 245 | } 246 | 247 | // Returns true if a node should *not* be altered in any way 248 | function isForbiddenNode(node) { 249 | return node.isContentEditable || // DraftJS and many others 250 | (node.parentNode && node.parentNode.isContentEditable) || // Special case for Gmail 251 | (node.tagName && (node.tagName.toLowerCase() == "textarea" || // Some catch-alls 252 | node.tagName.toLowerCase() == "input")); 253 | } 254 | 255 | // The callback used for the document body and title observers 256 | function observerCallback(mutations) { 257 | var i, node; 258 | 259 | mutations.forEach(function(mutation) { 260 | for (i = 0; i < mutation.addedNodes.length; i++) { 261 | node = mutation.addedNodes[i]; 262 | if (isForbiddenNode(node)) { 263 | // Should never operate on user-editable content 264 | continue; 265 | } else if (node.nodeType === 3) { 266 | // Replace the text for text nodes 267 | handleText(node); 268 | } else { 269 | // Otherwise, find text nodes within the given node and replace text 270 | walk(node); 271 | } 272 | } 273 | }); 274 | } 275 | 276 | // Walk the doc (document) body, replace the title, and observe the body and title 277 | function walkAndObserve(doc) { 278 | var docTitle = doc.getElementsByTagName('title')[0], 279 | observerConfig = { 280 | characterData: true, 281 | childList: true, 282 | subtree: true 283 | }, 284 | bodyObserver, titleObserver; 285 | 286 | // Do the initial text replacements in the document body and title 287 | walk(doc.body); 288 | doc.title = replaceText(doc.title); 289 | 290 | // Observe the body so that we replace text in any added/modified nodes 291 | bodyObserver = new MutationObserver(observerCallback); 292 | bodyObserver.observe(doc.body, observerConfig); 293 | 294 | // Observe the title so we can handle any modifications there 295 | if (docTitle) { 296 | titleObserver = new MutationObserver(observerCallback); 297 | titleObserver.observe(docTitle, observerConfig); 298 | } 299 | } 300 | walkAndObserve(document); 301 | -------------------------------------------------------------------------------- /Source/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericwbailey/millennials-to-snake-people/d6b12e972ed2ccd90f669ed4a44d7fa5d20e9710/Source/icon128.png -------------------------------------------------------------------------------- /Source/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericwbailey/millennials-to-snake-people/d6b12e972ed2ccd90f669ed4a44d7fa5d20e9710/Source/icon16.png -------------------------------------------------------------------------------- /Source/icon32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericwbailey/millennials-to-snake-people/d6b12e972ed2ccd90f669ed4a44d7fa5d20e9710/Source/icon32.png -------------------------------------------------------------------------------- /Source/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericwbailey/millennials-to-snake-people/d6b12e972ed2ccd90f669ed4a44d7fa5d20e9710/Source/icon48.png -------------------------------------------------------------------------------- /Source/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | 4 | "name": "Millennials to Snake People", 5 | "short_name": "Snake People", 6 | "description": "Replaces the text 'Millennial' with 'Snake People'.", 7 | "author": "Eric Bailey", 8 | "version": "2.3", 9 | 10 | "icons": { 11 | "16": "icon16.png", 12 | "32": "icon32.png", 13 | "48": "icon48.png", 14 | "128": "icon128.png" 15 | }, 16 | 17 | "content_scripts": 18 | [ 19 | { 20 | "matches": ["*://*/*"], 21 | "all_frames": true, 22 | "js": ["content_script.js"], 23 | "run_at": "document_end" 24 | } 25 | ] 26 | } 27 | --------------------------------------------------------------------------------