Bug 351235 <a href='foo' target='bar'> and window.open('foo', 'bar') should not be treated identically by browser.link.restriction r=bzbarsky
authorNeil Rashbrook <neil@parkwaycc.co.uk>
Mon, 05 Jul 2010 13:03:07 +0100
changeset 47224 a9d27938bb2dc2dec5f6c7cc2b9654af1b0cd841
parent 47223 dd73fb7289a4074c23d5446f858e97744aaf74fe
child 47225 f469d7357b5b19e64236302302346098a3b00b33
push idunknown
push userunknown
push dateunknown
reviewersbzbarsky
bugs351235
milestone2.0b2pre
Bug 351235 <a href='foo' target='bar'> and window.open('foo', 'bar') should not be treated identically by browser.link.restriction r=bzbarsky
embedding/base/nsIWindowProvider.idl
embedding/components/windowwatcher/src/nsWindowWatcher.cpp
xpfe/appshell/src/nsContentTreeOwner.cpp
--- a/embedding/base/nsIWindowProvider.idl
+++ b/embedding/base/nsIWindowProvider.idl
@@ -51,17 +51,17 @@ interface nsIURI;
 /**
  * The nsIWindowProvider interface exists so that the window watcher's default
  * behavior of opening a new window can be easly modified.  When the window
  * watcher needs to open a new window, it will first check with the
  * nsIWindowProvider it gets from the parent window.  If there is no provider
  * or the provider does not provide a window, the window watcher will proceed
  * to actually open a new window.
  */
-[scriptable, uuid(5119ac7f-81dd-4061-96a7-71f2cf5efee4)]
+[scriptable, uuid(f607bd66-08e5-4d2e-ad83-9f9f3ca17658)]
 interface nsIWindowProvider : nsISupports
 {
   /**
    * A method to request that this provider provide a window.  The window
    * returned need not to have the right name or parent set on it; setting
    * those is the caller's responsibility.  The provider can always return null
    * to have the caller create a brand-new window.
    *
@@ -109,15 +109,16 @@ interface nsIWindowProvider : nsISupport
    *         the nsIWindowProvider implementation or may be a window that
    *         already existed.
    *
    * @see nsIWindowWatcher for more information on aFeatures.
    * @see nsIWebBrowserChrome for more information on aChromeFlags.
    */
   nsIDOMWindow provideWindow(in nsIDOMWindow aParent,
                              in unsigned long aChromeFlags,
+                             in boolean aCalledFromJS,
                              in boolean aPositionSpecified,
                              in boolean aSizeSpecified,
                              in nsIURI aURI,
                              in AString aName,
                              in AUTF8String aFeatures,
                              out boolean aWindowIsNew);
 };
--- a/embedding/components/windowwatcher/src/nsWindowWatcher.cpp
+++ b/embedding/components/windowwatcher/src/nsWindowWatcher.cpp
@@ -618,17 +618,17 @@ nsWindowWatcher::OpenWindowJSInternal(ns
         !(chromeFlags & (nsIWebBrowserChrome::CHROME_MODAL         |
                          nsIWebBrowserChrome::CHROME_OPENAS_DIALOG | 
                          nsIWebBrowserChrome::CHROME_OPENAS_CHROME))) {
       nsCOMPtr<nsIWindowProvider> provider = do_GetInterface(parentTreeOwner);
       if (provider) {
         NS_ASSERTION(aParent, "We've _got_ to have a parent here!");
 
         nsCOMPtr<nsIDOMWindow> newWindow;
-        rv = provider->ProvideWindow(aParent, chromeFlags,
+        rv = provider->ProvideWindow(aParent, chromeFlags, aCalledFromJS,
                                      sizeSpec.PositionSpecified(),
                                      sizeSpec.SizeSpecified(),
                                      uriToLoad, name, features, &windowIsNew,
                                      getter_AddRefs(newWindow));
         if (NS_SUCCEEDED(rv)) {
           GetWindowTreeItem(newWindow, getter_AddRefs(newDocShellItem));
           if (windowIsNew && newDocShellItem) {
             // Make sure to stop any loads happening in this window that the
--- a/xpfe/appshell/src/nsContentTreeOwner.cpp
+++ b/xpfe/appshell/src/nsContentTreeOwner.cpp
@@ -812,16 +812,17 @@ private:
 };
 
 //*****************************************************************************
 // nsContentTreeOwner: nsIWindowProvider
 //*****************************************************************************   
 NS_IMETHODIMP
 nsContentTreeOwner::ProvideWindow(nsIDOMWindow* aParent,
                                   PRUint32 aChromeFlags,
+                                  PRBool aCalledFromJS,
                                   PRBool aPositionSpecified,
                                   PRBool aSizeSpecified,
                                   nsIURI* aURI,
                                   const nsAString& aName,
                                   const nsACString& aFeatures,
                                   PRBool* aWindowIsNew,
                                   nsIDOMWindow** aReturn)
 {
@@ -861,16 +862,17 @@ nsContentTreeOwner::ProvideWindow(nsIDOM
   }
 
   if (containerPref != nsIBrowserDOMWindow::OPEN_NEWTAB &&
       containerPref != nsIBrowserDOMWindow::OPEN_CURRENTWINDOW) {
     // Just open a window normally
     return NS_OK;
   }
 
+  if (aCalledFromJS) {
   /* Now check our restriction pref.  The restriction pref is a power-user's
      fine-tuning pref. values:     
      0: no restrictions - divert everything
      1: don't divert window.open at all
      2: don't divert window.open with features
   */
   PRInt32 restrictionPref;
   if (NS_FAILED(branch->GetIntPref("open_newwindow.restriction",
@@ -885,16 +887,17 @@ nsContentTreeOwner::ProvideWindow(nsIDOM
   }
 
   if (restrictionPref == 2 &&
       // Only continue if there are no size/position features and no special
       // chrome flags.
       (aChromeFlags != nsIWebBrowserChrome::CHROME_ALL ||
        aPositionSpecified || aSizeSpecified)) {
     return NS_OK;
+    }
   }
 
   nsCOMPtr<nsIDOMWindowInternal> domWin;
   mXULWindow->GetWindowDOMWindow(getter_AddRefs(domWin));
   nsCOMPtr<nsIDOMChromeWindow> chromeWin = do_QueryInterface(domWin);
   if (!chromeWin) {
     // Really odd... but whatever
     NS_WARNING("nsXULWindow's DOMWindow is not a chrome window");