├── src ├── css │ ├── popup.css │ └── options.css ├── js │ ├── options.js │ ├── popup.js │ └── background.js ├── img │ ├── unpinterested.png │ ├── screenshot-firefox.png │ ├── unpinterested_128x128.png │ └── unpinterested-transparent.png ├── background.html ├── popup.html └── manifest.json ├── global.js ├── .gitignore ├── utils ├── env.js ├── build.js └── webserver.js ├── package.json ├── LICENSE.md ├── README.md └── webpack.config.js /src/css/popup.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/css/options.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /global.js: -------------------------------------------------------------------------------- 1 | module.exports = window; 2 | -------------------------------------------------------------------------------- /src/js/options.js: -------------------------------------------------------------------------------- 1 | import "../css/options.css"; 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | secrets.*.js 4 | yarn* 5 | .idea/ 6 | build.zip -------------------------------------------------------------------------------- /src/img/unpinterested.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sellomkantjwa/unpinterested/HEAD/src/img/unpinterested.png -------------------------------------------------------------------------------- /src/img/screenshot-firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sellomkantjwa/unpinterested/HEAD/src/img/screenshot-firefox.png -------------------------------------------------------------------------------- /src/img/unpinterested_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sellomkantjwa/unpinterested/HEAD/src/img/unpinterested_128x128.png -------------------------------------------------------------------------------- /src/img/unpinterested-transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sellomkantjwa/unpinterested/HEAD/src/img/unpinterested-transparent.png -------------------------------------------------------------------------------- /utils/env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: (process.env.NODE_ENV || "production"), 3 | PORT: (process.env.PORT || 8080) 4 | }; 5 | -------------------------------------------------------------------------------- /src/background.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /utils/build.js: -------------------------------------------------------------------------------- 1 | const webpack = require("webpack"), 2 | config = require("../webpack.config"); 3 | 4 | webpack( 5 | config, 6 | function (err) { 7 | if (err) throw err; 8 | } 9 | ); 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "unpinterested", 3 | "version": "0.2.9", 4 | "description": "Exclude Pinterest from google search results", 5 | "scripts": { 6 | "build": "node utils/build.js", 7 | "watch": "npx webpack --watch ", 8 | "start": "node utils/webserver.js", 9 | "release": "rm -rf build.zip && node utils/build.js && zip -rj build.zip build/*" 10 | }, 11 | "devDependencies": { 12 | "clean-webpack-plugin": "^0.1.17", 13 | "copy-webpack-plugin": "^4.2.0", 14 | "css-loader": "^0.25.0", 15 | "file-loader": "3.0.1", 16 | "fs-extra": "^0.30.0", 17 | "html-loader": "^0.4.5", 18 | "html-webpack-plugin": "3.2.0", 19 | "style-loader": "^0.13.0", 20 | "webpack": "4.28.3", 21 | "webpack-cli": "^3.3.12", 22 | "webpack-dev-server": "^3.1.14", 23 | "write-file-webpack-plugin": "3.4.2" 24 | }, 25 | "dependencies": { 26 | "querystring": "0.2.0", 27 | "url-parse": "1.4.4" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /utils/webserver.js: -------------------------------------------------------------------------------- 1 | var WebpackDevServer = require("webpack-dev-server"), 2 | webpack = require("webpack"), 3 | config = require("../webpack.config"), 4 | env = require("./env"), 5 | path = require("path"); 6 | 7 | var options = (config.chromeExtensionBoilerplate || {}); 8 | var excludeEntriesToHotReload = (options.notHotReload || []); 9 | 10 | for (var entryName in config.entry) { 11 | if (excludeEntriesToHotReload.indexOf(entryName) === -1) { 12 | config.entry[entryName] = 13 | [ 14 | ("webpack-dev-server/client?http://localhost:" + env.PORT), 15 | "webpack/hot/dev-server" 16 | ].concat(config.entry[entryName]); 17 | } 18 | } 19 | 20 | config.plugins = 21 | [new webpack.HotModuleReplacementPlugin()].concat(config.plugins || []); 22 | 23 | delete config.chromeExtensionBoilerplate; 24 | 25 | var compiler = webpack(config); 26 | 27 | var server = 28 | new WebpackDevServer(compiler, { 29 | hot: true, 30 | contentBase: path.join(__dirname, "../build"), 31 | headers: { "Access-Control-Allow-Origin": "*" } 32 | }); 33 | 34 | server.listen(env.PORT); 35 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Sello Mkantjwa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A Chrome extension to remove Pinterest from Google search results 2 | 3 | ### NOTE (23 Sep 2023)): 4 | Unpinterested! has been acquired. This repository is no longer active. 5 | 6 | 7 | [On the Chrome store](https://chrome.google.com/webstore/detail/unpinterested/gefaihkenmchjmcpcbpdijpoknfjpbfe) 8 | 9 | 10 | ## WHY? 11 | 12 | [_Pinterest ruins Google search image search_](https://www.google.com/search?rlz=1C1CHBD_enZA786ZA787&q=pinterest+ruins+google+image+search&sa=X&ved=0ahUKEwiemdCDmaHaAhXpB8AKHZheBIQQ1QIIngEoAQ&biw=1366&bih=662) 13 | 14 | 15 | [_Pinterest is taking over google images_](https://www.google.com/search?rlz=1C1CHBD_enZA786ZA787&q=pinterest+is+taking+over+google+images&sa=X&ved=0ahUKEwie-cqKmaHaAhWJL8AKHf8tBc8Q1QIIqQEoAA&biw=1366&bih=662) 16 | 17 | 18 | [_Remove pinterest from google search_](https://www.google.com/search?rlz=1C1CHBD_enZA786ZA787&q=remove+pinterest+from+google+search&sa=X&ved=0ahUKEwjy-rqMnKHaAhUIBcAKHRsXDh8Q1QIIrgEoAA&biw=1366&bih=662) 19 | 20 | [_Exclude pinterest from search results_](https://www.google.com/search?rlz=1C1CHBD_enZA786ZA787&q=exclude+pinterest+from+search+results&sa=X&ved=0ahUKEwjY3_ajnKHaAhVnJsAKHX-FAgwQ1QIInwEoAg&biw=1366&bih=662) 21 | 22 | [block pinterest results](https://www.google.com/search?rlz=1C1CHBD_enZA786ZA787&q=block+pinterest+results&sa=X&ved=0ahUKEwjugYHXnKHaAhWlCMAKHb4eAWgQ1QII0gEoAw&biw=1366&bih=662) 23 | 24 | etc... 25 | 26 | # To Build 27 | 28 | - run `npm run release`. This produces a build.zip archive that can be uploaded to the Chrome/Firefox store. Note if you do not 29 | have `zip` installed, you can run `npm run build` and zip the resultant directory manually. 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/js/popup.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | require("../img/unpinterested.png"); 3 | let toggleOnOffBtn = document.getElementById("toggleOnOffBtn"); 4 | let descriptionDiv = document.getElementById("description"); 5 | let advancedSettingToggle = document.getElementById("advancedSettingToggle"); 6 | let enableForAllSearchesToggleBtn = document.getElementById("enableForAllSearchesToggleBtn"); 7 | let advancedSection = document.getElementById("advancedSection"); 8 | 9 | 10 | chrome.storage.sync.get("isDisabled", function (data) { 11 | toggleOnOffBtn.checked = !data.isDisabled; 12 | setDescriptionText(data.isDisabled); 13 | }); 14 | 15 | 16 | chrome.storage.sync.get("enableForAllSearches", function (data) { 17 | enableForAllSearchesToggleBtn.checked = data.enableForAllSearches; 18 | }); 19 | 20 | 21 | toggleOnOffBtn.onclick = function toggleOnOff(btn) { 22 | let isDisabled = !document.getElementById('toggleOnOffBtn').checked; 23 | setDescriptionText(isDisabled); 24 | chrome.storage.sync.set({isDisabled: isDisabled}) 25 | }; 26 | 27 | 28 | enableForAllSearchesToggleBtn.onclick = function toggleOnOff(btn) { 29 | let enableForAllSearches = document.getElementById('enableForAllSearchesToggleBtn').checked; 30 | chrome.storage.sync.set({enableForAllSearches: enableForAllSearches}) 31 | }; 32 | 33 | 34 | advancedSettingToggle.onclick = function toggleAdvancedSetting() { 35 | let currentlyHidden = getComputedStyle(advancedSection).display === "none"; 36 | 37 | if (currentlyHidden) { 38 | advancedSection.style.display = "flex"; 39 | } else { 40 | advancedSection.style.display = "none"; 41 | } 42 | 43 | }; 44 | 45 | function setDescriptionText(isDisabled) { 46 | if (isDisabled) { 47 | descriptionDiv.innerHTML = "Not excluding pinterest results "; 48 | } else { 49 | descriptionDiv.innerHTML = "Excluding pinterest results"; 50 | } 51 | } 52 | 53 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require("webpack"), 2 | path = require("path"), 3 | fileSystem = require("fs"), 4 | env = require("./utils/env"), 5 | CleanWebpackPlugin = require("clean-webpack-plugin"), 6 | CopyWebpackPlugin = require("copy-webpack-plugin"), 7 | HtmlWebpackPlugin = require("html-webpack-plugin"), 8 | WriteFilePlugin = require("write-file-webpack-plugin"); 9 | 10 | // load the secrets 11 | var alias = {}; 12 | 13 | var secretsPath = path.join(__dirname, ("secrets." + env.NODE_ENV + ".js")); 14 | 15 | var fileExtensions = ["jpg", "jpeg", "png", "gif", "eot", "otf", "svg", "ttf", "woff", "woff2"]; 16 | 17 | if (fileSystem.existsSync(secretsPath)) { 18 | alias["secrets"] = secretsPath; 19 | } 20 | 21 | var options = { 22 | entry: { 23 | popup: path.join(__dirname, "src", "js", "popup.js"), 24 | background: path.join(__dirname, "src", "js", "background.js") 25 | }, 26 | output: { 27 | path: path.join(__dirname, "build"), 28 | filename: "[name].bundle.js" 29 | }, 30 | module: { 31 | rules: [ 32 | { 33 | test: /\.css$/, 34 | loader: "style-loader!css-loader", 35 | exclude: /node_modules/ 36 | }, 37 | { 38 | test: new RegExp('\.(' + fileExtensions.join('|') + ')$'), 39 | loader: "file-loader?name=[name].[ext]", 40 | exclude: /node_modules/ 41 | }, 42 | { 43 | test: /\.html$/, 44 | loader: "html-loader", 45 | exclude: /node_modules/ 46 | } 47 | ] 48 | }, 49 | resolve: { 50 | alias: alias 51 | }, 52 | plugins: [ 53 | // clean the build folder 54 | // new CleanWebpackPlugin(["build"]), 55 | // expose and write the allowed env vars on the compiled bundle 56 | new webpack.DefinePlugin({ 57 | "process.env.NODE_ENV": JSON.stringify(env.NODE_ENV) 58 | }), 59 | new CopyWebpackPlugin([{ 60 | from: "src/manifest.json", 61 | transform: function (content, path) { 62 | // generates the manifest file using the package.json informations 63 | return Buffer.from(JSON.stringify({ 64 | description: process.env.npm_package_description, 65 | version: process.env.npm_package_version, 66 | ...JSON.parse(content.toString()) 67 | })) 68 | } 69 | }]), 70 | new HtmlWebpackPlugin({ 71 | template: path.join(__dirname, "src", "popup.html"), 72 | filename: "popup.html", 73 | chunks: ["popup"] 74 | }), 75 | new HtmlWebpackPlugin({ 76 | template: path.join(__dirname, "src", "background.html"), 77 | filename: "background.html", 78 | chunks: ["background"] 79 | }), 80 | new WriteFilePlugin(), 81 | new webpack.ProvidePlugin({ 82 | global: require.resolve('./global.js') 83 | }) 84 | ], 85 | optimization: { 86 | minimize: false 87 | }, 88 | node: { 89 | global: false 90 | }, 91 | }; 92 | 93 | module.exports = options; 94 | -------------------------------------------------------------------------------- /src/js/background.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import "../img/unpinterested.png"; 4 | import "../img/unpinterested_128x128.png"; 5 | import querystring from "querystring"; 6 | 7 | const URL = require("url-parse"); 8 | 9 | let isDisabled = false; 10 | let enableForAllSearches = true; 11 | const exclusionRegexString = "-site:pinterest.*"; 12 | const exclusionRegex = /\-site:pinterest\.\*/; 13 | 14 | chrome.runtime.onStartup.addListener(function () { 15 | chrome.storage.sync.get('isDisabled', function (data) { 16 | isDisabled = data.isDisabled; 17 | }); 18 | }); 19 | 20 | 21 | chrome.runtime.onInstalled.addListener(initialize); 22 | chrome.runtime.onStartup.addListener(initialize); 23 | chrome.runtime.onInstalled.addListener(function (object) { 24 | 25 | if (object.reason === 'install') { 26 | chrome.tabs.create({url: "https://www.buymeacoffee.com/wDWve46U2?ref=install"}, function (tab) { 27 | 28 | }); 29 | } 30 | }); 31 | chrome.runtime.setUninstallURL('https://docs.google.com/forms/d/1faYdMUgZC_fstuOiLvQ4dg6YZ-t3613RrKpghnS2djg', ()=>{ 32 | console.log('uninstall URL set') 33 | }); 34 | 35 | 36 | function unExcludeResults(requestDetails) { 37 | let {nonQueryURI, searchQuery, fullQueryString} = getParsedUrl(requestDetails.url); 38 | const newSearchQuery = searchQuery.replace(exclusionRegex, ""); 39 | fullQueryString.q = newSearchQuery; 40 | fullQueryString.oq = newSearchQuery; 41 | 42 | if (searchQuery !== newSearchQuery) { 43 | return {redirectUrl: `${nonQueryURI}?${querystring.stringify(fullQueryString)}`}; 44 | } 45 | 46 | } 47 | 48 | function modifyRequestToExcludeResults(requestDetails) { 49 | 50 | let {nonQueryURI, searchQuery, fullQueryString} = getParsedUrl(requestDetails.url); 51 | 52 | if (searchQuery && searchQuery.indexOf(exclusionRegexString) === -1) { 53 | const newSearchQuery = searchQuery + (" " + exclusionRegexString); 54 | fullQueryString.q = newSearchQuery; 55 | fullQueryString.oq = newSearchQuery; 56 | 57 | if (searchQuery !== newSearchQuery) { 58 | return {redirectUrl: `${nonQueryURI}?${querystring.stringify(fullQueryString)}`}; 59 | } 60 | } 61 | } 62 | 63 | function getParsedUrl(url) { 64 | const URISections = url.split("?"); 65 | let nonQueryURI = URISections[0]; 66 | let fullQueryString = querystring.parse(URISections[1]); 67 | 68 | let searchQuery = fullQueryString.q || fullQueryString.oq; 69 | 70 | 71 | return { 72 | nonQueryURI, 73 | searchQuery, 74 | fullQueryString 75 | } 76 | } 77 | 78 | function monitorIsDisabled(changes, namespace) { 79 | if (changes.isDisabled) { 80 | isDisabled = changes.isDisabled.newValue; 81 | } 82 | } 83 | 84 | function monitorEnableForAllSearches(changes, namespace) { 85 | if (changes.enableForAllSearches) { 86 | enableForAllSearches = changes.enableForAllSearches.newValue; 87 | } 88 | } 89 | 90 | function initialize() { 91 | { 92 | chrome.storage.sync.get('isDisabled', function (data) { 93 | console.log("isDisabled", isDisabled); 94 | isDisabled = data.isDisabled || false; 95 | 96 | if (data.isDisabled === undefined) { 97 | chrome.storage.sync.set({isDisabled: isDisabled}) 98 | } 99 | }); 100 | 101 | chrome.storage.sync.get('enableForAllSearches', function (data) { 102 | console.log("enableForAllSearches", data, data.enableForAllSearches); 103 | if (data.enableForAllSearches === undefined) { 104 | chrome.storage.sync.set({enableForAllSearches: true}) 105 | } 106 | enableForAllSearches = data.enableForAllSearches !== false; 107 | }); 108 | 109 | chrome.storage.onChanged.addListener(monitorIsDisabled); 110 | chrome.storage.onChanged.addListener(monitorEnableForAllSearches); 111 | 112 | 113 | chrome.webRequest.onBeforeRequest.addListener( 114 | (details) => { 115 | 116 | const host = URL(details.url).host; 117 | 118 | if (!/^([a-zA-Z\d-]+\.){0,}google\.([a-z\.])+$/.test(host)) { 119 | return; 120 | } 121 | 122 | 123 | if (isDisabled) { 124 | return unExcludeResults(details); 125 | } 126 | 127 | let {fullQueryString} = getParsedUrl(details.url); 128 | 129 | if( fullQueryString.tbm === "map"){ 130 | return unExcludeResults(details); 131 | } 132 | 133 | if (!enableForAllSearches && fullQueryString.tbm !== "isch") { 134 | return unExcludeResults(details); 135 | } 136 | 137 | return modifyRequestToExcludeResults(details); 138 | 139 | }, {urls: ["http://*/search?*", "https://*/search?*"]}, ['blocking']); 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /src/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 126 | 127 | 128 | 129 | 130 | 131 |
132 | 133 |
134 |
135 | 136 |
Unpinterested! 137 |
138 |
139 | 140 |
141 | 145 | 146 | 147 |
148 | Exluding Pinterest results 149 |
150 |
151 | 152 |
153 |
154 | 155 |
156 | advanced settings 157 |
158 | 159 |
160 | 161 |
162 | Enable for non image searches? 163 |
164 | 165 | 169 | 170 |
171 | 172 | By default Unpinterested! will block ALL Pinterest results.If you are getting unexpected results from 173 | searches for things like maps or any other non-images searches, try disabling Unpinterested! 174 | for non-image search and it will only block Pinterest on image searches. 175 |
176 |
177 |
178 | 179 |
180 |
181 | Enjoying the extension? 182 |
183 | 184 | Buy Me A Coffee 187 | 188 |
189 | 190 |
191 | 192 | 193 | 194 | 195 | 196 | -------------------------------------------------------------------------------- /src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Unpinterested!", 3 | "version": "0.2.9", 4 | "description": "Remove Pinterest from Google search results", 5 | "manifest_version": 2, 6 | "browser_specific_settings": { 7 | "gecko": { 8 | "id": "firefox@unpinterested" 9 | } 10 | }, 11 | "permissions": [ 12 | "storage", 13 | "webRequest", 14 | "webRequestBlocking", 15 | "*://*.google.com/", 16 | "*://*.google.ad/", 17 | "*://*.google.ae/", 18 | "*://*.google.com.af/", 19 | "*://*.google.com.ag/", 20 | "*://*.google.com.ai/", 21 | "*://*.google.al/", 22 | "*://*.google.am/", 23 | "*://*.google.co.ao/", 24 | "*://*.google.com.ar/", 25 | "*://*.google.as/", 26 | "*://*.google.at/", 27 | "*://*.google.com.au/", 28 | "*://*.google.az/", 29 | "*://*.google.ba/", 30 | "*://*.google.com.bd/", 31 | "*://*.google.be/", 32 | "*://*.google.bf/", 33 | "*://*.google.bg/", 34 | "*://*.google.com.bh/", 35 | "*://*.google.bi/", 36 | "*://*.google.bj/", 37 | "*://*.google.com.bn/", 38 | "*://*.google.com.bo/", 39 | "*://*.google.com.br/", 40 | "*://*.google.bs/", 41 | "*://*.google.bt/", 42 | "*://*.google.co.bw/", 43 | "*://*.google.by/", 44 | "*://*.google.com.bz/", 45 | "*://*.google.ca/", 46 | "*://*.google.cd/", 47 | "*://*.google.cf/", 48 | "*://*.google.cg/", 49 | "*://*.google.ch/", 50 | "*://*.google.ci/", 51 | "*://*.google.co.ck/", 52 | "*://*.google.cl/", 53 | "*://*.google.cm/", 54 | "*://*.google.cn/", 55 | "*://*.google.com.co/", 56 | "*://*.google.co.cr/", 57 | "*://*.google.com.cu/", 58 | "*://*.google.cv/", 59 | "*://*.google.com.cy/", 60 | "*://*.google.cz/", 61 | "*://*.google.de/", 62 | "*://*.google.dj/", 63 | "*://*.google.dk/", 64 | "*://*.google.dm/", 65 | "*://*.google.com.do/", 66 | "*://*.google.dz/", 67 | "*://*.google.com.ec/", 68 | "*://*.google.ee/", 69 | "*://*.google.com.eg/", 70 | "*://*.google.es/", 71 | "*://*.google.com.et/", 72 | "*://*.google.fi/", 73 | "*://*.google.com.fj/", 74 | "*://*.google.fm/", 75 | "*://*.google.fr/", 76 | "*://*.google.ga/", 77 | "*://*.google.ge/", 78 | "*://*.google.gg/", 79 | "*://*.google.com.gh/", 80 | "*://*.google.com.gi/", 81 | "*://*.google.gl/", 82 | "*://*.google.gm/", 83 | "*://*.google.gp/", 84 | "*://*.google.gr/", 85 | "*://*.google.com.gt/", 86 | "*://*.google.gy/", 87 | "*://*.google.com.hk/", 88 | "*://*.google.hn/", 89 | "*://*.google.hr/", 90 | "*://*.google.ht/", 91 | "*://*.google.hu/", 92 | "*://*.google.co.id/", 93 | "*://*.google.ie/", 94 | "*://*.google.co.il/", 95 | "*://*.google.im/", 96 | "*://*.google.co.in/", 97 | "*://*.google.iq/", 98 | "*://*.google.is/", 99 | "*://*.google.it/", 100 | "*://*.google.je/", 101 | "*://*.google.com.jm/", 102 | "*://*.google.jo/", 103 | "*://*.google.co.jp/", 104 | "*://*.google.co.ke/", 105 | "*://*.google.com.kh/", 106 | "*://*.google.ki/", 107 | "*://*.google.kg/", 108 | "*://*.google.co.kr/", 109 | "*://*.google.com.kw/", 110 | "*://*.google.kz/", 111 | "*://*.google.la/", 112 | "*://*.google.com.lb/", 113 | "*://*.google.li/", 114 | "*://*.google.lk/", 115 | "*://*.google.co.ls/", 116 | "*://*.google.lt/", 117 | "*://*.google.lu/", 118 | "*://*.google.lv/", 119 | "*://*.google.com.ly/", 120 | "*://*.google.co.ma/", 121 | "*://*.google.md/", 122 | "*://*.google.me/", 123 | "*://*.google.mg/", 124 | "*://*.google.mk/", 125 | "*://*.google.ml/", 126 | "*://*.google.com.mm/", 127 | "*://*.google.mn/", 128 | "*://*.google.ms/", 129 | "*://*.google.com.mt/", 130 | "*://*.google.mu/", 131 | "*://*.google.mv/", 132 | "*://*.google.mw/", 133 | "*://*.google.com.mx/", 134 | "*://*.google.com.my/", 135 | "*://*.google.co.mz/", 136 | "*://*.google.com.na/", 137 | "*://*.google.com.nf/", 138 | "*://*.google.com.ng/", 139 | "*://*.google.com.ni/", 140 | "*://*.google.ne/", 141 | "*://*.google.nl/", 142 | "*://*.google.no/", 143 | "*://*.google.com.np/", 144 | "*://*.google.nr/", 145 | "*://*.google.nu/", 146 | "*://*.google.co.nz/", 147 | "*://*.google.com.om/", 148 | "*://*.google.com.pa/", 149 | "*://*.google.com.pe/", 150 | "*://*.google.com.pg/", 151 | "*://*.google.com.ph/", 152 | "*://*.google.com.pk/", 153 | "*://*.google.pl/", 154 | "*://*.google.pn/", 155 | "*://*.google.com.pr/", 156 | "*://*.google.ps/", 157 | "*://*.google.pt/", 158 | "*://*.google.com.py/", 159 | "*://*.google.com.qa/", 160 | "*://*.google.ro/", 161 | "*://*.google.ru/", 162 | "*://*.google.rw/", 163 | "*://*.google.com.sa/", 164 | "*://*.google.com.sb/", 165 | "*://*.google.sc/", 166 | "*://*.google.se/", 167 | "*://*.google.com.sg/", 168 | "*://*.google.sh/", 169 | "*://*.google.si/", 170 | "*://*.google.sk/", 171 | "*://*.google.com.sl/", 172 | "*://*.google.sn/", 173 | "*://*.google.so/", 174 | "*://*.google.sm/", 175 | "*://*.google.sr/", 176 | "*://*.google.st/", 177 | "*://*.google.com.sv/", 178 | "*://*.google.td/", 179 | "*://*.google.tg/", 180 | "*://*.google.co.th/", 181 | "*://*.google.com.tj/", 182 | "*://*.google.tk/", 183 | "*://*.google.tl/", 184 | "*://*.google.tm/", 185 | "*://*.google.tn/", 186 | "*://*.google.to/", 187 | "*://*.google.com.tr/", 188 | "*://*.google.tt/", 189 | "*://*.google.com.tw/", 190 | "*://*.google.co.tz/", 191 | "*://*.google.com.ua/", 192 | "*://*.google.co.ug/", 193 | "*://*.google.co.uk/", 194 | "*://*.google.com.uy/", 195 | "*://*.google.co.uz/", 196 | "*://*.google.com.vc/", 197 | "*://*.google.co.ve/", 198 | "*://*.google.vg/", 199 | "*://*.google.co.vi/", 200 | "*://*.google.com.vn/", 201 | "*://*.google.vu/", 202 | "*://*.google.ws/", 203 | "*://*.google.rs/", 204 | "*://*.google.co.za/", 205 | "*://*.google.co.zm/", 206 | "*://*.google.co.zw/", 207 | "*://*.google.cat/" 208 | ], 209 | "background": { 210 | "scripts": [ 211 | "background.bundle.js" 212 | ] 213 | }, 214 | "browser_action": { 215 | "default_icon": "/unpinterested.png", 216 | "default_popup": "/popup.html" 217 | }, 218 | "icons": { 219 | "16": "/unpinterested.png", 220 | "32": "/unpinterested.png", 221 | "48": "/unpinterested.png", 222 | "128": "/unpinterested_128x128.png" 223 | }, 224 | "content_security_policy": "script-src 'self' ; object-src 'self'" 225 | } 226 | --------------------------------------------------------------------------------