Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: lib/ui.js

Issue 29322679: Issue 1730 - Fixed abp:subscribe functionality with e10s (Closed)
Patch Set: Created July 20, 2015, 3:19 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2015 Eyeo GmbH 3 * Copyright (C) 2006-2015 Eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 452
453 Notification.showNext(subject.location.href); 453 Notification.showNext(subject.location.href);
454 }.bind(UI) 454 }.bind(UI)
455 }; 455 };
456 Services.obs.addObserver(documentCreationObserver, "content-document-global- created", false); 456 Services.obs.addObserver(documentCreationObserver, "content-document-global- created", false);
457 onShutdown.add(function() 457 onShutdown.add(function()
458 { 458 {
459 Services.obs.removeObserver(documentCreationObserver, "content-document-gl obal-created", false); 459 Services.obs.removeObserver(documentCreationObserver, "content-document-gl obal-created", false);
460 }); 460 });
461 461
462 // Frame script URL has to be randomized due to caching
463 // (see https://bugzilla.mozilla.org/show_bug.cgi?id=1051238)
464 let frameScript = "chrome://adblockplus/content/subscribeLinkHandler.js?" + Math.random();
465
466 // Initialize subscribe link handling
467 let callback = this.subscribeLinkClicked.bind(this);
468 let messageManager = Cc["@mozilla.org/globalmessagemanager;1"]
469 .getService(Ci.nsIMessageListenerManager);
470 messageManager.loadFrameScript(frameScript, true);
471 messageManager.addMessageListener("AdblockPlus:SubscribeLink", callback);
472 onShutdown.add(() => {
473 messageManager.broadcastAsyncMessage("AdblockPlus:Shutdown", frameScript);
474 messageManager.removeDelayedFrameScript(frameScript);
475 messageManager.removeMessageListener("AdblockPlus:SubscribeLink", callback );
476 });
477
462 // Execute first-run actions if a window is open already, otherwise it 478 // Execute first-run actions if a window is open already, otherwise it
463 // will happen in applyToWindow() when a window is opened. 479 // will happen in applyToWindow() when a window is opened.
464 this.firstRunActions(this.currentWindow); 480 this.firstRunActions(this.currentWindow);
465 }, 481 },
466 482
467 addToolbarButton: function() 483 addToolbarButton: function()
468 { 484 {
469 let {WindowObserver} = require("windowObserver"); 485 let {WindowObserver} = require("windowObserver");
470 new WindowObserver(this); 486 new WindowObserver(this);
471 487
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 * has been performed. 551 * has been performed.
536 * @type Boolean 552 * @type Boolean
537 */ 553 */
538 firstRunDone: false, 554 firstRunDone: false,
539 555
540 /** 556 /**
541 * Initializes Adblock Plus UI in a window. 557 * Initializes Adblock Plus UI in a window.
542 */ 558 */
543 applyToWindow: function(/**Window*/ window, /**Boolean*/ noDelay) 559 applyToWindow: function(/**Window*/ window, /**Boolean*/ noDelay)
544 { 560 {
545 let {delayInitialization, isKnownWindow, getBrowser, addBrowserLocationListe ner, addBrowserClickListener} = require("appSupport"); 561 let {delayInitialization, isKnownWindow, getBrowser, addBrowserLocationListe ner} = require("appSupport");
546 if (window.document.documentElement.id == "CustomizeToolbarWindow" || isKnow nWindow(window)) 562 if (window.document.documentElement.id == "CustomizeToolbarWindow" || isKnow nWindow(window))
547 { 563 {
548 // Add style processing instruction 564 // Add style processing instruction
549 let style = window.document.createProcessingInstruction("xml-stylesheet", 'class="adblockplus-node" href="chrome://adblockplus/skin/overlay.css" type="tex t/css"'); 565 let style = window.document.createProcessingInstruction("xml-stylesheet", 'class="adblockplus-node" href="chrome://adblockplus/skin/overlay.css" type="tex t/css"');
550 window.document.insertBefore(style, window.document.firstChild); 566 window.document.insertBefore(style, window.document.firstChild);
551 } 567 }
552 568
553 if (!isKnownWindow(window)) 569 if (!isKnownWindow(window))
554 return; 570 return;
555 571
(...skipping 30 matching lines...) Expand all
586 element.addEventListener(event, handler.bind(null, window), false); 602 element.addEventListener(event, handler.bind(null, window), false);
587 } 603 }
588 window.addEventListener("popupshowing", this.onPopupShowing, false); 604 window.addEventListener("popupshowing", this.onPopupShowing, false);
589 window.addEventListener("keypress", this.onKeyPress, false); 605 window.addEventListener("keypress", this.onKeyPress, false);
590 606
591 addBrowserLocationListener(window, function() 607 addBrowserLocationListener(window, function()
592 { 608 {
593 this.updateIconState(window, window.document.getElementById("abp-status")) ; 609 this.updateIconState(window, window.document.getElementById("abp-status")) ;
594 this.updateIconState(window, window.document.getElementById("abp-toolbarbu tton")); 610 this.updateIconState(window, window.document.getElementById("abp-toolbarbu tton"));
595 }.bind(this)); 611 }.bind(this));
596 addBrowserClickListener(window, this.onBrowserClick.bind(this, window));
597 612
598 let notificationPanel = window.document.getElementById("abp-notification"); 613 let notificationPanel = window.document.getElementById("abp-notification");
599 notificationPanel.addEventListener("command", function(event) 614 notificationPanel.addEventListener("command", function(event)
600 { 615 {
601 switch (event.target.id) 616 switch (event.target.id)
602 { 617 {
603 case "abp-notification-close": 618 case "abp-notification-close":
604 notificationPanel.classList.add("abp-closing"); 619 notificationPanel.classList.add("abp-closing");
605 break; 620 break;
606 case "abp-notification-optout": 621 case "abp-notification-optout":
(...skipping 14 matching lines...) Expand all
621 .getInterface(Ci.nsIWebNavigation) 636 .getInterface(Ci.nsIWebNavigation)
622 .QueryInterface(Ci.nsIDocShell) 637 .QueryInterface(Ci.nsIDocShell)
623 .allowSubframes = true; 638 .allowSubframes = true;
624 }, 639 },
625 640
626 /** 641 /**
627 * Removes Adblock Plus UI from a window. 642 * Removes Adblock Plus UI from a window.
628 */ 643 */
629 removeFromWindow: function(/**Window*/ window) 644 removeFromWindow: function(/**Window*/ window)
630 { 645 {
631 let {isKnownWindow, removeBrowserLocationListeners, removeBrowserClickListen ers} = require("appSupport"); 646 let {isKnownWindow, removeBrowserLocationListeners} = require("appSupport");
632 if (window.document.documentElement.id == "CustomizeToolbarWindow" || isKnow nWindow(window)) 647 if (window.document.documentElement.id == "CustomizeToolbarWindow" || isKnow nWindow(window))
633 { 648 {
634 // Remove style processing instruction 649 // Remove style processing instruction
635 for (let child = window.document.firstChild; child; child = child.nextSibl ing) 650 for (let child = window.document.firstChild; child; child = child.nextSibl ing)
636 if (child.nodeType == child.PROCESSING_INSTRUCTION_NODE && child.data.in dexOf("adblockplus-node") >= 0) 651 if (child.nodeType == child.PROCESSING_INSTRUCTION_NODE && child.data.in dexOf("adblockplus-node") >= 0)
637 child.parentNode.removeChild(child); 652 child.parentNode.removeChild(child);
638 } 653 }
639 654
640 if (!isKnownWindow(window)) 655 if (!isKnownWindow(window))
641 return; 656 return;
(...skipping 14 matching lines...) Expand all
656 { 671 {
657 let clone = window.document.getElementById(id); 672 let clone = window.document.getElementById(id);
658 if (clone) 673 if (clone)
659 clone.parentNode.removeChild(clone); 674 clone.parentNode.removeChild(clone);
660 } 675 }
661 } 676 }
662 677
663 window.removeEventListener("popupshowing", this.onPopupShowing, false); 678 window.removeEventListener("popupshowing", this.onPopupShowing, false);
664 window.removeEventListener("keypress", this.onKeyPress, false); 679 window.removeEventListener("keypress", this.onKeyPress, false);
665 removeBrowserLocationListeners(window); 680 removeBrowserLocationListeners(window);
666 removeBrowserClickListeners(window);
667 }, 681 },
668 682
669 /** 683 /**
670 * The overlay information to be used when adding elements to the UI. 684 * The overlay information to be used when adding elements to the UI.
671 * @type Object 685 * @type Object
672 */ 686 */
673 overlay: null, 687 overlay: null,
674 688
675 /** 689 /**
676 * Iterator for application windows that Adblock Plus should apply to. 690 * Iterator for application windows that Adblock Plus should apply to.
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 notifyUser(); 930 notifyUser();
917 } 931 }
918 }, false); 932 }, false);
919 request.send(); 933 request.send();
920 } 934 }
921 else 935 else
922 notifyUser(); 936 notifyUser();
923 }, 937 },
924 938
925 /** 939 /**
926 * Handles clicks inside the browser's content area, will intercept clicks on 940 * Called whenever subscribeLinkHandler.js intercepts clicks on abp: links
927 * abp: links as well as links to subscribe.adblockplus.org. 941 * as well as links to subscribe.adblockplus.org.
928 */ 942 */
929 onBrowserClick: function (/**Window*/ window, /**Event*/ event) 943 subscribeLinkClicked: function(message)
930 { 944 {
931 // Ignore right-clicks 945 let {title, url, mainSubscriptionTitle, mainSubscriptionURL} = message.data;
932 if (event.button == 2)
933 return;
934
935 // Search the link associated with the click
936 let link = event.target;
937 while (!(link instanceof Ci.nsIDOMHTMLAnchorElement))
938 {
939 link = link.parentNode;
940
941 if (!link)
942 return;
943 }
944
945 let queryString = null;
946 if (link.protocol == "http:" || link.protocol == "https:")
947 {
948 if (link.host == "subscribe.adblockplus.org" && link.pathname == "/")
949 queryString = link.search.substr(1);
950 }
951 else
952 {
953 // Firefox doesn't populate the "search" property for links with
954 // non-standard URL schemes so we need to extract the query string
955 // manually
956 let match = /^abp:\/*subscribe\/*\?(.*)/i.exec(link.href);
957 if (match)
958 queryString = match[1];
959 }
960
961 if (!queryString)
962 return;
963
964 // This is our link - make sure the browser doesn't handle it
965 event.preventDefault();
966 event.stopPropagation();
967
968 // Decode URL parameters
969 let title = null;
970 let url = null;
971 let mainSubscriptionTitle = null;
972 let mainSubscriptionURL = null;
973 for (let param of queryString.split("&"))
974 {
975 let parts = param.split("=", 2);
976 if (parts.length != 2 || !/\S/.test(parts[1]))
977 continue;
978 switch (parts[0])
979 {
980 case "title":
981 title = decodeURIComponent(parts[1]);
982 break;
983 case "location":
984 url = decodeURIComponent(parts[1]);
985 break;
986 case "requiresTitle":
987 mainSubscriptionTitle = decodeURIComponent(parts[1]);
988 break;
989 case "requiresLocation":
990 mainSubscriptionURL = decodeURIComponent(parts[1]);
991 break;
992 }
993 }
994 if (!url) 946 if (!url)
995 return; 947 return;
996 948
997 // Default title to the URL 949 // Default title to the URL
998 if (!title) 950 if (!title)
999 title = url; 951 title = url;
1000 952
1001 // Main subscription needs both title and URL 953 // Main subscription needs both title and URL
1002 if (mainSubscriptionTitle && !mainSubscriptionURL) 954 if (mainSubscriptionTitle && !mainSubscriptionURL)
1003 mainSubscriptionTitle = null; 955 mainSubscriptionTitle = null;
(...skipping 17 matching lines...) Expand all
1021 973
1022 if (mainSubscriptionURL) 974 if (mainSubscriptionURL)
1023 { 975 {
1024 mainSubscriptionURL = Utils.makeURI(mainSubscriptionURL); 976 mainSubscriptionURL = Utils.makeURI(mainSubscriptionURL);
1025 if (!mainSubscriptionURL || (mainSubscriptionURL.scheme != "http" && mainS ubscriptionURL.scheme != "https" && mainSubscriptionURL.scheme != "ftp")) 977 if (!mainSubscriptionURL || (mainSubscriptionURL.scheme != "http" && mainS ubscriptionURL.scheme != "https" && mainSubscriptionURL.scheme != "ftp"))
1026 mainSubscriptionURL = mainSubscriptionTitle = null; 978 mainSubscriptionURL = mainSubscriptionTitle = null;
1027 else 979 else
1028 mainSubscriptionURL = mainSubscriptionURL.spec; 980 mainSubscriptionURL = mainSubscriptionURL.spec;
1029 } 981 }
1030 982
1031 this.openSubscriptionDialog(window, url, title, mainSubscriptionURL, mainSub scriptionTitle); 983 this.openSubscriptionDialog(this.currentWindow, url, title, mainSubscription URL, mainSubscriptionTitle);
1032 }, 984 },
1033 985
1034 /** 986 /**
1035 * Opens a dialog letting the user confirm/adjust a filter subscription to 987 * Opens a dialog letting the user confirm/adjust a filter subscription to
1036 * be added. 988 * be added.
1037 */ 989 */
1038 openSubscriptionDialog: function(/**Window*/ window, /**String*/ url, /**Strin g*/ title, /**String*/ mainURL, /**String*/ mainTitle) 990 openSubscriptionDialog: function(/**Window*/ window, /**String*/ url, /**Strin g*/ title, /**String*/ mainURL, /**String*/ mainTitle)
1039 { 991 {
1040 let subscription = {url: url, title: title, disabled: false, external: false , 992 let subscription = {url: url, title: title, disabled: false, external: false ,
1041 mainSubscriptionTitle: mainTitle, mainSubscriptionURL: m ainURL}; 993 mainSubscriptionTitle: mainTitle, mainSubscriptionURL: m ainURL};
(...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after
1989 ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)], 1941 ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)],
1990 ["abp-command-toggleshownotifications", "command", Notification.toggleIgnoreCa tegory.bind(Notification, "*", null)] 1942 ["abp-command-toggleshownotifications", "command", Notification.toggleIgnoreCa tegory.bind(Notification, "*", null)]
1991 ]; 1943 ];
1992 1944
1993 onShutdown.add(function() 1945 onShutdown.add(function()
1994 { 1946 {
1995 for (let window of UI.applicationWindows) 1947 for (let window of UI.applicationWindows)
1996 if (UI.isBottombarOpen(window)) 1948 if (UI.isBottombarOpen(window))
1997 UI.toggleBottombar(window); 1949 UI.toggleBottombar(window);
1998 }); 1950 });
OLDNEW
« chrome/content/subscribeLinkHandler.js ('K') | « lib/appSupport.js ('k') | lib/utils.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld