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

Delta Between Two Patch Sets: lib/ui.js

Issue 5538776168267776: Implemented anti-adblock message notification (Closed)
Left Patch Set: Created Feb. 11, 2014, 4:51 p.m.
Right Patch Set: Created Feb. 13, 2014, 12:50 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « lib/notification.js ('k') | no next file » | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 /* 1 /*
2 * This file is part of Adblock Plus <http://adblockplus.org/>, 2 * This file is part of Adblock Plus <http://adblockplus.org/>,
3 * Copyright (C) 2006-2013 Eyeo GmbH 3 * Copyright (C) 2006-2013 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 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 let menuSource = this.overlay["abp-status-popup"]; 389 let menuSource = this.overlay["abp-status-popup"];
390 delete this.overlay["abp-status-popup"]; 390 delete this.overlay["abp-status-popup"];
391 391
392 if (this.overlay.all.length) 392 if (this.overlay.all.length)
393 this.overlay.all[0].appendChild(menuSource); 393 this.overlay.all[0].appendChild(menuSource);
394 if ("abp-toolbarbutton" in this.overlay) 394 if ("abp-toolbarbutton" in this.overlay)
395 this.overlay["abp-toolbarbutton"].appendChild(fixId(menuSource.cloneNode (true), "abp-toolbar")); 395 this.overlay["abp-toolbarbutton"].appendChild(fixId(menuSource.cloneNode (true), "abp-toolbar"));
396 if ("abp-menuitem" in this.overlay) 396 if ("abp-menuitem" in this.overlay)
397 this.overlay["abp-menuitem"].appendChild(fixId(menuSource.cloneNode(true ), "abp-menuitem")); 397 this.overlay["abp-menuitem"].appendChild(fixId(menuSource.cloneNode(true ), "abp-menuitem"));
398 } 398 }
399 },
400
401 _initAntiAdblockNotification: function()
402 {
403 let notification = {
404 id: "antiadblock",
405 type: "question",
406 title: Utils.getString("notification_antiadblock_title"),
407 message: Utils.getString("notification_antiadblock_message"),
408 urlFilters: []
409 };
410
411 function notificationListener(approved)
412 {
413 let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl );
414 if (subscription.url in FilterStorage.knownSubscriptions)
415 subscription.disabled = !approved;
416 }
417
418 function addAntiAdblockNotification(subscription)
419 {
420 let urlFilters = [];
421 for each (let filter in subscription.filters)
422 if (filter instanceof ActiveFilter)
423 for (let domain in filter.domains)
424 if (domain && urlFilters.indexOf(domain) == -1)
425 urlFilters.push(domain);
426 notification.urlFilters = urlFilters;
427 Notification.addNotification(notification);
428 Notification.addQuestionListener(notification.id, notificationListener);
429 }
430
431 function removeAntiAdblockNotification()
432 {
433 Notification.removeNotification(notification);
434 Notification.removeQuestionListener(notification.id, notificationListener) ;
435 }
436
437 let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
438 if (subscription.lastDownload && subscription.disabled)
439 addAntiAdblockNotification(subscription);
440
441 FilterNotifier.addListener(function(action, value, newItem, oldItem)
442 {
443 if (!/^subscription\.(updated|removed|disabled)$/.test(action) || value.ur l != Prefs.subscriptions_antiadblockurl)
444 return;
445
446 if (action == "subscription.updated")
447 addAntiAdblockNotification(value);
448 else if (action == "subscription.removed" || (action == "subscription.disa bled" && !value.disabled))
449 removeAntiAdblockNotification();
450 });
451
452 var documentCreationObserver = {
453 observe: function(subject, topic, data)
454 {
455 if (!(subject instanceof Ci.nsIDOMWindow))
456 return;
457
458 this._showNextNotification(subject.location.href);
459 }.bind(this)
460 };
461 Services.obs.addObserver(documentCreationObserver, "content-document-global- created", false);
462 onShutdown.add(function()
463 {
464 Services.obs.removeObserver(documentCreationObserver, "content-document-gl obal-created", false);
465 });
399 }, 466 },
400 467
401 /** 468 /**
402 * Gets called once the initialization is finished and Adblock Plus elements 469 * Gets called once the initialization is finished and Adblock Plus elements
403 * can be added to the UI. 470 * can be added to the UI.
404 */ 471 */
405 initDone: function() 472 initDone: function()
406 { 473 {
407 let {WindowObserver} = require("windowObserver"); 474 let {WindowObserver} = require("windowObserver");
408 new WindowObserver(this); 475 new WindowObserver(this);
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 this.updateIconState(window, window.document.getElementById("abp-status")) ; 590 this.updateIconState(window, window.document.getElementById("abp-status")) ;
524 this.updateIconState(window, window.document.getElementById("abp-toolbarbu tton")); 591 this.updateIconState(window, window.document.getElementById("abp-toolbarbu tton"));
525 }.bind(this)); 592 }.bind(this));
526 addBrowserClickListener(window, this.onBrowserClick.bind(this, window)); 593 addBrowserClickListener(window, this.onBrowserClick.bind(this, window));
527 594
528 window.document.getElementById("abp-notification-close").addEventListener("c ommand", function(event) 595 window.document.getElementById("abp-notification-close").addEventListener("c ommand", function(event)
529 { 596 {
530 window.document.getElementById("abp-notification").hidePopup(); 597 window.document.getElementById("abp-notification").hidePopup();
531 }, false); 598 }, false);
532 599
533 // Add "anti-adblock messages" notification 600 // Add "anti-adblock messages" notification
Felix Dahlke 2014/02/11 17:57:17 I think all the anti adblock message specific code
Thomas Greiner 2014/02/12 11:58:49 Done.
534 function getURLFiltersFromSubscription(subscription) 601 this._initAntiAdblockNotification();
535 {
536 let urlFilters = [];
537 for each (let filter in subscription.filters)
538 if (filter instanceof ActiveFilter)
539 for (let domain in filter.domains)
540 if (domain && urlFilters.indexOf(domain) == -1)
541 urlFilters.push(domain);
542 return urlFilters;
543 }
544
545 let antiadblockNotification = {
546 id: "antiadblock",
547 severity: "question",
548 title: Utils.getString("notification_antiadblock_title"),
549 message: Utils.getString("notification_antiadblock_message"),
550 urlFilters: [],
551 onApproved: function()
Felix Dahlke 2014/02/11 17:57:17 I really don't think we should be able to put code
Thomas Greiner 2014/02/12 11:58:49 You cannot include functions in JSON so they can o
Felix Dahlke 2014/02/12 15:09:27 Oh that's right of course, wouldn't work anyway.
552 {
553 let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblocku rl);
554 if (subscription.url in FilterStorage.knownSubscriptions)
555 subscription.disabled = false;
556 },
557 onDeclined: function()
558 {
559 let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblocku rl);
560 if (subscription.url in FilterStorage.knownSubscriptions)
561 subscription.disabled = true;
562 }
563 };
564 let antiadblockSubscription = Subscription.fromURL(Prefs.subscriptions_antia dblockurl);
565 if (antiadblockSubscription.lastDownload && antiadblockSubscription.disabled )
566 {
567 antiadblockNotification.urlFilters = getURLFiltersFromSubscription(antiadb lockSubscription);
568 Notification.addNotification(antiadblockNotification);
569 }
570 FilterNotifier.addListener(function(action, value, newItem, oldItem)
571 {
572 if (!/^subscription\.(updated|removed|disabled)$/.test(action) || value.ur l != Prefs.subscriptions_antiadblockurl)
573 return;
574
575 if (action == "subscription.updated")
576 {
577 antiadblockNotification.urlFilters = getURLFiltersFromSubscription(value );
Felix Dahlke 2014/02/11 17:57:17 This is repeated above. How about having a createA
Thomas Greiner 2014/02/12 11:58:49 Done.
578 Notification.addNotification(antiadblockNotification);
579 }
580 else if (action == "subscription.removed" || (action == "subscription.disa bled" && !value.disabled))
581 {
582 Notification.removeNotification(antiadblockNotification);
583 }
584 });
585
586 var httpRequestObserver = {
Felix Dahlke 2014/02/11 17:57:17 Shouldn't it be called documentCreatingObserver or
Thomas Greiner 2014/02/12 11:58:49 Done.
587 observe: function(subject, topic, data)
588 {
589 if (!(subject instanceof Ci.nsIDOMWindow))
590 return;
591
592 this._showNextNotification(subject.location.href);
593 }.bind(this)
594 };
595 Services.obs.addObserver(httpRequestObserver, "content-document-global-creat ed", false);
596 onShutdown.add(function()
597 {
598 Services.obs.removeObserver(httpRequestObserver, "content-document-global- created", false);
599 });
600 602
601 // First-run actions? 603 // First-run actions?
602 if (!this.firstRunDone) 604 if (!this.firstRunDone)
603 { 605 {
604 this.firstRunDone = true; 606 this.firstRunDone = true;
605 607
606 let {addonVersion} = require("info"); 608 let {addonVersion} = require("info");
607 let prevVersion = Prefs.currentVersion; 609 let prevVersion = Prefs.currentVersion;
608 if (prevVersion != addonVersion) 610 if (prevVersion != addonVersion)
609 { 611 {
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
836 { 838 {
837 subscription.title = "Allow non-intrusive advertising"; 839 subscription.title = "Allow non-intrusive advertising";
838 FilterStorage.addSubscription(subscription); 840 FilterStorage.addSubscription(subscription);
839 if (subscription instanceof DownloadableSubscription && !subscription.la stDownload) 841 if (subscription instanceof DownloadableSubscription && !subscription.la stDownload)
840 Synchronizer.execute(subscription); 842 Synchronizer.execute(subscription);
841 } 843 }
842 else 844 else
843 addAcceptable = false; 845 addAcceptable = false;
844 } 846 }
845 847
846 // Add "anti-adblock messages" subscription for new users and users updating from old ABP versions. 848 // Add "anti-adblock messages" subscription
847 if (Services.vc.compare(prevVersion, "2.5") < 0) 849 let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
Felix Dahlke 2014/02/11 17:57:17 I think we should do this for everyone, no matter
Thomas Greiner 2014/02/12 11:58:49 Done.
848 { 850 if (subscription)
849 let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl ); 851 {
850 if (subscription) 852 subscription.disabled = true;
851 { 853 FilterStorage.addSubscription(subscription);
852 subscription.disabled = true; 854 if (subscription instanceof DownloadableSubscription && !subscription.last Download)
853 FilterStorage.addSubscription(subscription); 855 Synchronizer.execute(subscription);
854 if (subscription instanceof DownloadableSubscription && !subscription.la stDownload)
855 Synchronizer.execute(subscription);
856 }
857 } 856 }
858 857
859 if (!addSubscription && !addAcceptable) 858 if (!addSubscription && !addAcceptable)
860 return; 859 return;
861 860
862 function notifyUser() 861 function notifyUser()
863 { 862 {
864 let {addTab} = require("appSupport"); 863 let {addTab} = require("appSupport");
865 if (addTab) 864 if (addTab)
866 { 865 {
(...skipping 1036 matching lines...) Expand 10 before | Expand all | Expand 10 after
1903 let messageElement = window.document.getElementById("abp-notification-messag e"); 1902 let messageElement = window.document.getElementById("abp-notification-messag e");
1904 messageElement.innerHTML = ""; 1903 messageElement.innerHTML = "";
1905 let docLinks = []; 1904 let docLinks = [];
1906 for each (let link in notification.links) 1905 for each (let link in notification.links)
1907 docLinks.push(Utils.getDocLink(link)); 1906 docLinks.push(Utils.getDocLink(link));
1908 insertMessage(messageElement, texts.message, docLinks); 1907 insertMessage(messageElement, texts.message, docLinks);
1909 1908
1910 messageElement.addEventListener("click", function(event) 1909 messageElement.addEventListener("click", function(event)
1911 { 1910 {
1912 let link = event.target; 1911 let link = event.target;
1913 while (!link || link === messageElement || link.localName !== "a") 1912 while (link && link !== messageElement && link.localName !== "a")
Felix Dahlke 2014/02/11 17:57:17 Shouldn't this be an "if"? Anyway, why aren't we
Thomas Greiner 2014/02/12 11:58:49 Done. The bubbling lead to the link opening no ma
1913 link = link.parentNode;
1914 if (!link || link.localName !== "a")
1914 return; 1915 return;
1915 event.preventDefault(); 1916 event.preventDefault();
1916 event.stopPropagation(); 1917 event.stopPropagation();
1917 this.loadInBrowser(link.href, window); 1918 this.loadInBrowser(link.href, window);
1918 }.bind(this)); 1919 }.bind(this));
1919 1920
1920 if (notification.severity === "question") 1921 if (notification.type === "question")
1921 { 1922 {
1922 function buttonHandler(event) 1923 function buttonHandler(approved, event)
1923 { 1924 {
1924 event.preventDefault(); 1925 event.preventDefault();
1925 event.stopPropagation(); 1926 event.stopPropagation();
1926 panel.hidePopup(); 1927 panel.hidePopup();
1927 1928 Notification.triggerQuestionListeners(notification.id, approved)
1928 let action = notification[event.target.getAttribute("action")];
1929 if (typeof action === "function")
1930 action();
1931 Notification.markAsShown(notification.id); 1929 Notification.markAsShown(notification.id);
1932 } 1930 }
1933 window.document.getElementById("abp-notification-yes").oncommand = buttonH andler; 1931 window.document.getElementById("abp-notification-yes").onclick = buttonHan dler.bind(null, true);
1934 window.document.getElementById("abp-notification-no").oncommand = buttonHa ndler; 1932 window.document.getElementById("abp-notification-no").onclick = buttonHand ler.bind(null, false);
1935 } 1933 }
1936 1934
1937 panel.setAttribute("class", "abp-" + notification.severity); 1935 panel.setAttribute("class", "abp-" + notification.type);
1938 panel.setAttribute("noautohide", notification.severity === "question"); 1936 panel.setAttribute("noautohide", notification.type === "question");
1939 panel.openPopup(button, "bottomcenter topcenter", 0, 0, false, false, null); 1937 panel.openPopup(button, "bottomcenter topcenter", 0, 0, false, false, null);
1940 } 1938 }
1941 }; 1939 };
1942 UI.onPopupShowing = UI.onPopupShowing.bind(UI); 1940 UI.onPopupShowing = UI.onPopupShowing.bind(UI);
1943 UI.onKeyPress = UI.onKeyPress.bind(UI); 1941 UI.onKeyPress = UI.onKeyPress.bind(UI);
1944 UI.onIconClick = UI.onIconClick.bind(UI); 1942 UI.onIconClick = UI.onIconClick.bind(UI);
1945 UI.init(); 1943 UI.init();
1946 1944
1947 /** 1945 /**
1948 * List of event handers to be registered for each window. For each event 1946 * List of event handers to be registered for each window. For each event
(...skipping 16 matching lines...) Expand all
1965 ["abp-command-contribute", "command", UI.openContributePage.bind(UI)], 1963 ["abp-command-contribute", "command", UI.openContributePage.bind(UI)],
1966 ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)] 1964 ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)]
1967 ]; 1965 ];
1968 1966
1969 onShutdown.add(function() 1967 onShutdown.add(function()
1970 { 1968 {
1971 for (let window in UI.applicationWindows) 1969 for (let window in UI.applicationWindows)
1972 if (UI.isBottombarOpen(window)) 1970 if (UI.isBottombarOpen(window))
1973 UI.toggleBottombar(window); 1971 UI.toggleBottombar(window);
1974 }); 1972 });
LEFTRIGHT

Powered by Google App Engine
This is Rietveld