Полезная информация

Юристы зарабатывают огромные деньги и славу, оперируя хорошим знанием законов. Правила форума — простой путь к успешному общению.

№112-10-2011 19:22:23

VitaR
Участник
 
Группа: Members
Зарегистрирован: 05-03-2005
Сообщений: 277
UA: Aurora 9.0

Уважаемые гуру, исправьте, пожалуйста, старый скрипт

Есть такое мегаполезное расширение КешФиксер. В нём по сути один-единственный .js-файл /components/cachefixer.js

скрытый текст

Выделить код

Код:

const nsIFile                           = Components.interfaces.nsIFile;
const nsILocalFile                      = Components.interfaces.nsILocalFile;

const CACHE_FIXER_CONSOLE_SERVICE       = Components.classes["@mozilla.org/consoleservice;1"]
                                                    .getService(Components.interfaces.nsIConsoleService);

const CACHE_FIXER_PREFSERVICE_BRANCH    = Components.classes["@mozilla.org/preferences-service;1"]
                                                    .getService(Components.interfaces.nsIPrefService)
                                                    .getBranch("browser.cache.disk.");

const CACHE_FIXER_OBSERVER_SERVICE      = Components.classes["@mozilla.org/observer-service;1"]
                                                    .getService(Components.interfaces.nsIObserverService);

const CACHE_FIXER_DIR_LOCATOR           = Components.classes["@mozilla.org/file/directory_service;1"]
                                                    .getService(Components.interfaces.nsIProperties);


function nsCacheFixer() {
    CACHE_FIXER_OBSERVER_SERVICE.addObserver(this,"profile-after-change",false);
    this.debug = true;
}

nsCacheFixer.prototype = {

    _dump: function(msg) {
        if (!this.debug) return;
        
        msg = "[fixer]: " + msg + "\n";
        CACHE_FIXER_CONSOLE_SERVICE.logStringMessage(msg);
        dump(msg);
    },
    
    //~ nsIObserver interface
    observe: function(aSubject, aTopic, aData) {
        if (aTopic == "profile-after-change") {
            try {
                this.debug = CACHE_FIXER_PREFSERVICE_BRANCH.getBoolPref("cache_fixer_debug");
            } catch(e) {}
            
            var cacheDir, cacheMapFile;
            
            try { //~ prefs
                cacheDir = CACHE_FIXER_PREFSERVICE_BRANCH.getCharPref("parent_directory");
                this._dump("Cache dir: " + cacheDir);
            } catch(e) {
                try { //~ FF1.1
                    cacheDir = CACHE_FIXER_DIR_LOCATOR.get("ProfLD", nsIFile).path;
                    this._dump("Cache dir: " + cacheDir);
                } catch(e) {
                    try { //~ FF1.0-
                        cacheDir = CACHE_FIXER_DIR_LOCATOR.get("ProfD", nsIFile).path;
                        this._dump("Cache dir: " + cacheDir);
                    } catch(e) {
                        return this._dump("Error... Can't find cache dir...")
                    }
                }
            }
            
            if (cacheDir) {
                cacheMapFile = Components.classes["@mozilla.org/file/local;1"].createInstance(nsILocalFile);
                cacheMapFile.initWithPath(cacheDir);
                cacheMapFile.append("Cache");
                cacheMapFile.append("_CACHE_MAP_");
            }
            
            if (!cacheMapFile || !cacheMapFile.exists())
                return this._dump("Error... Can't found _CACHE_MAP_ file...");
            
            var ios = Components.classes["@mozilla.org/network/io-service;1"]
                                .getService(Components.interfaces.nsIIOService);
            
            var URL = ios.getProtocolHandler("file")
                                 .QueryInterface(Components.interfaces.nsIFileProtocolHandler)
                                 .getURLSpecFromFile(cacheMapFile);
            var channel = ios.newChannelFromURI( ios.newURI(URL,"utf8",null) );
            
            var binaryIS = Components.classes["@mozilla.org/binaryinputstream;1"]
                                     .createInstance(Components.interfaces.nsIBinaryInputStream);
            binaryIS.setInputStream(channel.open());
            
            var result = binaryIS.readByteArray(binaryIS.available());
            
            //~ leaks?!
            binaryIS.close();
            channel = null;
            
            if (result[15] == 1) {
                this._dump("FF was crashed, found 0F-byte == 1...");
                
                result[15] = 0; //~ Hi!
                
                var fs = Components.classes["@mozilla.org/network/file-output-stream;1"]
                                   .getService(Components.interfaces.nsIFileOutputStream);
                fs.init(cacheMapFile, 0x02 | 0x08 | 0x20, 0644, 0);
                
                var binaryOS = Components.classes["@mozilla.org/binaryoutputstream;1"]
                                          .createInstance(Components.interfaces.nsIBinaryOutputStream);
                binaryOS.setOutputStream(fs);
                binaryOS.writeByteArray(result, result.length);
                
                binaryOS.flush();
                fs.close();
                binaryOS.close();
                
                fs = null;
                binaryOS = null;
                result = null;
                
                this._dump("_CACHE_MAP_ was patched... That's it!");
            } else {
                this._dump("_CACHE_MAP_ ok, no patch needed...");
            }
        }
    },
    
    QueryInterface: function(iid) {
        if (!iid.equals(Components.interfaces.nsISupports) &&
            !iid.equals(Components.interfaces.nsISupportsWeakReference) &&
            !iid.equals(Components.interfaces.nsIObserver))
        {
            dump("nsCacheFixer: QI unknown interface: " + iid + "\n");
            throw Components.results.NS_ERROR_NO_INTERFACE;
        }
        return this;
    },

    //~ This Component's module implementation.
    module: {
        
        // registerSelf: Register this component.
        registerSelf: function (compMgr, fileSpec, location, type) {
            var compReg = compMgr.QueryInterface( Components.interfaces.nsIComponentRegistrar );
            compReg.registerFactoryLocation( this.cid,
                                             "nsCacheFixer JS component",
                                             this.contractId,
                                             fileSpec, location, type );
            
            var catman = Components.classes["@mozilla.org/categorymanager;1"]
                                   .getService(Components.interfaces.nsICategoryManager);
            catman.addCategoryEntry("app-startup", "nsCacheFixer", this.contractId, true, true);
        },
        
        unregisterSelf: function(compMgr, fileSpec, location) {
            compMgr = compMgr.QueryInterface( Components.interfaces.nsIComponentRegistrar );
            compMgr.unregisterFactoryLocation( this.cid, fileSpec );
            var catman = Components.classes["@mozilla.org/categorymanager;1"]
                                   .getService(Components.interfaces.nsICategoryManager);
            catman.deleteCategoryEntry("app-startup", this.contractId, true);
        },
        
        // getClassObject: Return this component's factory object.
        getClassObject: function (compMgr, cid, iid) {
            if (!cid.equals(this.cid))
                throw Components.results.NS_ERROR_NO_INTERFACE;
            
            if (!iid.equals(Components.interfaces.nsIFactory))
                throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
            
            return this.factory;
        },
        
        /* CID for this class */
        //~ extensions.roachfiend.com/cgi-bin/guid.pl
        cid: Components.ID("{ddbfe606-9b5a-4780-af06-38fc3705a3b8}"),
        
        /* Contract ID for this class */
        contractId: "@mozilla.org/cachefixer;1",
        
        /* factory object */
        factory: {
            // createInstance: Return a new nsCacheFixer object.
            createInstance: function (outer, iid) {
                if (outer != null)
                    throw Components.results.NS_ERROR_NO_AGGREGATION;
                
                return (new nsCacheFixer()).QueryInterface(iid);
            }
        },
        
        // canUnload: n/a (returns true)
        canUnload: function(compMgr) {
            return true;
        }
    }
}

// NSGetModule: Return the nsIModule object.
function NSGetModule(compMgr, fileSpec) {
    return nsCacheFixer.prototype.module;
}


Расширение старое, но с отключенной проверкой ставится. Если его развернуть в папку и перезапустить Лиса, то тоже вроде бы подключается. Во всяком случае, если в СкретчПаде ввести объявление констант и запустить, консоль ругается на попытку переопределения константы -- т.е. вроде как константы уже созданы, т.е. как я понимаю расширение инициализировано.

Но основной функционал не работает, и даже лог в консоль вообще не пишется. Всё сломалось не то на 8, не то на последних 7.

На этом мои знания кончаются. Попытался было тупо сверять вызовы методов с описаниями на Мозилле -- вдруг что поменялось -- но сломал голову.

Выручайте!

Отсутствует

 

№213-10-2011 00:38:12

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 7.0

Re: Уважаемые гуру, исправьте, пожалуйста, старый скрипт

К сведению:
http://sessionmanager.mozdev.org/history.html#0.7.6

Removed Cache Fixer since it tends to corrupt the cache file data which can cause Firefox to crash. See Firefox bug 529733, specifically comment 37.

Но если очень хочется, то, по идее, нужно реализовать функцию NSGetFactory() и добавить запись в chrome.manifest.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№313-10-2011 01:58:55

MySh
Кактусогрыз
 
Группа: Extensions
Зарегистрирован: 17-12-2006
Сообщений: 4623
UA: Firefox 7.0

Re: Уважаемые гуру, исправьте, пожалуйста, старый скрипт

Infocatcher
Так этот баг же вроде исправлен?

Отсутствует

 

№413-10-2011 13:01:00

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 7.0

Re: Уважаемые гуру, исправьте, пожалуйста, старый скрипт

MySh
Я не в курсе подробностей, но функционал в Session Manager так и не вернули.

Добавлено 13-10-2011 13:20:51
Тем не менее, у меня сохранение кэша работает:
Session Manager 0.7.5
Mozilla/5.0 (Windows NT 6.1; rv:10.0a1) Gecko/20111012 Firefox/10.0a1

Отредактировано Infocatcher (13-10-2011 13:20:51)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№513-10-2011 18:41:19

VitaR
Участник
 
Группа: Members
Зарегистрирован: 05-03-2005
Сообщений: 277
UA: Aurora 9.0

Re: Уважаемые гуру, исправьте, пожалуйста, старый скрипт

Infocatcher, поделись плз своим "Session Manager 0.7.5"

Отсутствует

 

№613-10-2011 22:08:32

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 7.0

Re: Уважаемые гуру, исправьте, пожалуйста, старый скрипт


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]