用户脚本在尝试从页面访问全局变量时无声地失败

时间:2015-09-19 15:01:22

标签: javascript angularjs firefox greasemonkey

我多年来一直在阅读Stack Overflow上的问题和答案(这个地方实际上教我编写代码)但这是我第一次提出问题,所以如果我做错了什么或者你需要,请告诉我更多信息。

我还会说我在JavaScript方面并不是特别擅长,只是在我自己的时候教会自己需要什么,所以我的知识可能很大。

基本上我正在研究一个用户脚本,它是三个先前脚本合二为一的(带有一些额外的和更改)。 它在Chrome上的TamperMonkey中运行得非常好,但在Firefox上的GreaseMonkey中无效,尽管三个独立的脚本都运行正常。

以下是the combined script on github/gist

的链接

当我尝试访问AngularJS变量以查找范围等时出现问题。 起初Firefox给我一个错误,说它未定义,但将函数包装在setTimeout中解决了这个问题。现在它只是失败而没有给我任何错误。

正如所建议的那样,我尝试用较小的代码示例重新创建问题,这似乎(不)起作用:

// ==UserScript==
// @name         test
// @namespace    https://gist.github.com/adaliabooks/
// @version      1.0
// @description  A package of fixes, new features and changes to improve GoG.com. I fix GoG, so you don't have to!
// @author       adaliabooks
// @updateURL    https://gist.github.com/adaliabooks/bf3cbdbb56db6c107dd8/raw/
// @downloadURL  https://gist.github.com/adaliabooks/bf3cbdbb56db6c107dd8/raw/
// @include      http://www.gog.com/*
// @include      https://www.gog.com/*
// @require      https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js
// @require      https://raw.githubusercontent.com/bartaz/sandbox.js/master/jquery.highlight.js
// @require      https://meetselva.github.io/attrchange/javascripts/attrchange.js
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_deleteValue
// ==/UserScript==


function swapManualForDownloaderLinks()
{
    console.log("Swap Links");
    var accountProductsScope = angular.element(document.querySelectorAll('.game-details__title')).scope();
   console.log("angular accessed successfully");
    var main = accountProductsScope.details.main;
        if(main.currentDownloads[0].manualUrl.indexOf("gogdownloader") <= -1)
        {
            console.log("Links swapped");
            for (var i = 0; i < main.currentDownloads.length; i++)
            {
                var oldLink = main.currentDownloads[i].manualUrl;
                main.currentDownloads[i].manualUrl = main.currentDownloads[i].downloaderUrl;
                main.currentDownloads[i].downloaderUrl = oldLink;
            }
            for (var i = 0; i < main.extras.length; i++)
            {
                var oldLink = main.extras[i].manualUrl;
                main.extras[i].manualUrl = main.extras[i].downloaderUrl;
                main.extras[i].downloaderUrl = oldLink;
            }
            accountProductsScope.$apply();
            $('.game-link').each(function(index){
                $(this).attr('href', $(this).attr('ng-href'));
            });
        }
}

function changeDownloadLinks()
{
  console.log("Change Download Links called");
  var downloadRows = $(".game-details__column--left");
  $('.game-details__header').parent().attrchange(
  {
    trackValues: true,
    callback: function(event)
    {
      if (event.attributeName == "class")
      {
        if (!(event.newValue === "ng-hide"))
        {
          console.log("Game Details Loaded");
          swapManualForDownloaderLinks();
        }
      }
    }
  });
}

changeDownloadLinks();

我认为这个问题与GreaseMonkey以及它如何对脚本进行沙盒化有关,但我不确定它是什么或者它是否可以修复......

我设法通过设置我自己的全局变量angular并将其设置为unsafeWindow.angular来解决这个问题,但是我需要访问的页面(gogData)中还有另一个全局变量即使以windowunsafeWindow作为前缀,也无法正常工作。

真正令人费解的是,它可以在Chrome中运行,而the original script这段代码来自Firefox,可以很好地访问这些变量。如果我从控制台调用违规行,它也可以工作。

那么任何想法?我做错了什么?

尝试上面的示例并将@grant设置为无效,所以它肯定与GreaseMonkey的安全设置有关......但是有解决方案还是可以解决?

0 个答案:

没有答案