home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / AIMP2 / aimp_2.61.583.exe / $TEMP / YandexPackSetup.msi / fil1544516F3E7103D81BEC5F69D1FE9BD6 < prev    next >
Text File  |  2010-07-12  |  11KB  |  375 lines

  1. function YaCanvasQueue(aGrabber) {
  2.   this._grabber = aGrabber;
  3.   this._elements = [];
  4.   this._activeElementsMaxLength = 5;
  5. }
  6.  
  7. YaCanvasQueue.prototype = {
  8.   destroy: function() {
  9.     this.clear();
  10.     this._grabber = null;
  11.   },
  12.   
  13.   get size() {
  14.     return this._elements.length;
  15.   },
  16.   
  17.   get isEmpty() {
  18.     return !this.size;
  19.   },
  20.   
  21.   isURLInQueue: function(aURL) {
  22.     return this._elements.some(function(elm) { return aURL === elm.url; });
  23.   },
  24.   
  25.   clear: function() {
  26.     this._elements = [];
  27.   },
  28.   
  29.   push: function(aURL) {
  30.     if (this.isURLInQueue(aURL))
  31.       return false;
  32.     
  33.     this._elements.push({url: aURL, active: false});
  34.     
  35.     this.checkNeedProccess();
  36.     
  37.     return true;
  38.   },
  39.   
  40.   remove: function(aURL) {
  41.     this._elements = this._elements.filter(function(el) { return el.url !== aURL; });
  42.     this.checkNeedProccess();
  43.   },
  44.   
  45.   get nextElement() {
  46.     return this._elements.filter(function(el) { return el.active === false; })[0];
  47.   },
  48.   
  49.   get activeElementsLength() {
  50.     return this._elements.filter(function(el) { return el.active === true; }).length;
  51.   },
  52.   
  53.   checkNeedProccess: function() {
  54.     if (this.isEmpty || !this._grabber.isGrabberFrameReady)
  55.       return false;
  56.     
  57.     let element;
  58.     while (this.activeElementsLength < this._activeElementsMaxLength &&
  59.           (element = this.nextElement)) {
  60.       element.active = true;
  61.       this._grabber._getCanvasForURL(element.url);
  62.     }
  63.     
  64.     return true;
  65.   },
  66.   
  67.   _getCanvasCallback: function(aPageData) {
  68.     this.remove(aPageData.url);
  69.   }
  70. }
  71.  
  72. function SShotProgressListener(aSShotGrabber) {
  73.   this.SShotGrabber = aSShotGrabber;
  74. }
  75.  
  76. SShotProgressListener.prototype = {
  77.   _getRequestStatus: function(aFrame) {
  78.     let webNavigation = aFrame.webNavigation;
  79.     
  80.     let httpStatus = 404;
  81.     let channel = (webNavigation && 'currentDocumentChannel' in webNavigation) ?
  82.                       webNavigation.currentDocumentChannel :
  83.                       null;
  84.     
  85.     if (channel) {
  86.       try {
  87.         channel = channel.QueryInterface(Ci.nsIHttpChannel);
  88.         httpStatus = channel.responseStatus;
  89.       } catch(e) {
  90.         if (channel.URI && channel.contentType == "application/xhtml+xml" && channel.URI.scheme == "file") {
  91.           httpStatus = 200;
  92.         }
  93.       }
  94.     }
  95.     
  96.     return httpStatus;
  97.   },
  98.   
  99.   onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
  100.     const Ci = Components.interfaces,
  101.           Cr = Components.results;
  102.     
  103.     if ((aStateFlags & Ci.nsIWebProgressListener.STATE_IS_WINDOW) &&
  104.         (aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK) &&
  105.         (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP)) {
  106.       
  107.       aWebProgress.QueryInterface(Ci.nsIWebNavigation);
  108.       if (!aWebProgress.document)
  109.         return;
  110.       
  111.       let targetFrame = this.SShotGrabber._getFrameForDocument(aWebProgress.document);
  112.       if (!targetFrame)
  113.         return;
  114.       
  115.       let httpStatus = this._getRequestStatus(targetFrame);
  116.       
  117.       this.SShotGrabber._onPageLoadTimed(targetFrame, httpStatus);
  118.     }
  119.   },
  120.   
  121.   onProgressChange : function() { return 0; },
  122.   onLocationChange : function() { return 0; },
  123.   onStatusChange   : function() { return 0; },
  124.   onSecurityChange : function() { return 0; },
  125.   
  126.   QueryInterface: function(aIID) {
  127.     const Ci = Components.interfaces;
  128.     if (aIID.equals(Ci.nsIWebProgressListener) ||
  129.         aIID.equals(Ci.nsISupportsWeakReference) ||
  130.         aIID.equals(Ci.nsISupports))
  131.       return this;
  132.     
  133.     throw Components.results.NS_NOINTERFACE;
  134.   }
  135. };
  136.  
  137.  
  138. function YaSShotGrabber(aListener, aSizeProps) {
  139.   if (!(aListener && 'onSShotCreated' in aListener))
  140.     throw new Error("YaSShotGrabber need onSShotCreated for listener");
  141.   
  142.   this._listener = aListener;
  143.   
  144.   this._progressListener = new SShotProgressListener(this);
  145.   
  146.   this._canvasQueue = new YaCanvasQueue(this);
  147.   this.__frameLoader = null;
  148.   this.__frameLoaderId = "yaSShotGrabberFrame-" + Date.now();
  149.   
  150.   this.SIZE = {
  151.     SCREEN: { WIDTH: 1024, HEIGHT: 768 },
  152.     CANVAS: { WIDTH:  600, HEIGHT: 450 }
  153.   }
  154. }
  155.  
  156. YaSShotGrabber.prototype = {
  157.   CANVAS_CAPTURE_TIMEOUT: 1500,
  158.   
  159.   isURLInQueue: function(aURL) {
  160.     return this._canvasQueue.isURLInQueue(aURL);
  161.   },
  162.   
  163.   getCanvasForURL: function(aURL) {
  164.     return this._canvasQueue.push(aURL);
  165.   },
  166.   
  167.   _setFrameEventListeners: function(aFrame, aSet) {
  168.     let fn = (aSet ? "add" : "remove") + "ProgressListener";
  169.     
  170.     try {
  171.       let webProgress = aFrame.docShell
  172.                               .QueryInterface(Ci.nsIInterfaceRequestor)
  173.                               .getInterface(Ci.nsIWebProgress);
  174.       webProgress[fn](this._progressListener, Ci.nsIWebProgress.NOTIFY_STATE_NETWORK);
  175.     } catch(e) {}
  176.   },
  177.   
  178.   _getCanvasForURL: function(aURL) {
  179.     let doc = this._frameLoader.contentDocument;
  180.     let iframe = doc.createElement("iframe");
  181.     
  182.     iframe.setAttribute("type", "content");
  183.     iframe.setAttribute("yaSSURL", aURL);
  184.     
  185.     iframe.setAttribute("style",
  186.         "width: {W}px !important; height: {H}px !important; \
  187.          max-width: {W}px !important; max-height: {H}px !important; \
  188.          min-width: {W}px !important; min-height: {H}px !important; \
  189.          overflow: hidden !important;"
  190.         .replace(/\{W\}/g, this.SIZE.SCREEN.WIDTH)
  191.         .replace(/\{H\}/g, this.SIZE.SCREEN.HEIGHT));
  192.     
  193.     doc.lastChild.appendChild(iframe);
  194.     
  195.     var webNav = iframe.docShell.QueryInterface(Ci.nsIWebNavigation);
  196.     webNav.stop(Ci.nsIWebNavigation.STOP_NETWORK);
  197.     
  198.     this._setFrameEventListeners(iframe, true);
  199.     
  200.     try {
  201.       iframe.webNavigation.loadURI(aURL, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null);
  202.     } catch(e) {
  203.       this._onPageLoadTimed(iframe, 404);
  204.     }
  205.   },
  206.   
  207.   _onFinishForURL: function(aPageData) {
  208.     this._canvasQueue._getCanvasCallback(aPageData);
  209.     this._listener.onSShotCreated(aPageData);
  210.   },
  211.   
  212.   get _hiddenWindow() {
  213.     let hiddenWindow = Cc["@mozilla.org/appshell/appShellService;1"]
  214.                            .getService(Ci.nsIAppShellService).hiddenDOMWindow;
  215.     
  216.     if (!hiddenWindow)
  217.       return null;
  218.     
  219.     delete this._hiddenWindow;
  220.     this.__defineGetter__("_hiddenWindow", function(){ return hiddenWindow; })
  221.     return this._hiddenWindow;
  222.   },
  223.   
  224.   destroy: function() {
  225.     this._canvasQueue.destroy();
  226.     this._canvasQueue = null;
  227.     
  228.     this._framesArray
  229.         .forEach(function(aFrame) {
  230.           this._setFrameEventListeners(aFrame, false);
  231.           aFrame.parentNode.removeChild(aFrame);
  232.         }, this);
  233.     
  234.     if (this.__frameLoader) {
  235.       try {
  236.         this.__frameLoader.removeEventListener("pageshow", this, false);
  237.         this.__frameLoader.parentNode.removeChild(this.__frameLoader);
  238.       } catch(e) {}
  239.     }
  240.     
  241.     this._progressListener = null;
  242.     
  243.     this._listener = null;
  244.     this.__frameLoader = null;
  245.   },
  246.   
  247.   get isGrabberFrameReady() {
  248.     return !!this._frameLoader;
  249.   },
  250.   
  251.   get _frameLoader() {
  252.     let hiddenWindow = this._hiddenWindow;
  253.     
  254.     if (hiddenWindow && !this.__frameLoader) {
  255.       this.__frameLoader = hiddenWindow.document.createElement("iframe");
  256.       this.__frameLoader.addEventListener("pageshow", this, false);
  257.       this.__frameLoader.setAttribute("id", this.__frameLoaderId);
  258.       this.__frameLoader.setAttribute("src", "chrome://yasearch/content/hiddenwindow.xul");
  259.       
  260.       hiddenWindow.document.documentElement.appendChild(this.__frameLoader);
  261.     }
  262.     
  263.     return null;
  264.   },
  265.   
  266.   get _framesArray() {
  267.     return this.__frameLoader ?
  268.                Array.slice(this.__frameLoader.contentDocument.getElementsByTagName("iframe")) :
  269.                [];
  270.   },
  271.   
  272.   _getFrameForDocument: function(aTarget) {
  273.     return this._framesArray
  274.                .filter(function(aFrame) { return aFrame.contentDocument === aTarget; })[0];
  275.   },
  276.   
  277.   _isRequestSuccess: function(aHttpStatus) {
  278.     return !!((aHttpStatus >= 200 && aHttpStatus <= 299) || aHttpStatus === 304);
  279.   },
  280.   
  281.   handleEvent: function(aEvent) {
  282.     if (!aEvent.isTrusted)
  283.       return;
  284.     
  285.     switch (aEvent.type) {
  286.       case "pageshow":
  287.         if (this.__frameLoader && aEvent.target == this.__frameLoader.contentDocument) {
  288.           this.__frameLoader.removeEventListener("pageshow", this, false);
  289.  
  290.           delete this._frameLoader;
  291.           let frameLoader = this.__frameLoader;
  292.           this.__defineGetter__("_frameLoader", function(){ return frameLoader; })
  293.  
  294.           this._canvasQueue.checkNeedProccess();
  295.         }
  296.         break;
  297.       
  298.       default:
  299.         break;
  300.     }
  301.   },
  302.   
  303.   _onPageLoadTimed: function(aTargetFrame, aHttpStatus) {
  304.     this._setFrameEventListeners(aTargetFrame, false);
  305.     
  306.     var me = this;
  307.     new G_Timer(function(){me._onPageLoad(aTargetFrame, aHttpStatus)}, this.CANVAS_CAPTURE_TIMEOUT);
  308.   },
  309.   
  310.   _onPageLoad: function(aTargetFrame, aHttpStatus) {
  311.     let result = {
  312.       url: aTargetFrame.getAttribute("yaSSURL"),
  313.       httpStatus: aHttpStatus,
  314.       checkTime: Date.now()
  315.     };
  316.     
  317.     if (this._isRequestSuccess(aHttpStatus)) {
  318.       let doc = aTargetFrame.contentDocument;
  319.       let safeUnicode = gYaSearchService.safeUnicode;
  320.       
  321.       result.title = safeUnicode(doc.title.toString());
  322.       result.urlReal = safeUnicode(doc.location.toString());
  323.       result.faviconUrl = safeUnicode(this._getDocumentFaviconURL(doc));
  324.       result.img = this._getFrameCanvasData(aTargetFrame);
  325.     }
  326.     
  327.     aTargetFrame.parentNode.removeChild(aTargetFrame);
  328.     
  329.     this._onFinishForURL(result);
  330.   },
  331.   
  332.   _getFrameCanvasData: function(aFrame) {
  333.     let canvas = this._frameLoader.contentDocument.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
  334.     
  335.     canvas.width = this.SIZE.CANVAS.WIDTH;
  336.     canvas.height = this.SIZE.CANVAS.HEIGHT;
  337.     
  338.     let ctx = canvas.getContext("2d");
  339.     
  340.     ctx.scale(this.SIZE.CANVAS.WIDTH / this.SIZE.SCREEN.WIDTH,
  341.               this.SIZE.CANVAS.HEIGHT / this.SIZE.SCREEN.HEIGHT);
  342.     
  343.     let win = aFrame.contentWindow;
  344.     ctx.drawWindow(win,
  345.                    win.pageXOffset,
  346.                    win.pageYOffset,
  347.                    win.pageXOffset + this.SIZE.SCREEN.WIDTH,
  348.                    win.pageYOffset + this.SIZE.SCREEN.HEIGHT,
  349.                    "rgb(255,255,255)");
  350.     
  351.     return canvas.toDataURL("image/png", "");
  352.   },
  353.   
  354.   _createFaviconURL: function(aURL) {
  355.     let url,
  356.         uri = gYaSearchService.makeURI(aURL);
  357.     
  358.     if (uri && /^https?$/.test(uri.scheme))
  359.       url = uri.prePath + "/favicon.ico";
  360.     
  361.     return url;
  362.   },
  363.   
  364.   _getDocumentFaviconURL: function(aDocument) {
  365.     let url = Array.slice(aDocument.getElementsByTagName("link"))
  366.                    .filter(function(aLinkElement) {
  367.                      return !!(/icon/.test(aLinkElement.rel) && /^https?:\/\//.test(aLinkElement.href));
  368.                    })[0];
  369.     
  370.     if (url)
  371.       url = url.href;
  372.     
  373.     return (url || this._createFaviconURL(aDocument.location) || "");
  374.   }
  375. }