Closed Bug 195924 Opened 22 years ago Closed 22 years ago

popup blocking UI: use whitelisting only (similar to Phoenix)

Categories

(SeaMonkey :: UI Design, defect)

defect
Not set
normal

Tracking

(Not tracked)

VERIFIED FIXED
mozilla1.4alpha

People

(Reporter: bugzilla, Assigned: shliang)

References

Details

(Whiteboard: [adt1])

Attachments

(1 file, 8 obsolete files)

popup blocking UI: use whitelisting only (similar to Phoenix). need to change as follows: I. Popup Windows pref panel --------------------------- a. get rid of the "allow popups" radiobutton and associated Exceptions button and dialog. b. change "suppress popups" to a checkbox. by default (ie, for new profiles), this will be OFF (deselected). c. keep the Exceptions button and dlg associated with "suppress popups". this will be the whitelist. II. Tools - Popup Manager menu items ------------------------------------ a. "Allow popups from this site". will bring up whitelist dlg, with the site prefilled in the Add field. b. "Suppress popups from this site". will bring up whitelist dlg, with the site selected (for removal) in the listbox (iff the site is already listed). c. "Manage popup permissions" will be removed. i'll spin off separate bugs for upgrade path and help updates.
Blocks: 195925
Blocks: 195928
Attached patch preliminary patch (obsolete) — Splinter Review
Nav triage team: nsbeta1+/adt1
Keywords: nsbeta1nsbeta1+
Whiteboard: [adt1]
this patch combines work for this bug, bug 195924 (provide info dialog when popup first encountered), 195928 (provide path for previous release - we've decided to ignore old blacklists rather than clearing them out) and bugscape 22023 (should there be menuitems for this in the tools menu - right now when blocking is off, the menuitems are always disabled as no blacklist means not allowing blocking of one site at a time). things seem to work with this patch but it still needs work.
Attachment #116583 - Attachment is obsolete: true
Attachment #116904 - Flags: superreview?(jaggernaut)
Attachment #116904 - Flags: review?(danm)
Attachment #116904 - Attachment is obsolete: true
Attachment #117512 - Flags: superreview?(jaggernaut)
Attachment #117512 - Flags: review?(danm)
Attachment #116904 - Flags: superreview?(jaggernaut)
Attachment #116904 - Flags: review?(danm)
Attachment #117512 - Attachment is obsolete: true
Attachment #117512 - Flags: superreview?(jaggernaut)
Attachment #117512 - Flags: review?(danm)
Attached patch patch (obsolete) — Splinter Review
Attachment #117526 - Flags: superreview?(jaggernaut)
Attachment #117526 - Flags: review?(danm)
Target Milestone: --- → mozilla1.4alpha
QA Contact: paw → sairuh
> I. Popup Windows pref panel I can't seem to find this; is it in Mozilla? > a. "Allow popups from this site". will bring up whitelist dlg, with the site > prefilled in the Add field. > > b. "Suppress popups from this site". will bring up whitelist dlg, with the site > selected (for removal) in the listbox (iff the site is already listed). What is the rationale for this change? It makes allowing and suppressing popups, which might be fairly common operations, a two-click instead of a one-click operation. Gerv
Attached patch patch (obsolete) — Splinter Review
this patch is for the last test build i did which sarah has ok'ed
Attachment #117526 - Attachment is obsolete: true
Attachment #117526 - Flags: superreview?(jaggernaut)
Attachment #117526 - Flags: review?(danm)
Comment on attachment 117686 [details] [diff] [review] patch For the record, the review process has been kind of going on for a while. But I finally had a chance to look at the whole thing, so here are some review-like comments despite no review having been requested on this version of the patch: Index: dom/src/base/nsGlobalWindow.cpp =================================================================== // static PRBool GlobalWindowImpl::CanSetProperty(const char *aPrefName) @@ -2986,6 +3007,8 @@ nsCOMPtr<nsIDOMChromeWindow> chrome_win(do_QueryInterface(*_retval)); if (NS_SUCCEEDED(rv) && !chrome_win) { + + FireFirstPopupEvent(mDocument); // A new non-chrome window was created from a call to // window.open() from JavaScript, make sure there's a document in // the new window. We do this by simply asking the new window for Here, true enough I think in every situation you care about execution will enter this (rv && !chrome_win) clause but what you really care about is whether a popup was just opened, isn't it? I think it's more readable if you rework it so: if (NS_SUCCEEDED(rv)) { if (!chrome_win) { // worry about windows without documents } FireFirstPopupEvent() } 2) Another point: you want to do this only after opening a popup window, not just any window, right? Shouldn't it be if (NS_SUCCEEDED(rv)) { ... if (CheckForAbusePoint()) FirstFirstPopupEvent() } Except that even that's not quite right. That assumes CheckForAbusePoint works as it originally worked (as its comment claims it works); that it simply determines whether any window that might be opened would be a popup. That's not quite true anymore: CheckForAbusePoint now determines whether the window should be opened at all. So to make this work exactly right I think you need to change this slightly as outlined above and also pull the call to IsPopupBlocked out of CheckForAbusePoint, calling it instead just after CheckForAbusePoint is called in Open. A final point: I wouldn't hold up a review for this, but consider changing the FirstPopupWindow event to a PopupWindow event. As this patch is written, the privacy.popups.first_popup preference is shared between files in the dom and in xpfe. It'd be cleaner and I think not a noticeable performance hit to just always fire an event when a popup window is opened. Leave it entirely to the listener, in this case the front end, to decide what to do with it; when to ignore it. Then this privacy pref can be entirely a browser UI pref, not a partial dom pref. Another benefit of that more general model is that it would support some other front end which may want to always know when a popup window is shown. Index: extensions/cookie/resources/content/cookieNavigatorOverlay.xul =================================================================== @@ -103,32 +102,65 @@ } } + function viewPopupManager() { + window.openDialog("chrome://communicator/content/popupManager.xul", "", + "chrome,resizable=yes", "", false, true); + } + You ended up not using this function @@ -173,44 +205,34 @@ } function PopupAction(action) { PopupAction is gone now too, isn't it? Index: xpfe/browser/resources/content/navigator.js =================================================================== @@ -2034,6 +2038,31 @@ FullScreen.toggle(); } +function onFirstPopup(aEvent) { + var showDialog = true; + var specialList = pref.getComplexValue("privacy.popups.default_whitelist", + Components.interfaces.nsIPrefLocalizedString).data; + if (specialList) { + hosts = specialList.split(","); Is this a marketing directive, that we wait to show the first-popup dialog until we get a popup from a site that's not on our special protected list? As a user, I'd find this confusing.
Attached patch patch (obsolete) — Splinter Review
Attachment #117686 - Attachment is obsolete: true
Attached patch patch (obsolete) — Splinter Review
Attachment #117786 - Attachment is obsolete: true
Attachment #117913 - Flags: superreview?(jaggernaut)
Attachment #117913 - Flags: review?(danm)
Attachment #117913 - Flags: review?(danm) → review+
Comment on attachment 117913 [details] [diff] [review] patch >Index: dom/src/base/nsGlobalWindow.cpp >=================================================================== >RCS file: /cvsroot/mozilla/dom/src/base/nsGlobalWindow.cpp,v >retrieving revision 1.578 >diff -u -w -r1.578 nsGlobalWindow.cpp >--- dom/src/base/nsGlobalWindow.cpp 24 Feb 2003 20:15:54 -0000 1.578 >+++ dom/src/base/nsGlobalWindow.cpp 20 Mar 2003 22:24:33 -0000 >@@ -2837,6 +2837,23 @@ > } > } > >+static You don't need static here. See "The C++ Programming Language, Third Edition", page 200 (summary: only use |static| inside classes and functions, the above usage is a carry-over from C and meant "use internal linkage"). >+void FirePopupWindowEvent(nsIDOMDocument* aDoc) >@@ -3005,6 +3025,10 @@ > > nsCOMPtr<nsIDOMDocument> doc; > (*_retval)->GetDocument(getter_AddRefs(doc)); >+ } >+ >+ if (CheckForAbusePoint()) >+ FirePopupWindowEvent(mDocument); You can cache the result from the previous call to CheckForAbusePoint(). >Index: extensions/cookie/resources/content/cookieNavigatorOverlay.xul >=================================================================== >RCS file: /cvsroot/mozilla/extensions/cookie/resources/content/cookieNavigatorOverlay.xul,v >retrieving revision 1.12 >diff -u -w -r1.12 cookieNavigatorOverlay.xul >--- extensions/cookie/resources/content/cookieNavigatorOverlay.xul 21 Jan 2003 07:37:30 -0000 1.12 >+++ extensions/cookie/resources/content/cookieNavigatorOverlay.xul 20 Mar 2003 22:24:33 -0000 >@@ -108,27 +107,29 @@ > var blocked = false; > var policy = pref.getBoolPref("dom.disable_open_during_load"); > >+ var aboutManage = document.getElementById("aboutManagePopups"); >+ var bundle = document.getElementById("bundle_cookieNav"); >+ if (policy) { >+ aboutManage.setAttribute("label", bundle.getString("managePopups")); >+ aboutManage.setAttribute("accesskey", bundle.getString("managePopupsAccesskey")); >+ aboutManage.setAttribute("oncommand", "window.openDialog('chrome://communicator/content/popupManager.xul', '', 'chrome,resizable=yes', '', false, true);"); >+ } >+ else { >+ aboutManage.setAttribute("label", bundle.getString("aboutPopups")); >+ aboutManage.setAttribute("accesskey", bundle.getString("aboutPopupsAccesskey")); >+ aboutManage.setAttribute("oncommand", "window.openDialog('chrome://communicator/content/aboutPopups.xul', '', 'chrome,centerscreen,resizable=yes', false);"); >+ } >+ Instead of this, wouldn't it be simpler to have two seperate menuitems for this, one of which will always be hidden? That way I think/hope you can drop the stringbundle and the new .properties file. Do any of the uri.hostPort accesses need try/catches? To do: extensions/cookie/resources/content/pref-popups.xul and down.
Attached patch patch (obsolete) — Splinter Review
Attachment #117913 - Attachment is obsolete: true
Attachment #118260 - Flags: superreview?(jaggernaut)
Attachment #117913 - Flags: superreview?(jaggernaut)
Comment on attachment 118260 [details] [diff] [review] patch >Index: extensions/cookie/resources/content/pref-popups.xul >=================================================================== >RCS file: /cvsroot/mozilla/extensions/cookie/resources/content/pref-popups.xul,v >retrieving revision 1.5 >diff -u -w -r1.5 pref-popups.xul >--- extensions/cookie/resources/content/pref-popups.xul 7 Mar 2003 02:14:56 -0000 1.5 >+++ extensions/cookie/resources/content/pref-popups.xul 24 Mar 2003 03:16:10 -0000 >@@ -159,17 +173,43 @@ > var ret = filepicker.show(); > if (ret == nsIFilePicker.returnOK) > gSoundUrlBox.value = filepicker.file.path; >+ >+ onSoundInput(); >+ } >+ >+ function previewSound() { >+ var soundUrl = gSoundUrlBox.value; >+ var sound = Components.classes["@mozilla.org/sound;1"] >+ .createInstance(Components.interfaces.nsISound); >+ if (soundUrl.indexOf("file://") == -1) { >+ sound.playSystemSound(soundUrl); >+ } >+ else { >+ var url = Components.classes["@mozilla.org/network/standard-url;1"] >+ .createInstance(Components.interfaces.nsIURL); Aren't we supposed to get URIs from the IOService? >+ function onSoundInput() >+ { >+ gPreviewSoundButton.disabled = gSoundUrlBox.value == ""; > } Everywhere else { follows the function. >Index: xpfe/browser/resources/content/navigator.js >=================================================================== >RCS file: /cvsroot/mozilla/xpfe/browser/resources/content/navigator.js,v >retrieving revision 1.488 >diff -u -w -r1.488 navigator.js >--- xpfe/browser/resources/content/navigator.js 19 Feb 2003 13:25:53 -0000 1.488 >+++ xpfe/browser/resources/content/navigator.js 24 Mar 2003 03:16:11 -0000 >@@ -475,6 +478,7 @@ > addPrefListener(gHomepagePrefListener); > addPopupPermListener(gPopupPermListener); > addPrefListener(gPopupPrefListener); >+ //addPrefListener(gButtonStylePrefListener); > > window.browserContentListener = > new nsBrowserContentListener(window, getBrowser()); Just remove that. >@@ -1470,7 +1475,7 @@ > window.focus(); > > // Disable menus which are not appropriate >- var disabledItems = ['cmd_close', 'Browser:SendPage', 'Browser:EditPage', 'Browser:PrintSetup', /*'Browser:PrintPreview',*/ >+ var disabledItems = ['cmd_close', 'Browser:SendPage', 'Browser:EditPage', 'cmd_printSetup', /*'Browser:PrintPreview',*/ > 'Browser:Print', 'canGoBack', 'canGoForward', 'Browser:Home', 'Browser:AddBookmark', 'cmd_undo', > 'cmd_redo', 'cmd_cut', 'cmd_copy','cmd_paste', 'cmd_delete', 'cmd_selectAll', 'menu_textZoom']; > for (var id in disabledItems) { That's from another patch. Oh, as is some of the theme stuff I saw earlier. Please make sure you check this in separately. >@@ -2034,6 +2039,39 @@ > FullScreen.toggle(); > } > >+function onPopupWindow(aEvent) { >+ var firstPopup = pref.getBoolPref("privacy.popups.first_popup"); >+ if (firstPopup) { >+ var showDialog = true; >+ var specialList = ""; >+ try { >+ specialList = pref.getComplexValue("privacy.popups.default_whitelist", >+ Components.interfaces.nsIPrefLocalizedString).data; >+ } >+ catch(ex) { } >+ >+ if (specialList) { >+ hosts = specialList.split(","); >+ var browser = getBrowserForDocument(aEvent.target); >+ if (!browser) >+ return; >+ var currentHost = browser.currentURI.hostPort; >+ for (var i = 0; i < hosts.length; i++) { >+ var nextHost = hosts[i]; >+ if (nextHost == currentHost || >+ "."+nextHost == currentHost.substr(currentHost.length - (nextHost.length+1))) { >+ showDialog = false; >+ break; >+ } >+ } >+ } >+ if (showDialog) { >+ window.openDialog("chrome://communicator/content/aboutPopups.xul", "", >+ "chrome,centerscreen,resizable=yes", true); >+ pref.setBoolPref("privacy.popups.first_popup", false); >+ } >+ } >+} > > function onPopupBlocked(aEvent) { > var playSound = pref.getBoolPref("privacy.popups.sound_enabled"); >+function getBrowserForDocument(doc) { > var browsers = getBrowser().browsers; > for (var i = 0; i < browsers.length; i++) { > if (browsers[i].contentDocument == doc) { >- var hostPort = browsers[i].currentURI.hostPort; >- browsers[i].popupDomain = hostPort; >- if (browsers[i] == getBrowser().selectedBrowser) { >- var popupIcon = document.getElementById("popupIcon"); >- popupIcon.hidden = false; >+ return browsers[i]; > } >+ else { >+ // check if popup was opened from frame within doc >+ var frames = browsers[i].contentWindow.frames; >+ for (var j = 0; j < frames.length; j++) { >+ if (frames[j].document == doc) >+ return browsers[i]; > } > } > } >+ return null; > } So I've talked to danm and a better way to deal with events from iframes is to fix the dispatching code in nsGlobalWindow to find the top-most content document and dispatch the event on that instead. Use GetTop to get the top-level content window, then GetDocument on that to get the document, pass that to the FireXXXEvent functions. Since this bug fix isn't really part of this bug, feel free to move this part of the patch, or whatever fix we end up agreeing on, to a new bug so it won't block you from checking the rest in tonight. >Index: xpfe/communicator/resources/content/aboutPopups.xul >=================================================================== >+<?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?> >+<?xml-stylesheet href="chrome://navigator/skin/navigator.css" type="text/css"?> navigator.css can be left off, right? >+ <script type="application/x-javascript" src="chrome://global/content/strres.js"/> I don't think you need strres.js, unless one of the other JS files there depends on it (in that case: bad JS files, no cookie!). Looking forward to seeing your merged patch + the above comments addresess.
Attachment #118260 - Flags: superreview?(jaggernaut) → superreview-
Depends on: 199216
bug 199216 blocks this. :(
Attached patch updated patchSplinter Review
Attachment #118260 - Attachment is obsolete: true
Attachment #118504 - Flags: superreview?(jaggernaut)
Attachment #118504 - Flags: review+
Comment on attachment 118504 [details] [diff] [review] updated patch Could you rename |parent| and |parentDoc| to |topWindow| and |topDoc|? No need for a new patch.
Attachment #118504 - Flags: superreview?(jaggernaut) → superreview+
resolving
Status: NEW → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
vrfy'd fixed with 2003.03.27 comm trunk builds on win2k, mac 10.2.4 and linux rh8.0. expected UI: Popup Windows pref panel ------------------------ a. "Block unrequested popup windows" checkbox. b. associated "Allowed Sites" button for customizing the whitelist. c. "Play a sound" checkbox (off by default). d. "Display an icon in the Navigator status bar" checkbox (on by default). Tools - Popup Manager menu items -------------------------------- a. Allow Popups From This Site b. Manage Popups (when blocking is on) / About Popup Blocking (when blocking is off) specific issues should be filed as new, separate bugs.
Status: RESOLVED → VERIFIED
A question, why has this been changed? I think having both white- and blacklists makes a lot of sense, we're loosing functionality here. For me, this is a regression. Any reason for this?
ditto question in comment #19 (mostly out of curiosity)
Henning, Peter: I don't much like the new UI either but I think it's an improvement over the previous one. Smart people found that one confusing, and it seemed that almost no one was using blacklists anyway. It wouldn't have hurt to have given a little more warning, though. Sorry about that. You could file a bug to restore blacklists! I wouldn't count on it to go anywhere but it might be a good place to collect a little bit of dissent.
Eww. Ack. I can't believe that the blacklist is going away. Ok, so, wouldn't a UI to match the cookies UI be better than going to a straight whitelist? (i.e. wouldn't it be nice if all of the UI's were the same?)
Is there any way to activate the blacklist feature again (e.g. in the user.js)? What happens to my (very big) blacklist now? Will 1.4a delete it? :-O Henning, Peter: Did you file a new bug?
Why remove blacklisting? What is wrong with this, for me working, feature?
As the code stands your blacklist is still active until the day you visit popup windows prefs. You may want to go make a backup before you do that. But there's no UI for maintaining that list. It's unsupported now. My own experience with the blacklist, and I had built a large one, was that I really wanted a whitelist. Give it a try, I suggest. I've learned to appreciate it. I can't defend the new UI in its details but I do feel it's an improvement and I've heard there are unpublished studies concluding that that's a majority sentiment. If you (anyone) have a great idea for an improved UI that supports both options, I encourage you to file a separate bug with a screenshot or ASCII art or something. Keep in mind though that this small simplification presages a general simplification of the entire browser UI, according to http://mozilla.org/roadmap.html.
<qa_ignore>If we're getting opiniony -- I find that the new whitelist's usability is so good that I weep with awe. Flawless victory.</qa_ignore>
With which switch can I re-activate the blacklist if I already was in the popup prefs and where can I find my blacklist? The whitelist feature would be usable if I was able to open the blocked popups by clicking on the blocked-popup-icon. What about this?
what was wrong with the old UI? What I don't like about the whitelist is that I might lose important pop-up windows. Mozilla alerts that a popup was blocked, but to tell if it was a ad-popup or a important popup I have to put the specific page onto the whitelist, reload the page and remove it from the whitelist again if it was an unwanted ad. This sucks! I'd rather see some ads (remeber, many free services can only be offered because of the ad-popup!) that miss a popup with important information. So pretty please bring back the blacklist.
Being able to click the alert icon to have the suppressed pop-up pop-up on the spot would seem to address most peoples' remaining complaints. I suggest that someone who would prefer that behaviour file a new bug specifically for it.
As for proposal in comment #21: there is bug 201720. However it was marked INVALID in four hours so that probably no one noticed...
As for proposal in comment #21: there is bug #202394. However it was marked INVALID so that probably no one noticed... Sorry, but I prefer a blacklist, really! I use few sites with blocked popups. All other popups I want to see! -> #201720 "I am only asking to reconsider dismissing a very useful feature. [...] However there are people who prefer the new way. What is wrong with letting them choose?" Is there any way to get the blacklist for popups?
Previous three comments: see bug 198846. To run in blacklist mode, use Mozilla 1.3(!) Or on the trunk, if you were using a blacklist and you've never visited the popups prefs panel since Mozilla 1.4, you're still using a blacklist. You just can't add new sites to your blacklist within Mozilla. To force a blacklist in 1.4 or to add new items to your blacklist, and remember this is an unsupported hack: Exit Mozilla. Find your profile. On Win2k it's at <root drive>:/Documents and Settings/<user>/Application Data/Mozilla/Profiles/<profile>/<randomized directory name>/. On OSX it's users/<user>/Library/Mozilla/<...>. Linux, ~/.mozilla/<...>. Your crazy platform, I don't know. Edit prefs.js. Does it contain a line that reads user_pref("dom.disable_open_during_load", true); ? If so you've already lost your blacklist. Delete that line and save the file. That gives you a blacklist. (Apologies for the naming of the preference; it's historical.) Individual site permissions are stored in a file named cookperm.txt. Hopefully you still have your large collection of blacklist entries. To add a new domain to your blacklist, add a new line to this file. It's one line per domain, and each line reads <domain>[\t0F][\t1F][\t2F] e.g. catholic.org\t2F I hope you know what I mean. Angle brackets are a semantic entity, anything in square brackets is optional and the sequence \t means a single tab character. 0 is cookies, 1 is images, 2 means popups and the F means no permission. (So a whitelist entry would read 2T.) Remember, when you visit the popup prefs panel your blacklist is put down. And remember you'll lose your changes if you edit these files while Mozilla is running. This isn't difficult, but it's a little onerous and you risk damaging your permissions file if you aren't familiar with what you're doing. This bug is all fixed and closed off. Bereft of life, it rests in peace. If we hadn't nailed it to the perch, it'd be pushing up the daisies. Its metabolic processes are now history. It's off the twig. It's kicked the bucket, shuffled off its mortal coil, run down the curtain and joined the bleedin' choir invisible. With apologies to Monty Python. Further discussion would perhaps be more appropriately moved to a discussion forum such as on http://www.mozillazine.org/forums/index.php . I couldn't find this topic under Mozilla Features, so I guess you'd have to start a new one. However it looks like blacklisting isn't coming back; witness the two attempts to resurrect it quickly shot down. Will bug 198846 take care of your concerns long-term? Go vote for it.
As far as I could tell from the comments the reason for removing the blacklist is that a) the UI is confusing and b) almost no one is using the blacklist. a) I don't know what's so confusing about the UI. Two radiobuttons and two exception-buttons. Nothing "smart people" (comment#21) wouldn't understand. b) how could you tell almost no one uses the blacklist? I'd suggest reopening bug 201720 and see how many votes / comments it gets. comment #32 : Will the backend-popup-blacklist code somewhen removed? If we don't manage it to bring the blacklist UI back into mozilla will it be possible to write an xpi addon to bring it back? Is anyone of the other blacklist fans comfortable with writing addons? Where can I find resources on how to write an addon?
*** Bug 211194 has been marked as a duplicate of this bug. ***
I just found that blacklist has been removed has I downloaded 1.4. Whitelist is useless on popup, I and I think a lot of people need blacklist. Is there a meeting point there we, all the blacklist fan, can express our point of view and get this function back in 1.4.1 ?
There were few attempts since blacklist removal in 1.4a (bug 201720). However, those were marked invalid immediately without thinking about them. Thus I don't think there is a chance to get blacklist back in 1.4 series. However, there is a chance to get blacklist into Mozilla Browser (bug 202394).
Product: Core → Mozilla Application Suite
Component: XP Apps: GUI Features → UI Design
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: