├── README.md ├── bookmarklet.js ├── index.html ├── ingot.js └── ingot.min.js /README.md: -------------------------------------------------------------------------------- 1 | # Patched! 2 | Ingot has been patched on Chrome 106 or after. This will not be updated. 3 | 4 | # Ingot 5 | A bookmarklet to disable extensions based on LTBEEF with an interface based on the chrome extension page 6 | 7 | ### Installation 8 | For easy setup go the the website at https://fognetwork.github.io/Ingot 9 | 10 | 1. Show your bookmarks bar with `ctrl + shift + b` 11 | 12 | 2. Right click on the bar and choose `Add Page` 13 | 14 | 3. Set the name to `Ingot` and the URL to the code below or [here](https://github.com/FogNetwork/Ingot/blob/main/bookmarklet.js) 15 | 16 | ```js 17 | javascript:(function () {var a = document.createElement('script');a.src = 'https://cdn.jsdelivr.net/gh/FogNetwork/Ingot/ingot.min.js';document.body.appendChild(a);}()) 18 | ``` 19 | 20 | ## Screenshots 21 | ![image](https://user-images.githubusercontent.com/81875430/192154755-0f3c4ad5-0637-445a-b928-5e78a3b33a55.png) 22 | ![image](https://user-images.githubusercontent.com/81875430/192154766-49dfa5b1-11a8-4bb0-b4cb-5ac01301a8b0.png) 23 | -------------------------------------------------------------------------------- /bookmarklet.js: -------------------------------------------------------------------------------- 1 | javascript:(function () {var a = document.createElement('script');a.src = 'https://cdn.jsdelivr.net/gh/FogNetwork/Ingot@latest/ingot.min.js';document.body.appendChild(a);}()) 2 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | Ingot 2 | 3 |
Ingot
4 | 5 |
Launch IngotIngot
6 |
Drag the button to your bookmarks bar for easy access
7 | 8 | 76 | -------------------------------------------------------------------------------- /ingot.js: -------------------------------------------------------------------------------- 1 | //Checks for dev mode 2 | function isPageDev() { 3 | if (localStorage.getItem("dev")) { 4 | return "dev" 5 | } else { 6 | return ""; 7 | } 8 | } 9 | 10 | function isButtonDev() { 11 | if (!localStorage.getItem("dev")) { 12 | return "unchecked" 13 | } else { 14 | return ""; 15 | } 16 | } 17 | 18 | //Set base page code 19 | document.documentElement.innerHTML = ` 20 | Ingot 21 | 22 | 23 | 39 | 40 |
41 |
42 |
Error: This may have been patched
43 |
You are not on the correct page.
To use Ingot click the button below to redirect and run the bookmarklet again.
44 |
Redirect
45 |
46 |
47 |
48 | 49 | 398 | 399 | ` 400 | 401 | //Remove extension 402 | function removeExtension(extensionId) { 403 | chrome.management.uninstall(extensionId) 404 | } 405 | 406 | //Simple function to make image to data url 407 | function blobToDataURL(blob) { 408 | return new Promise((resolve, reject) => { 409 | var reader = new FileReader(); 410 | reader.onload = function(e) { 411 | resolve(e.target.result) 412 | } 413 | reader.onerror = function(e) { 414 | reject(reader.error) 415 | } 416 | reader.onabort = function(e) { 417 | reject(new Error("Read aborted")) 418 | } 419 | reader.readAsDataURL(blob); 420 | }) 421 | } 422 | 423 | //Gets the icon from extensions 424 | async function getIconFromExtension(extensionID) { 425 | if (!extensionID) return ""; 426 | 427 | var extensionPage = await fetch("https://chrome.google.com/webstore/detail/" + extensionID) 428 | var extensionPageCode = await extensionPage.text() 429 | var dom = new DOMParser().parseFromString(extensionPageCode, "text/html") 430 | if (!dom.querySelector("img.e-f-s[src]")) return ""; 431 | var extensionImage = dom.querySelector("img.e-f-s[src]").src; 432 | var getImage = await fetch(extensionImage); 433 | return await blobToDataURL(await getImage.blob()); 434 | } 435 | 436 | //Toggle extensions 437 | function toggleExtension(e, extensionId) { 438 | if (e.hasAttribute("unchecked")) { 439 | chrome.management.setEnabled(extensionId, true) 440 | } else { 441 | chrome.management.setEnabled(extensionId, false) 442 | } 443 | } 444 | 445 | //Toggle the toggle 446 | function toggle(e) { 447 | if (e.hasAttribute("unchecked")) { 448 | e.removeAttribute("unchecked") 449 | } else { 450 | e.setAttribute("unchecked", "") 451 | } 452 | } 453 | 454 | //Toggle animation 455 | function togglePress(e, dir) { 456 | if (dir == "down") { 457 | e.children[1].children[0].children[0].setAttribute("open", "") 458 | } else { 459 | setTimeout(function() { 460 | e.children[1].children[0].children[0].style.display = "none" 461 | e.children[1].children[0].children[0].removeAttribute("open") 462 | e.children[1].children[0].children[0].style.display = "initial" 463 | }, 80) 464 | } 465 | } 466 | 467 | //Sets dev mode 468 | function devMode() { 469 | if (document.body.hasAttribute("dev")) { 470 | document.body.removeAttribute("dev") 471 | localStorage.removeItem("dev") 472 | } else { 473 | document.body.setAttribute("dev", "") 474 | localStorage.setItem("dev", "true") 475 | } 476 | } 477 | 478 | //Creates extension element 479 | function addExtension(data) { 480 | var items = document.getElementById("items") 481 | 482 | var item = document.createElement("div") 483 | item.className = "item" 484 | item.setAttribute("data-id", data.id) 485 | if (data.managed) { 486 | item.setAttribute("managed", "") 487 | } 488 | 489 | var itemMain = document.createElement("div") 490 | itemMain.className = "item-main" 491 | 492 | var itemImgWrapper = document.createElement("div") 493 | itemImgWrapper.className = "item-img-wrapper" 494 | 495 | var itemImg = document.createElement("img") 496 | itemImg.className = "item-img" 497 | itemImg.src = data.logo 498 | 499 | var itemImgSource = document.createElement("div") 500 | itemImgSource.className = "item-img-source" 501 | itemImgSource.innerHTML = `` 502 | 503 | itemImgWrapper.appendChild(itemImg) 504 | itemImgWrapper.appendChild(itemImgSource) 505 | 506 | itemMain.appendChild(itemImgWrapper) 507 | 508 | var itemContent = document.createElement("div") 509 | itemContent.className = "item-content" 510 | 511 | var itemTitleAndVersion = document.createElement("div") 512 | itemTitleAndVersion.className = "item-title-and-version" 513 | 514 | var itemTitle = document.createElement("div") 515 | itemTitle.className = "item-title" 516 | itemTitle.innerText = data.title 517 | 518 | var itemVersion = document.createElement("div") 519 | itemVersion.className = "item-version" 520 | itemVersion.innerText = data.version 521 | 522 | itemTitleAndVersion.appendChild(itemTitle) 523 | itemTitleAndVersion.appendChild(itemVersion) 524 | 525 | itemContent.appendChild(itemTitleAndVersion) 526 | 527 | var itemDescriptionOverflow = document.createElement("div") 528 | itemDescriptionOverflow.className = "item-description-overflow" 529 | 530 | var itemDescription = document.createElement("div") 531 | itemDescription.className = "item-description" 532 | itemDescription.innerText = data.description 533 | 534 | itemDescriptionOverflow.appendChild(itemDescription) 535 | 536 | itemContent.appendChild(itemDescriptionOverflow) 537 | 538 | var itemId = document.createElement("div") 539 | itemId.className = "item-id" 540 | itemId.innerText = "ID: " + data.id 541 | 542 | itemContent.appendChild(itemId) 543 | 544 | itemMain.appendChild(itemContent) 545 | 546 | item.appendChild(itemMain) 547 | 548 | var itemButtons = document.createElement("div") 549 | itemButtons.className = "item-buttons" 550 | 551 | //Does not work on admin extensions 552 | /* 553 | var itemLeftButtons = document.createElement("div") 554 | itemLeftButtons.className = "item-left-buttons" 555 | 556 | var itemLeftButton = document.createElement("div") 557 | itemLeftButton.className = "item-left-button" 558 | itemLeftButton.innerText = "Remove" 559 | itemLeftButton.setAttribute("onclick", "removeExtension('" + data.id + "')") 560 | itemLeftButtons.appendChild(itemLeftButton) 561 | 562 | itemButtons.appendChild(itemLeftButtons) 563 | */ 564 | 565 | var itemToggle = document.createElement("div") 566 | itemToggle.className = "item-toggle" 567 | itemToggle.setAttribute("onclick", "toggleExtension(this, '" + data.id + "');toggle(this)") 568 | itemToggle.setAttribute("onmousedown", "togglePress(this, 'down')") 569 | itemToggle.setAttribute("onmouseup", "togglePress(this, 'up')") 570 | if (!data.enabled) { 571 | itemToggle.setAttribute("unchecked", "") 572 | } 573 | 574 | var itemBar = document.createElement("div") 575 | itemBar.className = "item-bar" 576 | 577 | var itemKnob = document.createElement("div") 578 | itemKnob.className = "item-knob" 579 | 580 | var itemRipple = document.createElement("div") 581 | itemRipple.className = "item-ripple" 582 | 583 | var ripple = document.createElement("div") 584 | ripple.className = "ripple" 585 | 586 | itemRipple.appendChild(ripple) 587 | 588 | itemKnob.appendChild(itemRipple) 589 | 590 | itemToggle.appendChild(itemBar) 591 | 592 | itemToggle.appendChild(itemKnob) 593 | 594 | itemButtons.appendChild(itemToggle) 595 | 596 | item.appendChild(itemButtons) 597 | 598 | items.appendChild(item) 599 | } 600 | 601 | //Gets all extensions and adds them 602 | async function getExtensions() { 603 | chrome.management.getAll(async function(allExtensions) { 604 | for (let anExtension in allExtensions) 605 | if (!allExtensions[anExtension].isApp) { 606 | addExtension({ 607 | title: allExtensions[anExtension].name, 608 | version: allExtensions[anExtension].version, 609 | description: allExtensions[anExtension].description, 610 | id: allExtensions[anExtension].id, 611 | logo: "", 612 | managed: allExtensions[anExtension].installType == "admin" ? true : false, 613 | enabled: allExtensions[anExtension].enabled, 614 | }) 615 | } 616 | }) 617 | setTimeout(function() { 618 | setIcons() 619 | }, 100) 620 | } 621 | 622 | async function setIcons() { 623 | var items = document.querySelectorAll(".items .item") 624 | for (let item in items) { 625 | try { 626 | items[item].querySelector(".item-main .item-img-wrapper .item-img").src = await getIconFromExtension(items[item].dataset.id) 627 | } catch { 628 | } 629 | } 630 | } 631 | 632 | //Show wrong page popup 633 | if (!window.location.toString().startsWith("https://chrome.google.com/webstore")) { 634 | document.getElementById("items").setAttribute("wrongpage", "") 635 | } else { 636 | //Checks if it still works 637 | if (chrome.management) { 638 | getExtensions() 639 | } else { 640 | document.getElementById("items").setAttribute("patched", "") 641 | } 642 | } 643 | -------------------------------------------------------------------------------- /ingot.min.js: -------------------------------------------------------------------------------- 1 | function isPageDev(){return localStorage.getItem("dev")?"dev":""}function isButtonDev(){return localStorage.getItem("dev")?"":"unchecked"}function removeExtension(n){chrome.management.uninstall(n)}function blobToDataURL(n){return new Promise(((t,e)=>{var i=new FileReader;i.onload=function(n){t(n.target.result)},i.onerror=function(n){e(i.error)},i.onabort=function(n){e(new Error("Read aborted"))},i.readAsDataURL(n)}))}async function getIconFromExtension(n){if(!n)return"";var t=await fetch("https://chrome.google.com/webstore/detail/"+n),e=await t.text(),i=(new DOMParser).parseFromString(e,"text/html");if(!i.querySelector("img.e-f-s[src]"))return"";var o=i.querySelector("img.e-f-s[src]").src,r=await fetch(o);return await blobToDataURL(await r.blob())}function toggleExtension(n,t){n.hasAttribute("unchecked")?chrome.management.setEnabled(t,!0):chrome.management.setEnabled(t,!1)}function toggle(n){n.hasAttribute("unchecked")?n.removeAttribute("unchecked"):n.setAttribute("unchecked","")}function togglePress(n,t){"down"==t?n.children[1].children[0].children[0].setAttribute("open",""):setTimeout((function(){n.children[1].children[0].children[0].style.display="none",n.children[1].children[0].children[0].removeAttribute("open"),n.children[1].children[0].children[0].style.display="initial"}),80)}function devMode(){document.body.hasAttribute("dev")?(document.body.removeAttribute("dev"),localStorage.removeItem("dev")):(document.body.setAttribute("dev",""),localStorage.setItem("dev","true"))}function addExtension(n){var t=document.getElementById("items"),e=document.createElement("div");e.className="item",e.setAttribute("data-id",n.id),n.managed&&e.setAttribute("managed","");var i=document.createElement("div");i.className="item-main";var o=document.createElement("div");o.className="item-img-wrapper";var r=document.createElement("img");r.className="item-img",r.src=n.logo;var a=document.createElement("div");a.className="item-img-source",a.innerHTML='',o.appendChild(r),o.appendChild(a),i.appendChild(o);var d=document.createElement("div");d.className="item-content";var l=document.createElement("div");l.className="item-title-and-version";var s=document.createElement("div");s.className="item-title",s.innerText=n.title;var m=document.createElement("div");m.className="item-version",m.innerText=n.version,l.appendChild(s),l.appendChild(m),d.appendChild(l);var c=document.createElement("div");c.className="item-description-overflow";var p=document.createElement("div");p.className="item-description",p.innerText=n.description,c.appendChild(p),d.appendChild(c);var g=document.createElement("div");g.className="item-id",g.innerText="ID: "+n.id,d.appendChild(g),i.appendChild(d),e.appendChild(i);var h=document.createElement("div");h.className="item-buttons";var v=document.createElement("div");v.className="item-toggle",v.setAttribute("onclick","toggleExtension(this, '"+n.id+"');toggle(this)"),v.setAttribute("onmousedown","togglePress(this, 'down')"),v.setAttribute("onmouseup","togglePress(this, 'up')"),n.enabled||v.setAttribute("unchecked","");var x=document.createElement("div");x.className="item-bar";var u=document.createElement("div");u.className="item-knob";var b=document.createElement("div");b.className="item-ripple";var f=document.createElement("div");f.className="ripple",b.appendChild(f),u.appendChild(b),v.appendChild(x),v.appendChild(u),h.appendChild(v),e.appendChild(h),t.appendChild(e)}async function getExtensions(){chrome.management.getAll((async function(n){for(let t in n)n[t].isApp||addExtension({title:n[t].name,version:n[t].version,description:n[t].description,id:n[t].id,logo:"",managed:"admin"==n[t].installType,enabled:n[t].enabled})})),setTimeout((function(){setIcons()}),100)}async function setIcons(){var n=document.querySelectorAll(".items .item");for(let t in n)try{n[t].querySelector(".item-main .item-img-wrapper .item-img").src=await getIconFromExtension(n[t].dataset.id)}catch{}}document.documentElement.innerHTML="\">\nIngot\n\n\n\n\n
\n
\n
Error: This may have been patched
\n
You are not on the correct page.
To use Ingot click the button below to redirect and run the bookmarklet again.
\n
Redirect
\n
\n
\n
\n\n\n\n',window.location.toString().startsWith("https://chrome.google.com/webstore")?chrome.management?getExtensions():document.getElementById("items").setAttribute("patched",""):document.getElementById("items").setAttribute("wrongpage",""); 2 | --------------------------------------------------------------------------------