;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Este plugin mostra como 4 empresas dominam a internet sem que você perceba

Getty Images
Imagem: Getty Images

Lucas Santana

Colaboração para Tilt

15/03/2021 04h00

Uma nova extensão para os navegadores Google Chrome e Mozilla Firefox promete mostrar como as gigantes da tecnologia dominam a internet e estão conectadas em grande parte de sites e serviços que amos online. Chamada de Big Tech Detective, ela mostra como Google, Amazon, Microsoft e Facebook estão presentes nos mais diversos serviços que amos online.

Criada pela organização estadunidense Economic Security Project, a extensão é parte de um projeto que pretende mostrar o poder das empresas de tecnologia representadas pelas grandes marcas do Vale do Silício. "O Big Tech Detective é uma extensão para navegadores que te ajuda a rastrear e evitar as gigantes da tecnologia enquanto navega pela web", diz o site do projeto.

O serviço detecta, por exemplo, se a página que você está visitando possui algum anúncio vinculado ao AdSense, serviço de publicidade do Google. Segundo seus criadores, ele também detecta se essas empresas estão coletando dados da sua navegação ou se o site está hospedado em servidores ligados às "big techs".

Na prática

No teste que fizemos em Tilt usando a extensão por uma hora, navegando em diferentes sites e plataformas, pelo menos sete endereços tinham alguma conexão com o Google —64% dos 11 sites visitados, de acordo com o plugin. O Facebook e a Amazon vêm em seguida, aparecendo em 45% dos endereços visitados.

Relatório de uso da extensão Big Tech Detective mostrando predominância do Google e do Facebook na navegação - Reprodução - Reprodução
Relatório de uso da extensão Big Tech Detective mostrando predominância do Google e do Facebook na navegação
Imagem: Reprodução

Durante este uso monitorado, que envolveu o o a alguns serviços do Google e do Facebook, como o Gmail e o WhatsApp, não visitamos nenhum serviço da Amazon, como seu site de compras ou o serviço de streaming Prime Video.

Ainda assim, a empresa de Jeff Bezos estava presente em quase metade dos links que clicamos. Isso tem relação com a AWS (Amazon Web Services), empresa do grupo que oferece serviços de hospedagem e armazenamento de dados em nuvem para diversos sites. A Microsoft oferece serviços semelhantes, mas não apareceu durante nosso uso.

No teste ficou evidente a presença das big techs em praticamente todos os endereços que tentávamos ar. Usando a opção de bloqueio, pelo menos 80% dos sites que tentamos ar foram barrados pela ferramenta. Isso inclui sites de notícias, serviços de streaming, blogs, entre outros.

As big techs aparecem até em sites de órgãos públicos e do governo federal, como o gov.br, na página inicial do Banco Central e na do Ministério da Economia, entre outros.

A própria criadora da extensão adverte que a intenção é mais educativa do que acusatória. "A ferramenta educa os usuários sobre como os dados trafegam entre as maiores empresas de tecnologia para mostrar que essas companhias são parte integral da experiência diária da internet, destacando a sutileza e o alcance das empresas sobre toda a vida digital", diz a página oficial da extensão.