2010-05-01 5 views
1

저장된 개체를 유지 관리하기 위해 Javascript 개체를 사용하는 Greasemonkey 스크립트가 있습니다. 상당히 많은 양의 정보를 다루지 만 문제가 발생하기 전에 성공적으로 저장하고 검색 한 것보다 훨씬 적습니다. 하나의 가치는 저축을 거부하며, 왜 저의 삶이 그 이유를 결정할 수는 없습니다. 다음과 같은 문제 코드 :Greasemonkey가 GM_setValue()에 실패했습니다.

  • 더 큰 다른 개체를 유지 관리합니다.
  • 현재 이전에 작업 한 것보다 적은 양의 데이터를 처리하고 있습니다.
  • 함수 또는 다른 개체 정의와 충돌하지 않습니다.
  • 코드 시작시 문제 저장소 키를 "{}"로 성공적으로 저장할 수 있습니다 (선택 사항).
this.save = function(table) { 
    var tables = this.tables; 
    if(table) 
     tables = [table]; 
    for(i in tables) { 
     logger.log(this[tables[i]]); 
     logger.log(JSON.stringify(this[tables[i]])); 
     GM_setValue(tables[i] + "_" + this.user, JSON.stringify(this[tables[i]])); 
     logger.log(tables[i] + "_" + this.user + " updated"); 
     logger.log(GM_getValue(tables[i] + "_" + this.user)); 
    } 
} 

문제는 지속적으로 재현 및 로깅 문에서도이 방화범 다음과 같은 출력을 생성 :

  1. 오브젝트 {54,10 = 개체} // 확장이 예상대로 전체 내용을 보여 주지만, Firebug는 익명의 객체 대신 검은 색 대신 객체 키를 자주색으로 강조 표시합니다.
  2. { "54,10": { "x": 54, "y": 10, "name": "Lucky Pheasant"}} // 제대로 문자열로 묶은 JSON. 나는 객체 키의 형식을 변경 시도

  • bookmarks_HonoredMule없이 효과로 정의되지 않은
  • 을 업데이트했습니다. 이 문제를 더욱 좁히려면이 특정 값이 코드 초기화 중에 빈 객체 ("{}")로 성공적으로 저장되지만 건너 뛰면이 또한 도움이되지 않습니다. 페이지를 다시로드하면 비어 있지 않은 개체의 저장이 실제로 실패했음을 확인할 수 있습니다.

    어떤 문제가 있습니까? 필자는 크기 제약 조건에 대해 철저히 조사했으나 문제가 될 수있는 것으로 보지 않습니다. 이전에 언급했듯이 이미 스토리지 사용량을 줄였습니다. 다른 큰 개체는 여전히 저장되며, 이미 많지 않은 개체의 총 수가 여기에 저장하려고하는 데이터의 양보다 더 많이 줄어 듭니다.

    답변

    2

    unsafeWindow 컨텍스트에서 this.save()가 호출된다는 것이 문제가되었습니다. 이 보안 위반이지만, 하나 그게가 발생되고있는 액세스 위반 예외시킬 수도 :

    Error: Greasemonkey access violation: unsafeWindow cannot call GM_getValue. 
    

    대신 GM_setValue 반환 아무것도하지 데, 그리고 이후의 로깅 명령도 실행 정도의 힌트가 없었다 문제 및 documentation이 유효하지 않을 수 있습니다.

    이 문제를 해결하기 위해 GM_ 저장소 기능을 추상화 했으므로 다른 저장소 메커니즘을 사용할 수 있으므로 해결 방법은 모든 저장 지침을 setInterval에서 실행되는 기존 정리 루틴에 저장하는 것입니다. 앞에서 설명한 문서에서 설명한 수정과 유사합니다. 기존 간격을 사용하면 브라우저 가동 시간에 비해 성능이 과거에 저하 된 타이머가 과도하게 생성되는 것을 방지 할 수 있습니다.