Thu, 15 Jan 2015 15:59:08 +0100
Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
michael@0 | 1 | /* This Source Code Form is subject to the terms of the Mozilla Public |
michael@0 | 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
michael@0 | 3 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
michael@0 | 4 | |
michael@0 | 5 | const { Cc, Ci, Cu } = require('chrome'); |
michael@0 | 6 | const { Loader } = require('sdk/test/loader'); |
michael@0 | 7 | const loader = Loader(module); |
michael@0 | 8 | const file = require('sdk/io/file'); |
michael@0 | 9 | const httpd = loader.require('sdk/test/httpd'); |
michael@0 | 10 | const { pathFor } = require('sdk/system'); |
michael@0 | 11 | const { startServerAsync } = httpd; |
michael@0 | 12 | const basePath = pathFor('ProfD'); |
michael@0 | 13 | const { atob } = Cu.import("resource://gre/modules/Services.jsm", {}); |
michael@0 | 14 | const historyService = Cc["@mozilla.org/browser/nav-history-service;1"] |
michael@0 | 15 | .getService(Ci.nsINavHistoryService); |
michael@0 | 16 | const { events } = require('sdk/places/events'); |
michael@0 | 17 | |
michael@0 | 18 | function onFaviconChange (url, callback) { |
michael@0 | 19 | function handler ({data, type}) { |
michael@0 | 20 | if (type !== 'history-page-changed' || |
michael@0 | 21 | data.url !== url || |
michael@0 | 22 | data.property !== Ci.nsINavHistoryObserver.ATTRIBUTE_FAVICON) |
michael@0 | 23 | return; |
michael@0 | 24 | events.off('data', handler); |
michael@0 | 25 | callback(data.value); |
michael@0 | 26 | } |
michael@0 | 27 | events.on('data', handler); |
michael@0 | 28 | } |
michael@0 | 29 | exports.onFaviconChange = onFaviconChange; |
michael@0 | 30 | |
michael@0 | 31 | /* |
michael@0 | 32 | * Takes page content, a page path, and favicon binary data |
michael@0 | 33 | */ |
michael@0 | 34 | function serve ({name, favicon, port, host}) { |
michael@0 | 35 | let faviconTag = '<link rel="icon" type="image/x-icon" href="/'+ name +'.ico"/>'; |
michael@0 | 36 | let content = '<html><head>' + faviconTag + '<title>'+name+'</title></head><body></body></html>'; |
michael@0 | 37 | let srv = startServerAsync(port, basePath); |
michael@0 | 38 | let pagePath = file.join(basePath, name + '.html'); |
michael@0 | 39 | let iconPath = file.join(basePath, name + '.ico'); |
michael@0 | 40 | let pageStream = file.open(pagePath, 'w'); |
michael@0 | 41 | let iconStream = file.open(iconPath, 'wb'); |
michael@0 | 42 | iconStream.write(favicon); |
michael@0 | 43 | iconStream.close(); |
michael@0 | 44 | pageStream.write(content); |
michael@0 | 45 | pageStream.close(); |
michael@0 | 46 | return srv; |
michael@0 | 47 | } |
michael@0 | 48 | exports.serve = serve; |
michael@0 | 49 | |
michael@0 | 50 | let binFavicon = exports.binFavicon = atob('AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkpKQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAAzAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMAZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm/wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZmAABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM/wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA/wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnMmQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwzMwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZzADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8AZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+ZMwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm/wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoKCgoKCgoKCgoKCgoKCgoHAQEMbQoKCgoKCgoAAAdDH/kgHRIAAAAAAAAAAADrHfn5ASQQAAAAAAAAAArsBx0B+fkgHesAAAAAAAD/Cgwf+fn5IA4dEus/IvcACgcMAfkg+QEB+SABHushbf8QHR/5HQH5+QEdHetEHx4K7B/5+QH5+fkdDBL5+SBE/wwdJfkf+fn5AR8g+fkfEArsCh/5+QEeJR/5+SAeBwAACgoe+SAlHwFAEhAfAAAAAPcKHh8eASYBHhAMAAAAAAAA9EMdIB8gHh0dBwAAAAAAAAAA7BAdQ+wHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AADwfwAAwH8AAMB/AAAAPwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAgAcAAIAPAADADwAA8D8AAP//AAA'); |