Skip to content
This repository was archived by the owner on Dec 11, 2019. It is now read-only.

Commit 4a3f854

Browse files
committed
put private tabs in different sessions
partial fix for #6684 and #8963 TODO: Either the private tab sessions should be cleared and revert back to private session 1 when the last private tab is closed, or we need a private tab session manager menu. Currently the session will keep incrementing until the browser restarts. Test Plan: 1. open private tab 2. in the private tab, go to a site that requires login 3. login, then open a link from that site in a new private tab 4. you should also be logged in in the second private tab 5. open a new private tab 6. go to the same site. you should not be logged in.
1 parent ed4d33c commit 4a3f854

File tree

6 files changed

+107
-41
lines changed

6 files changed

+107
-41
lines changed

app/browser/tabs.js

+17-16
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const {app, BrowserWindow, extensions, session, ipcMain} = require('electron')
1212
const {makeImmutable, makeJS} = require('../common/state/immutableUtil')
1313
const {getTargetAboutUrl, getSourceAboutUrl, isSourceAboutUrl, newFrameUrl, isTargetAboutUrl, isIntermediateAboutPage, isTargetMagnetUrl, getSourceMagnetUrl} = require('../../js/lib/appUrlUtil')
1414
const {isURL, getUrlFromInput, toPDFJSLocation, getDefaultFaviconUrl, isHttpOrHttps, getLocationIfPDF} = require('../../js/lib/urlutil')
15-
const {isSessionPartition} = require('../../js/state/frameStateUtil')
15+
const {isSessionPartition, getPartitionNumber, getPartitionFromNumber} = require('../../js/state/frameStateUtil')
1616
const {getOrigin} = require('../../js/lib/urlutil')
1717
const settingsStore = require('../../js/settings')
1818
const settings = require('../../js/constants/settings')
@@ -41,7 +41,10 @@ const activeTabHistory = require('./activeTabHistory')
4141

4242
let adBlockRegions
4343
let currentPartitionNumber = 0
44-
const incrementPartitionNumber = () => ++currentPartitionNumber
44+
let currentPrivatePartitionNumber = 0
45+
const incrementPartitionNumber = (isPrivate) => isPrivate
46+
? ++currentPrivatePartitionNumber
47+
: ++currentPartitionNumber
4548

4649
const normalizeUrl = function (url) {
4750
if (isSourceAboutUrl(url)) {
@@ -76,28 +79,26 @@ const updateTab = (tabId, changeInfo = {}) => {
7679
}
7780
}
7881

79-
const getPartitionNumber = (partition) => {
80-
return Number(partition.split('persist:partition-')[1] || 0)
81-
}
82-
8382
/**
8483
* Obtains the current partition.
8584
* Warning: This function has global side effects in that it increments the
8685
* global next partition number if isPartitioned is passed into the create options.
8786
*/
8887
const getPartition = (createProperties) => {
89-
let partition = session.defaultSession.partition
9088
if (createProperties.partition) {
91-
partition = createProperties.partition
92-
} else if (createProperties.isPrivate) {
93-
partition = 'default'
94-
} else if (createProperties.isPartitioned) {
95-
partition = `persist:partition-${incrementPartitionNumber()}`
96-
} else if (createProperties.partitionNumber) {
97-
partition = `persist:partition-${createProperties.partitionNumber}`
89+
return createProperties.partition
9890
}
99-
100-
return partition
91+
if (createProperties.partitionNumber) {
92+
return getPartitionFromNumber(createProperties.partitionNumber,
93+
createProperties.isPrivate)
94+
}
95+
if (createProperties.isPrivate) {
96+
return getPartitionFromNumber(incrementPartitionNumber(true), true)
97+
}
98+
if (createProperties.isPartitioned) {
99+
return getPartitionFromNumber(incrementPartitionNumber(false), false)
100+
}
101+
return session.defaultSession.partition
101102
}
102103

103104
const needsPartitionAssigned = (createProperties) => {

app/common/state/tabContentState/partitionState.js

+3-9
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,7 @@ const frameStateUtil = require('../../../../js/state/frameStateUtil')
1010
const {tabs} = require('../../../../js/constants/config')
1111

1212
module.exports.isPartitionTab = (state, frameKey) => {
13-
const frame = frameStateUtil.getFrameByKey(state, frameKey)
14-
15-
if (frame == null) {
16-
return false
17-
}
18-
19-
return !!frame.get('partitionNumber')
13+
return module.exports.getPartitionNumber(state, frameKey) > 0
2014
}
2115

2216
module.exports.getPartitionNumber = (state, frameKey) => {
@@ -28,9 +22,9 @@ module.exports.getPartitionNumber = (state, frameKey) => {
2822

2923
const partitionNumber = frame.get('partitionNumber')
3024
if (typeof partitionNumber === 'string') {
31-
return partitionNumber.replace(/^partition-/i, '')
25+
return Number(partitionNumber.replace(/^partition-/i, ''))
3226
}
33-
return partitionNumber
27+
return Number(partitionNumber)
3428
}
3529

3630
module.exports.getMaxAllowedPartitionNumber = (state, frameKey) => {

app/renderer/components/main/siteInfo.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ class SiteInfo extends React.Component {
105105
}
106106

107107
get partitionInfo () {
108-
if (this.props.partitionNumber) {
108+
if (this.props.partitionNumber > 0) {
109109
// Figure out the partition info display
110110
let l10nArgs = {
111111
partitionNumber: this.props.partitionNumber

js/state/frameStateUtil.js

+21-10
Original file line numberDiff line numberDiff line change
@@ -289,31 +289,42 @@ function isAncestorFrameKey (state, frame, parentFrameKey) {
289289
return isAncestorFrameKey(state, parentFrame, parentFrameKey)
290290
}
291291

292+
/**
293+
* @param {string} partition - the name of the partition
294+
* @returns {number}
295+
*/
292296
function getPartitionNumber (partition) {
293-
const regex = /(?:persist:)?partition-(\d+)/
297+
const regex = /^(?:persist:)?partition-(\d+)$/
294298
const matches = regex.exec(partition)
295-
return Number((matches && matches[1]) || 0)
299+
const partitionNumber = Number((matches && matches[1]) || 0)
300+
// Return negative numbers for private sessions to avoid conflicts with
301+
// regular sessions
302+
return isPrivatePartition(partition) ? -partitionNumber : partitionNumber
296303
}
297304

298305
function isPrivatePartition (partition) {
299-
return partition && !partition.startsWith('persist:')
306+
if (partition === '') {
307+
return true
308+
}
309+
if (partition) {
310+
return !partition.startsWith('persist:')
311+
}
312+
return false
300313
}
301314

302315
function isSessionPartition (partition) {
303-
return partition && partition.startsWith('persist:partition-')
316+
return partition &&
317+
(partition.startsWith('persist:partition-') || partition.startsWith('partition-'))
304318
}
305319

306320
function getPartition (frameOpts) {
307321
return getPartitionFromNumber(frameOpts.get('partitionNumber'), frameOpts.get('isPrivate'))
308322
}
309323

310324
function getPartitionFromNumber (partitionNumber, incognito) {
311-
if (!partitionNumber && !incognito) {
312-
return 'persist:default'
313-
} else if (incognito) {
314-
return 'default'
315-
}
316-
return `persist:partition-${partitionNumber}`
325+
const partition = partitionNumber ? `partition-${Math.abs(partitionNumber)}` : 'default'
326+
const prefix = incognito ? '' : 'persist:'
327+
return `${prefix}${partition}`
317328
}
318329

319330
const frameOptsFromFrame = (frame) => {

test/unit/app/common/state/tabContentStateTest/partitionStateTest.js

+29-5
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ describe('partitionState unit tests', function () {
5252
assert.equal(partitionState.isPartitionTab(), false)
5353
})
5454

55-
it('returns true if partition number is defined', function * () {
55+
it('returns true if partition number is positive', function * () {
5656
const partitionNumber = 1337
5757
const state = defaultState
5858
.setIn(['frames', index, 'partitionNumber'], partitionNumber)
@@ -65,15 +65,33 @@ describe('partitionState unit tests', function () {
6565
const result = partitionState.isPartitionTab(state, frameKey)
6666
assert.equal(result, false)
6767
})
68+
69+
it('returns false if partition number is 0', function * () {
70+
const partitionNumber = 0
71+
const state = defaultState
72+
.setIn(['frames', index, 'partitionNumber'], partitionNumber)
73+
const result = partitionState.isPartitionTab(state, frameKey)
74+
assert.equal(result, false)
75+
})
76+
77+
it('returns false if partition number is negative', function * () {
78+
const partitionNumber = -10
79+
const state = defaultState
80+
.setIn(['frames', index, 'partitionNumber'], partitionNumber)
81+
const result = partitionState.isPartitionTab(state, frameKey)
82+
assert.equal(result, false)
83+
})
6884
})
6985

7086
describe('getPartitionNumber', function () {
7187
it('returns zero if frame is null/undefined', function * () {
7288
assert.equal(partitionState.getPartitionNumber(), 0)
7389
})
7490

75-
it('returns zero if frame is null/undefined', function * () {
76-
assert.equal(partitionState.getPartitionNumber(), 0)
91+
it('returns zero if partition number is null/undefined', function * () {
92+
const state = defaultState
93+
.setIn(['frames', index, 'partitionNumber'], null)
94+
assert.equal(partitionState.getPartitionNumber(state, frameKey), 0)
7795
})
7896

7997
it('can remove _partition_ string and keep the partition number', function * () {
@@ -95,8 +113,14 @@ describe('partitionState unit tests', function () {
95113
})
96114

97115
describe('getMaxAllowedPartitionNumber', function () {
98-
it('returns false if frame is null/undefined', function () {
99-
assert.equal(partitionState.getMaxAllowedPartitionNumber(), false)
116+
it('returns zero if frame is null/undefined', function () {
117+
assert.equal(partitionState.getMaxAllowedPartitionNumber(), 0)
118+
})
119+
120+
it('returns zero if partition number is null/undefined', function * () {
121+
const state = defaultState
122+
.setIn(['frames', index, 'partitionNumber'], null)
123+
assert.equal(partitionState.getMaxAllowedPartitionNumber(state, frameKey), 0)
100124
})
101125

102126
it('returns partition number', function * () {

test/unit/state/frameStateUtilTest.js

+36
Original file line numberDiff line numberDiff line change
@@ -492,4 +492,40 @@ describe('frameStateUtil', function () {
492492
assert.equal(result, true)
493493
})
494494
})
495+
496+
describe('partition utils', function () {
497+
it('getPartitionNumber', function () {
498+
const getPartitionNumber = frameStateUtil.getPartitionNumber
499+
assert.equal(getPartitionNumber(''), 0)
500+
assert.equal(getPartitionNumber('1'), 0)
501+
assert.equal(getPartitionNumber('partition-1'), -1)
502+
assert.equal(getPartitionNumber('partition-222'), -222)
503+
assert.equal(getPartitionNumber('partition-222.1'), 0)
504+
assert.equal(getPartitionNumber('persist:partition-1'), 1)
505+
assert.equal(getPartitionNumber('unpersist:partition-1'), 0)
506+
assert.equal(getPartitionNumber('persist:partition-10'), 10)
507+
assert.equal(getPartitionNumber('persist:partition'), 0)
508+
})
509+
it('isPrivatePartition', function () {
510+
const isPrivatePartition = frameStateUtil.isPrivatePartition
511+
assert.equal(isPrivatePartition(''), true)
512+
assert.equal(isPrivatePartition('partition-1'), true)
513+
assert.equal(isPrivatePartition('persist:partition-1'), false)
514+
})
515+
it('isSessionPartition', function () {
516+
const isSessionPartition = frameStateUtil.isSessionPartition
517+
assert.equal(isSessionPartition(''), false)
518+
assert.equal(isSessionPartition('default'), false)
519+
assert.equal(isSessionPartition('partition-1'), true)
520+
assert.equal(isSessionPartition('persist:partition-1'), true)
521+
})
522+
it('getPartitionFromNumber', function () {
523+
const getPartitionFromNumber = frameStateUtil.getPartitionFromNumber
524+
assert.equal(getPartitionFromNumber(0, true), 'default')
525+
assert.equal(getPartitionFromNumber(0, false), 'persist:default')
526+
assert.equal(getPartitionFromNumber(1, true), 'partition-1')
527+
assert.equal(getPartitionFromNumber(-10, true), 'partition-10')
528+
assert.equal(getPartitionFromNumber(1, false), 'persist:partition-1')
529+
})
530+
})
495531
})

0 commit comments

Comments
 (0)