From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Sat, 28 Oct 2017 10:09:41 +0200
Subject: Cure AMP and tracking from search results

---
 third_party/blink/renderer/core/dom/BUILD.gn         |  1 +
 third_party/blink/renderer/core/dom/document.cc      | 20 +++++++++++++++++++-
 .../renderer/core/dom/extensions/anti_amp_cure.h     |  6 ++++++
 3 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h

diff --git a/third_party/blink/renderer/core/dom/BUILD.gn b/third_party/blink/renderer/core/dom/BUILD.gn
--- a/third_party/blink/renderer/core/dom/BUILD.gn
+++ b/third_party/blink/renderer/core/dom/BUILD.gn
@@ -147,6 +147,7 @@ blink_core_sources("dom") {
     "events/tree_scope_event_context.h",
     "events/window_event_context.cc",
     "events/window_event_context.h",
+    "extensions/dont-track-me.h",
     "exception_code.h",
     "first_letter_pseudo_element.cc",
     "first_letter_pseudo_element.h",
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -276,6 +276,8 @@
 #include "third_party/blink/renderer/platform/wtf/text/text_encoding_registry.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
 
+#include "extensions/anti_amp_cure.h"
+
 #ifndef NDEBUG
 using WeakDocumentSet =
     blink::PersistentHeapHashSet<blink::WeakMember<blink::Document>>;
@@ -5839,8 +5841,24 @@ void Document::FinishedParsing() {
     fetcher_->ClearResourcesFromPreviousFetcher();
   }
 
-  if (IsPrefetchOnly())
+  if (IsPrefetchOnly()) {
     WebPrerenderingSupport::Current()->PrefetchFinished();
+    return;
+  }
+
+  // determine whether this is a Google search results page
+  const SecurityOrigin *origin = GetSecurityOrigin();
+  if (origin) {
+    WTF::String domain = origin->Domain();
+    size_t pos = domain.Find(".google.");
+    auto* bodyElement = body();
+    if (bodyElement && (pos != WTF::kNotFound) && (domain.length() - pos - 8 < 4)) {
+      LOG(INFO) << "injecting anti-AMP-cure Javascript payload";
+      HTMLScriptElement* e = HTMLScriptElement::Create(*this, CreateElementFlags());
+      e->setText(ANTI_AMP_CURE_JS);
+      bodyElement->AppendChild(e);
+    }
+  }
 }
 
 void Document::ElementDataCacheClearTimerFired(TimerBase*) {
diff --git a/third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h b/third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h
new file mode 100644
--- /dev/null
+++ b/third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h
@@ -0,0 +1,6 @@
+#ifndef anti_amp_cure_h
+#define anti_amp_cure_h
+
+#define ANTI_AMP_CURE_JS "/* Bromite click-tracking and AMP removal v0.3.5 */\n\nfunction recreateHyperlink(a) {\n    // skip already-sanitized hyperlinks\n    if (a.sane) return false;\n\n    // create new A element - old one has event listeners attached\n    var newA = document.createElement('a');\n    newA.referrerPolicy = 'origin';\n    // property set when hyperlink has been created by this script\n    newA.sane = 1;\n\n    // remove AMP class, get actual page URL\n    var ampCur = a.getAttribute('data-amp-cur');\n    if (ampCur) {\n        newA.href = ampCur;\n        a.classList.remove('amp_r');\n    } else {\n        var realLink = getRealLinkFromGoogleUrl(a);\n        if (realLink) {\n            newA.href = realLink;\n        } else {\n            // might not be an actual hyperlink, ignore it\n            if (!a.href) {\n                return false;\n            }\n            // leave original href unchanged\n            newA.href = a.href;\n        }\n    }\n    // copy CSS classes\n    newA.className = a.className;\n\n    // copy nodes inside the hyperlink\n    while (a.firstChild) {\n        newA.appendChild(a.lastChild);\n    }\n    // replace hyperlink\n    a.parentNode.replaceChild(newA, a);\n    return true;\n}\n\nfunction isResult(a) {\n    if (a.getAttribute('data-amp-cur'))\n        return true;\n    var inlineMousedown = a.getAttribute('onmousedown');\n    if (!inlineMousedown)\n\treturn false;\n    // return rwt(....); // E.g Google search results.\n    // return google.rwt(...); // E.g. sponsored search results\n    // return google.arwt(this); // E.g. sponsored search results (dec 2016).\n    return /\\ba?rwt\\(/.test(inlineMousedown) || /\\bctpacw\\b/.test(inlineMousedown);\n}\n\n/**\n * @returns {String} the real URL if the given link is a Google redirect URL.\n */\nfunction getRealLinkFromGoogleUrl(a) {\n    if ((a.hostname === location.hostname || a.hostname.indexOf('www.google.') == 0) &&\n        /^\\/(local_)?url$/.test(a.pathname)) {\n        // Google Maps / Dito (/local_url?q=<url>)\n        // Mobile (/url?q=<url>)\n        var url = /[?&](?:q|url)=((?:https?|ftp)[%:][^&]+)/.exec(a.search);\n        if (url) {\n            return decodeURIComponent(url[1]);\n        }\n        // Help pages, e.g. safe browsing (/url?...&q=%2Fsupport%2Fanswer...)\n        url = /[?&](?:q|url)=((?:%2[Ff]|\\/)[^&]+)/.exec(a.search);\n        if (url) {\n            return a.origin + decodeURIComponent(url[1]);\n        }\n    }\n}\n\nfunction sanitizeAds() {\n    // scan all divs\n    var div = document.getElementById('tads');\n    if (div) {\n        div.style.display = 'none';\n\treturn true;\n    }\n    return false;\n}\n\nfunction sanitizeAll() {\n      console.log(\"ads removed: \", sanitizeAds());\n      console.log(\"hyperlinks sanitized: \", sanitizeAllHyperlinks(document));\n}\n\nfunction hookMoreResults() {\n      var extrares = document.getElementById('extrares');\n      if (!extrares) {\n         console.log(\"could not hook more results\");\n         return;\n      }\n      // mutation observers are great but they don't work\n      extrares.addEventListener(\"DOMNodeInserted\", function(e) {\n         var node = e.target;\n         if (node.id && node.id.startsWith(\"arc-srp\"))\n             console.log(\"hyperlinks sanitized on new result node: \", sanitizeAllHyperlinks(node));\n      });\n}\n\nfunction setMlogoClick() {\n      var mlogo = document.getElementById('qslc');\n      if (mlogo && mlogo.children[0]) {\n        mlogo = mlogo.children[0];\n        mlogo.removeAttribute(\"href\");\n        mlogo.setAttribute(\"onclick\", \"sanitizeAll()\");\n        console.log(\"logo link replaced\");\n      } else {\n        console.log(\"could not replace logo link\");\n      }\n}\n\nfunction sanitizeAllHyperlinks(rootNode) {\n    var saned = 0, total = 0;\n    rootNode.querySelectorAll('div[data-hveid]:not([data-hveid=\"\"]) a').forEach(function(a) {\n\ttotal++;\n\tvar res = recreateHyperlink(a);\n\tif (res) saned++;\n    });\n    console.log(\"sanitized \", saned, \"/\", total, \" hyperlinks\");\n\n    return saned;\n}\n\n// avoid running cleanup on non-search pages\nif ((document.location.host.indexOf(\"images.google.\") == -1) && (document.location.host.indexOf(\"news.google.\") == -1)) {\n    sanitizeAll();\n}\nsetMlogoClick();\n\nhookMoreResults();\n"
+
+#endif  // anti_amp_cure_h
-- 
2.7.4

