[tor-commits] [tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 24920 - Only create Private tabs if browser.privatebrowsing.autostart is true

gk at torproject.org gk at torproject.org
Sat Aug 31 19:46:17 UTC 2019


commit 576ff6dcffff7ad57c21c4bc469b52566d8da3dd
Author: Matthew Finkel <Matthew.Finkel at gmail.com>
Date:   Mon May 27 15:55:33 2019 +0000

    Bug 24920 - Only create Private tabs if browser.privatebrowsing.autostart is true
---
 .../base/java/org/mozilla/gecko/BrowserApp.java    |  9 +++++++
 .../base/java/org/mozilla/gecko/GeckoApp.java      | 31 ++++++++++++++++++++++
 .../android/base/java/org/mozilla/gecko/Tabs.java  |  7 ++++-
 .../java/org/mozilla/gecko/tabs/TabsPanel.java     |  4 +++
 mobile/android/chrome/content/browser.js           |  4 +--
 5 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index da25e3b395be..c2a463ad6ed1 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -3362,6 +3362,15 @@ public class BrowserApp extends GeckoApp
 
         share.setActionProvider(provider);
 
+        // Change visibility of new_tab. This may be called before
+        // mOnlyPrivateTabs is set in GeckoApp::onCreate(). If the PrefHelper
+        // callback was not already called, then the visibility will be correctly set
+        // in the callback.
+        MenuItem newTabMenuItem = mMenu.findItem(R.id.new_tab);
+        if (newTabMenuItem != null) {
+            newTabMenuItem.setVisible(mOnlyPrivateTabs == false);
+        }
+
         return true;
     }
 
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
index e01318dab422..9c66f56b0485 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -165,6 +165,8 @@ public abstract class GeckoApp extends GeckoActivity
      */
     public static final String PREFS_IS_FIRST_RUN = "telemetry-isFirstRun";
 
+    public static final String PREFS_PRIVATEBROWSING_AUTOSTART = "browser.privatebrowsing.autostart";
+
     public static final String SAVED_STATE_IN_BACKGROUND   = "inBackground";
     public static final String SAVED_STATE_PRIVATE_SESSION = "privateSession";
     /**
@@ -352,6 +354,8 @@ public abstract class GeckoApp extends GeckoActivity
     private boolean mPrivateBrowsingSessionOutdated;
     private static final int MAX_PRIVATE_TABS_UPDATE_WAIT_MSEC = 500;
 
+    protected boolean mOnlyPrivateTabs = false;
+
     private volatile HealthRecorder mHealthRecorder;
     private volatile Locale mLastLocale;
 
@@ -1164,6 +1168,28 @@ public abstract class GeckoApp extends GeckoActivity
             "ToggleChrome:Show",
             null);
 
+        PrefsHelper.getPref(PREFS_PRIVATEBROWSING_AUTOSTART,
+                            new PrefsHelper.PrefHandlerBase() {
+            @Override public void prefValue(String pref, boolean value) {
+                if (pref != PREFS_PRIVATEBROWSING_AUTOSTART) {
+                    return;
+                }
+
+                mOnlyPrivateTabs = value;
+
+                // Change visibility here in case mMenu is initialized. If it is not initialized,
+                // then the visibility is set in BrowserApp::onCreateOptionsMenu().
+                if (mMenu != null) {
+                    MenuItem newTabMenuItem = mMenu.findItem(R.id.new_tab);
+                    if (newTabMenuItem != null) {
+                        newTabMenuItem.setVisible(mOnlyPrivateTabs == false);
+                    }
+                }
+
+                Tabs.getInstance().setOnlyPrivateTabs(mOnlyPrivateTabs);
+            }
+        });
+
         Tabs.getInstance().attachToContext(this, mLayerView, getAppEventDispatcher());
         Tabs.registerOnTabsChangedListener(this);
 
@@ -1202,6 +1228,7 @@ public abstract class GeckoApp extends GeckoActivity
                 }
 
                 // If we are doing a restore, read the session data so we can send it to Gecko later.
+
                 GeckoBundle restoreMessage = null;
                 if (!mIsRestoringActivity && mShouldRestore) {
                     final boolean isExternalURL = invokedWithExternalURL(getIntentURI(new SafeIntent(getIntent())));
@@ -2306,6 +2333,10 @@ public abstract class GeckoApp extends GeckoActivity
         }
     }
 
+    public boolean isOnlyPrivateTabs() {
+        return mOnlyPrivateTabs;
+    }
+
     @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
     protected void finishAndShutdown(final boolean restart) {
         ThreadUtils.assertOnUiThread();
diff --git a/mobile/android/base/java/org/mozilla/gecko/Tabs.java b/mobile/android/base/java/org/mozilla/gecko/Tabs.java
index 068d8cb7ca28..30c75b68aad8 100644
--- a/mobile/android/base/java/org/mozilla/gecko/Tabs.java
+++ b/mobile/android/base/java/org/mozilla/gecko/Tabs.java
@@ -106,6 +106,7 @@ public class Tabs implements BundleEventListener {
     private ContentObserver mBookmarksContentObserver;
     private PersistTabsRunnable mPersistTabsRunnable;
     private int mPrivateClearColor;
+    private boolean mOnlyPrivateTabs = true;
 
     // Close all tabs including normal and private tabs.
     @RobocopTarget
@@ -211,6 +212,10 @@ public class Tabs implements BundleEventListener {
         }
     }
 
+    public synchronized void setOnlyPrivateTabs(boolean onlyPrivateTabs) {
+        mOnlyPrivateTabs = onlyPrivateTabs;
+    }
+
     public void detachFromContext() {
         mGeckoView = null;
     }
@@ -1026,7 +1031,7 @@ public class Tabs implements BundleEventListener {
         // delayLoad implies background tab
         boolean background = delayLoad || (flags & LOADURL_BACKGROUND) != 0;
 
-        boolean isPrivate = (flags & LOADURL_PRIVATE) != 0 || (intent != null && intent.getBooleanExtra(PRIVATE_TAB_INTENT_EXTRA, false));
+        boolean isPrivate = (flags & LOADURL_PRIVATE) != 0 || (intent != null && intent.getBooleanExtra(PRIVATE_TAB_INTENT_EXTRA, false)) || mOnlyPrivateTabs;
         boolean userEntered = (flags & LOADURL_USER_ENTERED) != 0;
         boolean desktopMode = (flags & LOADURL_DESKTOP) != 0;
         boolean external = (flags & LOADURL_EXTERNAL) != 0;
diff --git a/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java b/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java
index 08c107ebb62d..fc27ac03c929 100644
--- a/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java
@@ -167,6 +167,10 @@ public class TabsPanel extends LinearLayout
         final View tabNormal = mTabWidget.addTab(R.drawable.tabs_normal, R.string.tabs_normal);
         mNormalTabsPanel = tabNormal instanceof ThemedImageButton ? ((ThemedImageButton) tabNormal) : null;
 
+        if (mActivity.isOnlyPrivateTabs()) {
+            tabNormal.setVisibility(View.GONE);
+        }
+
         final View tabPrivate = mTabWidget.addTab(R.drawable.tabs_private, R.string.tabs_private);
         mPrivateTabsPanel = tabPrivate instanceof ThemedImageButton ? ((ThemedImageButton) tabPrivate) : null;
         if (mPrivateTabsPanel != null) {
diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js
index e139e59a7f40..f8e9399f51c4 100644
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -4410,9 +4410,9 @@ Tab.prototype = {
     // Must be called after appendChild so the docShell has been created.
     this.setActive(false);
 
-    let isPrivate = "isPrivate" in aParams && aParams.isPrivate;
+    let isPrivate = (("isPrivate" in aParams) && aParams.isPrivate) || Services.prefs.getBoolPref("browser.privatebrowsing.autostart");
     if (isPrivate) {
-      attrs.privateBrowsingId = 1;
+      attrs['privateBrowsingId'] = 1;
     }
 
     this.browser.docShell.setOriginAttributes(attrs);





More information about the tor-commits mailing list