Como personalizar a resolução de tela relatada para um aplicativo JavaScript por um navegador da web?

3
Os valores de window.screen.availHeight e window.screen.availWidth permitem que os aplicativos da web conheçam minha resolução de tela real, embora eu nem sempre que eles saibam. Posso definir meus próprios valores para essas propriedades? Estou interessado em soluções para o Firefox e o Chrome.

    
por Ivan 04.02.2014 / 22:51

1 resposta

2

Pergunta interessante. É possível, em teoria, sobrescrever as propriedades window.screen.availHeight e window.screen.availWidth usando a função Object.defineProperty .

Experimente o seguinte arquivo:

test.html :

<html>
  <head>
    <script>
      window.alert("Window resolution before overwrite is " + window.screen.availWidth + " x " + window.screen.availHeight);
      Object.defineProperty(window.screen, "availWidth", { get: function(){return 0; }});
      Object.defineProperty(window.screen, "availHeight", { get: function(){return 0; }});
    </script>
  </head>
  <body>
    <script>
      window.alert("Window resolution after overwrite is " + window.screen.availWidth + " x " + window.screen.availHeight);
    </script>
  </body>
</html>

No entanto, para responder à sua pergunta sobre uma maneira genérica de fazer isso acontecer em todos os sites, só posso fornecer uma resposta parcial.

Usando UserScripts (através do Greasemonkey) no Firefox, o seguinte script tem o efeito desejado (para usar, instale o complemento Greasemonkey, reinicie o Firefox e arraste o script para a janela do Firefox).

Hide_screen_resolution.user.js :

// ==UserScript==
// @name          Hide screen resolution
// @description   This script hides access to the screen resolution through window.screen.availHeight and window.screen.availWidth values.
// @include       *
// @run-at document-start
// ==/UserScript==

Object.defineProperty(window.screen, "availWidth", { get: function(){return 0; }});
Object.defineProperty(window.screen, "availHeight", { get: function(){return 0; }});

Agora, se o test.html for aberto novamente, será possível ver que a resolução da tela antes da sobregravação já foi redefinida, fornecendo os resultados desejados.

Infelizmente, o Chrome não suporta a execução de código como este antes do documento ser carregado, por isso este UserScript não funciona aí. Eu publiquei esta resposta na esperança de que alguém possa sugerir uma possível solução no Chrome.

    
por 05.02.2014 / 04:04