;(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

YouTube é processado por coleta ilegal de dados de crianças e adolescentes

Foto: Oficina da Net
Imagem: Foto: Oficina da Net

Bruno Romani

São Paulo

03/12/2019 08h08

O Departamento de Proteção e Defesa do Consumidor (DPDC), da Secretaria Nacional do Consumidor (Senacon), instaurou na última semana um processo istrativo contra o Google por suposta coleta de dados de crianças e adolescentes no YouTube.

Segundo o órgão, há indícios de que os dados para fins publicitários foram coletados sem o consentimento dos pais - as informações seriam usadas para direcionar propagandas. Entre as informações estariam dados de geolocalização, número de telefone e modelo do aparelho. Se considerado culpado, o Google pode receber uma multa de até R$ 9,9 milhões. A Senacon começou a investigar o caso em setembro.

Em nota, o Google diz que esta alterando a maneira como coleta e usa dados em conteúdo infantil no YouTube. "A partir de janeiro, trataremos os dados de todos que am conteúdo infantil como se fossem de uma criança, independentemente da idade do usuário. Limitaremos coleta e utilização dos dados em conteúdo infantil apenas para permitir o funcionamento do produto, também não mais serviremos anúncios de forma segmentada. A identificação do conteúdo infantil será feita por meio de uma combinação de informação dos criadores e aprendizagem de máquina", diz o documento.

A empresa lembrou também dos termos de uso da plataforma: "Os usuários brasileiros concordam com os Termos de Serviço do YouTube no Brasil ao utilizarem a plataforma. Esses Termos de Serviço advertem que o YouTube é uma plataforma projetada para uso adulto. O uso do YouTube por crianças e adolescentes tem por pressuposto que estejam autorizados e supervisionados por seus pais ou responsáveis legais", explica a companhia.

O Google diz que encoraja os pais a utilizarem o YouTube Kids para os seus filhos. O serviço permite às crianças explorarem conteúdo compatível com a idade. Nesse ambiente, a coleta de dados seria menos invasiva do que na versão para adultos.

Em setembro, o Google tomou uma multa de US$ 170 milhões da Comissão Federal de Comércio dos EUA (FTC, na sigla em inglês) por violação da privacidade de crianças usuárias também no YouTube.

Em agosto, a Senacon notificou o Google pela suspeita de outras violações de privacidade. A secretaria investigava uma "possível captura indevida de dados de usuários sobre geolocalização".

As informações são do jornal O Estado de S. Paulo.