diff --git a/.gitignore b/.gitignore index 929d8b5..ca69aa0 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ build dist /pyLibrary/.svn +/results diff --git a/bzETL/alias_analysis.py b/bzETL/alias_analysis.py index 04e4277..b21c778 100644 --- a/bzETL/alias_analysis.py +++ b/bzETL/alias_analysis.py @@ -1,12 +1,26 @@ +# encoding: utf-8 +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. +# +# Author: Kyle Lahnakoski (kyle@lahnakoski.com) +# + +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + from bzETL.extract_bugzilla import get_all_cc_changes -from pyLibrary.env import startup, elasticsearch -from pyLibrary.cnv import CNV -from pyLibrary.queries.es_query import ESQuery -from pyLibrary.sql.db import DB -from pyLibrary.env.logs import Log -from pyLibrary.collections.multiset import Multiset -from pyLibrary.queries import Q -from pyLibrary.struct import nvl, set_default +from pyLibrary import convert +from pyLibrary.collections import Multiset +from pyLibrary.debugs import startup +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import set_default, coalesce +from pyLibrary.env import elasticsearch +from pyLibrary.queries import qb +from pyLibrary.queries.qb_usingES import FromES +from pyLibrary.sql.mysql import MySQL def full_analysis(settings, bug_list=None, please_stop=None): @@ -24,18 +38,18 @@ def full_analysis(settings, bug_list=None, please_stop=None): analyzer = AliasAnalyzer(settings.alias) if bug_list: - with DB(settings.bugzilla, readonly=True) as db: + with MySQL(settings.bugzilla, readonly=True) as db: data = get_all_cc_changes(db, bug_list) analyzer.aggregator(data) analyzer.analysis(True, please_stop) return - with DB(settings.bugzilla, readonly=True) as db: - start = nvl(settings.alias.start, 0) - end = nvl(settings.alias.end, db.query("SELECT max(bug_id)+1 bug_id FROM bugs")[0].bug_id) + with MySQL(settings.bugzilla, readonly=True) as db: + start = coalesce(settings.alias.start, 0) + end = coalesce(settings.alias.end, db.query("SELECT max(bug_id)+1 bug_id FROM bugs")[0].bug_id) #Perform analysis on blocks of bugs, in case we crash partway through - for s, e in Q.intervals(start, end, settings.alias.increment): + for s, e in qb.intervals(start, end, settings.alias.increment): Log.note("Load range {{start}}-{{end}}", { "start": s, "end": e @@ -56,7 +70,7 @@ class AliasAnalyzer(object): try: a = set_default({}, settings.elasticsearch, {"type":"alias"}) self.es = elasticsearch.Cluster(settings.elasticsearch).get_or_create_index(a, ALIAS_SCHEMA, limit_replicas=True) - self.esq = ESQuery(self.es) + self.esq = FromES(self.es) result = self.esq.query({ "from":"bug_aliases", "select":["canonical", "alias"] @@ -69,7 +83,7 @@ class AliasAnalyzer(object): # LOAD THE NON-MATCHES na = set_default({}, settings.elasticsearch, {"type":"not_alias"}) es = elasticsearch.Cluster(na).get_or_create_index(na) - esq = ESQuery(es) + esq = FromES(es) result = esq.query({ "from":"bug_aliases", "select":["canonical", "alias"] @@ -110,7 +124,7 @@ class AliasAnalyzer(object): if count < 0: problem_agg.add(self.alias(email)["canonical"], amount=count) - problems = Q.sort([ + problems = qb.sort([ {"email": e, "count": c} for e, c in problem_agg.dic.iteritems() if not self.not_aliases.get(e, None) and (c <= -(DIFF / 2) or last_run) @@ -126,7 +140,7 @@ class AliasAnalyzer(object): for bug_id, agg in self.bugs.iteritems(): if agg.dic.get(problem.email, 0) < 0: #ONLY BUGS THAT ARE EXPERIENCING THIS problem solution_agg += agg - solutions = Q.sort([{"email": e, "count": c} for e, c in solution_agg.dic.iteritems()], [{"field": "count", "sort": -1}, "email"]) + solutions = qb.sort([{"email": e, "count": c} for e, c in solution_agg.dic.iteritems()], [{"field": "count", "sort": -1}, "email"]) if last_run and len(solutions) == 2 and solutions[0].count == -solutions[1].count: #exact match @@ -140,7 +154,7 @@ class AliasAnalyzer(object): "problem": problem.email, "score": problem.count, "solution": best_solution.email, - "matches": CNV.object2JSON(Q.select(solutions, "count")[:10:]) + "matches": convert.value2json(qb.select(solutions, "count")[:10:]) }) try_again = True self.add_alias(problem.email, best_solution.email) diff --git a/bzETL/bz_etl.py b/bzETL/bz_etl.py index 897f3b9..fb54ea0 100644 --- a/bzETL/bz_etl.py +++ b/bzETL/bz_etl.py @@ -1,6 +1,5 @@ # encoding: utf-8 # -# # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. @@ -8,26 +7,27 @@ # Author: Kyle Lahnakoski (kyle@lahnakoski.com) # +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + # REPLACES THE KETTLE FLOW CONTROL PROGRAM, AND BASH SCRIPT - - -from pyLibrary.maths import Math -from pyLibrary import struct, jsons -from pyLibrary.env.logs import Log -from pyLibrary.struct import Struct, nvl +from bzETL import extract_bugzilla, transform_bugzilla, alias_analysis, parse_bug_history +from bzETL.extract_bugzilla import * +from bzETL.parse_bug_history import BugHistoryParser +from pyLibrary import jsons, convert +from pyLibrary.debugs import startup, constants +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import wrap, coalesce, Dict, listwrap, set_default +from pyLibrary.env import elasticsearch +from pyLibrary.env.elasticsearch import Cluster from pyLibrary.env.files import File -from pyLibrary.env import startup -from pyLibrary.thread.threads import Queue, Thread, AllThread, Lock, ThreadedQueue -from pyLibrary.cnv import CNV -from pyLibrary.env.elasticsearch import ElasticSearch -from pyLibrary.queries import Q -from pyLibrary.sql.db import DB - -from bzETL import parse_bug_history, transform_bugzilla, extract_bugzilla, alias_analysis +from pyLibrary.maths import Math +from pyLibrary.queries import qb +from pyLibrary.sql.mysql import MySQL +from pyLibrary.thread.threads import Lock, AllThread, Thread, Queue, ThreadedQueue from pyLibrary.times.timer import Timer -from extract_bugzilla import get_private_bugs_for_delete, get_recent_private_attachments, get_recent_private_comments, get_comments, get_comments_by_id, get_recent_private_bugs, get_current_time, get_bugs, get_dependencies, get_flags, get_new_activities, get_bug_see_also, get_attachments, get_tracking_flags, get_keywords, get_cc, get_bug_groups, get_duplicates -from parse_bug_history import BugHistoryParser db_cache_lock = Lock() @@ -55,14 +55,14 @@ def etl_comments(db, es, param, please_stop): # CONNECTIONS ARE EXPENSIVE, CACHE HERE with comment_db_cache_lock: if not comment_db_cache: - comment_db = DB(db) + comment_db = MySQL(db.settings) comment_db_cache.append(comment_db) with comment_db_cache_lock: Log.note("Read comments from database") comments = get_comments(comment_db_cache[0], param) - for g, c in Q.groupby(comments, size=500): + for g, c in qb.groupby(comments, size=500): with Timer("Write {{num}} comments to ElasticSearch", {"num": len(c)}): es.extend({"id": cc.comment_id, "value": cc} for cc in c) @@ -72,27 +72,35 @@ def etl(db, output_queue, param, please_stop): PROCESS RANGE, AS SPECIFIED IN param AND PUSH BUG VERSION RECORDS TO output_queue """ + NUM_CONNECTIONS = 10 - # CONNECTIONS ARE EXPENSIVE, CACHE HERE + # MAKING CONNECTIONS ARE EXPENSIVE, CACHE HERE with db_cache_lock: if not db_cache: with Timer("open connections to db"): - for f in get_stuff_from_bugzilla: - db = DB(db) - db_cache.append(db) + for i in range(NUM_CONNECTIONS): + db_cache.append(MySQL(db.settings)) - db_results = Queue(max=2**30) - with db_cache_lock: - # ASYMMETRIC MULTI THREADING TO GET RECORDS FROM DB - with AllThread() as all: - for i, f in enumerate(get_stuff_from_bugzilla): - def process(target, db, param, please_stop): - db_results.extend(target(db, param)) + db_results = Queue(name="db results", max=2**30) - all.add(process, f, db_cache[i], param.copy()) + def get_records_from_bugzilla(db, param, please_stop): + for get_stuff in get_stuff_from_bugzilla: + if please_stop: + break + db_results.extend(get_stuff(db, param)) + + with AllThread() as all: + with db_cache_lock: + # SPLIT TASK EVENLY, HAVE EACH BUG USE SAME CONNECTION FOR ALL DATA + size = Math.ceiling(float(len(param.bug_list))/float(10)) + for g, bug_ids in qb.groupby(param.bug_list, size=size): + all.add(get_records_from_bugzilla, db_cache[g], set_default( + {"bug_list": bug_ids}, + param + )) db_results.add(Thread.STOP) - sorted = Q.sort(db_results, [ + sorted = qb.sort(db_results, [ "bug_id", "_merge_order", {"field": "modified_ts", "sort": -1}, @@ -102,7 +110,7 @@ def etl(db, output_queue, param, please_stop): process = BugHistoryParser(param, output_queue) for s in sorted: process.processRow(s) - process.processRow(struct.wrap({"bug_id": parse_bug_history.STOP_BUG, "_merge_order": 1})) + process.processRow(wrap({"bug_id": parse_bug_history.STOP_BUG, "_merge_order": 1})) def run_both_etl(db, output_queue, es_comments, param): @@ -128,8 +136,8 @@ def setup_es(settings, db, es, es_comments): # INCREMENTAL UPDATE; DO NOT MAKE NEW INDEX last_run_time = long(File(settings.param.last_run_time).read()) if not es: - es = ElasticSearch(settings.es) - es_comments = ElasticSearch(settings.es_comments) + es = elasticsearch.Index(settings.es) + es_comments = elasticsearch.Index(settings.es_comments) elif File(settings.param.first_run_time).exists: # DO NOT MAKE NEW INDEX, CONTINUE INITIAL FILL try: @@ -137,17 +145,17 @@ def setup_es(settings, db, es, es_comments): current_run_time = long(File(settings.param.first_run_time).read()) if not es: if not settings.es.alias: - temp = ElasticSearch(settings.es).get_proto(settings.es.index) + temp = Cluster(settings.es).get_proto(settings.es.index) settings.es.alias = settings.es.index settings.es.index = temp.last() - es = ElasticSearch(settings.es) + es = elasticsearch.Index(settings.es) es.set_refresh_interval(1) #REQUIRED SO WE CAN SEE WHAT BUGS HAVE BEEN LOADED ALREADY if not settings.es_comments.alias: - temp = ElasticSearch(settings.es_comments).get_proto(settings.es_comments.index) + temp = Cluster(settings.es_comments).get_proto(settings.es_comments.index) settings.es_comments.alias = settings.es_comments.index settings.es_comments.index = temp.last() - es_comments = ElasticSearch(settings.es_comments) + es_comments = elasticsearch.Index(settings.es_comments) except Exception, e: Log.warning("can not resume ETL, restarting", e) File(settings.param.first_run_time).delete() @@ -160,23 +168,23 @@ def setup_es(settings, db, es, es_comments): schema = File(settings.es.schema_file).read() if transform_bugzilla.USE_ATTACHMENTS_DOT: schema = schema.replace("attachments_", "attachments\\.") - schema=CNV.JSON2object(schema, paths=True) + schema=convert.json2value(schema, paths=True) schema.settings=jsons.expand_dot(schema.settings) if not settings.es.alias: settings.es.alias = settings.es.index - settings.es.index = ElasticSearch.proto_name(settings.es.alias) - es = ElasticSearch.create_index(settings.es, schema, limit_replicas=True) + settings.es.index = Cluster.proto_name(settings.es.alias) + es = Cluster.create_index(settings.es, schema, limit_replicas=True) # BUG COMMENTS comment_schema = File(settings.es_comments.schema_file).read() - comment_schema=CNV.JSON2object(comment_schema, paths=True) + comment_schema=convert.json2value(comment_schema, paths=True) comment_schema.settings=jsons.expand_dot(comment_schema.settings) if not settings.es_comments.alias: settings.es_comments.alias = settings.es_comments.index - settings.es_comments.index = ElasticSearch.proto_name(settings.es_comments.alias) - es_comments = ElasticSearch.create_index(settings.es_comments, comment_schema, limit_replicas=True) + settings.es_comments.index = Cluster.proto_name(settings.es_comments.alias) + es_comments = Cluster.create_index(settings.es_comments, comment_schema, limit_replicas=True) - File(settings.param.first_run_time).write(unicode(CNV.datetime2milli(current_run_time))) + File(settings.param.first_run_time).write(unicode(convert.datetime2milli(current_run_time))) return current_run_time, es, es_comments, last_run_time @@ -190,7 +198,7 @@ def incremental_etl(settings, param, db, es, es_comments, output_queue): #REMOVE PRIVATE BUGS private_bugs = get_private_bugs_for_delete(db, param) Log.note("Ensure the following private bugs are deleted:\n{{private_bugs|indent}}", {"private_bugs": sorted(private_bugs)}) - for g, delete_bugs in Q.groupby(private_bugs, size=1000): + for g, delete_bugs in qb.groupby(private_bugs, size=1000): still_existing = get_bug_ids(es, {"terms": {"bug_id": delete_bugs}}) if still_existing: Log.note("Ensure the following existing private bugs are deleted:\n{{private_bugs|indent}}", {"private_bugs": sorted(still_existing)}) @@ -212,7 +220,7 @@ def incremental_etl(settings, param, db, es, es_comments, output_queue): #REMOVE **RECENT** PRIVATE ATTACHMENTS private_attachments = get_recent_private_attachments(db, param) - bugs_to_refresh = set(Q.select(private_attachments, "bug_id")) + bugs_to_refresh = set(qb.select(private_attachments, "bug_id")) es.delete_record({"terms": {"bug_id": bugs_to_refresh}}) #REBUILD BUGS THAT GOT REMOVED @@ -234,7 +242,7 @@ def incremental_etl(settings, param, db, es, es_comments, output_queue): #REFRESH COMMENTS WITH PRIVACY CHANGE private_comments = get_recent_private_comments(db, param) - comment_list = set(Q.select(private_comments, "comment_id")) | {0} + comment_list = set(qb.select(private_comments, "comment_id")) | {0} es_comments.delete_record({"terms": {"comment_id": comment_list}}) changed_comments = get_comments_by_id(db, comment_list, param) es_comments.extend({"id": c.comment_id, "value": c} for c in changed_comments) @@ -242,7 +250,7 @@ def incremental_etl(settings, param, db, es, es_comments, output_queue): #GET LIST OF CHANGED BUGS with Timer("time to get changed bug list"): if param.allow_private_bugs: - bug_list = Q.select(db.query(""" + bug_list = qb.select(db.query(""" SELECT b.bug_id FROM @@ -253,7 +261,7 @@ def incremental_etl(settings, param, db, es, es_comments, output_queue): "start_time_str": param.start_time_str }), u"bug_id") else: - bug_list = Q.select(db.query(""" + bug_list = qb.select(db.query(""" SELECT b.bug_id FROM @@ -286,10 +294,10 @@ def incremental_etl(settings, param, db, es, es_comments, output_queue): def full_etl(resume_from_last_run, settings, param, db, es, es_comments, output_queue): with Thread.run("alias_analysis", alias_analysis.full_analysis, settings=settings): - end = nvl(settings.param.end, db.query("SELECT max(bug_id)+1 bug_id FROM bugs")[0].bug_id) - start = nvl(settings.param.start, 0) + end = coalesce(settings.param.end, db.query("SELECT max(bug_id)+1 bug_id FROM bugs")[0].bug_id) + start = coalesce(settings.param.start, 0) if resume_from_last_run: - start = nvl(settings.param.start, Math.floor(get_max_bug_id(es), settings.param.increment)) + start = coalesce(settings.param.start, Math.floor(get_max_bug_id(es), settings.param.increment)) ############################################################# ## MAIN ETL LOOP @@ -297,7 +305,7 @@ def full_etl(resume_from_last_run, settings, param, db, es, es_comments, output_ #TWO WORKERS IS MORE THAN ENOUGH FOR A SINGLE THREAD # with Multithread([run_both_etl, run_both_etl]) as workers: - for min, max in Q.intervals(start, end, settings.param.increment): + for min, max in qb.intervals(start, end, settings.param.increment): if settings.args.quick and min < end - settings.param.increment and min != 0: #--quick ONLY DOES FIRST AND LAST BLOCKS continue @@ -306,7 +314,7 @@ def full_etl(resume_from_last_run, settings, param, db, es, es_comments, output_ #GET LIST OF CHANGED BUGS with Timer("time to get {{min}}..{{max}} bug list", {"min":min, "max":max}): if param.allow_private_bugs: - bug_list = Q.select(db.query(""" + bug_list = qb.select(db.query(""" SELECT b.bug_id FROM @@ -320,7 +328,7 @@ def full_etl(resume_from_last_run, settings, param, db, es, es_comments, output_ "start_time_str": param.start_time_str }), u"bug_id") else: - bug_list = Q.select(db.query(""" + bug_list = qb.select(db.query(""" SELECT b.bug_id FROM @@ -363,17 +371,17 @@ def main(settings, es=None, es_comments=None): #MAKE HANDLES TO CONTAINERS try: - with DB(settings.bugzilla, readonly=True) as db: + with MySQL(settings.bugzilla, readonly=True) as db: current_run_time, es, es_comments, last_run_time = setup_es(settings, db, es, es_comments) - with ThreadedQueue(es, size=500, silent=True) as output_queue: + with ThreadedQueue(es, max_size=500, silent=True) as output_queue: #SETUP RUN PARAMETERS - param = Struct() - param.end_time = CNV.datetime2milli(get_current_time(db)) - # DB WRITES ARE DELAYED, RESULTING IN UNORDERED bug_when IN bugs_activity (AS IS ASSUMED FOR bugs(delats_ts)) + param = Dict() + param.end_time = convert.datetime2milli(get_current_time(db)) + # MySQL WRITES ARE DELAYED, RESULTING IN UNORDERED bug_when IN bugs_activity (AS IS ASSUMED FOR bugs(delats_ts)) # THIS JITTER IS USUALLY NO MORE THAN ONE SECOND, BUT WE WILL GO BACK 60sec, JUST IN CASE. # THERE ARE OCCASIONAL WRITES THAT ARE IN GMT, BUT SINCE THEY LOOK LIKE THE FUTURE, WE CAPTURE THEM - param.start_time = last_run_time - nvl(settings.param.look_back, 5 * 60 * 1000) # 5 MINUTE LOOK_BACK + param.start_time = last_run_time - coalesce(settings.param.look_back, 5 * 60 * 1000) # 5 MINUTE LOOK_BACK param.start_time_str = extract_bugzilla.milli2string(db, param.start_time) param.alias_file = settings.param.alias_file param.allow_private_bugs = settings.param.allow_private_bugs @@ -395,7 +403,7 @@ def main(settings, es=None, es_comments=None): es.delete_all_but(settings.es_comments.alias, settings.es_comments.index) es_comments.add_alias(settings.es_comments.alias) - File(settings.param.last_run_time).write(unicode(CNV.datetime2milli(current_run_time))) + File(settings.param.last_run_time).write(unicode(convert.datetime2milli(current_run_time))) except Exception, e: Log.error("Problem with main ETL loop", e) finally: @@ -454,11 +462,13 @@ def get_max_bug_id(es): def close_db_connections(): - (globals()["db_cache"], temp) = ([], db_cache) + global db_cache, comment_db_cache + + db_cache, temp = [], db_cache for db in temp: db.close() - (globals()["comment_db_cache"], temp) = ([], comment_db_cache) + comment_db_cache, temp = [], comment_db_cache for db in temp: db.close() @@ -476,10 +486,11 @@ def start(): "action": "store_true", "dest": "restart" }]) + constants.set(settings.constants) with startup.SingleInstance(flavor_id=settings.args.filename): if settings.args.restart: - for l in struct.listwrap(settings.debug.log): + for l in listwrap(settings.debug.log): if l.filename: File(l.filename).parent.delete() File(settings.param.first_run_time).delete() diff --git a/bzETL/extract_bugzilla.py b/bzETL/extract_bugzilla.py index 80ff3b0..b285b8e 100644 --- a/bzETL/extract_bugzilla.py +++ b/bzETL/extract_bugzilla.py @@ -1,26 +1,26 @@ # encoding: utf-8 # -# # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. # -# PYTHON VERSION OF https://github.com/mozilla-metrics/bugzilla_etl/blob/master/transformations/bugzilla_to_json.ktr # Author: Kyle Lahnakoski (kyle@lahnakoski.com) # + +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + from bzETL.parse_bug_history import MAX_TIME -from pyLibrary.cnv import CNV -from pyLibrary.queries.db_query import esfilter2sqlwhere -from pyLibrary.sql.db import SQL - -from pyLibrary.env.logs import Log -from pyLibrary.queries import Q -from pyLibrary.struct import Struct - - -#ALL BUGS IN PRIVATE ETL HAVE SCREENED FIELDS +from pyLibrary import convert +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import Dict +from pyLibrary.queries import qb +from pyLibrary.queries.qb_usingMySQL import esfilter2sqlwhere +from pyLibrary.sql import SQL from pyLibrary.times.timer import Timer +#ALL BUGS IN PRIVATE ETL HAVE SCREENED FIELDS SCREENED_FIELDDEFS = [ 19, #bug_file_loc 24, #short_desc @@ -67,7 +67,7 @@ def get_current_time(db): SELECT UNIX_TIMESTAMP(now()) `value` """)[0].value - return CNV.unix2datetime(output) + return convert.unix2datetime(output) def milli2string(db, value): @@ -90,7 +90,7 @@ def get_screened_whiteboard(db): groups = db.query("SELECT id FROM groups WHERE {{where}}", { "where": esfilter2sqlwhere(db, {"terms": {"name": SCREENED_WHITEBOARD_BUG_GROUPS}}) }) - globals()["SCREENED_BUG_GROUP_IDS"] = Q.select(groups, "id") + globals()["SCREENED_BUG_GROUP_IDS"] = qb.select(groups, "id") def get_bugs_table_columns(db, schema_name): @@ -226,7 +226,7 @@ def get_bugs(db, param): else: return db.quote_column(col.column_name) - param.bugs_columns = Q.select(bugs_columns, "column_name") + param.bugs_columns = qb.select(bugs_columns, "column_name") param.bugs_columns_SQL = SQL(",\n".join([lower(c) for c in bugs_columns])) param.bug_filter = esfilter2sqlwhere(db, {"terms": {"b.bug_id": param.bug_list}}) param.screened_whiteboard = esfilter2sqlwhere(db, {"and": [ @@ -290,7 +290,7 @@ def get_bugs(db, param): def flatten_bugs_record(r, output): for field_name, value in r.items(): if value != "---": - newRow = Struct() + newRow = Dict() newRow.bug_id = r.bug_id newRow.modified_ts = r.modified_ts newRow.modified_by = r.modified_by @@ -523,7 +523,7 @@ def flatten_attachments(data): for k,v in r.items(): if k=="bug_id": continue - output.append(Struct( + output.append(Dict( bug_id=r.bug_id, modified_ts=r.modified_ts, modified_by=r.modified_by, diff --git a/bzETL/parse_bug_history.py b/bzETL/parse_bug_history.py index 8cc2ebe..9b43b64 100644 --- a/bzETL/parse_bug_history.py +++ b/bzETL/parse_bug_history.py @@ -1,11 +1,11 @@ # encoding: utf-8 # -# # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. # - +# Author: Kyle Lahnakoski (kyle@lahnakoski.com) +# # Workflow: # Create the current state object @@ -37,20 +37,20 @@ from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + import re import math -from pyLibrary import struct, strings + +from pyLibrary import convert, strings from pyLibrary.collections import MIN -from pyLibrary.strings import apply_diff -from pyLibrary.struct import nvl, StructList, unwrap, wrap -from pyLibrary.cnv import CNV -from pyLibrary.env.logs import Log -from pyLibrary.queries import Q -from pyLibrary.struct import Struct, Null +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import Null, wrap, DictList, Dict, coalesce, unwrap, inverse from pyLibrary.env.files import File - -from transform_bugzilla import normalize, NUMERIC_FIELDS, MULTI_FIELDS, DIFF_FIELDS - +from pyLibrary.queries import qb +from pyLibrary.strings import apply_diff +from bzETL.transform_bugzilla import normalize, NUMERIC_FIELDS, MULTI_FIELDS, DIFF_FIELDS # Used to split a flag into (type, status [,requestee]) @@ -76,7 +76,7 @@ MAX_TIME = 9999999999000 class BugHistoryParser(): def __init__(self, settings, output_queue): self.aliases = Null - self.startNewBug(struct.wrap({"bug_id": 0, "modified_ts": 0, "_merge_order": 1})) + self.startNewBug(wrap({"bug_id": 0, "modified_ts": 0, "_merge_order": 1})) self.prevActivityID = Null self.prev_row = Null self.settings = settings @@ -107,8 +107,8 @@ class BugHistoryParser(): # Bugzilla bug workaround - some values were truncated, introducing uncertainty / errors: # https://bugzilla.mozilla.org/show_bug.cgi?id=55161 if row_in.field_name in TRUNC_FIELDS: - added = CNV.value2string(row_in.new_value) - removed = CNV.value2string(row_in.old_value) + added = convert.value2string(row_in.new_value) + removed = convert.value2string(row_in.old_value) uncertain = False if added in ["? ?", "?"]: # Unknown value extracted from a possibly truncated field @@ -131,7 +131,7 @@ class BugHistoryParser(): # Process the "uncertain" flag as an activity # WE ARE GOING BACKWARDS IN TIME, SO MARKUP PAST Log.note("[Bug {{bug_id}}]: PROBLEM Setting this bug to be uncertain.", {"bug_id": self.currBugID}) - self.processBugsActivitiesTableItem(struct.wrap({ + self.processBugsActivitiesTableItem(wrap({ "modified_ts": row_in.modified_ts, "modified_by": row_in.modified_by, "field_name": "uncertain", @@ -144,7 +144,7 @@ class BugHistoryParser(): return # Treat timestamps as int values - new_value = CNV.value2int(row_in.new_value) if row_in.field_name.endswith("_ts") else row_in.new_value + new_value = convert.value2int(row_in.new_value) if row_in.field_name.endswith("_ts") else row_in.new_value # Determine where we are in the bug processing workflow @@ -181,11 +181,11 @@ class BugHistoryParser(): def startNewBug(self, row_in): self.prevBugID = row_in.bug_id - self.bugVersions = StructList() - self.bugVersionsMap = Struct() - self.currActivity = Struct() - self.currBugAttachmentsMap = Struct() - self.currBugState = Struct( + self.bugVersions = DictList() + self.bugVersionsMap = Dict() + self.currActivity = Dict() + self.currBugAttachmentsMap = Dict() + self.currBugState = Dict( _id=BugHistoryParser.uid(row_in.bug_id, row_in.modified_ts), bug_id=row_in.bug_id, modified_ts=row_in.modified_ts, @@ -199,7 +199,7 @@ class BugHistoryParser(): #WE FORCE ADD ALL SETS, AND WE WILL scrub() THEM OUT LATER IF NOT USED for f in MULTI_FIELDS: self.currBugState[f] = set([]) - self.currBugState.flags = StructList() #FLAGS ARE MULTI_FIELDS, BUT ARE ALSO STRUCTS, SO MUST BE IN AN ARRAY + self.currBugState.flags = DictList() #FLAGS ARE MULTI_FIELDS, BUT ARE ALSO STRUCTS, SO MUST BE IN AN ARRAY if row_in._merge_order != 1: # Problem: No entry found in the 'bugs' table. @@ -229,7 +229,7 @@ class BugHistoryParser(): if currActivityID != self.prevActivityID: self.prevActivityID = currActivityID - self.currActivity = Struct( + self.currActivity = Dict( _id=currActivityID, modified_ts=row_in.modified_ts, modified_by=row_in.modified_by, @@ -251,7 +251,7 @@ class BugHistoryParser(): "modified_ts": row_in.modified_ts, "created_ts": row_in.created_ts, "modified_by": row_in.modified_by, - "flags": StructList() + "flags": DictList() } self.currBugAttachmentsMap[unicode(row_in.attach_id)] = att @@ -292,7 +292,7 @@ class BugHistoryParser(): if currActivityID != self.prevActivityID: self.currActivity = self.bugVersionsMap[currActivityID] if self.currActivity == None: - self.currActivity = Struct( + self.currActivity = Dict( _id=currActivityID, modified_ts=row_in.modified_ts, modified_by=row_in.modified_by, @@ -377,7 +377,7 @@ class BugHistoryParser(): def populateIntermediateVersionObjects(self): # Make sure the self.bugVersions are in descending order by modification time. # They could be mixed because of attachment activity - self.bugVersions = Q.sort(self.bugVersions, [ + self.bugVersions = qb.sort(self.bugVersions, [ {"field": "modified_ts", "sort": -1} ]) @@ -385,7 +385,7 @@ class BugHistoryParser(): prevValues = {} currVersion = Null # Prime the while loop with an empty next version so our first iteration outputs the initial bug state - nextVersion = Struct(_id=self.currBugState._id, changes=[]) + nextVersion = Dict(_id=self.currBugState._id, changes=[]) flagMap = {} # A monotonically increasing version number (useful for debugging) @@ -431,7 +431,7 @@ class BugHistoryParser(): mergeBugVersion = True # Link this version to the next one (if there is a next one) - self.currBugState.expires_on = nvl(nextVersion.modified_ts, MAX_TIME) + self.currBugState.expires_on = coalesce(nextVersion.modified_ts, MAX_TIME) # Copy all attributes from the current version into self.currBugState for propName, propValue in currVersion.items(): @@ -439,7 +439,7 @@ class BugHistoryParser(): # Now walk self.currBugState forward in time by applying the changes from currVersion #BE SURE TO APPLY REMOVES BEFORE ADDS, JUST IN CASE BOTH HAPPENED TO ONE FIELD - changes = Q.sort(currVersion.changes, ["attach_id", "field_name", {"field": "old_value", "sort": -1}, "new_value"]) + changes = qb.sort(currVersion.changes, ["attach_id", "field_name", {"field": "old_value", "sort": -1}, "new_value"]) currVersion.changes = changes self.currBugState.changes = changes @@ -461,7 +461,7 @@ class BugHistoryParser(): continue if DEBUG_CHANGES: - Log.note("Processing change: " + CNV.object2JSON(change)) + Log.note("Processing change: " + convert.value2json(change)) target = self.currBugState targetName = "currBugState" attach_id = change.attach_id @@ -562,7 +562,7 @@ class BugHistoryParser(): def processFlagChange(self, target, change, modified_ts, modified_by): if target.flags == None: Log.note("[Bug {{bug_id}}]: PROBLEM processFlagChange called with unset 'flags'", {"bug_id": self.currBugState.bug_id}) - target.flags = StructList() + target.flags = DictList() addedFlags = BugHistoryParser.getMultiFieldValue("flags", change.new_value) removedFlags = BugHistoryParser.getMultiFieldValue("flags", change.old_value) @@ -685,7 +685,7 @@ class BugHistoryParser(): if chosen_one != None: for f in ["value", "request_status", "requestee"]: - chosen_one[f] = nvl(added_flag[f], chosen_one[f]) + chosen_one[f] = coalesce(added_flag[f], chosen_one[f]) # We need to avoid later adding this flag twice, since we rolled an add into a delete. @@ -723,7 +723,7 @@ class BugHistoryParser(): # if flag==u'review?(bjacob@mozilla.co': # Log.debug() - flagParts = Struct( + flagParts = Dict( modified_ts=modified_ts, modified_by=modified_by, value=flag @@ -742,7 +742,7 @@ class BugHistoryParser(): def addValues(self, total, add, valueType, field_name, target): if not add: return total - # Log.note("[Bug {{bug_id}}]: Adding " + valueType + " " + fieldName + " values:" + CNV.object2JSON(someValues)) + # Log.note("[Bug {{bug_id}}]: Adding " + valueType + " " + fieldName + " values:" + convert.value2json(someValues)) if field_name == "flags": Log.error("use processFlags") else: @@ -763,7 +763,7 @@ class BugHistoryParser(): self.currActivity.changes.append({ "field_name": field_name, "new_value": Null, - "old_value": ", ".join(map(unicode, Q.sort(diff))), + "old_value": ", ".join(map(unicode, qb.sort(diff))), "attach_id": target.attach_id }) @@ -780,7 +780,7 @@ class BugHistoryParser(): if valueType == "added" and remove: self.currActivity.changes.append({ "field_name": field_name, - "new_value": u", ".join(map(unicode, Q.sort(remove))), + "new_value": u", ".join(map(unicode, qb.sort(remove))), "old_value": Null, "attach_id": target.attach_id }) @@ -800,8 +800,8 @@ class BugHistoryParser(): return output elif field_name == "cc": # MAP CANONICAL TO EXISTING (BETWEEN map_* AND self.aliases WE HAVE A BIJECTION) - map_total = struct.inverse({t: self.alias(t) for t in total}) - map_remove = struct.inverse({r: self.alias(r) for r in remove}) + map_total = inverse({t: self.alias(t) for t in total}) + map_remove = inverse({r: self.alias(r) for r in remove}) # CANONICAL VALUES c_total = set(map_total.keys()) c_remove = set(map_remove.keys()) @@ -816,8 +816,8 @@ class BugHistoryParser(): "type": valueType, "object": arrayDesc, "field_name": field_name, - "missing": Q.sort(Q.map2set(diff, map_remove)), - "existing": Q.sort(total), + "missing": qb.sort(qb.map2set(diff, map_remove)), + "existing": qb.sort(total), "candidates": {d: self.aliases.get(d, None) for d in diff}, "bug_id": self.currBugID }) @@ -879,18 +879,18 @@ class BugHistoryParser(): "diff": diff, "output": output }) - final_removed = Q.map2set(removed, map_total) + final_removed = qb.map2set(removed, map_total) if final_removed: self.currActivity.changes.append({ "field_name": field_name, - "new_value": u", ".join(map(unicode, Q.sort(final_removed))), + "new_value": u", ".join(map(unicode, qb.sort(final_removed))), "old_value": Null, "attach_id": target.attach_id }) except Exception, email: Log.error("issues", email) - return Q.map2set(output, map_total) + return qb.map2set(output, map_total) else: removed = total & remove diff = remove - total @@ -899,7 +899,7 @@ class BugHistoryParser(): if valueType == "added" and removed: self.currActivity.changes.append({ "field_name": field_name, - "new_value": u", ".join(map(unicode, Q.sort(removed))), + "new_value": u", ".join(map(unicode, qb.sort(removed))), "old_value": Null, "attach_id": target.attach_id }) @@ -917,13 +917,13 @@ class BugHistoryParser(): return output def processFlags(self, total, old_values, new_values, modified_ts, modified_by, target_type, target): - added_values = StructList() #FOR SOME REASON, REMOVAL BY OBJECT DOES NOT WORK, SO WE USE THIS LIST OF STRING VALUES + added_values = DictList() #FOR SOME REASON, REMOVAL BY OBJECT DOES NOT WORK, SO WE USE THIS LIST OF STRING VALUES for v in new_values: flag = BugHistoryParser.makeFlag(v, modified_ts, modified_by) if flag.request_type == None: Log.note("[Bug {{bug_id}}]: PROBLEM Unable to parse flag {{flag}} (caused by 255 char limit?)", { - "flag": CNV.value2quote(flag.value), + "flag": convert.value2quote(flag.value), "bug_id": self.currBugID }) continue @@ -940,7 +940,7 @@ class BugHistoryParser(): else: Log.note("[Bug {{bug_id}}]: PROBLEM Unable to find {{type}} FLAG: {{object}}.{{field_name}}: (All {{missing}}" + " not in : {{existing}})", { "type": target_type, - "object": nvl(target.attach_id, target.bug_id), + "object": coalesce(target.attach_id, target.bug_id), "field_name": "flags", "missing": v, "existing": total, @@ -951,21 +951,21 @@ class BugHistoryParser(): if added_values: self.currActivity.changes.append({ "field_name": "flags", - "new_value": ", ".join(Q.sort(added_values.value)), + "new_value": ", ".join(qb.sort(added_values.value)), "old_value": Null, "attach_id": target.attach_id }) if not old_values: return total - # Log.note("[Bug {{bug_id}}]: Adding " + valueType + " " + fieldName + " values:" + CNV.object2JSON(someValues)) + # Log.note("[Bug {{bug_id}}]: Adding " + valueType + " " + fieldName + " values:" + convert.value2json(someValues)) for v in old_values: total.append(BugHistoryParser.makeFlag(v, target.modified_ts, target.modified_by)) self.currActivity.changes.append({ "field_name": "flags", "new_value": Null, - "old_value": ", ".join(Q.sort(old_values)), + "old_value": ", ".join(qb.sort(old_values)), "attach_id": target.attach_id }) @@ -991,7 +991,7 @@ class BugHistoryParser(): def alias(self, name): if name == None: return Null - return nvl(self.aliases.get(name, Null).canonical, name) + return coalesce(self.aliases.get(name, Null).canonical, name) def initializeAliases(self): @@ -1000,7 +1000,7 @@ class BugHistoryParser(): alias_json = File(self.settings.alias_file).read() except Exception, e: alias_json = "{}" - self.aliases = {k: struct.wrap(v) for k, v in CNV.JSON2object(alias_json).items()} + self.aliases = {k: wrap(v) for k, v in convert.json2value(alias_json).items()} Log.note("{{num}} aliases loaded", {"num": len(self.aliases.keys())}) diff --git a/bzETL/replicate.py b/bzETL/replicate.py index f3d2d26..4358228 100644 --- a/bzETL/replicate.py +++ b/bzETL/replicate.py @@ -1,6 +1,5 @@ # encoding: utf-8 # -# # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. @@ -8,29 +7,32 @@ # Author: Kyle Lahnakoski (kyle@lahnakoski.com) # - -from datetime import datetime, timedelta -from pyLibrary.collections import MIN -from pyLibrary.struct import nvl, Struct -from pyLibrary.thread.threads import ThreadedQueue -from pyLibrary.times.timer import Timer -import transform_bugzilla -from pyLibrary.cnv import CNV -from pyLibrary.env.logs import Log -from pyLibrary.queries import Q -from pyLibrary.env import startup -from pyLibrary.env.files import File -from pyLibrary.collections.multiset import Multiset -from pyLibrary.env.elasticsearch import ElasticSearch - - +# # REPLICATION # # Replication has a few benefits: # 1) The slave can have scripting enabled, allowing more powerful set of queries -# 2) Physical proximity increases the probability of reduced latency +# 2) Physical proximity reduces latency # 3) The slave can be configured with better hardware -# 4) The slave's exclusivity increases availability (Mozilla's public cluster my have time of high load) +# 4) The slave's exclusivity increases availability (Mozilla's public cluster may have high load) + +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +from datetime import datetime, timedelta +from bzETL import transform_bugzilla +from pyLibrary import convert +from pyLibrary.collections import MIN, Multiset +from pyLibrary.debugs import startup +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import coalesce, Dict +from pyLibrary.env import elasticsearch +from pyLibrary.env.elasticsearch import Cluster +from pyLibrary.env.files import File +from pyLibrary.queries import qb +from pyLibrary.thread.threads import ThreadedQueue +from pyLibrary.times.timer import Timer far_back = datetime.utcnow() - timedelta(weeks=52) @@ -39,12 +41,12 @@ BATCH_SIZE = 1000 def extract_from_file(source_settings, destination): file = File(source_settings.filename) - for g, d in Q.groupby(file, size=BATCH_SIZE): + for g, d in qb.groupby(file, size=BATCH_SIZE): try: d2 = map( lambda (x): {"id": x.id, "value": x}, map( - lambda(x): transform_bugzilla.normalize(CNV.JSON2object(x)), + lambda(x): transform_bugzilla.normalize(convert.json2value(x)), d ) ) @@ -61,8 +63,8 @@ def extract_from_file(source_settings, destination): def get_last_updated(es): - if not isinstance(es, ElasticSearch): - return CNV.milli2datetime(0) + if not isinstance(es, elasticsearch.Index): + return convert.milli2datetime(0) try: results = es.search({ @@ -70,7 +72,7 @@ def get_last_updated(es): "query": {"match_all": {}}, "filter": { "range": { - "modified_ts": {"gte": CNV.datetime2milli(far_back)}}} + "modified_ts": {"gte": convert.datetime2milli(far_back)}}} }}, "from": 0, "size": 0, @@ -79,8 +81,8 @@ def get_last_updated(es): }) if results.facets.modified_ts.count == 0: - return CNV.milli2datetime(0) - return CNV.milli2datetime(results.facets.modified_ts.max) + return convert.milli2datetime(0) + return convert.milli2datetime(results.facets.modified_ts.max) except Exception, e: Log.error("Can not get_last_updated from {{host}}/{{index}}",{ "host": es.settings.host, @@ -102,13 +104,13 @@ def get_pending(es, since): pending_bugs = None - for s, e in Q.intervals(0, max_bug+1, 100000): + for s, e in qb.intervals(0, max_bug+1, 100000): Log.note("Collect history for bugs from {{start}}..{{end}}", {"start":s, "end":e}) result = es.search({ "query": {"filtered": { "query": {"match_all": {}}, "filter": {"and":[ - {"range": {"modified_ts": {"gte": CNV.datetime2milli(since)}}}, + {"range": {"modified_ts": {"gte": convert.datetime2milli(since)}}}, {"range": {"bug_id": {"gte": s, "lte": e}}} ]} }}, @@ -140,30 +142,30 @@ def get_pending(es, since): # USE THE source TO GET THE INDEX SCHEMA def get_or_create_index(destination_settings, source): #CHECK IF INDEX, OR ALIAS, EXISTS - es = ElasticSearch(destination_settings) + es = elasticsearch.Index(destination_settings) aliases = es.get_aliases() indexes = [a for a in aliases if a.alias == destination_settings.index or a.index == destination_settings.index] if not indexes: #CREATE INDEX - schema = CNV.JSON2object(File(destination_settings.schema_file).read(), paths=True) + schema = convert.json2value(File(destination_settings.schema_file).read(), paths=True) assert schema.settings assert schema.mappings - ElasticSearch.create_index(destination_settings, schema, limit_replicas=True) + Cluster(destination_settings).create_index(destination_settings, schema, limit_replicas=True) elif len(indexes) > 1: Log.error("do not know how to replicate to more than one index") elif indexes[0].alias != None: destination_settings.alias = indexes[0].alias destination_settings.index = indexes[0].index - return ElasticSearch(destination_settings) + return elasticsearch.Index(destination_settings) def replicate(source, destination, pending, last_updated): """ COPY source RECORDS TO destination """ - for g, bugs in Q.groupby(pending, max_size=BATCH_SIZE): + for g, bugs in qb.groupby(pending, max_size=BATCH_SIZE): with Timer("Replicate {{num_bugs}} bug versions", {"num_bugs": len(bugs)}): data = source.search({ "query": {"filtered": { @@ -171,7 +173,7 @@ def replicate(source, destination, pending, last_updated): "filter": {"and": [ {"terms": {"bug_id": set(bugs)}}, {"range": {"expires_on": - {"gte": CNV.datetime2milli(last_updated)} + {"gte": convert.datetime2milli(last_updated)} }} ]} }}, @@ -197,12 +199,12 @@ def main(settings): #USE A SOURCE FILE if settings.source.filename != None: settings.destination.alias = settings.destination.index - settings.destination.index = ElasticSearch.proto_name(settings.destination.alias) - schema = CNV.JSON2object(File(settings.destination.schema_file).read(), paths=True, flexible=True) + settings.destination.index = Cluster.proto_name(settings.destination.alias) + schema = convert.json2value(File(settings.destination.schema_file).read(), paths=True, flexible=True) if transform_bugzilla.USE_ATTACHMENTS_DOT: - schema = CNV.JSON2object(CNV.object2JSON(schema).replace("attachments_", "attachments.")) + schema = convert.json2value(convert.value2json(schema).replace("attachments_", "attachments.")) - dest = ElasticSearch.create_index(settings.destination, schema, limit_replicas=True) + dest = Cluster(settings.destination).create_index(settings.destination, schema, limit_replicas=True) dest.set_refresh_interval(-1) extract_from_file(settings.source, dest) dest.set_refresh_interval(1) @@ -212,15 +214,15 @@ def main(settings): else: # SYNCH WITH source ES INDEX - source=ElasticSearch(settings.source) + source=elasticsearch.Index(settings.source) # USE A DESTINATION FILE if settings.destination.filename: Log.note("Sending records to file: {{filename}}", {"filename":settings.destination.filename}) file = File(settings.destination.filename) - destination = Struct( - extend=lambda x: file.extend([CNV.object2JSON(v["value"]) for v in x]), + destination = Dict( + extend=lambda x: file.extend([convert.value2json(v["value"]) for v in x]), file=file ) else: @@ -229,17 +231,17 @@ def main(settings): # GET LAST UPDATED from_file = None if time_file.exists: - from_file = CNV.milli2datetime(CNV.value2int(time_file.read())) + from_file = convert.milli2datetime(convert.value2int(time_file.read())) from_es = get_last_updated(destination) - timedelta(hours=1) - last_updated = MIN(nvl(from_file, CNV.milli2datetime(0)), from_es) + last_updated = MIN(coalesce(from_file, convert.milli2datetime(0)), from_es) Log.note("updating records with modified_ts>={{last_updated}}", {"last_updated":last_updated}) pending = get_pending(source, last_updated) - with ThreadedQueue(destination, size=1000) as data_sink: + with ThreadedQueue(destination, max_size=1000) as data_sink: replicate(source, data_sink, pending, last_updated) # RECORD LAST UPDATED - time_file.write(unicode(CNV.datetime2milli(current_time))) + time_file.write(unicode(convert.datetime2milli(current_time))) def start(): diff --git a/bzETL/transform_bugzilla.py b/bzETL/transform_bugzilla.py index e18dfa4..3d4ae6f 100644 --- a/bzETL/transform_bugzilla.py +++ b/bzETL/transform_bugzilla.py @@ -1,12 +1,23 @@ # encoding: utf-8 # +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. +# +# Author: Kyle Lahnakoski (kyle@lahnakoski.com) +# + +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + from datetime import date import re -from pyLibrary.cnv import CNV -from pyLibrary.env import elasticsearch -from pyLibrary.env.logs import Log -from pyLibrary.queries import Q +from pyLibrary import convert +from pyLibrary.debugs.logs import Log +from pyLibrary.env import elasticsearch +from pyLibrary.queries import qb USE_ATTACHMENTS_DOT = True @@ -34,7 +45,7 @@ DATE_PATTERN_RELAXED = re.compile("^[0-9]{4}[\\/-][0-9]{2}[\\/-][0-9]{2}") def rename_attachments(bug_version): if bug_version.attachments == None: return bug_version if not USE_ATTACHMENTS_DOT: - bug_version.attachments=CNV.JSON2object(CNV.object2JSON(bug_version.attachments).replace("attachments.", "attachments_")) + bug_version.attachments=convert.json2value(convert.value2json(bug_version.attachments).replace("attachments.", "attachments_")) return bug_version @@ -47,31 +58,31 @@ def normalize(bug, old_school=False): #ENSURE STRUCTURES ARE SORTED # Do some processing to make sure that diffing between runs stays as similar as possible. - bug.flags=Q.sort(bug.flags, "value") + bug.flags=qb.sort(bug.flags, "value") if bug.attachments: if USE_ATTACHMENTS_DOT: - bug.attachments=CNV.JSON2object(CNV.object2JSON(bug.attachments).replace("attachments_", "attachments.")) - bug.attachments = Q.sort(bug.attachments, "attach_id") + bug.attachments=convert.json2value(convert.value2json(bug.attachments).replace("attachments_", "attachments.")) + bug.attachments = qb.sort(bug.attachments, "attach_id") for a in bug.attachments: for k,v in list(a.items()): if k.startswith("attachments") and (k.endswith("isobsolete") or k.endswith("ispatch") or k.endswith("isprivate")): - new_v=CNV.value2int(v) + new_v=convert.value2int(v) new_k=k[12:] a[k.replace(".", "\.")]=new_v if not old_school: a[new_k]=new_v - a.flags = Q.sort(a.flags, ["modified_ts", "value"]) + a.flags = qb.sort(a.flags, ["modified_ts", "value"]) if bug.changes != None: if USE_ATTACHMENTS_DOT: - json = CNV.object2JSON(bug.changes).replace("attachments_", "attachments.") - bug.changes=CNV.JSON2object(json) - bug.changes = Q.sort(bug.changes, ["attach_id", "field_name"]) + json = convert.value2json(bug.changes).replace("attachments_", "attachments.") + bug.changes=convert.json2value(json) + bug.changes = qb.sort(bug.changes, ["attach_id", "field_name"]) #bug IS CONVERTED TO A 'CLEAN' COPY bug = elasticsearch.scrub(bug) - # bug.attachments = nvl(bug.attachments, []) # ATTACHMENTS MUST EXIST + # bug.attachments = coalesce(bug.attachments, []) # ATTACHMENTS MUST EXIST for f in NUMERIC_FIELDS: @@ -79,11 +90,11 @@ def normalize(bug, old_school=False): if v == None: continue elif f in MULTI_FIELDS: - bug[f] = CNV.value2intlist(v) - elif CNV.value2number(v) == 0: + bug[f] = convert.value2intlist(v) + elif convert.value2number(v) == 0: del bug[f] else: - bug[f]=CNV.value2number(v) + bug[f]=convert.value2number(v) # Also reformat some date fields for dateField in ["deadline", "cf_due_date", "cf_last_resolved"]: @@ -91,7 +102,7 @@ def normalize(bug, old_school=False): if v == None: continue try: if isinstance(v, date): - bug[dateField] = CNV.datetime2milli(v) + bug[dateField] = convert.datetime2milli(v) elif isinstance(v, (long, int, float)) and len(unicode(v)) in [12, 13]: bug[dateField] = v elif not isinstance(v, basestring): @@ -100,17 +111,17 @@ def normalize(bug, old_school=False): # Convert to "2012/01/01 00:00:00.000" # Example: bug 856732 (cf_last_resolved) # dateString = v.substring(0, 10).replace("/", '-') + "T" + v.substring(11) + "Z" - bug[dateField] = CNV.datetime2milli(CNV.string2datetime(v+"000", "%Y/%m/%d %H:%M%:S%f")) + bug[dateField] = convert.datetime2milli(convert.string2datetime(v+"000", "%Y/%m/%d %H:%M%:S%f")) elif DATE_PATTERN_STRICT_SHORT.match(v): # Convert "2012/01/01 00:00:00" to "2012-01-01T00:00:00.000Z", then to a timestamp. # Example: bug 856732 (cf_last_resolved) # dateString = v.substring(0, 10).replace("/", '-') + "T" + v.substring(11) + "Z" - bug[dateField] = CNV.datetime2milli(CNV.string2datetime(v.replace("-", "/"), "%Y/%m/%d %H:%M:%S")) + bug[dateField] = convert.datetime2milli(convert.string2datetime(v.replace("-", "/"), "%Y/%m/%d %H:%M:%S")) elif DATE_PATTERN_RELAXED.match(v): # Convert "2012/01/01 00:00:00.000" to "2012-01-01" # Example: bug 643420 (deadline) # bug 726635 (cf_due_date) - bug[dateField] = CNV.datetime2milli(CNV.string2datetime(v[0:10], "%Y-%m-%d")) + bug[dateField] = convert.datetime2milli(convert.string2datetime(v[0:10], "%Y-%m-%d")) except Exception, e: Log.error("problem with converting date to milli (type={{type}}, value={{value}})", {"value":bug[dateField], "type":type(bug[dateField]).name}, e) diff --git a/pyLibrary/README.md b/pyLibrary/README.md index b69ca41..41f29f8 100644 --- a/pyLibrary/README.md +++ b/pyLibrary/README.md @@ -18,7 +18,7 @@ Module `meta` **Description** -`@use_settings` will decorate a function to accept a `settings` parameter which is just like `**kwargs`, but the named parameters can override the properties in `settings`, rather than raise duplicate keyname exceptions. +`@use_settings` will decorate a function to accept a `settings` parameter which is just like `**kwargs`, but the other parameters can override the properties in `settings`, rather than raise duplicate keyname exceptions. **Example** diff --git a/pyLibrary/convert.py b/pyLibrary/convert.py index 8f5b6b2..9af073d 100644 --- a/pyLibrary/convert.py +++ b/pyLibrary/convert.py @@ -10,7 +10,6 @@ from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import -from __future__ import absolute_import import HTMLParser import StringIO @@ -23,11 +22,12 @@ import gzip import hashlib from io import BytesIO import json +from numbers import Number import re from tempfile import TemporaryFile from pyLibrary import strings, meta -from pyLibrary.dot import wrap, wrap_dot, unwrap +from pyLibrary.dot import wrap, wrap_dot, unwrap, unwraplist from pyLibrary.collections.multiset import Multiset from pyLibrary.debugs.logs import Log, Except from pyLibrary.env.big_data import FileString, safe_size @@ -103,6 +103,7 @@ def json2value(json_string, params={}, flexible=False, paths=False): if params: json_string = expand_template(json_string, params) + # LOOKUP REFERENCES value = wrap(json_decoder(json_string)) @@ -113,10 +114,10 @@ def json2value(json_string, params={}, flexible=False, paths=False): except Exception, e: e = Except.wrap(e) - if ("Expecting '" in e and "' delimiter: line" in e) or "Expecting property name enclosed in double quotes: " in e: + if "Expecting '" in e and "' delimiter: line" in e: line_index = int(strings.between(e.message, " line ", " column ")) - 1 column = int(strings.between(e.message, " column ", " ")) - 1 - line = json_string.split("\n")[line_index].replace("\t", " ") + line = json_string.split("\n")[line_index] if column > 20: sample = "..." + line[column - 20:] pointer = " " + (" " * 20) + "^" @@ -243,22 +244,52 @@ def list2tab(rows): return "\t".join(keys) + "\n" + "\n".join(output) -def list2table(rows): - columns = set() - for r in rows: - columns |= set(r.keys()) - keys = list(columns) +def list2table(rows, column_names=None): + if column_names: + keys = list(set(column_names)) + else: + columns = set() + for r in rows: + columns |= set(r.keys()) + keys = list(columns) - output = [] - for r in rows: - output.append([r[k] for k in keys]) + output = [[unwraplist(r[k]) for k in keys] for r in rows] return wrap({ + "meta": {"format": "table"}, "header": keys, "data": output }) +def list2cube(rows, column_names=None): + if column_names: + keys = column_names + else: + columns = set() + for r in rows: + columns |= set(r.keys()) + keys = list(columns) + + data = {k: [] for k in keys} + output = wrap({ + "meta": {"format": "cube"}, + "edges": [ + { + "name": "rownum", + "domain": {"type": "rownum", "min": 0, "max": len(rows), "interval": 1} + } + ], + "data": data + }) + + for r in rows: + for k in keys: + data[k].append(r[k]) + + return output + + def value2string(value): # PROPER NULL HANDLING if value == None: @@ -443,11 +474,15 @@ def bytes2sha1(value): def value2intlist(value): if value == None: return None + elif isinstance(value, Number): + return [int(value)] + elif isinstance(value, basestring): + if value.strip() == "": + return None + return [int(value)] elif hasattr(value, '__iter__'): output = [int(d) for d in value if d != "" and d != None] return output - elif value.strip() == "": - return None else: return [int(value)] @@ -547,7 +582,7 @@ def ini2value(ini_content): buff = StringIO.StringIO(ini_content) config = ConfigParser() - config.read(buff, "dummy") + config._read(buff, "dummy") output = {} for section in config.sections(): diff --git a/pyLibrary/debugs/log_usingElasticSearch.py b/pyLibrary/debugs/log_usingElasticSearch.py index 9acf179..ca3e896 100644 --- a/pyLibrary/debugs/log_usingElasticSearch.py +++ b/pyLibrary/debugs/log_usingElasticSearch.py @@ -28,6 +28,7 @@ class Log_usingElasticSearch(BaseLog): self.es = Cluster(settings).get_or_create_index( schema=convert.json2value(convert.value2json(SCHEMA), paths=True), limit_replicas=True, + tjson=True, settings=settings ) self.queue = self.es.threaded_queue(max_size=max_size, batch_size=batch_size) @@ -60,7 +61,7 @@ class Log_usingElasticSearch(BaseLog): SCHEMA = { "settings": { - "index.number_of_shards": 3, + "index.number_of_shards": 1, "index.number_of_replicas": 2, "index.store.throttle.type": "merge", "index.store.throttle.max_bytes_per_sec": "2mb", @@ -73,13 +74,38 @@ SCHEMA = { { "values_strings": { "match": "*", - "match_mapping_type" : "string", + "match_mapping_type": "string", "mapping": { "type": "string", - "index": "not_analyzed" + "index": "not_analyzed", + "doc_values": True } } + }, + { + "default_doubles": { + "mapping": { + "index": "not_analyzed", + "type": "double", + "doc_values": True + }, + "match_mapping_type": "double", + "match": "*" + } + }, + { + "default_longs": { + "mapping": { + "index": "not_analyzed", + "type": "long", + "doc_values": True + }, + "match_mapping_type": "long|integer", + "match_pattern": "regex", + "path_match": ".*" + } } + ], "_all": { "enabled": False @@ -90,11 +116,17 @@ SCHEMA = { }, "properties": { "timestamp": { - "type": "double", - "index": "not_analyzed", - "store": "yes" + "type": "object", + "properties": { + "$value": { + "type": "double", + "index": "not_analyzed", + "store": "yes", + "doc_values": True + } + } }, - "params": { + "params": { # JUST IN CASE WE ARE NOT USING TYPED JSON "type": "object", "enabled": False, "index": "no", diff --git a/pyLibrary/debugs/logs.py b/pyLibrary/debugs/logs.py index 9b2fcb9..de33c08 100644 --- a/pyLibrary/debugs/logs.py +++ b/pyLibrary/debugs/logs.py @@ -256,9 +256,9 @@ class Log(object): @classmethod def error( cls, - template, # human readable template - default_params={}, # parameters for template - cause=None, # pausible cause + template, # human readable template + default_params={}, # parameters for template + cause=None, # pausible cause stack_depth=0, # stack trace offset (==1 if you do not want to report self) **more_params ): @@ -270,6 +270,7 @@ class Log(object): default_params = {} params = dict(unwrap(default_params), **more_params) + add_to_trace = False if cause == None: cause = [] diff --git a/pyLibrary/debugs/startup.py b/pyLibrary/debugs/startup.py index ab0449d..67f558c 100644 --- a/pyLibrary/debugs/startup.py +++ b/pyLibrary/debugs/startup.py @@ -60,7 +60,7 @@ def read_settings(filename=None, defs=None): Log.error("Can not file settings file {{filename}}", { "filename": settings_file.abspath }) - settings = ref.get("file://" + settings_file.abspath) + settings = ref.get("file:///" + settings_file.abspath.replace(os.sep, "/")) if defs: settings.args = _argparse(defs) return settings diff --git a/pyLibrary/dot/README.md b/pyLibrary/dot/README.md index a745fb1..778c084 100644 --- a/pyLibrary/dot/README.md +++ b/pyLibrary/dot/README.md @@ -68,7 +68,7 @@ different names and slightly different variations, some examples are: * `jinja2.environment.Environment.getattr()` to allow convenient dot notation * `argparse.Environment()` - code performs `setattr(e, name, value)` on instances of Environment to provide dot(`.`) accessors - * `collections.namedtuple()` - gives attribute names to tuple indicies + * `collections.namedtuple()` - gives attribute names to tuple indices effectively providing a.b rather than a["b"] offered by dicts * [configman's DotDict](https://github.com/mozilla/configman/blob/master/configman/dotdict.py) @@ -131,7 +131,9 @@ replaced with `None` in all cases. ###Identity and Absorbing (Zero) Elements### -With closure we can realize we have defined an algebraic semigroup: The identity element is the dot string (`"."`) and the zero element is `Null` (or `None`). +With closure we can realize we have defined an algebraic semigroup: The +identity element is the dot string (`"."`) and the zero element is `Null` +(or `None`). 1. `a[Null] == Null` 2. `a["."] == a` @@ -208,7 +210,7 @@ all `a<=b` * Trinary slicing `[::]` uses the flat list definition When assuming a *flat-list*, we loose the *take-from-the-right* tricks gained -from modulo arithmetic on the indicies. Therefore, we require extra methods +from modulo arithmetic on the indices. Therefore, we require extra methods to perform right-based slicing: * **right()** - `flat_list.right(b)` same as `loop_list[-b:]` except when `b<=0` @@ -231,9 +233,17 @@ The dot operator on a `DictList` performs a simple projection; it will return a DictObject for data ------------------- -There are two major families of objects in Object Oriented programming. The first, are ***Actors***: characterized by a number of useful instance methods and some state bundled into a package. The second are ***Data***: Primarily a set of properties, with only (de)serialization functions, or algebraic operators defined. Boto has many examples of these *Data* classes, [here is one](https://github.com/boto/boto/blob/4b8269562e663f090403e57ba1a3a471b6e0aa0e/boto/ec2/networkinterface.py). +There are two major families of objects in Object Oriented programming. The +first, are ***Actors***: characterized by a number of useful instance methods +and some state bundled into a package. The second are ***Data***: Primarily +a set of properties, with only (de)serialization functions, or algebraic +operators defined. Boto has many examples of these *Data* classes, +[here is one](https://github.com/boto/boto/blob/4b8269562e663f090403e57ba1a3a471b6e0aa0e/boto/ec2/networkinterface.py). -The problem with *Data* objects is they have an useless distinction between attributes and properties. This prevents us from using the `[]` operator for dereferencing, forcing use to use the verbose `__getattr__()` instead. It also prevents the use of query operators over these objects. +The problem with *Data* objects is they have an useless distinction between +attributes and properties. This prevents us from using the `[]` operator for +dereferencing, forcing use to use the verbose `getattr()` instead. It +also prevents the use of query operators over these objects. You can register a class as a *data* class, by wrapping it with `DictClass`. diff --git a/pyLibrary/dot/__init__.py b/pyLibrary/dot/__init__.py index 395433b..90ff6f1 100644 --- a/pyLibrary/dot/__init__.py +++ b/pyLibrary/dot/__init__.py @@ -64,7 +64,9 @@ def split_field(field): """ RETURN field AS ARRAY OF DOT-SEPARATED FIELDS """ - if field.find(".") >= 0: + if field == "." or field==None: + return [] + elif field.find(".") >= 0: field = field.replace("\.", "\a") return [k.replace("\a", ".") for k in field.split(".")] else: @@ -75,7 +77,10 @@ def join_field(field): """ RETURN field SEQUENCE AS STRING """ - return ".".join([f.replace(".", "\.") for f in field]) + potent = [f for f in field if f != "."] + if not potent: + return "." + return ".".join([f.replace(".", "\.") for f in potent]) def hash_value(v): @@ -128,7 +133,13 @@ def _all_default(d, default, seen=None): if existing_value == None: if default_value != None: - _set_attr(d, [k], default_value) + try: + _set_attr(d, [k], default_value) + except Exception, e: + if PATH_NOT_FOUND not in e: + from pyLibrary.debugs.logs import Log + Log.error("Can not set attribute {{name}}", name=k, cause=e) + elif (hasattr(existing_value, "__setattr__") or isinstance(existing_value, Mapping)) and isinstance(default_value, Mapping): df = seen.get(id(existing_value)) if df: @@ -143,13 +154,13 @@ def _getdefault(obj, key): TRY BOTH ATTRIBUTE AND ITEM ACCESS, OR RETURN Null """ try: - return getattr(obj, key) - except Exception, e: + return obj[key] + except Exception, f: pass try: - return obj[key] - except Exception, f: + return getattr(obj, key) + except Exception, e: pass try: @@ -242,11 +253,13 @@ def _get_attr(obj, path): obj = getattr(obj, attr_name) return _get_attr(obj, path[1:]) except Exception, e: - try: - obj = obj[attr_name] - return _get_attr(obj, path[1:]) - except Exception, f: - return None + pass + + try: + obj = obj[attr_name] + return _get_attr(obj, path[1:]) + except Exception, f: + return None def _set_attr(obj, path, value): @@ -270,7 +283,7 @@ def _set_attr(obj, path, value): new_value = value try: - _get(obj, "__setattr__")(attr_name, new_value) + setattr(obj, attr_name, new_value) return old_value except Exception, e: try: diff --git a/pyLibrary/dot/dicts.py b/pyLibrary/dot/dicts.py index d97ac0e..b6b41be 100644 --- a/pyLibrary/dot/dicts.py +++ b/pyLibrary/dot/dicts.py @@ -70,13 +70,19 @@ class Dict(MutableMapping): def __getitem__(self, key): if key == None: return Null + if key == ".": + output = _get(self, "_dict") + if isinstance(output, Mapping): + return self + else: + return output + if isinstance(key, str): key = key.decode("utf8") elif not isinstance(key, unicode): from pyLibrary.debugs.logs import Log Log.error("only string keys are supported") - d = _get(self, "_dict") if key.find(".") >= 0: @@ -96,6 +102,13 @@ class Dict(MutableMapping): from pyLibrary.debugs.logs import Log Log.error("key is empty string. Probably a bad idea") + if key == ".": + # SOMETHING TERRIBLE HAPPENS WHEN value IS NOT A Mapping; + # HOPEFULLY THE ONLY OTHER METHOD RUN ON self IS unwrap() + v = unwrap(value) + _set(self, "_dict", v) + return v + if isinstance(key, str): key = key.decode("utf8") @@ -257,13 +270,13 @@ class Dict(MutableMapping): try: return "Dict("+dict.__str__(_get(self, "_dict"))+")" except Exception, e: - return "{}" + return "Dict{}" def __repr__(self): try: return "Dict("+dict.__repr__(_get(self, "_dict"))+")" except Exception, e: - return "Dict{}" + return "Dict()" class _DictUsingSelf(dict): @@ -460,7 +473,6 @@ class _DictUsingSelf(dict): return "Dict()" - # KEEP TRACK OF WHAT ATTRIBUTES ARE REQUESTED, MAYBE SOME (BUILTIN) ARE STILL USEFUL requested = set() diff --git a/pyLibrary/dot/lists.py b/pyLibrary/dot/lists.py index a5566dd..a9608c8 100644 --- a/pyLibrary/dot/lists.py +++ b/pyLibrary/dot/lists.py @@ -18,14 +18,14 @@ from pyLibrary.dot import wrap, unwrap _get = object.__getattribute__ _set = object.__setattr__ -dictwrap = None +_dictwrap = None def _late_import(): - global dictwrap - from pyLibrary.dot.objects import dictwrap + global _dictwrap + from pyLibrary.dot.objects import dictwrap as _dictwrap - _ = dictwrap + _ = _dictwrap class DictList(list): """ @@ -82,10 +82,10 @@ class DictList(list): """ simple `select` """ - if not dictwrap: + if not _dictwrap: _late_import() - return DictList(vals=[unwrap(dictwrap(v)[key]) for v in _get(self, "list")]) + return DictList(vals=[unwrap(_dictwrap(v)[key]) for v in _get(self, "list")]) def filter(self, _filter): return DictList(vals=[unwrap(u) for u in (wrap(v) for v in _get(self, "list")) if _filter(u)]) @@ -112,6 +112,9 @@ class DictList(list): Log.warning("slicing is broken in Python 2.7: a[i:j] == a[i+len(a), j] sometimes. Use [start:stop:step] (see https://github.com/klahnakoski/pyLibrary/blob/master/pyLibrary/dot/README.md#the-slice-operator-in-python27-is-inconsistent)") return self[i:j:] + def __list__(self): + return self.list + def copy(self): return DictList(list(_get(self, "list"))) diff --git a/pyLibrary/dot/objects.py b/pyLibrary/dot/objects.py index 04d2bfb..d1476d3 100644 --- a/pyLibrary/dot/objects.py +++ b/pyLibrary/dot/objects.py @@ -22,6 +22,9 @@ WRAPPED_CLASSES = set() class DictObject(Mapping): + """ + TREAT AN OBJECT LIKE DATA + """ def __init__(self, obj): _set(self, "_obj", obj) @@ -90,12 +93,16 @@ def dictwrap(v): m = Dict() _set(m, "_dict", v) # INJECT m.__dict__=v SO THERE IS NO COPY return m + elif type_ is Dict: + return v elif type_ is NoneType: - return None # So we allow `is None` + return None # So we allow `is None` (OFTEN USED IN PYTHON LIBRARIES) elif type_ is list: return DictList(v) elif type_ is GeneratorType: return (wrap(vv) for vv in v) + elif hasattr(v, "as_dict"): + return v.as_dict() elif isinstance(v, (basestring, int, float, Decimal, datetime, date, Dict, DictList, NullType, NoneType)): return v else: diff --git a/pyLibrary/env/elasticsearch.py b/pyLibrary/env/elasticsearch.py index 6ddccdb..b574c6c 100644 --- a/pyLibrary/env/elasticsearch.py +++ b/pyLibrary/env/elasticsearch.py @@ -18,19 +18,28 @@ import time from pyLibrary import convert from pyLibrary.debugs.logs import Log +from pyLibrary.dot import coalesce, Null, Dict, set_default, join_field, split_field +from pyLibrary.dot.lists import DictList +from pyLibrary.dot import wrap from pyLibrary.env import http +from pyLibrary.jsons.typed_encoder import json2typed from pyLibrary.maths.randoms import Random from pyLibrary.maths import Math from pyLibrary.meta import use_settings from pyLibrary.queries import qb from pyLibrary.strings import utf82unicode -from pyLibrary.dot import coalesce, Null, Dict, set_default -from pyLibrary.dot.lists import DictList -from pyLibrary.dot import wrap, unwrap -from pyLibrary.thread.threads import ThreadedQueue, Thread +from pyLibrary.thread.threads import ThreadedQueue, Thread, Lock -class Index(object): +ES_NUMERIC_TYPES = ["long", "integer", "double", "float"] +ES_PRIMITIVE_TYPES = ["string", "boolean", "integer", "date", "long", "double"] + + +class Features(object): + pass + + +class Index(Features): """ AN ElasticSearch INDEX LIFETIME MANAGEMENT TOOL @@ -53,18 +62,17 @@ class Index(object): alias=None, explore_metadata=True, # PROBING THE CLUSTER FOR METADATA IS ALLOWED read_only=True, + tjson=False, # STORED AS TYPED JSON timeout=None, # NUMBER OF SECONDS TO WAIT FOR RESPONSE, OR SECONDS TO WAIT FOR DOWNLOAD (PASSED TO requests) debug=False, # DO NOT SHOW THE DEBUG STATEMENTS settings=None ): - if index==None: Log.error("not allowed") if index == alias: Log.error("must have a unique index name") self.cluster_state = None - self.cluster_metadata = None self.debug = debug if self.debug: Log.alert("elasticsearch debugging for index {{index}} is on", index=settings.index) @@ -73,16 +81,19 @@ class Index(object): self.cluster = Cluster(settings) try: - index = self.get_index(index) - if index and alias==None: + full_index = self.get_index(index) + if full_index and alias==None: settings.alias = settings.index - settings.index = index - if index == None: + settings.index = full_index + if full_index==None: Log.error("not allowed") if type == None: # NO type PROVIDED, MAYBE THERE IS A SUITABLE DEFAULT? - indices = self.cluster.get_metadata().indices - index_ = indices[self.settings.index] + with self.cluster.metadata_locker: + index_ = self.cluster._metadata.indices[self.settings.index] + if not index_: + indices = self.cluster.get_metadata(index=self.settings.index).indices + index_ = indices[self.settings.index] candidate_types = list(index_.mappings.keys()) if len(candidate_types) != 1: @@ -90,13 +101,16 @@ class Index(object): self.settings.type = type = candidate_types[0] except Exception, e: # EXPLORING (get_metadata()) IS NOT ALLOWED ON THE PUBLIC CLUSTER - pass + Log.error("not expected", cause=e) - self.path = "/" + index + "/" + type + if not type: + Log.error("not allowed") + + self.path = "/" + full_index + "/" + type @property def url(self): - return self.cluster.path + "/" + self.path + return self.cluster.path.rstrip("/") + "/" + self.path.lstrip("/") def get_schema(self, retry=True): if self.settings.explore_metadata: @@ -134,25 +148,25 @@ class Index(object): def add_alias(self, alias=None): if alias: self.cluster_state = None - self.cluster._post( + self.cluster.post( "/_aliases", - data=convert.unicode2utf8(convert.value2json({ + data={ "actions": [ {"add": {"index": self.settings.index, "alias": alias}} ] - })), + }, timeout=coalesce(self.settings.timeout, 30) ) else: # SET ALIAS ACCORDING TO LIFECYCLE RULES self.cluster_state = None - self.cluster._post( + self.cluster.post( "/_aliases", - data=convert.unicode2utf8(convert.value2json({ + data={ "actions": [ {"add": {"index": self.settings.index, "alias": self.settings.alias}} ] - })), + }, timeout=coalesce(self.settings.timeout, 30) ) @@ -160,9 +174,10 @@ class Index(object): """ RETURN THE INDEX USED BY THIS alias """ + alias_list = self.cluster.get_aliases() output = sort([ a.index - for a in self.cluster.get_aliases() + for a in alias_list if a.alias == alias or a.index == alias or (re.match(re.escape(alias) + "\\d{8}_\\d{6}", a.index) and a.index != alias) @@ -186,7 +201,7 @@ class Index(object): return True def flush(self): - self.cluster._post("/" + self.settings.index + "/_refresh") + self.cluster.post("/" + self.settings.index + "/_refresh") def delete_record(self, filter): if self.settings.read_only: @@ -250,7 +265,10 @@ class Index(object): Log.error("Expecting every record given to have \"value\" or \"json\" property") lines.append('{"index":{"_id": ' + convert.value2json(id) + '}}') - lines.append(json) + if self.settings.tjson: + lines.append(json2typed(json)) + else: + lines.append(json) del records if not lines: @@ -263,7 +281,7 @@ class Index(object): Log.error("can not make request body from\n{{lines|indent}}", lines=lines, cause=e) - response = self.cluster._post( + response = self.cluster.post( self.path + "/_bulk", data=data_bytes, headers={"Content-Type": "text"}, @@ -279,7 +297,7 @@ class Index(object): error=item.index.error, line=lines[i * 2 + 1] ) - elif any(map(self.cluster.version.startswith, ["1.4.", "1.5.", "1.6."])): + elif any(map(self.cluster.version.startswith, ["1.4.", "1.5.", "1.6.", "1.7."])): if item.index.status not in [200, 201]: Log.error( "{{num}} {{error}} while loading line into {{index}}:\n{{line}}", @@ -323,7 +341,7 @@ class Index(object): Log.error("Can not set refresh interval ({{error}})", { "error": utf82unicode(response.all_content) }) - elif any(map(self.cluster.version.startswith, ["1.4.", "1.5.", "1.6."])): + elif any(map(self.cluster.version.startswith, ["1.4.", "1.5.", "1.6.", "1.7."])): response = self.cluster.put( "/" + self.settings.index + "/_settings", data=convert.unicode2utf8('{"index":{"refresh_interval":' + convert.value2json(interval) + '}}') @@ -347,9 +365,9 @@ class Index(object): else: show_query = query Log.note("Query:\n{{query|indent}}", query=show_query) - return self.cluster._post( + return self.cluster.post( self.path + "/_search", - data=convert.value2json(query).encode("utf8"), + data=query, timeout=coalesce(timeout, self.settings.timeout) ) except Exception, e: @@ -374,24 +392,41 @@ class Index(object): self.cluster.delete_index(index=self.settings.index) +known_clusters = {} + class Cluster(object): + @use_settings - def __init__(self, host, port=9200, settings=None): + def __new__(cls, host, port=9200, settings=None): + if not isinstance(port, int): + Log.error("port must be integer") + cluster = known_clusters.get((host, port)) + if cluster: + return cluster + + cluster = object.__new__(cls) + known_clusters[(host, port)] = cluster + return cluster + + @use_settings + def __init__(self, host, port=9200, explore_metadata=True, settings=None): """ settings.explore_metadata == True - IF PROBING THE CLUSTER FOR METADATA IS ALLOWED settings.timeout == NUMBER OF SECONDS TO WAIT FOR RESPONSE, OR SECONDS TO WAIT FOR DOWNLOAD (PASSED TO requests) """ + if hasattr(self, "settings"): + return - settings.setdefault("explore_metadata", True) - - self.cluster_state = None - self.cluster_metadata = None - - self.debug = settings.debug self.settings = settings + self.cluster_state = None + self._metadata = None + self.metadata_locker = Lock() + self.debug = settings.debug self.version = None self.path = settings.host + ":" + unicode(settings.port) + self.get_metadata() + @use_settings def get_or_create_index( self, @@ -400,6 +435,7 @@ class Cluster(object): schema=None, limit_replicas=None, read_only=False, + tjson=False, settings=None ): best = self._get_best(settings) @@ -489,6 +525,7 @@ class Cluster(object): schema=None, limit_replicas=None, read_only=False, + tjson=False, settings=None ): if not settings.alias: @@ -518,7 +555,7 @@ class Cluster(object): ) schema.settings.index.number_of_replicas = health.number_of_nodes - 1 - self._post( + self.post( "/" + settings.index, data=convert.value2json(schema).encode("utf8"), headers={"Content-Type": "application/json"} @@ -542,9 +579,9 @@ class Cluster(object): RETURN LIST OF {"alias":a, "index":i} PAIRS ALL INDEXES INCLUDED, EVEN IF NO ALIAS {"alias":Null} """ - data = self.get_metadata().indices + data = self.get("/_cluster/state") output = [] - for index, desc in data.items(): + for index, desc in data.metadata.indices.items(): if not desc["aliases"]: output.append({"index": index, "alias": None}) else: @@ -552,29 +589,38 @@ class Cluster(object): output.append({"index": index, "alias": a}) return wrap(output) - def get_metadata(self): - if self.settings.explore_metadata: - if not self.cluster_metadata: - response = self.get("/_cluster/state") - self.cluster_metadata = wrap(response.metadata) - self.cluster_state = wrap(self.get("/")) - self.version = self.cluster_state.version.number - else: - Log.error("Metadata exploration has been disabled") - return self.cluster_metadata + def get_metadata(self, index=None, force=False): + with self.metadata_locker: + if self.settings.explore_metadata: + if not self._metadata or (force and index is None): + response = self.get("/_cluster/state") + self._metadata = wrap(response.metadata) + self.cluster_state = wrap(self.get("/")) + self.version = self.cluster_state.version.number + elif index: # UPDATE THE MAPPING FOR ONE INDEX ONLY + response = self.get("/"+index+"/_mapping") + self._metadata.indices[index].mappings = qb.sort(response.items(), 0).last()[1].mappings + return Dict(indices={index: self._metadata.indices[index]}) + else: + Log.error("Metadata exploration has been disabled") + return self._metadata - - def _post(self, path, **kwargs): + def post(self, path, **kwargs): url = self.settings.host + ":" + unicode(self.settings.port) + path try: wrap(kwargs).headers["Accept-Encoding"] = "gzip,deflate" - if "data" in kwargs and not isinstance(kwargs["data"], str): + data = kwargs.get(b'data') + if data == None: + pass + elif isinstance(data, Mapping): + kwargs[b'data'] = data =convert.unicode2utf8(convert.value2json(data)) + elif not isinstance(kwargs["data"], str): Log.error("data must be utf8 encoded string") if self.debug: - sample = kwargs.get("data", "")[:300] + sample = kwargs.get(b'data', "")[:300] Log.note("{{url}}:\n{{data|indent}}", url=url, data=sample) response = http.post(url, **kwargs) @@ -597,9 +643,12 @@ class Cluster(object): suggestion = "" if kwargs.get("data"): - Log.error("Problem with call to {{url}}" + suggestion + "\n{{body|left(10000)}}", + Log.error( + "Problem with call to {{url}}" + suggestion + "\n{{body|left(10000)}}", url=url, - body=kwargs["data"][0:10000] if self.debug else kwargs["data"][0:100], cause=e) + body=kwargs["data"][0:10000] if self.debug else kwargs["data"][0:100], + cause=e + ) else: Log.error("Problem with call to {{url}}" + suggestion, url=url, cause=e) @@ -718,7 +767,7 @@ def _scrub(r): if len(output) == 1: return output[0] try: - return sort(output) # SUCCESS ONLY ON STRINGS, OR NUMBERS + return sort(output) except Exception: return output else: @@ -728,7 +777,7 @@ def _scrub(r): -class Alias(object): +class Alias(Features): @use_settings def __init__( self, @@ -751,11 +800,13 @@ class Alias(object): Log.error("Alias() was given no `type` (aka schema) and not allowed to explore metadata. Do not know what to do now.") indices = self.cluster.get_metadata().indices - if not self.settings.alias or self.settings.alias == self.settings.index: - candidates = [(name, i) for name, i in indices.items() if self.settings.index in i.aliases] - index = qb.sort(candidates, 0).last()[1] + if not self.settings.alias or self.settings.alias==self.settings.index: + alias_list = self.cluster.get("/_alias/"+self.settings.index) + candidates = [(name, i) for name, i in alias_list.items() if self.settings.index in i.aliases.keys()] + full_name = qb.sort(candidates, 0).last()[0] + index = self.cluster.get("/" + full_name + "/_mapping")[full_name] else: - index = indices[self.settings.index] + index = self.cluster.get("/"+self.settings.index+"/_mapping")[self.settings.index] # FIND MAPPING WITH MOST PROPERTIES (AND ASSUME THAT IS THE CANONICAL TYPE) max_prop = -1 @@ -773,7 +824,7 @@ class Alias(object): @property def url(self): - return self.cluster.path + "/" + self.path + return self.cluster.path.rstrip("/") + "/" + self.path.lstrip("/") def get_schema(self, retry=True): if self.settings.explore_metadata: @@ -871,8 +922,8 @@ class Alias(object): show_query.facets = {k: "..." for k in query.facets.keys()} else: show_query = query - Log.note("Query:\n{{query|indent}}", query= show_query) - return self.cluster._post( + Log.note("Query:\n{{query|indent}}", query=show_query) + return self.cluster.post( self.path + "/_search", data=convert.value2json(query).encode("utf8"), timeout=coalesce(timeout, self.settings.timeout) @@ -886,6 +937,98 @@ class Alias(object): ) +def parse_properties(parent_index_name, parent_query_path, esProperties): + """ + RETURN THE COLUMN DEFINITIONS IN THE GIVEN esProperties OBJECT + """ + from pyLibrary.queries.meta import Column + + columns = DictList() + for name, property in esProperties.items(): + if parent_query_path: + index_name, query_path = parent_index_name, join_field(split_field(parent_query_path) + [name]) + else: + index_name, query_path = parent_index_name, name + + if property.type == "nested" and property.properties: + # NESTED TYPE IS A NEW TYPE DEFINITION + # MARKUP CHILD COLUMNS WITH THE EXTRA DEPTH + self_columns = parse_properties(index_name, query_path, property.properties) + for c in self_columns: + if not c.nested_path: + c.nested_path = [query_path] + else: + c.nested_path.insert(0, query_path) + columns.extend(self_columns) + columns.append(Column( + table=index_name, + name=query_path, + abs_name=query_path, + type="nested", + nested_path=[name] + )) + + continue + + if property.properties: + child_columns = parse_properties(index_name, query_path, property.properties) + columns.extend(child_columns) + columns.append(Column( + table=index_name, + name=query_path, + abs_name=query_path, + type="object" + )) + + if property.dynamic: + continue + if not property.type: + continue + if property.type == "multi_field": + property.type = property.fields[name].type # PULL DEFAULT TYPE + for i, (n, p) in enumerate(property.fields.items()): + if n == name: + # DEFAULT + columns.append(Column( + table=index_name, + name=query_path, + type=p.type + )) + else: + columns.append(Column( + table=index_name, + name=query_path + "." + n, + type=p.type + )) + continue + + if property.type in ["string", "boolean", "integer", "date", "long", "double"]: + columns.append(Column( + table=index_name, + name=query_path, + abs_name=query_path, + type=property.type + )) + if property.index_name and name != property.index_name: + columns.append(Column( + table=index_name, + name=property.index_name, + type=property.type + )) + elif property.enabled == None or property.enabled == False: + columns.append(Column( + table=index_name, + name=query_path, + abs_name=query_path, + type="object" + )) + else: + Log.warning("unknown type {{type}} for property {{path}}", type=property.type, path=query_path) + + return columns + + + def _merge_mapping(a, b): """ MERGE TWO MAPPINGS, a TAKES PRECEDENCE @@ -990,5 +1133,3 @@ _merge_type = { } } - - diff --git a/pyLibrary/env/files.py b/pyLibrary/env/files.py index a654d68..3af1e3b 100644 --- a/pyLibrary/env/files.py +++ b/pyLibrary/env/files.py @@ -16,7 +16,8 @@ import shutil from pyLibrary.strings import utf82unicode from pyLibrary.maths import crypto -from pyLibrary.dot import coalesce +from pyLibrary.dot import coalesce, set_default, split_field, join_field +from pyLibrary.dot import listwrap, wrap from pyLibrary import convert diff --git a/pyLibrary/env/http.py b/pyLibrary/env/http.py index 8fedfee..9b882d4 100644 --- a/pyLibrary/env/http.py +++ b/pyLibrary/env/http.py @@ -99,7 +99,7 @@ def request(method, url, **kwargs): if " Read timed out." in e: Log.error("Timeout failure (timeout was {{timeout}}", timeout=timeout, cause=e) else: - Log.error("Request failure", e) + Log.error("Request failure of {{url}}", url=url, cause=e) def _to_ascii_dict(headers): diff --git a/pyLibrary/jsons/__init__.py b/pyLibrary/jsons/__init__.py index 47a30d5..bdac991 100644 --- a/pyLibrary/jsons/__init__.py +++ b/pyLibrary/jsons/__init__.py @@ -5,7 +5,7 @@ import json import re from types import NoneType -from pyLibrary.dot import DictList, NullType +from pyLibrary.dot import DictList, NullType, Dict, unwrap from pyLibrary.dot.objects import DictObject from pyLibrary.times.dates import Date @@ -22,10 +22,10 @@ def _late_import(): global datetime2unix global utf82unicode - from pyLibrary.debugs.logs import Log + from pyLibrary.debugs.logs import Log as _Log from pyLibrary.convert import datetime2unix, utf82unicode - _ = Log + _ = _Log _ = datetime2unix _ = utf82unicode @@ -50,7 +50,6 @@ def replace(match): def quote(value): - value return "\"" + ESCAPE.sub(replace, value) + "\"" @@ -82,6 +81,8 @@ def _scrub(value, is_done): return utf82unicode(value) elif type_ is Decimal: return float(value) + elif type_ is Dict: + return _scrub(unwrap(value), is_done) elif isinstance(value, Mapping): _id = id(value) if _id in is_done: diff --git a/pyLibrary/jsons/encoder.py b/pyLibrary/jsons/encoder.py index a542058..ea366d8 100644 --- a/pyLibrary/jsons/encoder.py +++ b/pyLibrary/jsons/encoder.py @@ -36,7 +36,7 @@ json_decoder = json.JSONDecoder().decode # THE DEFAULT JSON ENCODERS CAN NOT HANDLE A DIVERSITY OF TYPES *AND* BE FAST # # 1) WHEN USING cPython, WE HAVE NO COMPILER OPTIMIZATIONS: THE BEST STRATEGY IS TO -# CONVERT THE MEMORY STRUCTURE TO STANDARD TYPES AND SEND TO THE INSANELY FAST +# CONVERT THE MEMORY STRUCTURE TO STANDARD TYPES AND SEND TO THE INSANELY FAST # DEFAULT JSON ENCODER # 2) WHEN USING PYPY, WE USE CLEAR-AND-SIMPLE PROGRAMMING SO THE OPTIMIZER CAN DO # ITS JOB. ALONG WITH THE UnicodeBuilder WE GET NEAR C SPEEDS @@ -67,11 +67,14 @@ except Exception, e: append = UnicodeBuilder.append +_dealing_with_problem = False + def pypy_json_encode(value, pretty=False): """ pypy DOES NOT OPTIMIZE GENERATOR CODE WELL """ + global _dealing_with_problem if pretty: return pretty_json(value) @@ -83,14 +86,23 @@ def pypy_json_encode(value, pretty=False): except Exception, e: # THE PRETTY JSON WILL PROVIDE MORE DETAIL ABOUT THE SERIALIZATION CONCERNS from pyLibrary.debugs.logs import Log - Log.warning("Serialization of JSON problems", e) + + if _dealing_with_problem: + Log.error("Serialization of JSON problems", e) + else: + Log.warning("Serialization of JSON problems", e) + _dealing_with_problem = True try: return pretty_json(value) except Exception, f: Log.error("problem serializing object", f) + finally: + _dealing_with_problem = False + almost_pattern = r"(?:\.(\d*)999)|(?:\.(\d*)000)" + def float_repr(value): output = repr(value) d = output.find(".") @@ -107,13 +119,14 @@ def float_repr(value): else: return output + json_encoder_module.FLOAT_REPR = float_repr + class cPythonJSONEncoder(object): def __init__(self): object.__init__(self) - self.encoder = json.JSONEncoder( skipkeys=False, ensure_ascii=False, # DIFF FROM DEFAULTS @@ -135,6 +148,7 @@ class cPythonJSONEncoder(object): return unicode(self.encoder.encode(scrubbed)) except Exception, e: from pyLibrary.debugs.logs import Log, Except + e = Except.wrap(e) Log.warning("problem serializing {{type}}", type=_repr(value), cause=e) raise e @@ -242,7 +256,6 @@ def _dict2json(value, _buffer): append(_buffer, u"}") - ARRAY_ROW_LENGTH = 80 ARRAY_ITEM_MAX_LENGTH = 30 ARRAY_MAX_COLUMNS = 10 @@ -262,7 +275,7 @@ def pretty_json(value): from pyLibrary.debugs.logs import Log try: - Log.note("try explicit convert of string with length {{length}}", length= len(value)) + Log.note("try explicit convert of string with length {{length}}", length=len(value)) acc = [u"\""] for c in value: try: @@ -277,7 +290,7 @@ def pretty_json(value): # Log.warning("odd character {{ord}} found in string. Ignored.", ord= ord(c)}, cause=g) acc.append(u"\"") output = u"".join(acc) - Log.note("return value of length {{length}}", length= len(output)) + Log.note("return value of length {{length}}", length=len(output)) return output except BaseException, f: Log.warning("can not even explicit convert", f) @@ -291,8 +304,8 @@ def pretty_json(value): return "{" + quote(unicode(items[0][0])) + ": " + pretty_json(items[0][1]).strip() + "}" items = sorted(items, lambda a, b: value_compare(a[0], b[0])) - values = [quote(unicode(k))+": " + indent(pretty_json(v)).strip() for k, v in items if v != None] - return "{\n" + INDENT + (",\n"+INDENT).join(values) + "\n}" + values = [quote(unicode(k)) + ": " + indent(pretty_json(v)).strip() for k, v in items if v != None] + return "{\n" + INDENT + (",\n" + INDENT).join(values) + "\n}" except Exception, e: from pyLibrary.debugs.logs import Log from pyLibrary.collections import OR @@ -309,7 +322,7 @@ def pretty_json(value): if not value: return "[]" - if ARRAY_MAX_COLUMNS==1: + if ARRAY_MAX_COLUMNS == 1: return "[\n" + ",\n".join([indent(pretty_json(v)) for v in value]) + "\n]" if len(value) == 1: @@ -323,14 +336,14 @@ def pretty_json(value): max_len = max(*[len(j) for j in js]) if max_len <= ARRAY_ITEM_MAX_LENGTH and max(*[j.find("\n") for j in js]) == -1: # ALL TINY VALUES - num_columns = max(1, min(ARRAY_MAX_COLUMNS, int(floor((ARRAY_ROW_LENGTH + 2.0)/float(max_len+2))))) # +2 TO COMPENSATE FOR COMMAS - if len(js)<=num_columns: # DO NOT ADD \n IF ONLY ONE ROW + num_columns = max(1, min(ARRAY_MAX_COLUMNS, int(floor((ARRAY_ROW_LENGTH + 2.0) / float(max_len + 2))))) # +2 TO COMPENSATE FOR COMMAS + if len(js) <= num_columns: # DO NOT ADD \n IF ONLY ONE ROW return "[" + ", ".join(js) + "]" if num_columns == 1: # DO NOT rjust IF THERE IS ONLY ONE COLUMN return "[\n" + ",\n".join([indent(pretty_json(v)) for v in value]) + "\n]" content = ",\n".join( - ", ".join(j.rjust(max_len) for j in js[r:r+num_columns]) + ", ".join(j.rjust(max_len) for j in js[r:r + num_columns]) for r in xrange(0, len(js), num_columns) ) return "[\n" + indent(content) + "\n]" @@ -363,13 +376,13 @@ def pretty_json(value): return "null" else: try: - if int(value)==value: + if int(value) == value: return str(int(value)) except Exception, e: pass try: - if float(value)==value: + if float(value) == value: return str(float(value)) except Exception, e: pass @@ -450,13 +463,11 @@ def datetime2milli(d, type): _repr_ = Repr() _repr_.maxlevel = 2 + def _repr(obj): return _repr_.repr(obj) - - - # OH HUM, cPython with uJSON, OR pypy WITH BUILTIN JSON? # http://liangnuren.wordpress.com/2012/08/13/python-json-performance/ # http://morepypy.blogspot.ca/2011/10/speeding-up-json-encoding-in-pypy.html diff --git a/pyLibrary/jsons/ref.py b/pyLibrary/jsons/ref.py index 3670117..ee98850 100644 --- a/pyLibrary/jsons/ref.py +++ b/pyLibrary/jsons/ref.py @@ -207,7 +207,7 @@ def get_file(ref, url): except Exception, e: try: new_value = _convert.ini2value(content) - except Exception, f: + except Exception: raise _Log.error("Can not read {{file}}", file=path, cause=e) new_value = _replace_ref(new_value, ref) return new_value diff --git a/pyLibrary/jsons/typed_encoder.py b/pyLibrary/jsons/typed_encoder.py index 60ab970..c185ec2 100644 --- a/pyLibrary/jsons/typed_encoder.py +++ b/pyLibrary/jsons/typed_encoder.py @@ -218,7 +218,13 @@ def json2typed(json): mode = VALUE elif c == ",": mode = context.pop() - elif c in "]}": + if mode != OBJECT: + context.append(mode) + mode = VALUE + elif c in "]": + mode = context.pop() + elif c in "}": + mode = context.pop() mode = context.pop() elif c == '"': context.append(mode) @@ -276,6 +282,8 @@ def json2typed(json): context.append(mode) context.append(KEYWORD) mode = STRING + elif c == ",": + pass elif c == '}': mode = context.pop() else: diff --git a/pyLibrary/maths/__init__.py b/pyLibrary/maths/__init__.py index da72142..c53afb2 100644 --- a/pyLibrary/maths/__init__.py +++ b/pyLibrary/maths/__init__.py @@ -234,7 +234,7 @@ class Math(object): @staticmethod def MAX(values): - output = None + output = Null for v in values: if v == None: continue diff --git a/pyLibrary/meta.py b/pyLibrary/meta.py index f8ba5de..2fe2f80 100644 --- a/pyLibrary/meta.py +++ b/pyLibrary/meta.py @@ -124,14 +124,14 @@ def use_settings(func): def wrapper(*args, **kwargs): try: - if func.func_name == "__init__" and "settings" in kwargs: + if func.func_name in ("__init__", "__new__") and "settings" in kwargs: packed = params_pack(params, kwargs, dot.zip(params[1:], args[1:]), kwargs["settings"], defaults) return func(args[0], **packed) - elif func.func_name == "__init__" and len(args) == 2 and len(kwargs) == 0 and isinstance(args[1], Mapping): + elif func.func_name in ("__init__", "__new__") and len(args) == 2 and len(kwargs) == 0 and isinstance(args[1], Mapping): # ASSUME SECOND UNNAMED PARAM IS settings packed = params_pack(params, args[1], defaults) return func(args[0], **packed) - elif func.func_name == "__init__": + elif func.func_name in ("__init__", "__new__"): # DO NOT INCLUDE self IN SETTINGS packed = params_pack(params, kwargs, dot.zip(params[1:], args[1:]), defaults) return func(args[0], **packed) diff --git a/pyLibrary/parsers.py b/pyLibrary/parsers.py index e5647eb..9fc7a63 100644 --- a/pyLibrary/parsers.py +++ b/pyLibrary/parsers.py @@ -1,19 +1,18 @@ -from urlparse import urlparse - -from pyLibrary.dot import wrap +from urlparse import urlparse, parse_qs +from pyLibrary.dot import Null, coalesce, wrap +from pyLibrary.dot.dicts import Dict -_convert = None -_Log = None +convert = None +Log = None def _late_import(): - global _convert - global _Log - from pyLibrary import convert as _convert - from pyLibrary.debugs.logs import Log as _Log - _ = _convert - _ = _Log + global convert + global Log + from pyLibrary import convert + from pyLibrary.debugs.logs import Log + names = ["path", "query", "fragment"] indicator = ["/", "?", "#"] @@ -50,7 +49,7 @@ class URL(object): if value == None: return - if not _convert: + if not convert: _late_import() if value.startswith("file://") or value.startswith("//"): # urlparse DOES NOT WORK IN THESE CASES @@ -58,7 +57,7 @@ class URL(object): self.scheme = scheme.rstrip(":") parse(self, suffix, 0, 1) - self.query = wrap(_convert.url_param2value(self.query)) + self.query = wrap(convert.url_param2value(self.query)) self.fragment = self.fragment else: output = urlparse(value) @@ -66,7 +65,7 @@ class URL(object): self.port = output.port self.host = output.netloc.split(":")[0] self.path = output.path - self.query = wrap(_convert.url_param2value(output.query)) + self.query = wrap(convert.url_param2value(output.query)) self.fragment = output.fragment def __nonzero__(self): @@ -90,9 +89,9 @@ class URL(object): if self.path: url += str(self.path) if self.query: - url = url + '?' + _convert.value2url(self.query) + url = url + '?' + convert.value2url(self.query) if self.fragment: - url = url + '#' + _convert.value2url(self.fragment) + url = url + '#' + convert.value2url(self.fragment) return url diff --git a/pyLibrary/queries/README.md b/pyLibrary/queries/README.md new file mode 100644 index 0000000..1b3467e --- /dev/null +++ b/pyLibrary/queries/README.md @@ -0,0 +1,6 @@ +MoQueries +========= + +A Python library that supports [Qb queries](https://github.com/klahnakoski/ActiveData/blob/dev/docs/Qb_Tutorial.md "Qb Queries"), and a variety of other set-operations. + + diff --git a/pyLibrary/queries/__init__.py b/pyLibrary/queries/__init__.py index e69de29..d0e77e5 100644 --- a/pyLibrary/queries/__init__.py +++ b/pyLibrary/queries/__init__.py @@ -0,0 +1,87 @@ +# encoding: utf-8 +# +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. +# +# Author: Kyle Lahnakoski (kyle@lahnakoski.com) +# +from __future__ import unicode_literals +from collections import Mapping + +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import wrap, set_default, split_field +from pyLibrary.dot.dicts import Dict +from pyLibrary.queries import containers + +type2container = Dict() +config = Dict() # config.default IS EXPECTED TO BE SET BEFORE CALLS ARE MADE +_ListContainer = None + +def _delayed_imports(): + global type2container + global _ListContainer + + from pyLibrary.queries.containers.lists import ListContainer as _ListContainer + _ = _ListContainer + + from pyLibrary.queries.qb_usingMySQL import MySQL + from pyLibrary.queries.qb_usingES import FromES + from pyLibrary.queries.meta import FromESMetadata + + set_default(type2container, { + "elasticsearch": FromES, + "mysql": MySQL, + "memory": None, + "meta": FromESMetadata + }) + + +def wrap_from(frum, schema=None): + """ + :param frum: + :param schema: + :return: + """ + if not type2container: + _delayed_imports() + + frum = wrap(frum) + + if isinstance(frum, basestring): + if not containers.config.default.settings: + Log.error("expecting pyLibrary.queries.query.config.default.settings to contain default elasticsearch connection info") + + type_ = None + index = frum + if frum.startswith("meta."): + type_ = "meta" + else: + index = split_field(frum)[0] + + settings = set_default( + { + "index": index, + "name": frum, + "type": type_ + }, + containers.config.default.settings + ) + return type2container[settings.type](settings) + elif isinstance(frum, Mapping) and frum.type and type2container[frum.type]: + # TODO: Ensure the frum.name is set, so we capture the deep queries + if not frum.type: + Log.error("Expecting from clause to have a 'type' property") + return type2container[frum.type](frum.settings) + elif isinstance(frum, Mapping) and (frum["from"] or isinstance(frum["from"], (list, set))): + from pyLibrary.queries.query import Query + return Query(frum, schema=schema) + elif isinstance(frum, list): + return _ListContainer(frum) + else: + return frum + + + +import es09.util diff --git a/pyLibrary/queries/containers/__init__.py b/pyLibrary/queries/containers/__init__.py index 92e8282..d0ab594 100644 --- a/pyLibrary/queries/containers/__init__.py +++ b/pyLibrary/queries/containers/__init__.py @@ -16,7 +16,7 @@ from copy import copy from types import GeneratorType from pyLibrary.debugs.logs import Log -from pyLibrary.dot import set_default, split_field, wrap +from pyLibrary.dot import set_default, split_field, wrap, DictList from pyLibrary.dot.dicts import Dict type2container = Dict() @@ -25,7 +25,7 @@ _ListContainer = None _Cube = None _run = None _Query = None - +_Normal = None def _delayed_imports(): global type2container @@ -33,6 +33,7 @@ def _delayed_imports(): global _Cube global _run global _Query + global _Normal from pyLibrary.queries.qb_usingMySQL import MySQL as _MySQL from pyLibrary.queries.qb_usingES import FromES as _FromES @@ -49,10 +50,11 @@ def _delayed_imports(): _ = _run _ = _Query + _ = _Normal class Container(object): - __slots__ = ["data", "schema"] + __slots__ = ["data", "schema", "namespaces"] @classmethod def new_instance(type, frum, schema=None): @@ -100,8 +102,14 @@ class Container(object): def __init__(self, frum, schema=None): object.__init__(self) + if not type2container: + _delayed_imports() + self.data = frum + if isinstance(schema, list): + Log.error("expecting map from abs_name to column object") self.schema = schema + # self.namespaces = wrap([_Normal()]) def query(self, query): if query.frum != self: @@ -135,7 +143,7 @@ class Container(object): _ = format Log.error("not implemented") - def get_columns(self, frum): + def get_columns(self, table): """ USE THE frum TO DETERMINE THE COLUMNS """ diff --git a/pyLibrary/queries/containers/cube.py b/pyLibrary/queries/containers/cube.py index de80f10..c1e77c8 100644 --- a/pyLibrary/queries/containers/cube.py +++ b/pyLibrary/queries/containers/cube.py @@ -16,11 +16,11 @@ from pyLibrary import convert from pyLibrary.collections.matrix import Matrix from pyLibrary.collections import MAX, OR from pyLibrary.queries.containers import Container -# from pyLibrary.queries.query import _normalize_edge from pyLibrary.dot import Null, Dict from pyLibrary.dot.lists import DictList from pyLibrary.dot import wrap, wrap_dot, listwrap from pyLibrary.debugs.logs import Log +from pyLibrary.queries.query import _normalize_edge class Cube(Container): @@ -272,7 +272,7 @@ class Cube(Container): if len(self.edges)==1 and self.edges[0].domain.type=="index": # USE THE STANDARD LIST FILTER from pyLibrary.queries import qb - return qb.filter(where, self.data.values()[0].cube) + return qb.filter(self.data.values()[0].cube, where) else: # FILTER DOES NOT ALTER DIMESIONS, JUST WHETHER THERE ARE VALUES IN THE CELLS Log.unexpected("Incomplete") diff --git a/pyLibrary/queries/containers/lists.py b/pyLibrary/queries/containers/lists.py index 9d1c611..bb9f701 100644 --- a/pyLibrary/queries/containers/lists.py +++ b/pyLibrary/queries/containers/lists.py @@ -10,26 +10,37 @@ from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import +from collections import Mapping from pyLibrary import convert from pyLibrary.debugs.logs import Log -from pyLibrary.dot import Dict, wrap +from pyLibrary.dot import Dict, wrap, listwrap, unwraplist +from pyLibrary.queries import qb from pyLibrary.queries.containers import Container -from pyLibrary.queries.expressions import TRUE_FILTER -from pyLibrary.queries.list.aggs import is_aggs, list_aggs +from pyLibrary.queries.domains import is_keyword +from pyLibrary.queries.expressions import TRUE_FILTER, qb_expression_to_python +from pyLibrary.queries.lists.aggs import is_aggs, list_aggs +from pyLibrary.queries.meta import Column +from pyLibrary.thread.threads import Lock class ListContainer(Container): def __init__(self, frum, schema=None): - Container.__init__(self, frum, schema) - self.frum = list(frum) + #TODO: STORE THIS LIKE A CUBE FOR FASTER ACCESS AND TRANSFORMATION + frum = list(frum) if schema == None: self.schema = get_schema_from_list(frum) + Container.__init__(self, frum, schema) + self.frum = frum + + @property + def query_path(self): + return None def query(self, q): - frum = self.frum + frum = self if is_aggs(q): - frum = list_aggs(frum, q) + frum = list_aggs(frum.data, q) else: # SETOP try: if q.filter != None or q.esfilter != None: @@ -51,22 +62,55 @@ class ListContainer(Container): return frum.format(q.format) + def update(self, command): + """ + EXPECTING command == {"set":term, "clear":term, "where":where} + THE set CLAUSE IS A DICT MAPPING NAMES TO VALUES + THE where CLAUSE IS AN ES FILTER + """ + command = wrap(command) + if command.where==None: + filter_ = lambda: True + else: + filter_ = _exec("temp = lambda row: "+qb_expression_to_python(command.where)) + for c in self.data: + if filter_(c): + for k in command["clear"].keys(): + c[k] = None + for k, v in command.set.items(): + c[k] = v + def filter(self, where): return self.where(where) def where(self, where): - _ = where - Log.error("not implemented") + if isinstance(where, Mapping): + temp = None + exec("def temp(row):\n return "+qb_expression_to_python(where)) + else: + temp = where + + return ListContainer(filter(temp, self.data), self.schema) def sort(self, sort): - _ = sort - Log.error("not implemented") + return ListContainer(qb.sort(self.data, sort), self.schema) def select(self, select): - _ = select - Log.error("not implemented") + selects = listwrap(select) + if selects[0].value == "*" and selects[0].name == ".": + return self + + for s in selects: + if not isinstance(s.value, basestring) or not is_keyword(s.value): + Log.error("selecting on structure, or expressions, not supported yet") + + #TODO: DO THIS WITH JUST A SCHEMA TRANSFORM, DO NOT TOUCH DATA + #TODO: HANDLE STRUCTURE AND EXPRESSIONS + new_schema = {s.name: self.schema[s.value] for s in selects} + new_data = [{s.name: d[s.value] for s in selects} for d in self.data] + return ListContainer(frum=new_data, schema=new_schema) def window(self, window): _ = window @@ -78,17 +122,35 @@ class ListContainer(Container): def format(self, format): if format == "table": - frum = convert.list2table(self.data) - frum.meta.format = "table" + frum = convert.list2table(self.data, self.schema.keys()) + elif format == "cube": + frum = convert.list2cube(self.data, self.schema.keys()) else: - frum = wrap({ - "meta": {"format": "list"}, - "data": self.data - }) + frum = self - def get_columns(self, frum): + return frum + + def insert(self, documents): + self.data.extend(documents) + + def extend(self, documents): + self.data.extend(documents) + + def add(self, doc): + self.data.append(doc) + + def to_dict(self): + return wrap({ + "meta": {"format": "list"}, + "data": [{k: unwraplist(v) for k, v in row.items()} for row in self.data] + }) + + def get_columns(self, table=None): return self.schema.values() + def __getitem__(self, item): + return self.data[item] + def get_schema_from_list(frum): """ @@ -98,7 +160,7 @@ def get_schema_from_list(frum): _get_schema_from_list(frum, columns, [], 0) return columns -def _get_schema_from_list(frum, columns, prefix, depth): +def _get_schema_from_list(frum, columns, prefix, nested_path): """ SCAN THE LIST FOR COLUMN TYPES """ @@ -111,14 +173,21 @@ def _get_schema_from_list(frum, columns, prefix, depth): names[name] = new_type if this_type == "object": - _get_schema_from_list([value], columns, prefix + [name], depth) + _get_schema_from_list([value], columns, prefix + [name], nested_path) elif this_type == "nested": - _get_schema_from_list(value, columns, prefix + [name], depth+1) + if not nested_path: + _get_schema_from_list(value, columns, prefix + [name], [name]) + else: + _get_schema_from_list(value, columns, prefix + [name], [nested_path[0]+"."+name]+nested_path) for n, t in names.items(): full_name = ".".join(prefix + [n]) - column = {"name": full_name, "value": full_name, "type": t, "depth": depth} - columns[full_name] = column + column = Column( + name=full_name, + type=t, + nested_path=nested_path + ) + columns[columns.name] = column _type_to_name = { @@ -229,3 +298,7 @@ _merge_type = { +def _exec(code): + temp = None + exec code + return temp diff --git a/pyLibrary/queries/cubes/aggs.py b/pyLibrary/queries/cubes/aggs.py index bb085a3..cf8b5eb 100644 --- a/pyLibrary/queries/cubes/aggs.py +++ b/pyLibrary/queries/cubes/aggs.py @@ -14,7 +14,7 @@ import itertools from pyLibrary.collections.matrix import Matrix from pyLibrary.debugs.logs import Log -from pyLibrary.dot import listwrap +from pyLibrary.dot import listwrap, unwrap from pyLibrary.queries import windows from pyLibrary.queries.containers.cube import Cube from pyLibrary.queries.domains import SimpleSetDomain, DefaultDomain diff --git a/pyLibrary/queries/dimensions.py b/pyLibrary/queries/dimensions.py index 90bcf95..fc640d8 100644 --- a/pyLibrary/queries/dimensions.py +++ b/pyLibrary/queries/dimensions.py @@ -26,16 +26,20 @@ DEFAULT_QUERY_LIMIT = 20 class Dimension(Container): + __slots__ = ["name", "full_name", "where", "type", "limit", "index", "parent", "edges", "partitions", "fields"] def __init__(self, dim, parent, qb): + dim = wrap(dim) + self.name = dim.name - self.parent = parent + self.parent = coalesce(parent) self.full_name = join_field(split_field(self.parent.full_name)+[self.name]) + self.edges = None # FOR NOW dot.set_default(self, dim) - self.esfilter = dim.esfilter + self.where = dim.where self.type = coalesce(dim.type, "set") self.limit = coalesce(dim.limit, DEFAULT_QUERY_LIMIT) - self.index = coalesce(dim.index, coalesce(parent, Null).index, qb.es.settings.name) + self.index = coalesce(dim.index, coalesce(parent, Null).index, qb.settings.index) if not self.index: Log.error("Expecting an index name") @@ -61,18 +65,19 @@ class Dimension(Container): if dim.partitions: return # ALREADY HAVE PARTS - if dim.type not in KNOWN - ALGEBRAIC: + if self.type not in KNOWN - ALGEBRAIC: return # PARTS OR TOO FUZZY (OR TOO NUMEROUS) TO FETCH + qb.get_columns() with Timer("Get parts of {{name}}", {"name": self.name}): parts = qb.query({ "from": self.index, "select": {"name": "count", "aggregate": "count"}, "edges": edges, - "esfilter": self.esfilter, + "where": self.where, "limit": self.limit }) - Log.note("{{name}} has {{num}} parts", name=self.name, num=len(parts)) + Log.note("{{name}} has {{num}} parts", name= self.name, num= len(parts)) d = parts.edges[0].domain @@ -101,7 +106,7 @@ class Dimension(Container): if p: partitions.append({ "value": g, - "esfilter": {"and": [ + "where": {"and": [ {"term": {e.value: g[e.name]}} for e in edges ]}, @@ -116,7 +121,7 @@ class Dimension(Container): { "name": str(d.partitions[i].name), # CONVERT TO STRING "value": d.getEnd(d.partitions[i]), - "esfilter": {"term": {edges[0].value: d.partitions[i].value}}, + "where": {"term": {edges[0].value: d.partitions[i].value}}, "count": count } for i, count in enumerate(parts) @@ -142,13 +147,13 @@ class Dimension(Container): { "name": str(d.partitions[i].name), # CONVERT TO STRING "value": d.getEnd(d.partitions[i]), - "esfilter": {"term": {edges[0].value: d.partitions[i].value}}, + "where": {"term": {edges[0].value: d.partitions[i].value}}, "count": SUM(subcube), "partitions": [ { "name": str(d2.partitions[j].name), # CONVERT TO STRING "value": edges2value(d.getEnd(d.partitions[i]), d2.getEnd(d2.partitions[j])), - "esfilter": {"and": [ + "where": {"and": [ {"term": {edges[0].value: d.partitions[i].value}}, {"term": {edges[1].value: d2.partitions[j].value}} ]}, @@ -165,11 +170,17 @@ class Dimension(Container): parse_partition(self) # RELATE THE PARTS TO THE PARENTS + def __getitem__(self, item): + return self.__getattr__(item) + def __getattr__(self, key): """ RETURN CHILD EDGE OR PARTITION BY NAME """ #TODO: IGNORE THE STANDARD DIMENSION PROPERTIES TO AVOID ACCIDENTAL SELECTION OF EDGE OR PART + if key in Dimension.__slots__: + return None + e = self.edges[key] if e: return e @@ -187,14 +198,14 @@ class Dimension(Container): # USE EACH EDGE AS A PARTITION, BUT isFacet==True SO IT ALLOWS THE OVERLAP partitions = [ { - "name":v.name, - "value":v.name, - "esfilter":v.esfilter, - "style":v.style, - "weight":v.weight # YO! WHAT DO WE *NOT* COPY? + "name": v.name, + "value": v.name, + "where": v.where, + "style": v.style, + "weight": v.weight # YO! WHAT DO WE *NOT* COPY? } for i, v in enumerate(self.edges) - if i < coalesce(self.limit, DEFAULT_QUERY_LIMIT) and v.esfilter + if i < coalesce(self.limit, DEFAULT_QUERY_LIMIT) and v.where ] self.isFacet = True elif kwargs.depth == None: # ASSUME self.fields IS A dict @@ -205,7 +216,7 @@ class Dimension(Container): partitions.append({ "name":part.name, "value":part.value, - "esfilter":part.esfilter, + "where":part.where, "style":coalesce(part.style, part.parent.style), "weight":part.weight # YO! WHAT DO WE *NOT* COPY? }) @@ -214,7 +225,7 @@ class Dimension(Container): { "name":v.name, "value":v.value, - "esfilter":v.esfilter, + "where":v.where, "style":v.style, "weight":v.weight # YO! WHAT DO WE *NOT* COPY? } @@ -232,7 +243,7 @@ class Dimension(Container): partitions.append({ "name":join_field(split_field(subpart.parent.name) + [subpart.name]), "value":subpart.value, - "esfilter":subpart.esfilter, + "where":subpart.where, "style":coalesce(subpart.style, subpart.parent.style), "weight":subpart.weight # YO! WHAT DO WE *NOT* COPY? }) @@ -324,12 +335,12 @@ def parse_partition(part): p.value = coalesce(p.value, p.name) p.parent = part - if not part.esfilter: + if not part.where: if len(part.partitions) > 100: - Log.error("Must define an esfilter on {{name}} there are too many partitions ({{num_parts}})", + Log.error("Must define an where on {{name}} there are too many partitions ({{num_parts}})", name= part.name, num_parts= len(part.partitions)) - # DEFAULT esfilter IS THE UNION OF ALL CHILD FILTERS + # DEFAULT where IS THE UNION OF ALL CHILD FILTERS if part.partitions: - part.esfilter = {"or": part.partitions.esfilter} + part.where = {"or": part.partitions.where} diff --git a/pyLibrary/queries/domains.py b/pyLibrary/queries/domains.py index 2fba601..11b8aea 100644 --- a/pyLibrary/queries/domains.py +++ b/pyLibrary/queries/domains.py @@ -14,16 +14,18 @@ from collections import Mapping from numbers import Number import re import itertools + from pyLibrary import convert from pyLibrary.debugs.logs import Log from pyLibrary.maths import Math from pyLibrary.queries.unique_index import UniqueIndex from pyLibrary.dot import coalesce, Dict, set_default, Null, listwrap from pyLibrary.dot.lists import DictList -from pyLibrary.dot import wrap, unwrap +from pyLibrary.dot import wrap from pyLibrary.times.dates import Date from pyLibrary.times.durations import Duration + ALGEBRAIC = {"time", "duration", "numeric", "count", "datetime"} # DOMAINS THAT HAVE ALGEBRAIC OPERATIONS DEFINED KNOWN = {"set", "boolean", "duration", "time", "numeric"} # DOMAINS THAT HAVE A KNOWN NUMBER FOR PARTS AT QUERY TIME PARTITION = {"uid", "set", "boolean"} # DIMENSIONS WITH CLEAR PARTS @@ -132,6 +134,7 @@ class DefaultDomain(Domain): self.partitions = DictList() self.map = dict() self.map[None] = self.NULL + self.limit = desc.get('limit') def compare(self, a, b): return value_compare(a.value, b.value) @@ -162,6 +165,7 @@ class DefaultDomain(Domain): def as_dict(self): output = Domain.as_dict(self) output.partitions = self.partitions + output.limit = self.limit return output @@ -284,6 +288,8 @@ class SimpleSetDomain(Domain): return self.partitions[index] def getKeyByIndex(self, index): + if index < 0 or index >= len(self.partitions): + return None return self.partitions[index][self.key] def getKey(self, part): @@ -533,6 +539,70 @@ class DurationDomain(Domain): return output + +class NumericDomain(Domain): + __slots__ = ["max", "min"] + + def __new__(cls, **desc): + if not desc.get('partitions') and not desc.get('interval'): + return object.__new__(cls) + else: + return object.__new__(RangeDomain) + + def __init__(self, **desc): + Domain.__init__(self, **desc) + self.min = desc.get('min') + self.max = desc.get('max') + + def compare(self, a, b): + return value_compare(a, b) + + def getCanonicalPart(self, part): + return part + + def getIndexByKey(self, key): + return key + + def getPartByKey(self, key): + if self.min!=None and key < self.min: + return self.NULL + if self.max!=None and key >= self.max: + return self.NULL + return key + + def getKey(self, part): + return part + + def getKeyByIndex(self, index): + return index + + def as_dict(self): + output = Domain.as_dict(self) + + output.min = self.min + output.max = self.max + return output + + +class UniqueDomain(Domain): + __slots__ = () + + def compare(self, a, b): + return value_compare(a, b) + + def getCanonicalPart(self, part): + return part + + def getPartByKey(self, key): + return key + + def getKey(self, part): + return part + + def getEnd(self, value): + return value + + class RangeDomain(Domain): __slots__ = ["max", "min", "interval", "partitions", "NULL"] @@ -640,9 +710,10 @@ name_to_type = { "value": ValueDomain, "default": DefaultDomain, "set": SimpleSetDomain, - "uid": DefaultDomain, "time": TimeDomain, "duration": DurationDomain, - "range": RangeDomain + "range": NumericDomain, + "uid": UniqueDomain, + "numeric": NumericDomain } diff --git a/pyLibrary/queries/es09/expressions.py b/pyLibrary/queries/es09/expressions.py index 135cbb9..b36d1f5 100644 --- a/pyLibrary/queries/es09/expressions.py +++ b/pyLibrary/queries/es09/expressions.py @@ -82,12 +82,8 @@ class _MVEL(object): path = split_field(fromPath) # ADD LOCAL VARIABLES - from pyLibrary.queries.es09.util import INDEX_CACHE - columns = INDEX_CACHE[path[0]].columns for i, c in enumerate(columns): - if c.name=="attachments": - Log.debug("") if c.name.find("\\.") >= 0: self.prefixMap.insert(0, { "path": c.name, diff --git a/pyLibrary/queries/es09/util.py b/pyLibrary/queries/es09/util.py index b3576ae..34c5fb3 100644 --- a/pyLibrary/queries/es09/util.py +++ b/pyLibrary/queries/es09/util.py @@ -10,7 +10,6 @@ from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import -from copy import deepcopy from datetime import datetime from pyLibrary import convert @@ -21,11 +20,9 @@ from pyLibrary.debugs.logs import Log from pyLibrary.maths import Math from pyLibrary.queries import domains from pyLibrary.dot.dicts import Dict -from pyLibrary.dot import split_field, join_field, coalesce +from pyLibrary.dot import split_field, join_field, coalesce, Null from pyLibrary.dot.lists import DictList from pyLibrary.dot import wrap -from pyLibrary.queries import qb -from pyLibrary.queries.es09 import expressions from pyLibrary.queries.es09.expressions import value2MVEL, isKeyword from pyLibrary.queries.expressions import simplify_esfilter from pyLibrary.times import durations @@ -34,21 +31,19 @@ from pyLibrary.times import durations TrueFilter = {"match_all": {}} DEBUG = False -INDEX_CACHE = {} # MATCH NAMES TO ES URL AND COLUMNS eg {name:{"url":url, "columns":columns"}} - -def post(es, FromES, limit): - if not FromES.facets and FromES.size == 0 and not FromES.aggs: +def post(es, es_query, limit): + if not es_query.facets and es_query.size == 0 and not es_query.aggs: Log.error("FromES is sending no facets") # DO NOT KNOW WHY THIS WAS HERE # if isinstance(query.select, list) or len(query.edges) and not FromES.facets.keys and FromES.size == 0: # Log.error("FromES is sending no facets") - postResult = None + post_result = None try: - postResult = es.search(FromES) + post_result = es.search(es_query) - for facetName, f in postResult.facets.items(): + for facetName, f in post_result.facets.items(): if f._type == "statistical": continue if not f.terms: @@ -59,7 +54,7 @@ def post(es, FromES, limit): except Exception, e: Log.error("Error with FromES", e) - return postResult + return post_result def build_es_query(query): @@ -86,90 +81,7 @@ def build_es_query(query): return output -def parse_columns(parent_path, esProperties): - """ - RETURN THE COLUMN DEFINITIONS IN THE GIVEN esProperties OBJECT - """ - columns = DictList() - for name, property in esProperties.items(): - if parent_path: - path = join_field(split_field(parent_path) + [name]) - else: - path = name - if property.type == "nested" and property.properties: - # NESTED TYPE IS A NEW TYPE DEFINITION - # MARKUP CHILD COLUMNS WITH THE EXTRA DEPTH - child_columns = deepcopy(parse_columns(path, property.properties)) - self_columns = deepcopy(child_columns) - for c in self_columns: - c.depth += 1 - columns.extend(self_columns) - columns.append({ - "name": join_field(split_field(path)[1::]), - "type": "nested", - "useSource": False - }) - - if path not in INDEX_CACHE: - pp = split_field(parent_path) - for i in qb.reverse(range(len(pp))): - c = INDEX_CACHE.get(join_field(pp[:i + 1]), None) - if c: - INDEX_CACHE[path] = c.copy() - break - else: - Log.error("Can not find parent") - - INDEX_CACHE[path].name = path - INDEX_CACHE[path].columns = child_columns - continue - - if property.properties: - child_columns = parse_columns(path, property.properties) - columns.extend(child_columns) - columns.append({ - "name": join_field(split_field(path)[1::]), - "type": "object", - "useSource": False - }) - - if property.dynamic: - continue - if not property.type: - continue - if property.type == "multi_field": - property.type = property.fields[name].type # PULL DEFAULT TYPE - for i, (n, p) in enumerate(property.fields.items()): - if n == name: - # DEFAULT - columns.append({"name": join_field(split_field(path)[1::]), "type": p.type, "useSource": p.index == "no"}) - else: - columns.append({"name": join_field(split_field(path)[1::]) + "." + n, "type": p.type, "useSource": p.index == "no"}) - continue - - if property.type in ["string", "boolean", "integer", "date", "long", "double"]: - columns.append({ - "name": join_field(split_field(path)[1::]), - "type": property.type, - "useSource": property.index == "no" - }) - if property.index_name and name != property.index_name: - columns.append({ - "name": property.index_name, - "type": property.type, - "useSource": property.index == "no" - }) - elif property.enabled == None or property.enabled == False: - columns.append({ - "name": join_field(split_field(path)[1::]), - "type": "object", - "useSource": True - }) - else: - Log.warning("unknown type {{type}} for property {{path}}", type= property.type, path= path) - - return columns def compileTime2Term(edge): @@ -200,7 +112,7 @@ def compileTime2Term(edge): if Math.round(value) == 0: return edge.domain.NULL - d = datetime(str(value)[:4:], str(value).right(2), 1) + d = datetime(str(value)[:4:], str(value)[-2:], 1) d = d.addMilli(offset) return edge.domain.getPartByKey(d) else: diff --git a/pyLibrary/queries/es14/aggs.py b/pyLibrary/queries/es14/aggs.py index 0fa2326..758d050 100644 --- a/pyLibrary/queries/es14/aggs.py +++ b/pyLibrary/queries/es14/aggs.py @@ -12,21 +12,22 @@ from __future__ import division from __future__ import absolute_import from collections import Mapping -from pyLibrary import convert from pyLibrary.collections import MAX from pyLibrary.debugs.logs import Log from pyLibrary.dot import listwrap, Dict, wrap, literal_field, set_default, coalesce, Null, split_field, join_field +from pyLibrary.maths import Math from pyLibrary.queries import qb, es09 from pyLibrary.queries.dimensions import Dimension -from pyLibrary.queries.domains import PARTITION, SimpleSetDomain, is_keyword -from pyLibrary.queries.es14.util import aggregates1_4 +from pyLibrary.queries.domains import PARTITION, SimpleSetDomain, is_keyword, DefaultDomain +from pyLibrary.queries.es14.util import aggregates1_4, NON_STATISTICAL_AGGS from pyLibrary.queries.expressions import simplify_esfilter, qb_expression_to_ruby, get_all_vars +from pyLibrary.queries.query import DEFAULT_LIMIT from pyLibrary.times.timer import Timer def is_aggsop(es, query): es.cluster.get_metadata() - if any(map(es.cluster.version.startswith, ["1.4.", "1.5.", "1.6."])) and (query.edges or query.groupby or any(a != None and a != "none" for a in listwrap(query.select).aggregate)): + if any(map(es.cluster.version.startswith, ["1.4.", "1.5.", "1.6.", "1.7."])) and (query.edges or query.groupby or any(a != None and a != "none" for a in listwrap(query.select).aggregate)): return True return False @@ -40,24 +41,60 @@ def es_aggsop(es, frum, query): for s in select: if s.aggregate == "count" and (s.value == None or s.value == "."): s.pull = "doc_count" + elif s.value == ".": + if frum.typed: + # STATISITCAL AGGS IMPLY $value, WHILE OTHERS CAN BE ANYTHING + if s.aggregate in NON_STATISTICAL_AGGS: + #TODO: HANDLE BOTH $value AND $objects TO COUNT + Log.error("do not know how to handle") + else: + s.value = "$value" + new_select["$value"] += [s] + else: + if s.aggregate in NON_STATISTICAL_AGGS: + #TODO: WE SHOULD BE ABLE TO COUNT, BUT WE MUST *OR* ALL LEAF VALUES TO DO IT + Log.error("do not know how to handle") + else: + Log.error('Not expecting ES to have a value at "." which {{agg}} can be applied', agg=s.aggregate) elif is_keyword(s.value): new_select[literal_field(s.value)] += [s] else: formula.append(s) - for litral_field, many in new_select.items(): - if len(many)>1: - canonical_name=literal_field(many[0].name) - es_query.aggs[canonical_name].stats.field = many[0].value + for canonical_name, many in new_select.items(): + representative = many[0] + if representative.value == ".": + Log.error("do not know how to handle") + else: + field_name = representative.value + + if len(many) > 1 or many[0].aggregate in ("median", "percentile"): + # canonical_name=literal_field(many[0].name) for s in many: if s.aggregate == "count": - s.pull = canonical_name + ".count" + es_query.aggs[literal_field(canonical_name)].stats.field = field_name + s.pull = literal_field(canonical_name) + ".count" + elif s.aggregate == "median": + #ES USES DIFFERENT METHOD FOR PERCENTILES THAN FOR STATS AND COUNT + key=literal_field(canonical_name + " percentile") + + es_query.aggs[key].percentiles.field = field_name + es_query.aggs[key].percentiles.percents += [50] + s.pull = key + ".values.50\.0" + elif s.aggregate == "percentile": + #ES USES DIFFERENT METHOD FOR PERCENTILES THAN FOR STATS AND COUNT + key=literal_field(canonical_name + " percentile") + percent = Math.round(s.percentile * 100, decimal=6) + + es_query.aggs[key].percentiles.field = field_name + es_query.aggs[key].percentiles.percents += [percent] + s.pull = key + ".values." + literal_field(unicode(percent)) else: - s.pull = canonical_name + "." + aggregates1_4[s.aggregate] + es_query.aggs[literal_field(canonical_name)].stats.field = field_name + s.pull = literal_field(canonical_name) + "." + aggregates1_4[s.aggregate] else: - s = many[0] - s.pull = literal_field(s.value) + ".value" - es_query.aggs[literal_field(s.value)][aggregates1_4[s.aggregate]].field = s.value + es_query.aggs[literal_field(canonical_name)][aggregates1_4[representative.aggregate]].field = field_name + representative.pull = literal_field(canonical_name) + ".value" for i, s in enumerate(formula): new_select[unicode(i)] = s @@ -71,6 +108,8 @@ def es_aggsop(es, frum, query): start += d.num_columns if query.where: + #TODO: INCLUDE FILTERS ON EDGES + filter = simplify_esfilter(query.where) es_query = Dict( aggs={"_filter": set_default({"filter": filter}, es_query)} @@ -79,13 +118,18 @@ def es_aggsop(es, frum, query): if len(split_field(frum.name)) > 1: es_query = wrap({ "size": 0, - "aggs": {"_nested": set_default({ - "nested": { - "path": join_field(split_field(frum.name)[1::]) - } - }, es_query)} + "aggs": {"_nested": set_default( + { + "nested": { + "path": frum.query_path + } + }, + es_query + )} }) + es_query.size=0 + with Timer("ES query time") as es_duration: result = es09.util.post(es, es_query, query.limit) @@ -109,10 +153,35 @@ def es_aggsop(es, frum, query): class AggsDecoder(object): - def __new__(cls, *args, **kwargs): - e = args[0] + def __new__(cls, e=None, query=None, *args, **kwargs): + if query.groupby: + # GROUPBY ASSUMES WE IGNORE THE DOMAIN RANGE + e.allowNulls = False + else: + e.allowNulls = coalesce(e.allowNulls, True) + if e.value and e.domain.type == "default": - return object.__new__(DefaultDecoder, e.copy()) + if query.groupby: + return object.__new__(DefaultDecoder, e.copy()) + + if is_keyword(e.value): + cols = query.frum.get_columns() + col = cols.filter(lambda c: c.name == e.value)[0] + if not col: + return object.__new__(DefaultDecoder, e.copy()) + limit = coalesce(e.domain.limit, query.limit, DEFAULT_LIMIT) + + if col.partitions != None: + e.domain = SimpleSetDomain(partitions=col.partitions[:limit:]) + else: + e.domain = set_default(DefaultDomain(limit=limit), e.domain.as_dict()) + return object.__new__(DefaultDecoder, e.copy()) + + elif isinstance(e.value, (list, Mapping)): + Log.error("Not supported yet") + else: + return object.__new__(DefaultDecoder, e.copy()) + if e.value and e.domain.type in PARTITION: return object.__new__(SetDecoder, e) if isinstance(e.domain.dimension, Dimension): @@ -167,10 +236,33 @@ class AggsDecoder(object): class SetDecoder(AggsDecoder): def append_query(self, es_query, start): self.start = start - return wrap({"aggs": { - "_match": set_default({"terms": {"field": self.edge.value}}, es_query), - "_missing": set_default({"missing": {"field": self.edge.value}}, es_query), - }}) + domain = self.edge.domain + + include = [p[domain.key] for p in domain.partitions] + if self.edge.allowNulls: + + return wrap({"aggs": { + "_match": set_default({"terms": { + "field": self.edge.value, + "size": 0, + "include": include + }}, es_query), + "_missing": set_default( + {"filter": {"or": [ + {"missing": {"field": self.edge.value}}, + {"not": {"terms": {self.edge.value: include}}} + ]}}, + es_query + ), + }}) + else: + return wrap({"aggs": { + "_match": set_default({"terms": { + "field": self.edge.value, + "size": 0, + "include": include + }}, es_query) + }}) def get_value(self, index): return self.edge.domain.getKeyByIndex(index) @@ -216,7 +308,7 @@ def _range_composer(edge, domain, es_query, to_float): missing_filter = set_default( {"filter": {"or": [ missing_range, - {"missing": {"field": get_all_vars(edge.value)}} + {"or": [{"missing": {"field": v}} for v in get_all_vars(edge.value)]} ]}}, es_query ) @@ -332,7 +424,7 @@ class DefaultDecoder(SetDecoder): def __init__(self, edge, query): AggsDecoder.__init__(self, edge, query) self.edge = self.edge.copy() - self.edge.allowNulls = False # SINCE WE DO NOT KNOW THE DOMAIN, WE HAVE NO SENSE OF WHAT IS OUTSIDE THAT DOMAIN, allowNulls==True MAKES NO SENSE + # self.edge.allowNulls = False # SINCE WE DO NOT KNOW THE DOMAIN, WE HAVE NO SENSE OF WHAT IS OUTSIDE THAT DOMAIN, allowNulls==True MAKES NO SENSE self.edge.domain.partitions = set() self.edge.domain.limit = coalesce(self.edge.domain.limit, query.limit, 10) diff --git a/pyLibrary/queries/es14/deep.py b/pyLibrary/queries/es14/deep.py new file mode 100644 index 0000000..536a932 --- /dev/null +++ b/pyLibrary/queries/es14/deep.py @@ -0,0 +1,204 @@ +# encoding: utf-8 +# +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http:# mozilla.org/MPL/2.0/. +# +# Author: Kyle Lahnakoski (kyle@lahnakoski.com) +# +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import +from pyLibrary import queries +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import split_field, DictList, listwrap, literal_field, wrap, coalesce, Dict +from pyLibrary.queries import es09 +from pyLibrary.queries.domains import is_keyword +from pyLibrary.queries.es14.setop import format_dispatch +from pyLibrary.queries.es14.util import qb_sort_to_es_sort + +from pyLibrary.queries.expressions import query_get_all_vars, qb_expression_to_ruby, expression_map, qb_expression_to_esfilter +from pyLibrary.queries.unique_index import UniqueIndex +from pyLibrary.thread.threads import Thread +from pyLibrary.times.timer import Timer + + +def is_deepop(es, query): + if query.edges or query.groupby: + return False + vars = query_get_all_vars(query) + columns = query.frum.get_columns() + if len(split_field(query.frum.name)) > 1: + return True + if any(c for c in columns if c.nested_path and c.name in vars): + return True + return False + + +def es_deepop(es, query): + columns = query.frum.get_columns() + query_path = query.frum.query_path + columns = UniqueIndex(keys=["name"], data=sorted(columns, lambda a, b: cmp(len(b.nested_path), len(a.nested_path))), fail_on_dup=False) + _map = {c.name: c.abs_name for c in columns} + where = qb_expression_to_esfilter(expression_map(query.where, _map)) + more_filter = { + "and": [ + where, + {"not": { + "nested": { + "path": query_path, + "filter": { + "match_all": {} + } + } + }} + ] + } + + + es_query = wrap({ + "query": { + "nested": { + "path": query_path, + "inner_hits": {}, + "filter": where + }, + }, + "fields": [] + }) + es_query.size = coalesce(query.limit, queries.query.DEFAULT_LIMIT) + es_query.sort = qb_sort_to_es_sort(query.sort) + + is_list = isinstance(query.select, list) + new_select = DictList() + + def get_pull(column): + if column.nested_path: + return "_inner" + column.abs_name[len(column.nested_path[0]):] + else: + return "fields." + literal_field(column.abs_name) + + i = 0 + for s in listwrap(query.select): + if s.value == "*": + # IF THERE IS A *, THEN INSERT THE EXTRA COLUMNS + for c in columns: + if c.relative and c.type not in ["nested", "object"]: + if not c.nested_path: + es_query.fields.append(c.abs_name) + new_select.append({ + "name": c.name, + "pull": get_pull(c), + "nested_path": c.nested_path[0], + "put": {"name": c.name, "index": i, "child": "."} + }) + i += 1 + # REMOVE DOTS IN PREFIX IF NAME NOT AMBIGUOUS + + col_names = [c.name for c in columns if c.relative] + for n in new_select: + if n.name.startswith("..") and n.name.lstrip(".") not in col_names: + n.name = n.put.name = n.name.lstrip(".") + elif s.value == ".": + for c in columns: + if c.relative and c.type not in ["nested", "object"]: + if not c.nested_path: + es_query.fields.append(c.abs_name) + new_select.append({ + "name": c.name, + "pull": get_pull(c), + "nested_path": c.nested_path[0], + "put": {"name": ".", "index": i, "child": c.abs_name} + }) + i += 1 + elif isinstance(s.value, basestring) and s.value.endswith(".*") and is_keyword(s.value[:-2]): + parent = s.value[:-1] + prefix = len(parent) + for c in columns: + if c.name.startswith(parent): + pull = get_pull(c) + if len(c.nested_path) < 0: + es_query.fields.append(c.abs_name) + new_select.append({ + "name": s.name + "." + c.name[prefix:], + "pull": pull, + "nested_path": c.nested_path[0], + "put": {"name": s.name + "." + c[prefix:], "index": i, "child": "."} + }) + elif isinstance(s.value, basestring) and is_keyword(s.value): + parent = s.value + "." + prefix = len(parent) + net_columns = [c for c in columns if c.name.startswith(parent)] + if not net_columns: + c = columns[(s.value,)] + pull = get_pull(c) + if not c.nested_path: + es_query.fields.append(s.value) + new_select.append({ + "name": s.name if is_list else ".", + "pull": pull, + "nested_path": c.nested_path[0], + "put": {"name": s.name, "index": i, "child": "."} + }) + else: + for n in net_columns: + pull = get_pull(n) + if not n.nested_path: + es_query.fields.append(n.abs_name) + new_select.append({ + "name": s.name if is_list else ".", + "pull": pull, + "nested_path": n.nested_path[0], + "put": {"name": s.name, "index": i, "child": n[prefix:]} + }) + i += 1 + elif isinstance(s.value, list): + Log.error("need an example") + es_query.fields.extend([v for v in s.value]) + else: + Log.error("need an example") + es_query.script_fields[literal_field(s.name)] = {"script": qb_expression_to_ruby(s.value)} + new_select.append({ + "name": s.name if is_list else ".", + "value": s.name, + "put": {"name": s.name, "index": i, "child": "."} + }) + i += 1 + + + more = [] + def get_more(please_stop): + more.append(es09.util.post( + es, + Dict( + query={"filtered": {"filter": more_filter}}, + fields=es_query.fields + ), + query.limit + )) + need_more=Thread.run("get more", target=get_more) + + with Timer("call to ES") as call_timer: + data = es09.util.post(es, es_query, query.limit) + + # RETURN A LIST OF INNER OBJECTS + def inners(): + for t in data.hits.hits: + for i in t.inner_hits[query_path].hits.hits: + t._inner = i._source + yield t + Thread.join(need_more) + for t in more[0].hits.hits: + yield t + + try: + formatter, groupby_formatter, mime_type = format_dispatch[query.format] + + output = formatter(inners(), new_select, query) + output.meta.es_response_time = call_timer.duration + output.meta.content_type = mime_type + output.meta.es_query = es_query + return output + except Exception, e: + Log.error("problem formatting", e) diff --git a/pyLibrary/queries/es14/format.py b/pyLibrary/queries/es14/format.py index 969f46d..a77083c 100644 --- a/pyLibrary/queries/es14/format.py +++ b/pyLibrary/queries/es14/format.py @@ -15,6 +15,7 @@ from pyLibrary import convert from pyLibrary.collections.matrix import Matrix from pyLibrary.debugs.logs import Log from pyLibrary.dot import Dict, set_default, coalesce, wrap +from pyLibrary.maths import Math from pyLibrary.queries.containers.cube import Cube from pyLibrary.queries.es14.aggs import count_dim, aggs_iterator, format_dispatch @@ -27,7 +28,7 @@ def format_cube(decoders, aggs, start, query, select): coord = tuple(d.get_index(row) for d in decoders) for s, m in matricies: try: - if m[coord]: + if m[coord]: # THIS CAN HAPPEN WHEN THE SET QUERIED IS SMALLER THAN THE AVAILABLE IN ES Log.error("Not expected") m[coord] = agg[s.pull] except Exception, e: @@ -115,6 +116,8 @@ def format_table_from_aggop(decoders, aggs, start, query, select): row = [] for s in select: + if not s.pull: + Log.error("programmer error") row.append(agg[s.pull]) return Dict( @@ -196,14 +199,23 @@ def format_list_from_aggop(decoders, aggs, start, query, select): agg = b b = coalesce(agg._filter, agg._nested) - item = Dict() - for s in select: - item[s.name] = agg[s.pull] + if isinstance(query.select, list): + item = Dict() + for s in select: + item[s.name] = agg[s.pull] + else: + item = agg[select[0].pull] - return wrap({ - "meta": {"format": "list"}, - "data": [item] - }) + if query.edges or query.groupby: + return wrap({ + "meta": {"format": "list"}, + "data": [item] + }) + else: + return wrap({ + "meta": {"format": "value"}, + "data": item + }) diff --git a/pyLibrary/queries/es14/setop.py b/pyLibrary/queries/es14/setop.py index d002719..2c2ff5e 100644 --- a/pyLibrary/queries/es14/setop.py +++ b/pyLibrary/queries/es14/setop.py @@ -10,108 +10,30 @@ from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import + from collections import Mapping from pyLibrary import queries from pyLibrary.collections.matrix import Matrix -from pyLibrary.collections import AND, UNION -from pyLibrary.dot import coalesce, split_field, set_default, Dict, unwraplist, literal_field +from pyLibrary.collections import AND +from pyLibrary.dot import coalesce, split_field, set_default, Dict, unwraplist, literal_field, join_field, unwrap from pyLibrary.dot.lists import DictList from pyLibrary.dot import listwrap -from pyLibrary.queries.domains import is_keyword -from pyLibrary.queries import domains -from pyLibrary.queries.expressions import qb_expression_to_esfilter, simplify_esfilter, qb_expression_to_ruby +from pyLibrary.maths import Math from pyLibrary.debugs.logs import Log +from pyLibrary.queries import domains, es14, es09, qb from pyLibrary.queries.containers.cube import Cube +from pyLibrary.queries.domains import is_keyword from pyLibrary.queries.es14.util import qb_sort_to_es_sort +from pyLibrary.queries.expressions import qb_expression_to_esfilter, simplify_esfilter, qb_expression_to_ruby +from pyLibrary.queries.query import DEFAULT_LIMIT from pyLibrary.times.timer import Timer -from pyLibrary.queries import es14, es09 format_dispatch = {} -def is_fieldop(es, query): - if not any(map(es.cluster.version.startswith, ["1.4.", "1.5.", "1.6."])): - return False - - # THESE SMOOTH EDGES REQUIRE ALL DATA (SETOP) - select = listwrap(query.select) - if not query.edges: - isDeep = len(split_field(query.frum.name)) > 1 # LOOKING INTO NESTED WILL REQUIRE A SCRIPT - isSimple = AND(s.value != None and (s.value in ["*", "."] or is_keyword(s.value)) for s in select) - noAgg = AND(s.aggregate == "none" for s in select) - - if not isDeep and isSimple and noAgg: - return True - else: - isSmooth = AND((e.domain.type in domains.ALGEBRAIC and e.domain.interval == "none") for e in query.edges) - if isSmooth: - return True - - return False - - -def es_fieldop(es, query): - es_query, es_filter = es14.util.es_query_template(query.frum.name) - es_query[es_filter]=simplify_esfilter(qb_expression_to_esfilter(query.where)) - es_query.size = coalesce(query.limit, queries.query.DEFAULT_LIMIT) - es_query.sort = qb_sort_to_es_sort(query.sort) - es_query.fields = DictList() - - source = "fields" - - select = listwrap(query.select) - for s in select.value: - if s == "*": - es_query.fields=None - source = "_source" - elif s == ".": - es_query.fields=None - source = "_source" - elif isinstance(s, basestring) and is_keyword(s): - es_query.fields.append(s) - elif isinstance(s, list) and es_query.fields is not None: - es_query.fields.extend(s) - elif isinstance(s, Mapping) and es_query.fields is not None: - es_query.fields.extend(s.values()) - elif es_query.fields is not None: - es_query.fields.append(s) - es_query.sort = [{s.field: "asc" if s.sort >= 0 else "desc"} for s in query.sort] - - return extract_rows(es, es_query, source, select, query) - - -def extract_rows(es, es_query, source, select, query): - with Timer("call to ES") as call_timer: - data = es09.util.post(es, es_query, query.limit) - - T = data.hits.hits - for i, s in enumerate(select.copy()): - # IF THERE IS A *, THEN INSERT THE EXTRA COLUMNS - if s.value == "*": - try: - column_names = set(c.name for c in query.frum.get_columns() if (c.type not in ["object"] or c.useSource) and not c.depth) - except Exception, e: - Log.warning("can not get columns", e) - column_names = UNION(*[[k for k, v in row.items()] for row in T.select(source)]) - column_names -= set(select.name) - select = select[:i:] + [{"name": n, "value": n} for n in column_names] + select[i + 1::] - break - - try: - formatter, groupby_formatter, mime_type = format_dispatch[query.format] - - output = formatter(T, select, source) - output.meta.es_response_time = call_timer.duration - output.meta.content_type = mime_type - output.meta.es_query = es_query - return output - except Exception, e: - Log.error("problem formatting", e) - - def is_setop(es, query): - if not any(map(es.cluster.version.startswith, ["1.4.", "1.5.", "1.6."])): + if not any(map(es.cluster.version.startswith, ["1.4.", "1.5.", "1.6.", "1.7."])): return False select = listwrap(query.select) @@ -133,70 +55,140 @@ def is_setop(es, query): def es_setop(es, query): es_query, es_filter = es14.util.es_query_template(query.frum.name) - es_query[es_filter]=simplify_esfilter(qb_expression_to_esfilter(query.where)) + es_query[es_filter] = simplify_esfilter(qb_expression_to_esfilter(query.where)) es_query.size = coalesce(query.limit, queries.query.DEFAULT_LIMIT) - es_query.fields = DictList() es_query.sort = qb_sort_to_es_sort(query.sort) + es_query.fields = DictList() + return extract_rows(es, es_query, query) + + +def extract_rows(es, es_query, query): + is_list = isinstance(query.select, list) + new_select = DictList() + column_names = set(c.name for c in query.frum.get_columns() if (c.type not in ["object"]) and not c.nested_path) source = "fields" - select = listwrap(query.select) - for s in select: + + i = 0 + for s in listwrap(query.select): + # IF THERE IS A *, THEN INSERT THE EXTRA COLUMNS if s.value == "*": es_query.fields = None - es_query.script_fields = None source = "_source" + + net_columns = column_names - set(listwrap(query.select).name) + for n in net_columns: + new_select.append({"name": n, "value": n, "put": {"name": n, "index": i, "child": "."}}) + i += 1 elif s.value == ".": es_query.fields = None - es_query.script_fields = None source = "_source" + + new_select.append({"name": s.name if is_list else ".", "value": s.value, "put": {"name": s.name, "index": i, "child": "."}}) + i += 1 + elif isinstance(s.value, basestring) and s.value.endswith(".*") and is_keyword(s.value[:-2]): + parent = s.value[:-1] + prefix = len(parent) + for c in column_names: + if c.startswith(parent): + if es_query.fields is not None: + es_query.fields.append(c) + + new_select.append({"name": s.name+"."+c[prefix:], "value": c, "put": {"name": s.name+"."+c[prefix:], "index": i, "child": "."}}) + i += 1 elif isinstance(s.value, basestring) and is_keyword(s.value): - es_query.fields.append(s.value) - elif isinstance(s.value, list) and es_query.fields is not None: - es_query.fields.extend(s.value) + parent = s.value + "." + prefix = len(parent) + net_columns = [c for c in column_names if c.startswith(parent)] + if not net_columns: + if es_query.fields is not None: + es_query.fields.append(s.value) + new_select.append({"name": s.name if is_list else ".", "value": s.value, "put": {"name": s.name, "index": i, "child": "."}}) + else: + for n in net_columns: + if es_query.fields is not None: + es_query.fields.append(n) + new_select.append({"name": s.name if is_list else ".", "value": n, "put": {"name": s.name, "index": i, "child": n[prefix:]}}) + i += 1 + elif isinstance(s.value, list): + Log.error("need an example") + if es_query.fields is not None: + es_query.fields.extend([v for v in s.value]) else: es_query.script_fields[literal_field(s.name)] = {"script": qb_expression_to_ruby(s.value)} + new_select.append({ + "name": s.name if is_list else ".", + "pull": "fields." + literal_field(s.name), + "put": {"name": s.name, "index": i, "child": "."} + }) + i += 1 - return extract_rows(es, es_query, source, select, query) + for n in new_select: + if n.pull: + continue + if source == "_source": + n.pull = join_field(["_source"] + split_field(n.value)) + else: + n.pull = "fields." + literal_field(n.value) + + with Timer("call to ES") as call_timer: + data = es09.util.post(es, es_query, query.limit) + + T = data.hits.hits + + try: + formatter, groupby_formatter, mime_type = format_dispatch[query.format] + + output = formatter(T, new_select, query) + output.meta.es_response_time = call_timer.duration + output.meta.content_type = mime_type + output.meta.es_query = es_query + return output + except Exception, e: + Log.error("problem formatting", e) -def format_list(T, select, source): + +def format_list(T, select, query=None): data = [] for row in T: - r = Dict(_id=row._id) + r = Dict() for s in select: - if s.value == ".": - r[s.name] = row[source] - else: - if source=="_source": - r[s.name] = unwraplist(row[source][s.value]) - elif isinstance(s.value, basestring): # fields - r[s.name] = unwraplist(row[source][literal_field(s.value)]) - else: - r[s.name] = unwraplist(row[source][literal_field(s.name)]) - data.append(r) + r[s.name][s.put.child] = unwraplist(row[s.pull]) + data.append(r if r else None) return Dict( meta={"format": "list"}, data=data ) -def format_table(T, select, source): - header = [s.name for s in select] - map = {s.name: i for i, s in enumerate(select)} # MAP FROM name TO COLUMN INDEX +def format_table(T, select, query=None): data = [] + num_columns = (Math.MAX(select.put.index)+1) for row in T: - r = [None] * len(header) + r = [None] * num_columns for s in select: - if s.value == ".": - r[map[s.name]] = row[source] + value = unwraplist(row[s.pull]) + + if value == None: + continue + + index, child = s.put.index, s.put.child + if child == ".": + r[index] = value else: - if source == "_source": - r[map[s.name]] = unwraplist(row[source][s.value]) - elif isinstance(s.value, basestring): # fields - r[map[s.name]] = unwraplist(row[source][literal_field(s.value)]) - else: - r[map[s.name]] = unwraplist(row[source][literal_field(s.name)]) + if r[index] is None: + r[index] = Dict() + r[index][child] = value + data.append(r) + + header = [None]*num_columns + for s in select: + if header[s.put.index]: + continue + header[s.put.index] = s.put.name + return Dict( meta={"format": "table"}, header=header, @@ -204,26 +196,22 @@ def format_table(T, select, source): ) -def format_cube(T, select, source): - matricies = {} - for s in select: - try: - if s.value == ".": - matricies[s.name] = Matrix.wrap(T.select(source)) - elif isinstance(s.value, list): - matricies[s.name] = Matrix.wrap([tuple(unwraplist(t[source][ss]) for ss in s.value) for t in T]) - else: - if source == "_source": - matricies[s.name] = Matrix.wrap([unwraplist(t[source][s.value]) for t in T]) +def format_cube(T, select, query=None): + table = format_table(T, select, query) - elif isinstance(s.value, basestring): # fields - matricies[s.name] = Matrix.wrap([unwraplist(t[source].get(s.value)) for t in T]) - else: - matricies[s.name] = Matrix.wrap([unwraplist(t[source].get(s.name)) for t in T]) - except Exception, e: - Log.error("", e) - cube = Cube(select, edges=[{"name": "rownum", "domain": {"type": "rownum", "min": 0, "max": len(T), "interval": 1}}], data=matricies) - return cube + if len(table.data) == 0: + return Cube( + select, + edges=[{"name": "rownum", "domain": {"type": "rownum", "min": 0, "max": 0, "interval": 1}}], + data={h: Matrix(list=[]) for i, h in enumerate(table.header)} + ) + + cols = zip(*unwrap(table.data)) + return Cube( + select, + edges=[{"name": "rownum", "domain": {"type": "rownum", "min": 0, "max": len(table.data), "interval": 1}}], + data={h: Matrix(list=cols[i]) for i, h in enumerate(table.header)} + ) set_default(format_dispatch, { diff --git a/pyLibrary/queries/es14/util.py b/pyLibrary/queries/es14/util.py index cfe3e03..a344921 100644 --- a/pyLibrary/queries/es14/util.py +++ b/pyLibrary/queries/es14/util.py @@ -11,10 +11,15 @@ from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import -from pyLibrary.dot import wrap, join_field, split_field +from pyLibrary.dot import wrap, split_field, join_field def es_query_template(path): + """ + RETURN TEMPLATE AND PATH-TO-FILTER AS A 2-TUPLE + :param path: + :return: + """ sub_path = split_field(path)[1:] if sub_path: @@ -34,24 +39,30 @@ def es_query_template(path): else: output = wrap({ "query": { - "filter": {}, + "filtered": { + "query": {"match_all": {}}, + "filter": {} + } }, "from": 0, "size": 0, "sort": [] }) - return output, "query.filter" + return output, "query.filtered.filter" def qb_sort_to_es_sort(sort): + if not sort: + return [] + output = [] for s in sort: if s.sort == 1: - output.append(s.field) + output.append(s.value) elif s.sort == -1: - output.append({s.field: "desc"}) + output.append({s.value: "desc"}) else: pass return output @@ -71,6 +82,8 @@ aggregates1_4 = { "mean": "avg", "average": "avg", "avg": "avg", + "median": "median", + "percentile": "percentile", "N": "count", "X0": "count", "X1": "sum", @@ -81,3 +94,5 @@ aggregates1_4 = { "variance": "variance" } +NON_STATISTICAL_AGGS = {"none", "one", "count"} + diff --git a/pyLibrary/queries/expressions.py b/pyLibrary/queries/expressions.py index 6ad92ea..76f6a8c 100644 --- a/pyLibrary/queries/expressions.py +++ b/pyLibrary/queries/expressions.py @@ -15,7 +15,7 @@ import itertools from pyLibrary import convert from pyLibrary.collections import OR -from pyLibrary.dot import coalesce, wrap, set_default, literal_field +from pyLibrary.dot import coalesce, wrap, set_default, literal_field, listwrap from pyLibrary.debugs.logs import Log from pyLibrary.maths import Math from pyLibrary.queries.domains import is_keyword @@ -25,6 +25,16 @@ from pyLibrary.times.dates import Date TRUE_FILTER = True FALSE_FILTER = False +_Query = None + +def _late_import(): + global _Query + + from pyLibrary.queries.query import Query as _Query + + _=_Query + + def compile_expression(source): @@ -53,7 +63,7 @@ def qb_expression(expr): def qb_expression_to_function(expr): - if expr!=None and not isinstance(expr, (Mapping, list)) and hasattr(expr, "__call__"): + if expr != None and not isinstance(expr, (Mapping, list)) and hasattr(expr, "__call__"): return expr return compile_expression(qb_expression_to_python(expr)) @@ -89,7 +99,10 @@ def qb_expression_to_ruby(expr): elif expr is False: return "false" - op, term = expr.items()[0] + try: + op, term = expr.items()[0] + except Exception, e: + Log.error("expecting expression (`{op: term}` format)") mop = ruby_multi_operators.get(op) if mop: @@ -115,20 +128,15 @@ def qb_expression_to_ruby(expr): elif isinstance(term, Mapping): if op == "eq": # eq CAN ACCEPT A WHOLE OBJECT OF key:value PAIRS TO COMPARE - output = " and ".join("(" + qb_expression_to_ruby(a) + ")" + bop + "(" + qb_expression_to_ruby(b) + ")" for a, b in term.items()) + output = " and ".join("(" + qb_expression_to_ruby(var) + bop + convert.value2quote(val) + ")" for var, val in term.items()) return output else: - a, b = term.items()[0] - output = "(" + qb_expression_to_ruby(a) + ")" + bop + "(" + qb_expression_to_ruby(b) + ")" + var, val = term.items()[0] + output = "(" + qb_expression_to_ruby(var) + bop + convert.value2quote(val) + ")" return output else: Log.error("Expecting binary term") - uop = ruby_unary_operators.get(op) - if uop: - output = expand_template(uop, {"term": qb_expression_to_ruby(term)}) - return output - cop = complex_operators.get(op) if cop: output = cop(term).to_ruby() @@ -144,7 +152,10 @@ def qb_expression_to_python(expr): return unicode(expr) elif isinstance(expr, Date): return unicode(expr.unix) - elif isinstance(expr, unicode): + elif isinstance(expr, basestring): + if isinstance(expr, str): + expr = convert.utf82unicode(expr) + if expr == ".": return "row" elif is_keyword(expr): @@ -165,6 +176,8 @@ def qb_expression_to_python(expr): if isinstance(term, list): if not term: return mop[1] # RETURN DEFAULT + elif len(term)==1: + return qb_expression_to_python(term[0]) else: output = mop[0].join(["(" + qb_expression_to_python(t) + ")" for t in term]) return output @@ -183,26 +196,32 @@ def qb_expression_to_python(expr): elif isinstance(term, Mapping): if op == "eq": # eq CAN ACCEPT A WHOLE OBJECT OF key:value PAIRS TO COMPARE - output = " and ".join("(" + qb_expression_to_python(a) + ")" + bop + "(" + qb_expression_to_python(b) + ")" for a, b in term.items()) + output = " and ".join("(" + qb_expression_to_python(a) + ")" + bop + convert.value2json(b) for a, b in term.items()) return output else: a, b = term.items()[0] - output = "(" + qb_expression_to_python(a) + ")" + bop + "(" + qb_expression_to_python(b) + ")" + output = "(" + qb_expression_to_python(a) + ")" + bop + convert.value2json(b) return output else: Log.error("Expecting binary term") - uop = python_unary_operators.get(op) - if uop: - output = uop + "(" + qb_expression_to_python(term) + ")" + cop = complex_operators.get(op) + if cop: + output = cop(op, term).to_python() return output + Log.error("`{{op}}` is not a recognized operation", op= op) def get_all_vars(expr): + if not _Query: + _late_import() + if expr == None: return set() + elif isinstance(expr, _Query): + return query_get_all_vars(expr) elif isinstance(expr, unicode): if expr == "." or is_keyword(expr): return set([expr]) @@ -249,10 +268,6 @@ def get_all_vars(expr): else: Log.error("Expecting binary term") - uop = ruby_unary_operators.get(op) - if uop: - return get_all_vars(term) - cop = complex_operators.get(op) if cop: return cop(op, term).vars() @@ -260,10 +275,134 @@ def get_all_vars(expr): Log.error("`{{op}}` is not a recognized operation", op= op) +def expression_map(expr, map): + """ + USE map TO MAP VARIABLES NAMES TO SOME OTHER + """ + if expr == None: + return expr + elif Math.is_number(expr): + return expr + elif isinstance(expr, Date): + return expr + elif isinstance(expr, unicode): + if expr == ".": + return expr + elif is_keyword(expr): + return map.get(expr, expr) + else: + Log.error("Expecting a json path") + elif isinstance(expr, CODE): + return expr.code + elif expr is True: + return expr + elif expr is False: + return expr + + op, term = expr.items()[0] + + mop = python_multi_operators.get(op) + if mop: + output = map(expression_map, term) + return output + + bop = python_binary_operators.get(op) + if bop: + if isinstance(term, list): + output = {op: map(expression_map, term)} + return output + elif isinstance(term, Mapping): + output = {op: {expression_map(k, map): v for k, v, in term.items()}} + return output + else: + Log.error("Expecting binary term") + + Log.error("`{{op}}` is not a recognized operation", op=op) + + + + +def query_get_all_vars(query, exclude_where=False): + """ + :param query: + :param exclude_where: Sometimes we do not what to look at the where clause + :return: all variables in use by query + """ + output = set() + for s in listwrap(query.select): + output |= select_get_all_vars(s) + for s in listwrap(query.edges): + output |= edges_get_all_vars(s) + for s in listwrap(query.groupby): + output |= edges_get_all_vars(s) + if not exclude_where: + output |= get_all_vars(query.where) + return output + + +def select_get_all_vars(s): + if isinstance(s.value, list): + return set(s.value) + elif isinstance(s.value, basestring): + return set([s.value]) + elif s.value == None or s.value == ".": + return set() + else: + if s.value == "*": + return set(["*"]) + return get_all_vars(s.value) + + +def edges_get_all_vars(e): + output = set() + if isinstance(e.value, basestring): + output.add(e.value) + if e.domain.key: + output.add(e.domain.key) + if e.domain.where: + output |= get_all_vars(e.domain.where) + if e.domain.partitions: + for p in e.domain.partitions: + if p.where: + output |= get_all_vars(p.where) + return output + + +def where_get_all_vars(w): + if w in [True, False, None]: + return [] + + output = set() + key = list(w.keys())[0] + val = w[key] + if key in ["and", "or"]: + for ww in val: + output |= get_all_vars(ww) + return output + + if key == "not": + return get_all_vars(val) + + if key in ["exists", "missing"]: + if isinstance(val, unicode): + return {val} + else: + return {val.field} + + if key in ["gte", "gt", "eq", "ne", "term", "terms", "lt", "lte", "range", "prefix"]: + if not isinstance(val, Mapping): + Log.error("Expecting `{{key}}` to have a dict value, not a {{type}}", + key= key, + type= val.__class__.__name__) + return val.keys() + + if key == "match_all": + return set() + + Log.error("do not know how to handle where {{where|json}}", {"where", w}) + + -python_unary_operators = { - "not": "not {{term}}", -} python_binary_operators = { "sub": " - ", @@ -282,6 +421,23 @@ python_binary_operators = { "term": " == " } +ruby_binary_operators = { + "sub": " - ", + "subtract": " - ", + "minus": " - ", + "div": " / ", + "divide": " / ", + "exp": " ** ", + "mod": " % ", + "gt": " > ", + "gte": " >= ", + "eq": " == ", + "lte": " <= ", + "lt": " < ", + "ne": " != ", + "term": " == " +} + python_multi_operators = { "add": (" + ", "0"), # (operator, zero-array default value) PAIR "sum": (" + ", "0"), @@ -292,27 +448,6 @@ python_multi_operators = { "or": (" or ", "false") } -ruby_unary_operators = { - "not": "! {{term}}", -} - -ruby_binary_operators = { - "sub": " - ", - "subtract": " - ", - "minus": " - ", - "div": " / ", - "divide": " / ", - "exp": " ** ", - "mod": " % ", - "gt": " > ", - "gte": " >= ", - "eq": " == ", - "lte": " <= ", - "lt": " < ", - "ne": " != ", - "term": " == " -} - ruby_multi_operators = { "add": (" + ", "0"), # (operator, zero-array default value) PAIR "sum": (" + ", "0"), @@ -334,10 +469,6 @@ default_multi_operators = { } - - - - class BinaryOp(object): def __init__(self, op, term): self.op = op @@ -347,22 +478,23 @@ class BinaryOp(object): self.a, self.b = map(qb_expression, term.items()[0]) def to_ruby(self): - symbol = ruby_multi_operators[self.op][0] + symbol = ruby_binary_operators[self.op] return "(" + self.a.to_ruby() + ")" + symbol + "(" + self.b.to_ruby() + ")" def to_python(self): - symbol = python_multi_operators[self.op][0] + symbol = python_binary_operators[self.op] return "(" + self.a.to_python() + ")" + symbol + "(" + self.b.to_python() + ")" def to_esfilter(self): if self.op in ["gt", "gte", "lte", "lt"]: - return {"range":{self.op: {self.a: self.b}}} + return {"range": {self.op: {self.a: self.b}}} else: Log.error("Operator {{op}} is not supported by ES", op=self.op) def vars(self): return self.a.vars() | self.b.vars() + class MultiOp(object): def __init__(self, op, terms): self.op = op @@ -391,6 +523,35 @@ class MultiOp(object): return output + +_python_unary_operators = { + "not": "not {{term}}", + "length": 'len({{term}})', + "number": 'float({{term}})', +} +_ruby_unary_operators = { + "not": "! {{term}}", + "length": '({{term}}).length()', + "number": '({{term}}).to_f' +} + +class UnaryOp(object): + def __init__(self, op, term): + self.op = op + self.term = qb_expression(term) + + def to_ruby(self): + pattern = _ruby_unary_operators[self.op] + return expand_template(pattern, {"term": self.term.to_ruby()}) + + def to_python(self): + pattern = _python_unary_operators[self.op] + return expand_template(pattern, {"term": self.term.to_python()}) + + def vars(self): + return self.term.vars() + + class RegExpOp(object): def __init__(self, op, term): self.var, self.pattern = term.items()[0] @@ -420,6 +581,9 @@ class TermsOp(object): def vars(self): return {self.var} + def map(self, map): + return {"terms": {map.get(self.var, self.var): self.vals}} + class ExistsOp(object): def __init__(self, op, term): @@ -440,6 +604,9 @@ class ExistsOp(object): def vars(self): return set([self.field]) + def map(self, map): + return {"exists": map.get(self.field, self.field)} + class PrefixOp(object): def __init__(self, op, term): @@ -457,6 +624,9 @@ class PrefixOp(object): def vars(self): return set([self.field]) + def map(self, map): + return {"prefix": {map.get(self.field, self.field): self.prefix}} + class MissingOp(object): def __init__(self, op, term): @@ -477,13 +647,16 @@ class MissingOp(object): def vars(self): return set([self.field]) + def map(self, map): + return {"missing": map.get(self.field, self.field)} + class NotOp(object): def __init__(self, op, term): self.term = qb_expression(term) def to_ruby(self): - return "not " + self.term.to_ruby() + return "! " + self.term.to_ruby() def to_python(self): return "not" + self.term.to_python() @@ -494,16 +667,19 @@ class NotOp(object): def vars(self): return self.term.vars() + def map(self, map): + return {"not": self.term.map(map)} + class RangeOp(object): def __init__(self, op, term): self.field, self.cmp = term.items()[0] def to_ruby(self): - return " and ".join(qb_expression_to_ruby([{o: {self.field: v}} for o, v in self.cmp.items()])) + return " and ".join(qb_expression_to_ruby({"and": [{o: {self.field: v}} for o, v in self.cmp.items()]})) def to_python(self): - return " and ".join(qb_expression_to_python([{o: {self.field: v}} for o, v in self.cmp.items()])) + return " and ".join(qb_expression_to_python({"and": [{o: {self.field: v}} for o, v in self.cmp.items()]})) def to_esfilter(self): return {"range": {self.field, self.cmp}} @@ -511,16 +687,19 @@ class RangeOp(object): def vars(self): return set([self.field]) + def map(self, map): + return {"range": {map.get(self.field, self.field): self.cmp}} + class DocOp(object): """ A literal JSON document """ - def __init__(self, term): + def __init__(self, op, term): self.json = convert.value2json(term) def to_ruby(self): - def _convert(v, depth): + def _convert(v): if v is None: return "nil" if v is True: @@ -532,19 +711,11 @@ class DocOp(object): if isinstance(v, (int, long, float)): return unicode(v) if isinstance(v, dict): - var_name = "output" + unicode(depth) - return \ - "lambda {\n" + var_name + "={};\n" + \ - "".join( - "" + var_name + "[" + convert.string2quote(k) + "]=" + _convert(vv, depth + 1) + ";\n" for k, vv in v.items() - ) + \ - " return " + var_name + ";\n}.call\n" + return "{" + ", ".join(convert.string2quote(k) + "=>" + _convert(vv) for k, vv in v.items()) + "}" if isinstance(v, list): - return "[" + ", ".join(_convert(vv, depth+1) for vv in v) + "]" + return "[" + ", ".join(_convert(vv) for vv in v) + "]" -# { output={}; output["failure_classification"]="intermittent"; yield output; } - - return _convert(convert.json_decoder(self.json), 0) + return _convert(convert.json_decoder(self.json)) def to_python(self): return self.json @@ -561,6 +732,9 @@ class DocOp(object): complex_operators = { + "not": NotOp, + "length": UnaryOp, + "number": UnaryOp, "terms": TermsOp, "exists": ExistsOp, "missing": MissingOp, diff --git a/pyLibrary/queries/list/__init__.py b/pyLibrary/queries/lists/__init__.py similarity index 100% rename from pyLibrary/queries/list/__init__.py rename to pyLibrary/queries/lists/__init__.py diff --git a/pyLibrary/queries/list/aggs.py b/pyLibrary/queries/lists/aggs.py similarity index 98% rename from pyLibrary/queries/list/aggs.py rename to pyLibrary/queries/lists/aggs.py index 2ac2dee..ac5b545 100644 --- a/pyLibrary/queries/list/aggs.py +++ b/pyLibrary/queries/lists/aggs.py @@ -18,7 +18,6 @@ from pyLibrary.dot import listwrap from pyLibrary.queries import windows from pyLibrary.queries.containers.cube import Cube from pyLibrary.queries.domains import SimpleSetDomain, DefaultDomain -# from pyLibrary.queries.py.util import util_filter from pyLibrary.queries.expressions import qb_expression_to_function diff --git a/pyLibrary/queries/list/util.py b/pyLibrary/queries/lists/util.py similarity index 100% rename from pyLibrary/queries/list/util.py rename to pyLibrary/queries/lists/util.py diff --git a/pyLibrary/queries/meta.py b/pyLibrary/queries/meta.py new file mode 100644 index 0000000..04812a9 --- /dev/null +++ b/pyLibrary/queries/meta.py @@ -0,0 +1,481 @@ +# encoding: utf-8 +# +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http:# mozilla.org/MPL/2.0/. +# +# Author: Kyle Lahnakoski (kyle@lahnakoski.com) +# +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import +from copy import copy + +from pyLibrary import convert +from pyLibrary.env import elasticsearch +from pyLibrary.env.elasticsearch import ES_NUMERIC_TYPES +from pyLibrary.meta import use_settings +from pyLibrary.queries import qb +from pyLibrary.queries.containers import Container +from pyLibrary.queries.domains import NumericDomain, SimpleSetDomain, UniqueDomain +from pyLibrary.queries.query import Query +from pyLibrary.debugs.logs import Log +from pyLibrary.dot.dicts import Dict +from pyLibrary.dot import coalesce, set_default, Null, literal_field +from pyLibrary.dot import wrap +from pyLibrary.strings import expand_template +from pyLibrary.thread.threads import Queue, Thread, Lock, Till +from pyLibrary.times.dates import Date +from pyLibrary.times.durations import HOUR, MINUTE + + +DEBUG = True +TOO_OLD = 2*HOUR +singlton = None + + +class FromESMetadata(Container): + """ + QUERY THE METADATA + """ + + def __new__(cls, *args, **kwargs): + global singlton + if singlton: + return singlton + else: + singlton = object.__new__(cls) + return singlton + + @use_settings + def __init__(self, host, index, alias=None, name=None, port=9200, settings=None): + if hasattr(self, "settings"): + return + + from pyLibrary.queries.containers.lists import ListContainer + + Container.__init__(self, None, schema=self) + self.settings = settings + self.default_name = coalesce(name, alias, index) + self.default_es = elasticsearch.Cluster(settings=settings) + self.locker = Lock("") + self.todo = Queue("refresh metadata") + + table_columns = metadata_tables() + column_columns = metadata_columns() + self.tables = ListContainer([], wrap({c.name: c for c in table_columns})) + self.columns = ListContainer([], wrap({c.name: c for c in column_columns})) + self.columns.insert(column_columns) + self.columns.insert(table_columns) + self.worker = Thread.run("refresh metadata", self.monitor) + return + + @property + def query_path(self): + return None + + @property + def url(self): + return self.default_es.path + "/" + self.default_name.replace(".", "/") + + def get_table(self, table_name): + with self.locker: + return self.tables.query({"where": {"eq": {"name": table_name}}}) + + def upsert_column(self, c): + existing_columns = filter(lambda r: r.table == c.table and r.abs_name == c.abs_name, self.columns.data) + if not existing_columns: + self.columns.add(c) + cols = filter(lambda r: r.table == "meta.columns", self.columns.data) + for c in cols: + c.partitions = c.cardinality = c.last_updated = None + self.todo.add(c) + self.todo.extend(cols) + else: + set_default(existing_columns[0], c) + self.todo.add(existing_columns[0]) + + def _get_columns(self, table=None): + # TODO: HANDLE MORE THEN ONE ES, MAP TABLE SHORT_NAME TO ES INSTANCE + alias_done = set() + metadata = self.default_es.get_metadata(index=table) + for index, meta in qb.sort(metadata.indices.items(), {"value": 0, "sort": -1}): + for _, properties in meta.mappings.items(): + columns = elasticsearch.parse_properties(index, None, properties.properties) + with self.locker: + for c in columns: + # ABSOLUTE + c.table = index + # c.domain = DefaultDomain() + self.upsert_column(c) + + for alias in meta.aliases: + # ONLY THE LATEST ALIAS IS CHOSEN TO GET COLUMNS + if alias in alias_done: + continue + alias_done.add(alias) + + c = copy(c) + c.table = alias + self.upsert_column(c) + + def query(self, _query): + return self.columns.query(Query(set_default( + { + "from": self.columns, + "sort": ["table", "name"] + }, + _query.as_dict() + ))) + + def get_columns(self, table): + """ + RETURN METADATA COLUMNS + """ + with self.locker: + columns = qb.sort(filter(lambda r: r.table == table, self.columns.data), "name") + if columns: + return columns + + self._get_columns(table=table) + with self.locker: + columns = qb.sort(filter(lambda r: r.table == table, self.columns.data), "name") + if columns: + return columns + + # self._get_columns(table=table) + Log.error("no columns for {{table}}", table=table) + + def _update_cardinality(self, c): + """ + QUERY ES TO FIND CARDINALITY AND PARTITIONS FOR A SIMPLE COLUMN + """ + if c.type in ["object", "nested"]: + Log.error("not supported") + if c.table == "meta.columns": + with self.locker: + partitions = qb.sort([g[c.abs_name] for g, _ in qb.groupby(self.columns, c.abs_name) if g[c.abs_name] != None]) + self.columns.update({ + "set": { + "partitions": partitions, + "cardinality": len(partitions), + "last_updated": Date.now() + }, + "where": {"eq": {"table": c.table, "abs_name": c.abs_name}} + }) + return + if c.table == "meta.tables": + with self.locker: + partitions = qb.sort([g[c.abs_name] for g, _ in qb.groupby(self.tables, c.abs_name) if g[c.abs_name] != None]) + self.columns.update({ + "set": { + "partitions": partitions, + "cardinality": len(partitions), + "last_updated": Date.now() + }, + "where": {"eq": {"table": c.table, "name": c.name}} + }) + return + + result = self.default_es.post("/"+c.table+"/_search", data={ + "aggs": {c.name: _counting_query(c)}, + "size": 0 + }) + r = result.aggregations.values()[0] + cardinaility = coalesce(r.value, r._nested.value) + + query = Dict(size=0) + if c.type in ["object", "nested"]: + Log.note("{{field}} has {{num}} parts", field=c.name, num=c.cardinality) + with self.locker: + self.columns.update({ + "set": { + "cardinality": cardinaility, + "last_updated": Date.now() + }, + "clear": ["partitions"], + "where": {"eq": {"table": c.table, "name": c.name}} + }) + return + elif c.cardinality > 1000: + Log.note("{{field}} has {{num}} parts", field=c.name, num=c.cardinality) + with self.locker: + self.columns.update({ + "set": { + "cardinality": cardinaility, + "last_updated": Date.now() + }, + "clear": ["partitions"], + "where": {"eq": {"table": c.table, "name": c.name}} + }) + return + elif c.type in ES_NUMERIC_TYPES and c.cardinality > 30: + Log.note("{{field}} has {{num}} parts", field=c.name, num=c.cardinality) + with self.locker: + self.columns.update({ + "set": { + "cardinality": cardinaility, + "last_updated": Date.now() + }, + "clear": ["partitions"], + "where": {"eq": {"table": c.table, "name": c.name}} + }) + return + elif c.nested_path: + query.aggs[literal_field(c.name)] = { + "nested": {"path": c.nested_path[0]}, + "aggs": {"_nested": {"terms": {"field": c.name, "size": 0}}} + } + else: + query.aggs[literal_field(c.name)] = {"terms": {"field": c.name, "size": 0}} + + result = self.default_es.post("/"+c.table+"/_search", data=query) + + aggs = result.aggregations.values()[0] + if aggs._nested: + parts = qb.sort(aggs._nested.buckets.key) + else: + parts = qb.sort(aggs.buckets.key) + + Log.note("{{field}} has {{parts}}", field=c.name, parts=parts) + with self.locker: + self.columns.update({ + "set": { + "cardinality": cardinaility, + "partitions": parts, + "last_updated": Date.now() + }, + "where": {"eq": {"table": c.table, "abs_name": c.abs_name}} + }) + + def monitor(self, please_stop): + while not please_stop: + if not self.todo: + with self.locker: + old_columns = filter(lambda c: (c.last_updated == None or c.last_updated < Date.now()-TOO_OLD) and c.type not in ["object", "nested"], self.columns) + if old_columns: + self.todo.extend(old_columns) + else: + Log.note("no more metatdata to update") + + column = self.todo.pop(timeout=10*MINUTE) + if column: + if column.type in ["object", "nested"]: + continue + if column.last_updated >= Date.now()-TOO_OLD: + continue + self._update_cardinality(column) + Log.note("updated {{column.name}}", column=column) + + +def _counting_query(c): + if c.nested_path: + return { + "nested": { + "path": c.nested_path[0] # FIRST ONE IS LONGEST + }, + "aggs": { + "_nested": {"cardinality": { + "field": c.name, + "precision_threshold": 10 if c.type in ES_NUMERIC_TYPES else 100 + }} + } + } + else: + return {"cardinality": { + "field": c.name + }} + + +def metadata_columns(): + return wrap( + [ + Column( + table="meta.columns", + name=c, + abs_name=c, + type="string", + nested_path=Null, + ) + for c in [ + "name", + "type", + "nested_path", + "relative", + "abs_name", + "table" + ] + ] + [ + Column( + table="meta.columns", + name=c, + abs_name=c, + type="object", + nested_path=Null, + ) + for c in [ + "domain", + "partitions" + ] + ] + [ + Column( + table="meta.columns", + name=c, + abs_name=c, + type="long", + nested_path=Null, + ) + for c in [ + "count", + "cardinality" + ] + ] + [ + Column( + table="meta.columns", + name="last_updated", + abs_name="last_updated", + type="time", + nested_path=Null, + ) + ] + ) + +def metadata_tables(): + return wrap( + [ + Column( + table="meta.tables", + name=c, + abs_name=c, + type="string", + nested_path=Null + ) + for c in [ + "name", + "url", + "query_path" + ] + ] + ) + + + + + +def DataClass(name, columns): + """ + Each column has {"name", "required", "nulls", "default"} properties + """ + + columns = wrap([{"name": c, "required": True, "nulls": False} if isinstance(c, basestring) else c for c in columns]) + slots = columns.name + required = wrap(filter(lambda c: c.required and not c.nulls and not c.default, columns)).name + nulls = wrap(filter(lambda c: c.nulls, columns)).name + + code = expand_template(""" +from __future__ import unicode_literals +from collections import Mapping + +class {{name}}(Mapping): + __slots__ = {{slots}} + + def __init__(self, **kwargs): + if not kwargs: + return + + for s in {{slots}}: + setattr(self, s, kwargs.get(s, kwargs.get('default', Null))) + + missed = {{required}}-set(kwargs.keys()) + if missed: + Log.error("Expecting properties {"+"{missed}}", missed=missed) + + illegal = set(kwargs.keys())-set({{slots}}) + if illegal: + Log.error("{"+"{names}} are not a valid properties", names=illegal) + + def __getitem__(self, item): + return getattr(self, item) + + def __setitem__(self, item, value): + setattr(self, item, value) + return self + + def __setattr__(self, item, value): + if item not in {{slots}}: + Log.error("{"+"{item|quote}} not valid attribute", item=item) + object.__setattr__(self, item, value) + + def __getattr__(self, item): + Log.error("{"+"{item|quote}} not valid attribute", item=item) + + def items(self): + return ((k, getattr(self, k)) for k in {{slots}}) + + def __copy__(self): + _set = object.__setattr__ + output = object.__new__(Column) + {{assign}} + return output + + def __iter__(self): + return {{slots}}.__iter__() + + def __len__(self): + return {{len_slots}} + + def __str__(self): + return str({{dict}}) + +temp = {{name}} +""", + { + "name": name, + "slots": "(" + (", ".join(convert.value2quote(s) for s in slots)) + ")", + "required": "{" + (", ".join(convert.value2quote(s) for s in required)) + "}", + "nulls": "{" + (", ".join(convert.value2quote(s) for s in nulls)) + "}", + "len_slots": len(slots), + "dict": "{" + (", ".join(convert.value2quote(s) + ": self." + s for s in slots)) + "}", + "assign": "; ".join("_set(output, "+convert.value2quote(s)+", self."+s+")" for s in slots) + } + ) + + return _exec(code) + + +def _exec(code): + temp = None + exec(code) + return temp + + +class Table(DataClass("Table", [ + "name", + "url", + "query_path" +])): + @property + def columns(self): + return FromESMetadata.singlton.get_columns(table=self.name) + + +Column = DataClass( + "Column", + [ + "name", + "abs_name", + "table", + "type", + {"name": "useSource", "default": False}, + {"name": "nested_path", "nulls": True}, # AN ARRAY OF PATHS (FROM DEEPEST TO SHALLOWEST) INDICATING THE JSON SUB-ARRAYS + {"name": "relative", "nulls": True}, + {"name": "count", "nulls": True}, + {"name": "cardinality", "nulls": True}, + {"name": "partitions", "nulls": True}, + {"name": "last_updated", "nulls": True} + ] +) + + + diff --git a/pyLibrary/queries/namespace/__init__.py b/pyLibrary/queries/namespace/__init__.py new file mode 100644 index 0000000..7c53aa4 --- /dev/null +++ b/pyLibrary/queries/namespace/__init__.py @@ -0,0 +1,59 @@ +# encoding: utf-8 +# +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. +# +# Author: Kyle Lahnakoski (kyle@lahnakoski.com) +# +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +from collections import Mapping + +from pyLibrary.dot import set_default, Dict +from pyLibrary.queries.query import Query + + +class Namespace(object): + + def convert(self, expr): + raise NotImplementedError() + + def _convert_query(self, query): + output = Query() + output.select = self._convert_clause(query.select) + output.where = self.convert(query.where) + output["from"] = self._convert_from(query["from"]) + output.edges = self._convert_clause(query.edges) + output.having = convert_list(self._convert_having, query.having) + output.window = convert_list(self._convert_window, query.window) + output.sort = self._convert_clause(query.sort) + output.format = query.format + + return output + + def _convert_from(self, frum): + raise NotImplementedError() + + def _convert_clause(self, clause): + raise NotImplementedError() + + def _convert_having(self, clause): + raise NotImplementedError() + + def _convert_window(self, clause): + raise NotImplementedError() + + +def convert_list(operator, operand): + if operand==None: + return None + elif isinstance(operand, Mapping): + return operator(operand) + else: + return map(operator, operand) + + diff --git a/pyLibrary/queries/namespace/normal.py b/pyLibrary/queries/namespace/normal.py new file mode 100644 index 0000000..cec958c --- /dev/null +++ b/pyLibrary/queries/namespace/normal.py @@ -0,0 +1,283 @@ +# encoding: utf-8 +# +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. +# +# Author: Kyle Lahnakoski (kyle@lahnakoski.com) +# +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +from collections import Mapping +from copy import copy + +from pyLibrary.debugs.logs import Log +from pyLibrary.dot.dicts import Dict +from pyLibrary.dot import coalesce, Null +from pyLibrary.dot.lists import DictList +from pyLibrary.dot import wrap, listwrap +from pyLibrary.maths import Math +from pyLibrary.queries.containers import Container +from pyLibrary.queries.dimensions import Dimension +from pyLibrary.queries.domains import Domain +from pyLibrary.queries.expressions import TRUE_FILTER +from pyLibrary.queries.namespace import Namespace, convert_list +from pyLibrary.queries.query import Query, get_all_vars + + +DEFAULT_LIMIT = 10 + + +class Normal(Namespace): + """ + UNREMARKABLE NAMESPACE, SIMPLY FOR CONVERTING QUERY TO NORMAL FORM + """ + + def convert(self, expr): + if isinstance(expr, Mapping) and expr["from"]: + return self._convert_query(expr) + return expr + + + def _convert_query(self, query): + # if not isinstance(query["from"], Container): + # Log.error('Expecting from clause to be a Container') + query = wrap(query) + + output = Query() + output["from"] = self._convert_from(query["from"]) + + output.format = query.format + + if query.select: + output.select = convert_list(self._convert_select, query.select) + else: + if query.edges or query.groupby: + output.select = {"name": "count", "value": ".", "aggregate": "count"} + else: + output.select = {"name": "__all__", "value": "*", "aggregate": "none"} + + if query.groupby and query.edges: + Log.error("You can not use both the `groupby` and `edges` clauses in the same query!") + elif query.edges: + output.edges = convert_list(self._convert_edge, query.edges) + output.groupby = None + elif query.groupby: + output.edges = None + output.groupby = convert_list(self._convert_group, query.groupby) + else: + output.edges = [] + output.groupby = None + + output.where = self.convert(query.where) + output.window = convert_list(self._convert_window, query.window) + output.sort = self._convert_sort(query.sort) + + output.limit = coalesce(query.limit, DEFAULT_LIMIT) + if not Math.is_integer(output.limit) or output.limit < 0: + Log.error("Expecting limit >= 0") + + output.isLean = query.isLean + + # DEPTH ANALYSIS - LOOK FOR COLUMN REFERENCES THAT MAY BE DEEPER THAN + # THE from SOURCE IS. + vars = get_all_vars(output, exclude_where=True) # WE WILL EXCLUDE where VARIABLES + for c in query.columns: + if c.name in vars and c.nested_path: + Log.error("This query, with variable {{var_name}} is too deep", var_name=c.name) + + output.having = convert_list(self._convert_having, query.having) + + return output + + def _convert_from(self, frum): + if isinstance(frum, basestring): + return Dict(name=frum) + elif isinstance(frum, (Container, Query)): + return frum + else: + Log.error("Expecting from clause to be a name, or a container") + + def _convert_select(self, select): + if isinstance(select, basestring): + return Dict( + name=select.rstrip("."), # TRAILING DOT INDICATES THE VALUE, BUT IS INVALID FOR THE NAME + value=select, + aggregate="none" + ) + else: + select = wrap(select) + output = copy(select) + if not select.value or isinstance(select.value, basestring): + if select.value == ".": + output.name = coalesce(select.name, select.aggregate) + else: + output.name = coalesce(select.name, select.value, select.aggregate) + elif not output.name: + Log.error("Must give name to each column in select clause") + + if not output.name: + Log.error("expecting select to have a name: {{select}}", select=select) + + output.aggregate = coalesce(canonical_aggregates.get(select.aggregate), select.aggregate, "none") + return output + + def _convert_edge(self, edge): + if isinstance(edge, basestring): + return Dict( + name=edge, + value=edge, + domain=self._convert_domain() + ) + else: + edge = wrap(edge) + if not edge.name and not isinstance(edge.value, basestring): + Log.error("You must name compound edges: {{edge}}", edge= edge) + + if isinstance(edge.value, (Mapping, list)) and not edge.domain: + # COMPLEX EDGE IS SHORT HAND + domain =self._convert_domain() + domain.dimension = Dict(fields=edge.value) + + return Dict( + name=edge.name, + allowNulls=False if edge.allowNulls is False else True, + domain=domain + ) + + domain = self._convert_domain(edge.domain) + return Dict( + name=coalesce(edge.name, edge.value), + value=edge.value, + range=edge.range, + allowNulls=False if edge.allowNulls is False else True, + domain=domain + ) + + def _convert_group(self, column): + if isinstance(column, basestring): + return wrap({ + "name": column, + "value": column, + "domain": {"type": "default"} + }) + else: + column = wrap(column) + if (column.domain and column.domain.type != "default") or column.allowNulls != None: + Log.error("groupby does not accept complicated domains") + + if not column.name and not isinstance(column.value, basestring): + Log.error("You must name compound edges: {{edge}}", edge= column) + + return wrap({ + "name": coalesce(column.name, column.value), + "value": column.value, + "domain": {"type": "default"} + }) + + + def _convert_domain(self, domain=None): + if not domain: + return Domain(type="default") + elif isinstance(domain, Dimension): + return domain.getDomain() + elif isinstance(domain, Domain): + return domain + + if not domain.name: + domain = domain.copy() + domain.name = domain.type + + if not isinstance(domain.partitions, list): + domain.partitions = list(domain.partitions) + + return Domain(**domain) + + def _convert_range(self, range): + if range == None: + return None + + return Dict( + min=range.min, + max=range.max + ) + + def _convert_where(self, where): + if where == None: + return TRUE_FILTER + return where + + + def _convert_window(self, window): + return Dict( + name=coalesce(window.name, window.value), + value=window.value, + edges=[self._convert_edge(e) for e in listwrap(window.edges)], + sort=self._convert_sort(window.sort), + aggregate=window.aggregate, + range=self._convert_range(window.range), + where=self._convert_where(window.where) + ) + + + def _convert_sort(self, sort): + return normalize_sort(sort) + + +def normalize_sort(sort=None): + """ + CONVERT SORT PARAMETERS TO A NORMAL FORM SO EASIER TO USE + """ + + if not sort: + return DictList.EMPTY + + output = DictList() + for s in listwrap(sort): + if isinstance(s, basestring) or Math.is_integer(s): + output.append({"value": s, "sort": 1}) + elif not s.field and not s.value and s.sort==None: + #ASSUME {name: sort} FORM + for n, v in s.items(): + output.append({"value": n, "sort": sort_direction[v]}) + else: + output.append({"value": coalesce(s.field, s.value), "sort": coalesce(sort_direction[s.sort], 1)}) + return wrap(output) + + +sort_direction = { + "asc": 1, + "desc": -1, + "none": 0, + 1: 1, + 0: 0, + -1: -1, + None: 1, + Null: 1 +} + +canonical_aggregates = { + "none": "none", + "one": "one", + "count": "count", + "sum": "sum", + "add": "sum", + "mean": "average", + "average": "average", + "avg": "average", + "min": "minimum", + "minimum": "minimum", + "max": "maximum", + "maximum": "minimum", + "X2": "sum_of_squares", + "std": "std", + "stddev": "std", + "std_deviation": "std", + "var": "variance", + "variance": "variance", + "stats": "stats" +} + diff --git a/pyLibrary/queries/namespace/rename.py b/pyLibrary/queries/namespace/rename.py new file mode 100644 index 0000000..171cac8 --- /dev/null +++ b/pyLibrary/queries/namespace/rename.py @@ -0,0 +1,140 @@ +# encoding: utf-8 +# +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. +# +# Author: Kyle Lahnakoski (kyle@lahnakoski.com) +# +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +from collections import Mapping +from copy import copy + +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import set_default, wrap, coalesce, Dict, listwrap, unwraplist +from pyLibrary.maths import Math +from pyLibrary.queries.dimensions import Dimension +from pyLibrary.queries.domains import is_keyword +from pyLibrary.queries.namespace import Namespace, convert_list +from pyLibrary.queries.query import Query +from pyLibrary.times.dates import Date + + +class Rename(Namespace): + + def __init__(self, dimensions, source): + """ + EXPECTING A LIST OF {"name":name, "value":value} OBJECTS TO PERFORM A MAPPING + """ + dimensions = wrap(dimensions) + if isinstance(dimensions, Mapping) and dimensions.name == None: + # CONVERT TO A REAL DIMENSION DEFINITION + dimensions = {"name": ".", "type": "set", "edges":[{"name": k, "field": v} for k, v in dimensions.items()]} + + self.dimensions = Dimension(dimensions, None, source) + + def convert(self, expr): + """ + EXPAND INSTANCES OF name TO value + """ + if expr is True or expr == None or expr is False: + return expr + elif Math.is_number(expr): + return expr + elif expr == ".": + return "." + elif is_keyword(expr): + return coalesce(self.dimensions[expr], expr) + elif isinstance(expr, basestring): + Log.error("{{name|quote}} is not a valid variable name", name=expr) + elif isinstance(expr, Date): + return expr + elif isinstance(expr, Query): + return self._convert_query(expr) + elif isinstance(expr, Mapping): + if expr["from"]: + return self._convert_query(expr) + elif len(expr) >= 2: + #ASSUME WE HAVE A NAMED STRUCTURE, NOT AN EXPRESSION + return wrap({name: self.convert(value) for name, value in expr.leaves()}) + else: + # ASSUME SINGLE-CLAUSE EXPRESSION + k, v = expr.items()[0] + return converter_map.get(k, self._convert_bop)(self, k, v) + elif isinstance(expr, (list, set, tuple)): + return wrap([self.convert(value) for value in expr]) + else: + return expr + + def _convert_query(self, query): + output = Query(None) + output.select = self._convert_clause(query.select) + output.where = self.convert(query.where) + output.frum = self._convert_from(query.frum) + output.edges = convert_list(self._convert_edge, query.edges) + output.having = convert_list(self._convert_having, query.having) + output.window = convert_list(self._convert_window, query.window) + output.sort = self._convert_clause(query.sort) + output.format = query.format + + return output + + + + + def _convert_bop(self, op, term): + if isinstance(term, list): + return {op: map(self.convert, term)} + + return {op: {self.convert(var): val for var, val in term.items()}} + + def _convert_many(self, k, v): + return {k: map(self.convert, v)} + + def _convert_from(self, frum): + if isinstance(frum, Mapping): + return Dict(name=self.convert(frum.name)) + else: + return self.convert(frum) + + def _convert_edge(self, edge): + dim = self.dimensions[edge.value] + if not dim: + return edge + + if len(listwrap(dim.fields)) == 1: + #TODO: CHECK IF EDGE DOMAIN AND DIMENSION DOMAIN CONFLICT + new_edge = set_default({"value": unwraplist(dim.fields)}, edge) + return new_edge + new_edge.domain = dim.getDomain() + + edge = copy(edge) + edge.value = None + edge.domain = dim.getDomain() + return edge + + def _convert_clause(self, clause): + """ + Qb QUERIES HAVE MANY CLAUSES WITH SIMILAR COLUMN DELCARATIONS + """ + clause = wrap(clause) + + if clause == None: + return None + elif isinstance(clause, Mapping): + return set_default({"value": self.convert(clause.value)}, clause) + else: + return [set_default({"value": self.convert(c.value)}, c) for c in clause] + +converter_map = { + "and": Rename._convert_many, + "or": Rename._convert_many, + "not": Rename.convert, + "missing": Rename.convert, + "exists": Rename.convert +} + diff --git a/pyLibrary/queries/namespace/typed.py b/pyLibrary/queries/namespace/typed.py new file mode 100644 index 0000000..629dabe --- /dev/null +++ b/pyLibrary/queries/namespace/typed.py @@ -0,0 +1,111 @@ +# encoding: utf-8 +# +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. +# +# Author: Kyle Lahnakoski (kyle@lahnakoski.com) +# +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +from collections import Mapping + +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import set_default, wrap, Dict, Null +from pyLibrary.maths import Math +from pyLibrary.queries.domains import is_keyword +from pyLibrary.queries.namespace import convert_list, Namespace +from pyLibrary.queries.query import Query +from pyLibrary.times.dates import Date + + +class Typed(Namespace): + + def __init__(self): + self.converter_map = { + "and": self._convert_many, + "or": self._convert_many, + "not": self.convert, + "missing": self.convert, + "exists": self.convert + } + + def convert(self, expr): + """ + ADD THE ".$value" SUFFIX TO ALL VARIABLES + """ + if expr is True or expr == None or expr is False: + return expr + elif Math.is_number(expr): + return expr + elif expr == ".": + return "." + elif is_keyword(expr): + #TODO: LOOKUP SCHEMA AND ADD ALL COLUMNS WITH THIS PREFIX + return expr + ".$value" + elif isinstance(expr, basestring): + Log.error("{{name|quote}} is not a valid variable name", name=expr) + elif isinstance(expr, Date): + return expr + elif isinstance(expr, Query): + return self._convert_query(expr) + elif isinstance(expr, Mapping): + if expr["from"]: + return self._convert_query(expr) + elif len(expr) >= 2: + #ASSUME WE HAVE A NAMED STRUCTURE, NOT AN EXPRESSION + return wrap({name: self.convert(value) for name, value in expr.items()}) + else: + # ASSUME SINGLE-CLAUSE EXPRESSION + k, v = expr.items()[0] + return self.converter_map.get(k, self._convert_bop)(k, v) + elif isinstance(expr, (list, set, tuple)): + return wrap([self.convert(value) for value in expr]) + + def _convert_query(self, query): + output = Query(Null) + output.select = self._convert_clause(query.select) + output.where = self.convert(query.where) + output.frum = self._convert_from(query.frum) + output.edges = self._convert_clause(query.edges) + output.groupby = self._convert_clause(query.groupby) + output.window = convert_list(self._convert_window, query.window) + output.having = convert_list(self._convert_having, query.having) + output.sort = self._convert_clause(query.sort) + output.limit = query.limit + output.format = query.format + + return output + + def _convert_clause(self, clause): + """ + Qb QUERIES HAVE MANY CLAUSES WITH SIMILAR COLUMN DELCARATIONS + """ + if clause == None: + return None + elif isinstance(clause, Mapping): + return set_default({"value": self.convert(clause["value"])}, clause) + else: + return [set_default({"value": self.convert(c.value)}, c) for c in clause] + + def _convert_from(self, frum): + return frum + + def _convert_having(self, having): + raise NotImplementedError() + + def _convert_window(self, window): + raise NotImplementedError() + + def _convert_many(self, k, v): + return {k: map(self.convert, v)} + + def _convert_bop(self, op, term): + if isinstance(term, list): + return {op: map(self.convert, term)} + + return {op: {var: val for var, val in term.items()}} + diff --git a/pyLibrary/queries/normalize.py b/pyLibrary/queries/normalize.py deleted file mode 100644 index 86a0920..0000000 --- a/pyLibrary/queries/normalize.py +++ /dev/null @@ -1,424 +0,0 @@ -# encoding: utf-8 -# -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this file, -# You can obtain one at http://mozilla.org/MPL/2.0/. -# -# Author: Kyle Lahnakoski (kyle@lahnakoski.com) -# -from __future__ import unicode_literals -from __future__ import division -from __future__ import absolute_import - -from collections import Mapping - -from pyLibrary.collections import AND, reverse -from pyLibrary.debugs.logs import Log -from pyLibrary.dot.dicts import Dict -from pyLibrary.dot import coalesce, split_field, join_field, Null -from pyLibrary.dot.lists import DictList -from pyLibrary.dot import wrap, unwrap, listwrap -from pyLibrary.maths import Math -from pyLibrary.queries.dimensions import Dimension -from pyLibrary.queries.domains import Domain, is_keyword -from pyLibrary.queries.expressions import TRUE_FILTER, simplify_esfilter - - -DEFAULT_LIMIT = 10 - -_qb = None -_INDEX_CACHE = None - - -def _late_import(): - global _qb - global _INDEX_CACHE - - from pyLibrary.queries import qb as _qb - from pyLibrary.queries.es09.util import INDEX_CACHE as _INDEX_CACHE - - _ = _qb - _ = _INDEX_CACHE - - -def _normalize_selects(selects, schema=None): - if isinstance(selects, list): - output = wrap([_normalize_select(s, schema=schema) for s in selects]) - - exists = set() - for s in output: - if s.name in exists: - Log.error("{{name}} has already been defined", name= s.name) - exists.add(s.name) - return output - else: - return _normalize_select(selects, schema=schema) - - -def _normalize_select(select, schema=None): - if isinstance(select, basestring): - if schema: - s = schema[select] - if s: - return s.getSelect() - return Dict( - name=select.rstrip("."), # TRAILING DOT INDICATES THE VALUE, BUT IS INVALID FOR THE NAME - value=select, - aggregate="none" - ) - else: - select = wrap(select) - output = select.copy() - if not select.value or isinstance(select.value, basestring): - output.name = coalesce(select.name, select.value, select.aggregate) - elif not output.name: - Log.error("Must give name to each column in select clause") - - if not output.name: - Log.error("expecting select to have a name: {{select}}", select=select) - - output.aggregate = coalesce(canonical_aggregates.get(select.aggregate), select.aggregate, "none") - return output - - -def _normalize_edges(edges, schema=None): - return [_normalize_edge(e, schema=schema) for e in listwrap(edges)] - - -def _normalize_edge(edge, schema=None): - if isinstance(edge, basestring): - if schema: - e = schema[edge] - if e: - if isinstance(e.fields, list) and len(e.fields) == 1: - return Dict( - name=e.name, - value=e.fields[0], - domain=e.getDomain() - ) - else: - return Dict( - name=e.name, - domain=e.getDomain() - ) - return Dict( - name=edge, - value=edge, - domain=_normalize_domain(schema=schema) - ) - else: - edge = wrap(edge) - if not edge.name and not isinstance(edge.value, basestring): - Log.error("You must name compound edges: {{edge}}", edge= edge) - - if isinstance(edge.value, (Mapping, list)) and not edge.domain: - # COMPLEX EDGE IS SHORT HAND - domain = _normalize_domain(schema=schema) - domain.dimension = Dict(fields=edge.value) - - return Dict( - name=edge.name, - allowNulls=False if edge.allowNulls is False else True, - domain=domain - ) - - domain = _normalize_domain(edge.domain, schema=schema) - return Dict( - name=coalesce(edge.name, edge.value), - value=edge.value, - range=edge.range, - allowNulls=False if edge.allowNulls is False else True, - domain=domain - ) - - -def _normalize_groupby(groupby, schema=None): - if groupby == None: - return None - return [_normalize_group(e, schema=schema) for e in listwrap(groupby)] - - -def _normalize_group(edge, schema=None): - if isinstance(edge, basestring): - return wrap({ - "name": edge, - "value": edge, - "domain": {"type": "default"} - }) - else: - edge = wrap(edge) - if (edge.domain and edge.domain.type != "default") or edge.allowNulls != None: - Log.error("groupby does not accept complicated domains") - - if not edge.name and not isinstance(edge.value, basestring): - Log.error("You must name compound edges: {{edge}}", edge= edge) - - return wrap({ - "name": coalesce(edge.name, edge.value), - "value": edge.value, - "domain": {"type": "default"} - }) - - -def _normalize_domain(domain=None, schema=None): - if not domain: - return Domain(type="default") - elif isinstance(domain, Dimension): - return domain.getDomain() - elif schema and isinstance(domain, basestring) and schema[domain]: - return schema[domain].getDomain() - elif isinstance(domain, Domain): - return domain - - if not domain.name: - domain = domain.copy() - domain.name = domain.type - - if not isinstance(domain.partitions, list): - domain.partitions = list(domain.partitions) - - return Domain(**domain) - - -def _normalize_range(range): - if range == None: - return None - - return Dict( - min=range.min, - max=range.max - ) - - -def _normalize_where(where, schema=None): - if where == None: - return TRUE_FILTER - if schema == None: - return where - where = simplify_esfilter(_where_terms(where, where, schema)) - return where - - - -def _normalize_window(window, schema=None): - return Dict( - name=coalesce(window.name, window.value), - value=window.value, - edges=[_normalize_edge(e, schema) for e in listwrap(window.edges)], - sort=_normalize_sort(window.sort), - aggregate=window.aggregate, - range=_normalize_range(window.range), - where=_normalize_where(window.where, schema=schema) - ) - - - - -def _map_term_using_schema(master, path, term, schema_edges): - """ - IF THE WHERE CLAUSE REFERS TO FIELDS IN THE SCHEMA, THEN EXPAND THEM - """ - output = DictList() - for k, v in term.items(): - dimension = schema_edges[k] - if isinstance(dimension, Dimension): - domain = dimension.getDomain() - if dimension.fields: - if isinstance(dimension.fields, Mapping): - # EXPECTING A TUPLE - for local_field, es_field in dimension.fields.items(): - local_value = v[local_field] - if local_value == None: - output.append({"missing": {"field": es_field}}) - else: - output.append({"term": {es_field: local_value}}) - continue - - if len(dimension.fields) == 1 and is_keyword(dimension.fields[0]): - # SIMPLE SINGLE-VALUED FIELD - if domain.getPartByKey(v) is domain.NULL: - output.append({"missing": {"field": dimension.fields[0]}}) - else: - output.append({"term": {dimension.fields[0]: v}}) - continue - - if AND(is_keyword(f) for f in dimension.fields): - # EXPECTING A TUPLE - if not isinstance(v, tuple): - Log.error("expecing {{name}}={{value}} to be a tuple", name= k, value= v) - for i, f in enumerate(dimension.fields): - vv = v[i] - if vv == None: - output.append({"missing": {"field": f}}) - else: - output.append({"term": {f: vv}}) - continue - if len(dimension.fields) == 1 and is_keyword(dimension.fields[0]): - if domain.getPartByKey(v) is domain.NULL: - output.append({"missing": {"field": dimension.fields[0]}}) - else: - output.append({"term": {dimension.fields[0]: v}}) - continue - if domain.partitions: - part = domain.getPartByKey(v) - if part is domain.NULL or not part.esfilter: - Log.error("not expected to get NULL") - output.append(part.esfilter) - continue - else: - Log.error("not expected") - elif isinstance(v, Mapping): - sub = _map_term_using_schema(master, path + [k], v, schema_edges[k]) - output.append(sub) - continue - - output.append({"term": {k: v}}) - return {"and": output} - - -def _move_nested_term(master, where, schema): - """ - THE WHERE CLAUSE CAN CONTAIN NESTED PROPERTY REFERENCES, THESE MUST BE MOVED - TO A NESTED FILTER - """ - items = where.term.items() - if len(items) != 1: - Log.error("Expecting only one term") - k, v = items[0] - nested_path = _get_nested_path(k, schema) - if nested_path: - return {"nested": { - "path": nested_path, - "query": {"filtered": { - "query": {"match_all": {}}, - "filter": {"and": [ - {"term": {k: v}} - ]} - }} - }} - return where - - -def _get_nested_path(field, schema): - if not _INDEX_CACHE: - _late_import() - - if is_keyword(field): - field = join_field([schema.es.alias] + split_field(field)) - for i, f in reverse(enumerate(split_field(field))): - path = join_field(split_field(field)[0:i + 1:]) - if path in _INDEX_CACHE: - return join_field(split_field(path)[1::]) - return None - - -def _where_terms(master, where, schema): - """ - USE THE SCHEMA TO CONVERT DIMENSION NAMES TO ES FILTERS - master - TOP LEVEL WHERE (FOR PLACING NESTED FILTERS) - """ - if isinstance(where, Mapping): - if where.term: - # MAP TERM - try: - output = _map_term_using_schema(master, [], where.term, schema.edges) - return output - except Exception, e: - Log.error("programmer problem?", e) - elif where.terms: - # MAP TERM - output = DictList() - for k, v in where.terms.items(): - if not isinstance(v, (list, set)): - Log.error("terms filter expects list of values") - edge = schema.edges[k] - if not edge: - output.append({"terms": {k: v}}) - else: - if isinstance(edge, basestring): - # DIRECT FIELD REFERENCE - return {"terms": {edge: v}} - try: - domain = edge.getDomain() - except Exception, e: - Log.error("programmer error", e) - fields = domain.dimension.fields - if isinstance(fields, Mapping): - or_agg = [] - for vv in v: - and_agg = [] - for local_field, es_field in fields.items(): - vvv = vv[local_field] - if vvv != None: - and_agg.append({"term": {es_field: vvv}}) - or_agg.append({"and": and_agg}) - output.append({"or": or_agg}) - elif isinstance(fields, list) and len(fields) == 1 and is_keyword(fields[0]): - output.append({"terms": {fields[0]: v}}) - elif domain.partitions: - output.append({"or": [domain.getPartByKey(vv).esfilter for vv in v]}) - return {"and": output} - elif where["or"]: - return {"or": [unwrap(_where_terms(master, vv, schema)) for vv in where["or"]]} - elif where["and"]: - return {"and": [unwrap(_where_terms(master, vv, schema)) for vv in where["and"]]} - elif where["not"]: - return {"not": unwrap(_where_terms(master, where["not"], schema))} - return where - - -def _normalize_sort(sort=None): - """ - CONVERT SORT PARAMETERS TO A NORMAL FORM SO EASIER TO USE - """ - - if not sort: - return DictList.EMPTY - - output = DictList() - for s in listwrap(sort): - if isinstance(s, basestring) or Math.is_integer(s): - output.append({"field": s, "sort": 1}) - elif not s.field and not s.value and s.sort==None: - #ASSUME {name: sort} FORM - for n, v in s.items(): - output.append({"field": n, "sort": sort_direction[v]}) - else: - output.append({"field": coalesce(s.field, s.value), "sort": coalesce(sort_direction[s.sort], 1)}) - return wrap(output) - - -sort_direction = { - "asc": 1, - "desc": -1, - "none": 0, - 1: 1, - 0: 0, - -1: -1, - None: 1, - Null: 1 -} - -canonical_aggregates = { - "none": "none", - "one": "one", - "count": "value_count", - "sum": "sum", - "add": "sum", - "mean": "average", - "average": "average", - "avg": "average", - "min": "minimum", - "minimum": "minimum", - "max": "maximum", - "maximum": "minimum", - "X2": "sum_of_squares", - "std": "std", - "stddev": "std", - "std_deviation": "std", - "var": "variance", - "variance": "variance", - "stats": "stats" -} - diff --git a/pyLibrary/queries/qb.py b/pyLibrary/queries/qb.py index e8fefc0..c3b8881 100644 --- a/pyLibrary/queries/qb.py +++ b/pyLibrary/queries/qb.py @@ -21,34 +21,82 @@ from pyLibrary.debugs.logs import Log from pyLibrary.dot import set_default, Null, Dict, split_field, coalesce, join_field from pyLibrary.dot.lists import DictList from pyLibrary.dot import listwrap, wrap, unwrap -from pyLibrary.dot.objects import DictObject +from pyLibrary.dot.objects import DictClass, DictObject from pyLibrary.maths import Math from pyLibrary.queries import flat_list, query, group_by from pyLibrary.queries.containers import Container from pyLibrary.queries.cubes.aggs import cube_aggs -from pyLibrary.queries.expressions import TRUE_FILTER, FALSE_FILTER, compile_expression, qb_expression_to_function +from pyLibrary.queries.expressions import TRUE_FILTER, FALSE_FILTER, compile_expression, qb_expression_to_function, qb_expression_to_python from pyLibrary.queries.flat_list import FlatList from pyLibrary.queries.index import Index +from pyLibrary.queries.query import Query, _normalize_selects, sort_direction, _normalize_select from pyLibrary.queries.containers.cube import Cube -from pyLibrary.queries.normalize import _normalize_sort, _normalize_select, _normalize_selects -from pyLibrary.queries.query import Query from pyLibrary.queries.unique_index import UniqueIndex - # A COLLECTION OF DATABASE OPERATORS (RELATIONAL ALGEBRA OPERATORS) # qb QUERY DOCUMENTATION: https://github.com/klahnakoski/qb/tree/master/docs # START HERE: https://github.com/klahnakoski/qb/blob/master/docs/Qb_Reference.md # TODO: USE http://docs.sqlalchemy.org/en/latest/core/tutorial.html AS DOCUMENTATION FRAMEWORK -def run(query): +def run(query, frum=None): """ THIS FUNCTION IS SIMPLY SWITCHING BASED ON THE query["from"] CONTAINER, BUT IT IS ALSO PROCESSING A list CONTAINER; SEPARATE TO A ListContainer """ - frum = Container.new_instance(query["from"]) - q = Query(query, frum) - return frum.query(q) + query = Query(query) + frum = coalesce(frum, query["from"]) + if isinstance(frum, Container): + return frum.query(query) + elif isinstance(frum, (list, set, GeneratorType)): + frum = wrap(list(frum)) + elif isinstance(frum, Cube): + if is_aggs(query): + return cube_aggs(frum, query) + + elif isinstance(frum, Query): + frum = run(frum).data + else: + Log.error("Do not know how to handle {{type}}", type=frum.__class__.__name__) + + if is_aggs(query): + frum = list_aggs(frum, query) + else: # SETOP + # try: + # if query.filter != None or query.esfilter != None: + # Log.error("use 'where' clause") + # except AttributeError: + # pass + + if query.where is not TRUE_FILTER: + frum = filter(frum, query.where) + + if query.sort: + frum = sort(frum, query.sort) + + if query.select: + frum = select(frum, query.select) + + if query.window: + if isinstance(frum, Cube): + frum = list(frum.values()) + + for param in query.window: + window(frum, param) + + # AT THIS POINT frum IS IN LIST FORMAT, NOW PACKAGE RESULT + if query.format == "cube": + frum = convert.list2cube(frum) + elif query.format == "table": + frum = convert.list2table(frum) + frum.meta.format = "table" + else: + frum = wrap({ + "meta": {"format": "list"}, + "data": frum + }) + + return frum groupby = group_by.groupby @@ -221,12 +269,13 @@ def select_one(record, selection): output = Dict() for f in selection: f = _normalize_select(f) - output[f.name]=record[f.value] + output[f.name] = record[f.value] return output else: Log.error("Do not know how to handle") + def select(data, field_name): """ return list with values from field_name @@ -395,8 +444,8 @@ def _select_deep_meta(field, depth): return assign -# def get_columns(data): -# return wrap([{"name": n} for n in UNION(set(d.keys()) for d in data)]) +def get_columns(data): + return wrap([{"name": n} for n in UNION(set(d.keys()) for d in data)]) def sort(data, fieldnames=None): @@ -410,19 +459,29 @@ def sort(data, fieldnames=None): if fieldnames == None: return wrap(sorted(data)) - fieldnames = _normalize_sort(fieldnames) + fieldnames = listwrap(fieldnames) if len(fieldnames) == 1: fieldnames = fieldnames[0] - # SPECIAL CASE, ONLY ONE FIELD TO SORT BY - if fieldnames.field == ".": + if fieldnames == ".": + return wrap(sorted(data)) + if isinstance(fieldnames, (basestring, int)): + fieldnames = wrap({"value": fieldnames, "sort": 1}) + + # EXPECTING {"field":f, "sort":i} FORMAT + fieldnames.sort = sort_direction.get(fieldnames.sort, 1) + fieldnames.value = coalesce(fieldnames.value, fieldnames.field) + if fieldnames.value==None: + Log.error("Expecting sort to have 'value' attribute") + + if fieldnames.value == ".": #VALUE COMPARE def _compare_v(l, r): return value_compare(l, r, fieldnames.sort) return DictList([unwrap(d) for d in sorted(data, cmp=_compare_v)]) else: def _compare_o(left, right): - return value_compare(coalesce(left)[fieldnames.field], coalesce(right)[fieldnames.field], fieldnames.sort) + return value_compare(coalesce(left)[fieldnames.value], coalesce(right)[fieldnames.value], fieldnames.sort) return DictList([unwrap(d) for d in sorted(data, cmp=_compare_o)]) formal = query._normalize_sort(fieldnames) @@ -432,7 +491,7 @@ def sort(data, fieldnames=None): right = coalesce(right) for f in formal: try: - result = value_compare(left[f.field], right[f.field], f.sort) + result = value_compare(left[f.value], right[f.value], f.sort) if result != 0: return result except Exception, e: @@ -449,7 +508,7 @@ def sort(data, fieldnames=None): return output except Exception, e: - Log.error("Problem sorting\n{{data}}", data= data, cause=e) + Log.error("Problem sorting\n{{data}}", data=data, cause=e) def value_compare(l, r, ordering=1): @@ -491,9 +550,13 @@ def filter(data, where): if isinstance(data, Cube): data.filter(where) + temp = None + exec("def temp(row):\n return "+qb_expression_to_python(where)) + return data.filter(temp) + try: return drill_filter(where, data) - except Exception, e: + except Exception, _: # WOW! THIS IS INEFFICIENT! return wrap([unwrap(d) for d in drill_filter(where, [DictObject(d) for d in data])]) @@ -516,7 +579,10 @@ def drill_filter(esfilter, data): col = split_field(fieldname) d = data for i, c in enumerate(col): - d = d[c] + try: + d = d[c] + except Exception, e: + Log.error("{{name}} does not exist", name=fieldname) if isinstance(d, list) and len(col) > 1: if len(primary_column) <= depth+i: primary_nested.append(True) @@ -581,10 +647,11 @@ def drill_filter(esfilter, data): return True else: return {"not": f} - elif filter.term: + elif filter.term or filter.eq: + eq = coalesce(filter.term, filter.eq) result = True output = {} - for col, val in filter["term"].items(): + for col, val in eq.items(): first, rest = parse_field(col, data, depth) d = data[first] if not rest: @@ -896,4 +963,4 @@ def reverse(vals): return wrap(output) -from pyLibrary.queries.list.aggs import is_aggs, list_aggs +from pyLibrary.queries.lists.aggs import is_aggs, list_aggs diff --git a/pyLibrary/queries/qb_usingES.py b/pyLibrary/queries/qb_usingES.py index 31e736b..a6b4f15 100644 --- a/pyLibrary/queries/qb_usingES.py +++ b/pyLibrary/queries/qb_usingES.py @@ -10,24 +10,28 @@ from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import -from collections import Mapping +from copy import copy + +from collections import Mapping from pyLibrary import convert from pyLibrary.env import elasticsearch, http from pyLibrary.meta import use_settings -from pyLibrary.queries import qb, expressions -from pyLibrary.queries.containers import Container, config +from pyLibrary.queries import qb, expressions, containers +from pyLibrary.queries.containers import Container from pyLibrary.queries.domains import is_keyword from pyLibrary.queries.es09 import setop as es09_setop -from pyLibrary.queries.es09.util import parse_columns, INDEX_CACHE from pyLibrary.queries.es14.aggs import es_aggsop, is_aggsop -from pyLibrary.queries.es14.setop import is_fieldop, is_setop, es_setop, es_fieldop +from pyLibrary.queries.es14.deep import is_deepop, es_deepop +from pyLibrary.queries.es14.setop import is_setop, es_setop from pyLibrary.queries.dimensions import Dimension from pyLibrary.queries.es14.util import aggregates1_4 +from pyLibrary.queries.meta import FromESMetadata +from pyLibrary.queries.namespace.typed import Typed from pyLibrary.queries.query import Query, _normalize_where from pyLibrary.debugs.logs import Log, Except from pyLibrary.dot.dicts import Dict -from pyLibrary.dot import coalesce, split_field, set_default, literal_field, unwraplist +from pyLibrary.dot import coalesce, split_field, literal_field, unwraplist, join_field from pyLibrary.dot.lists import DictList from pyLibrary.dot import wrap, listwrap @@ -43,24 +47,27 @@ class FromES(Container): output.__init__(*args, **kwargs) return output else: - output = object.__new__(cls) - output.schema = None #TODO: WHERE IS THE SCHEMA? - return output + return Container.__new__(cls) @use_settings def __init__(self, host, index, type=None, alias=None, name=None, port=9200, read_only=True, settings=None): - if not config.default: - config.default.settings = settings + Container.__init__(self, None, None) + if not containers.config.default: + containers.config.default.settings = settings self.settings = settings self.name = coalesce(name, alias, index) if read_only: self._es = elasticsearch.Alias(alias=coalesce(alias, index), settings=settings) else: self._es = elasticsearch.Cluster(settings=settings).get_index(read_only=read_only, settings=settings) + + self.meta = FromESMetadata(settings=settings) self.settings.type = self._es.settings.type - self.schema = Dict() + self.edges = Dict() self.worker = None - self._columns = None + self._columns = self.get_columns() + # SWITCH ON TYPED MODE + self.typed = any(c.name in ("$value", "$object") for c in self._columns) @staticmethod def wrap(es): @@ -91,15 +98,26 @@ class FromES(Container): else: self.worker.join() + @property + def query_path(self): + return join_field(split_field(self.name)[1:]) + @property def url(self): return self._es.url - def query(self, query): + def query(self, _query): try: + query = Query(_query, schema=self) + + for n in self.namespaces: + query = n.convert(query) + if self.typed: + query = Typed().convert(query) + for s in listwrap(query.select): - if not aggregates1_4[s.aggregate]: - Log.error("ES can not aggregate " + self.select[0].name + " because '" + self.select[0].aggregate + "' is not a recognized aggregate") + if not aggregates1_4.get(s.aggregate): + Log.error("ES can not aggregate " + s.name + " because '" + s.aggregate + "' is not a recognized aggregate") frum = query["from"] if isinstance(frum, Query): @@ -108,10 +126,10 @@ class FromES(Container): q2.frum = result return qb.run(q2) + if is_deepop(self._es, query): + return es_deepop(self._es, query) if is_aggsop(self._es, query): return es_aggsop(self._es, frum, query) - if is_fieldop(self._es, query): - return es_fieldop(self._es, query) if is_setop(self._es, query): return es_setop(self._es, query) if es09_setop.is_setop(query): @@ -125,60 +143,47 @@ class FromES(Container): Log.error("Problem (Tried to clear Elasticsearch cache)", e) Log.error("problem", e) + def get_columns(self, table=None): + query_path = self.query_path if self.query_path != "." else None + abs_columns = self.meta.get_columns(table=coalesce(table, self.settings.index)) + columns = [] + if query_path: + depth = (len(c.nested_path) for c in abs_columns if c.nested_path[0] == query_path).next() + # ADD RELATIVE COLUMNS + for c in abs_columns: + if c.nested_path[0] == query_path: + c = copy(c) + columns.append(c) + c = copy(c) + c.name = c.abs_name[len(query_path) + 1:] if c.type != "nested" else "." + c.relative = True + columns.append(c) + elif not c.nested_path: + c = copy(c) + columns.append(c) + c = copy(c) + c.name = "." + ("." * depth) + c.abs_name + c.relative = True + columns.append(c) + elif depth > len(c.nested_path) and query_path.startswith(c.nested_path[0] + "."): + diff = depth - len(c.nested_path) + c = copy(c) + columns.append(c) + c = copy(c) + c.name = "." + ("." * diff) + (c.abs_name[len(c.nested_path[0]) + 1:] if c.type != "nested" else "") + c.relative = True + columns.append(c) + else: + continue + else: + for c in abs_columns: + if not c.nested_path: + c = copy(c) + c.relative = True + columns.append(c) - def get_relative_columns(self): - if self._columns: - return self._columns - - abs_columns=self._get_columns(self.settings.alias, self.path) - - - - - - def get_columns(self, _from_name=None): - """ - ENSURE COLUMNS FOR GIVEN INDEX/QUERY ARE LOADED, SCRIPT COMPILATION WILL WORK BETTER - - _from_name - NOT MEANT FOR EXTERNAL USE - """ - - if _from_name is None: - _from_name = self.name - if not isinstance(_from_name, basestring): - Log.error("Expecting string") - - output = INDEX_CACHE.get(_from_name) - if output: - # VERIFY es IS CONSISTENT - if self.url != output.url: - Log.error("Using {{name}} for two different containers\n\t{{existing}}\n\t{{new}}", - name= _from_name, - existing= output.url, - new= self._es.url) - return output.columns - - path = split_field(_from_name) - if len(path) > 1: - # LOAD THE PARENT (WHICH WILL FILL THE INDEX_CACHE WITH NESTED CHILDREN) - self.get_columns(_from_name=path[0]) - return INDEX_CACHE[_from_name].columns - - schema = self._es.get_schema() - properties = schema.properties - INDEX_CACHE[_from_name] = output = Dict() - output.name = _from_name - output.url = self._es.url - output.columns = parse_columns(_from_name, properties) - return output.columns - - - def get_column_names(self): - # GET METADATA FOR INDEX - # LIST ALL COLUMNS - frum = self.get_columns() - return frum.name + return wrap(columns) def addDimension(self, dim): if isinstance(dim, list): @@ -189,14 +194,14 @@ class FromES(Container): dim.full_name = dim.name for e in dim.edges: d = Dimension(e, dim, self) - self.schema[d.full_name] = d + self.edges[d.full_name] = d def __getitem__(self, item): - e = self.schema[item] + e = self.edges[item] return e def __getattr__(self, item): - return self.schema[item] + return self.edges[item] def normalize_edges(self, edges): output = DictList() @@ -257,23 +262,15 @@ class FromES(Container): "size": 200000 }) + # SCRIPT IS SAME FOR ALL (CAN ONLY HANDLE ASSIGNMENT TO CONSTANT) scripts = DictList() for k, v in command.set.items(): if not is_keyword(k): Log.error("Only support simple paths for now") - - if "doc" in v.keys(): - # scripts.append({ - # "script": "ctx._source[" + convert.string2quote(k) + "] = param_", - # "params": {"param_": v["doc"]} - # }) - #SIMPLE DOC ASSIGNMENT - scripts.append({"doc": {k: v["doc"]}}) + if isinstance(v, Mapping) and v.doc: + scripts.append({"doc": v.doc}) else: - # SCRIPT IS SAME FOR ALL (CAN ONLY HANDLE ASSIGNMENT TO CONSTANT) - scripts.append({ - "script": "ctx._source[" + convert.string2quote(k) + "] = " + expressions.qb_expression_to_ruby(v) + ";\n" - }) + scripts.append({"script": "ctx._source." + k + " = " + expressions.qb_expression_to_ruby(v)}) if results.hits.hits: updates = [] @@ -282,7 +279,7 @@ class FromES(Container): updates.append({"update": {"_id": h._id, "_routing": unwraplist(h.fields[literal_field(schema._routing.path)])}}) updates.append(s) content = ("\n".join(convert.value2json(c) for c in updates) + "\n").encode('utf-8') - response = self._es.cluster._post( + response = self._es.cluster.post( self._es.path + "/_bulk", data=content, headers={"Content-Type": "application/json"} @@ -290,97 +287,3 @@ class FromES(Container): if response.errors: Log.error("could not update: {{error}}", error=[e.error for i in response["items"] for e in i.values() if e.status not in (200, 201)]) -class FromESMetadata(Container): - """ - QUERY THE METADATA - """ - - @use_settings - def __init__(self, host, index, alias=None, name=None, port=9200, settings=None): - self.settings = settings - self.name = coalesce(name, alias, index) - self._es = elasticsearch.Cluster(settings=settings) - self.metadata = self._es.get_metadata() - self.columns = None - - @property - def url(self): - return self._es.path + "/" + self.name.replace(".", "/") - - def __enter__(self): - return self - - def __exit__(self, type, value, traceback): - pass - - def query(self, _query): - if not self.columns: - self.columns = [] - alias_done = set() - metadata = self._es.get_metadata() - for index, meta in qb.sort(metadata.indices.items(), {"value": 0, "sort": -1}): - for _, properties in meta.mappings.items(): - columns = _parse_properties(index, properties.properties) - for c in columns: - c.cube = index - c.property = c.name - c.name = None - c.useSource = None - - self.columns.extend(columns) - for a in meta.aliases: - # ONLY THE LATEST ALIAS IS CHOSEN TO GET COLUMNS - if a in alias_done: - continue - alias_done.add(a) - for c in columns: - self.columns.append(set_default({"cube": a}, c)) # ENSURE WE COPY - - - return qb.run(set_default( - { - "from": self.columns, - "sort": ["cube", "property"] - }, - _query.as_dict() - )) - - def get_columns(self, _=None): - """ - RETURN METADATA COLUMNS - """ - if self.name == "meta.columns": - return wrap([ - { - "name": "cube", - "type": "string", - "depth": 0 - }, { - "name": "column", - "type": "string", - "depth": 0 - }, { - "name": "type", - "type": "string", - "depth": 0 - }, { - "name": "depth", - "type": "integer", - "depth": 0 - } - ]) - else: - Log.error("Unknonw metadata: {{name}}", name= self.settings.name) - - -def _parse_properties(index, properties): - """ - ISOLATE THE DEALING WITH THE INDEX_CACHE, - INDEX_CACHE IS REDUNDANT WHEN YOU HAVE metadata.columns - """ - backup = INDEX_CACHE.get(index) - INDEX_CACHE[index] = output = Dict() - output.name = index - columns = parse_columns(index, properties) - INDEX_CACHE[index] = backup - return columns diff --git a/pyLibrary/queries/query.py b/pyLibrary/queries/query.py index c403d61..cb6eddc 100644 --- a/pyLibrary/queries/query.py +++ b/pyLibrary/queries/query.py @@ -10,63 +10,93 @@ from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import +from collections import Mapping +from pyLibrary.collections import AND, reverse from pyLibrary.debugs.logs import Log from pyLibrary.dot.dicts import Dict -from pyLibrary.dot import coalesce -from pyLibrary.dot import wrap, listwrap +from pyLibrary.dot import coalesce, split_field, join_field, Null +from pyLibrary.dot.lists import DictList +from pyLibrary.dot import wrap, unwrap, listwrap from pyLibrary.maths import Math -from pyLibrary.queries import expressions +from pyLibrary.queries import wrap_from from pyLibrary.queries.containers import Container -from pyLibrary.queries.normalize import _normalize_groupby, _normalize_edges, _normalize_where, _normalize_window, _normalize_sort, DEFAULT_LIMIT, _normalize_selects +from pyLibrary.queries.dimensions import Dimension +from pyLibrary.queries.domains import Domain, is_keyword +from pyLibrary.queries.expressions import TRUE_FILTER, simplify_esfilter, query_get_all_vars + + +DEFAULT_LIMIT = 10 + +qb = None + + +def _late_import(): + global qb + + from pyLibrary.queries import qb + + _ = qb class Query(object): - __slots__ = ["frum", "select", "edges", "groupby", "where", "window", "sort", "limit", "format", "isLean"] + __slots__ = ["frum", "select", "edges", "groupby", "where", "window", "sort", "limit", "having", "format", "isLean"] - def __new__(cls, query, frum): + def __new__(cls, query, schema=None): if isinstance(query, Query): return query - return object.__new__(cls) + output = object.__new__(cls) + for s in Query.__slots__: + setattr(output, s, None) + return output - def __init__(self, query, frum): + def __init__(self, query, schema=None): """ NORMALIZE QUERY SO IT CAN STILL BE JSON """ - object.__init__(self) - if isinstance(query, Query): + if isinstance(query, Query) or query == None: return + object.__init__(self) query = wrap(query) - self.frum = frum - if not isinstance(self.frum, Container): - Log.error('Expecting from clause to be a Container') - self.format = query.format + self.frum = wrap_from(query["from"], schema=schema) - if query.select: - self.select = _normalize_selects(query.select, frum.schema) + select = query.select + if isinstance(select, list): + names = set() + new_select = [] + for s in select: + ns = _normalize_select(s, schema=schema) + if ns.name in names: + Log.error("two select have the same name") + names.add(ns.name) + new_select.append(unwrap(ns)) + self.select = wrap(new_select) + elif select: + self.select = _normalize_select(select, schema=schema) else: if query.edges or query.groupby: self.select = {"name": "count", "value": ".", "aggregate": "count"} else: - self.select = {"name": "__all__", "value": "*", "aggregate": "none"} + self.select = {"name": ".", "value": "*", "aggregate": "none"} if query.groupby and query.edges: Log.error("You can not use both the `groupby` and `edges` clauses in the same query!") elif query.edges: - self.edges = _normalize_edges(query.edges, schema=self.frum.schema) + self.edges = _normalize_edges(query.edges, schema=schema) self.groupby = None elif query.groupby: self.edges = None - self.groupby = _normalize_groupby(query.groupby, schema=self.frum.schema) + self.groupby = _normalize_groupby(query.groupby, schema=schema) else: self.edges = [] self.groupby = None - self.where = _normalize_where(query.where, schema=self.frum.schema) + self.where = _normalize_where(query.where, schema=schema) self.window = [_normalize_window(w) for w in listwrap(query.window)] + self.having = None self.sort = _normalize_sort(query.sort) self.limit = coalesce(query.limit, DEFAULT_LIMIT) if not Math.is_integer(self.limit) or self.limit < 0: @@ -77,9 +107,20 @@ class Query(object): # DEPTH ANALYSIS - LOOK FOR COLUMN REFERENCES THAT MAY BE DEEPER THAN # THE from SOURCE IS. - vars = get_all_vars(self, exclude_where=True) # WE WILL EXCLUDE where VARIABLES - for c in self.columns: - if c.name in vars and c.depth: + # TODO: IGNORE REACHING INTO THE NON-NESTED TYPES + if isinstance(self.frum, list): + if not qb: + _late_import() + columns = qb.get_columns(self.frum) + elif isinstance(self.frum, Container): + columns = self.frum.get_columns(table=query["from"]) + else: + columns = [] + + query_path = coalesce(self.frum.query_path, "") + vars = query_get_all_vars(self, exclude_where=True) # WE WILL EXCLUDE where VARIABLES + for c in columns: + if c.name in vars and not query_path.startswith(coalesce(c.nested_path[0], "")): Log.error("This query, with variable {{var_name}} is too deep", var_name=c.name) @property @@ -102,48 +143,381 @@ class Query(object): return output -def get_all_vars(query, exclude_where=False): - """ - :param query: - :param exclude_where: Sometimes we do not what to look at the where clause - :return: all variables in use by query - """ - output = [] - for s in listwrap(query.select): - output.extend(select_get_all_vars(s)) - for s in listwrap(query.edges): - output.extend(edges_get_all_vars(s)) - for s in listwrap(query.groupby): - output.extend(edges_get_all_vars(s)) - if not exclude_where: - output.extend(expressions.get_all_vars(query.where)) - return output +canonical_aggregates = { + "min": "minimum", + "max": "maximum", + "add": "sum", + "avg": "average", + "mean": "average" +} -def select_get_all_vars(s): - if isinstance(s.value, list): - return set(s.value) - elif isinstance(s.value, basestring): - return set([s.value]) - elif s.value == None or s.value == ".": - return set() +def _normalize_selects(selects, schema=None): + if isinstance(selects, list): + output = wrap([_normalize_select(s, schema=schema) for s in selects]) + + exists = set() + for s in output: + if s.name in exists: + Log.error("{{name}} has already been defined", name= s.name) + exists.add(s.name) + return output else: - if s.value == "*": - return set(["*"]) - return expressions.get_all_vars(s.value) + return _normalize_select(selects, schema=schema) -def edges_get_all_vars(e): - output = [] - if isinstance(e.value, basestring): - output.append(e.value) - if e.domain.key: - output.append(e.domain.key) - if e.domain.where: - output.extend(expressions.get_all_vars(e.domain.where)) - if e.domain.partitions: - for p in e.domain.partitions: - if p.where: - output.extend(expressions.get_all_vars(p.where)) - return output +def _normalize_select(select, schema=None): + if isinstance(select, basestring): + select = select.rstrip(".") + if not select: + return Dict( + name=".", + value="*", + aggregate="none" + ) + if schema: + s = schema[select] + if s: + return s.getSelect() + + if select.endswith(".*"): + name = select[:-2] + else: + name = select + + return Dict( + name=name, + value=select, + aggregate="none" + ) + else: + select = wrap(select) + output = select.copy() + if not select.value or isinstance(select.value, basestring): + if select.value == ".": + output.name = coalesce(select.name, select.aggregate) + else: + output.name = coalesce(select.name, select.value, select.aggregate) + elif not output.name: + Log.error("Must give name to each column in select clause") + + if not output.name: + Log.error("expecting select to have a name: {{select}}", select= select) + if output.name.endswith(".*"): + output.name = output.name[:-2] + + output.aggregate = coalesce(canonical_aggregates.get(select.aggregate), select.aggregate, "none") + return output + + +def _normalize_edges(edges, schema=None): + return [_normalize_edge(e, schema=schema) for e in listwrap(edges)] + + +def _normalize_edge(edge, schema=None): + if isinstance(edge, basestring): + if schema: + e = schema[edge] + if e: + if isinstance(e.fields, list) and len(e.fields) == 1: + return Dict( + name=e.name, + value=e.fields[0], + allowNulls=True, + domain=e.getDomain() + ) + else: + return Dict( + name=e.name, + allowNulls=True, + domain=e.getDomain() + ) + return Dict( + name=edge, + value=edge, + allowNulls=True, + domain=_normalize_domain(schema=schema) + ) + else: + edge = wrap(edge) + if not edge.name and not isinstance(edge.value, basestring): + Log.error("You must name compound edges: {{edge}}", edge= edge) + + if isinstance(edge.value, (Mapping, list)) and not edge.domain: + # COMPLEX EDGE IS SHORT HAND + domain = _normalize_domain(schema=schema) + domain.dimension = Dict(fields=edge.value) + + return Dict( + name=edge.name, + allowNulls=bool(coalesce(edge.allowNulls, True)), + domain=domain + ) + + domain = _normalize_domain(edge.domain, schema=schema) + return Dict( + name=coalesce(edge.name, edge.value), + value=edge.value, + range=edge.range, + allowNulls=bool(coalesce(edge.allowNulls, True)), + domain=domain + ) + + +def _normalize_groupby(groupby, schema=None): + if groupby == None: + return None + return [_normalize_group(e, schema=schema) for e in listwrap(groupby)] + + +def _normalize_group(edge, schema=None): + if isinstance(edge, basestring): + return wrap({ + "name": edge, + "value": edge, + "domain": {"type": "default"} + }) + else: + edge = wrap(edge) + if (edge.domain and edge.domain.type != "default") or edge.allowNulls != None: + Log.error("groupby does not accept complicated domains") + + if not edge.name and not isinstance(edge.value, basestring): + Log.error("You must name compound edges: {{edge}}", edge= edge) + + return wrap({ + "name": coalesce(edge.name, edge.value), + "value": edge.value, + "domain": {"type": "default"} + }) + + +def _normalize_domain(domain=None, schema=None): + if not domain: + return Domain(type="default") + elif isinstance(domain, Dimension): + return domain.getDomain() + elif schema and isinstance(domain, basestring) and schema[domain]: + return schema[domain].getDomain() + elif isinstance(domain, Domain): + return domain + + if not domain.name: + domain = domain.copy() + domain.name = domain.type + + if not isinstance(domain.partitions, list): + domain.partitions = list(domain.partitions) + + return Domain(**domain) + + +def _normalize_window(window, schema=None): + return Dict( + name=coalesce(window.name, window.value), + value=window.value, + edges=[_normalize_edge(e, schema) for e in listwrap(window.edges)], + sort=_normalize_sort(window.sort), + aggregate=window.aggregate, + range=_normalize_range(window.range), + where=_normalize_where(window.where, schema=schema) + ) + + +def _normalize_range(range): + if range == None: + return None + + return Dict( + min=range.min, + max=range.max + ) + + +def _normalize_where(where, schema=None): + if where == None: + return TRUE_FILTER + if schema == None: + return where + where = simplify_esfilter(_where_terms(where, where, schema)) + return where + + +def _map_term_using_schema(master, path, term, schema_edges): + """ + IF THE WHERE CLAUSE REFERS TO FIELDS IN THE SCHEMA, THEN EXPAND THEM + """ + output = DictList() + for k, v in term.items(): + dimension = schema_edges[k] + if isinstance(dimension, Dimension): + domain = dimension.getDomain() + if dimension.fields: + if isinstance(dimension.fields, Mapping): + # EXPECTING A TUPLE + for local_field, es_field in dimension.fields.items(): + local_value = v[local_field] + if local_value == None: + output.append({"missing": {"field": es_field}}) + else: + output.append({"term": {es_field: local_value}}) + continue + + if len(dimension.fields) == 1 and is_keyword(dimension.fields[0]): + # SIMPLE SINGLE-VALUED FIELD + if domain.getPartByKey(v) is domain.NULL: + output.append({"missing": {"field": dimension.fields[0]}}) + else: + output.append({"term": {dimension.fields[0]: v}}) + continue + + if AND(is_keyword(f) for f in dimension.fields): + # EXPECTING A TUPLE + if not isinstance(v, tuple): + Log.error("expecing {{name}}={{value}} to be a tuple", name= k, value= v) + for i, f in enumerate(dimension.fields): + vv = v[i] + if vv == None: + output.append({"missing": {"field": f}}) + else: + output.append({"term": {f: vv}}) + continue + if len(dimension.fields) == 1 and is_keyword(dimension.fields[0]): + if domain.getPartByKey(v) is domain.NULL: + output.append({"missing": {"field": dimension.fields[0]}}) + else: + output.append({"term": {dimension.fields[0]: v}}) + continue + if domain.partitions: + part = domain.getPartByKey(v) + if part is domain.NULL or not part.esfilter: + Log.error("not expected to get NULL") + output.append(part.esfilter) + continue + else: + Log.error("not expected") + elif isinstance(v, Mapping): + sub = _map_term_using_schema(master, path + [k], v, schema_edges[k]) + output.append(sub) + continue + + output.append({"term": {k: v}}) + return {"and": output} + + +def _move_nested_term(master, where, schema): + """ + THE WHERE CLAUSE CAN CONTAIN NESTED PROPERTY REFERENCES, THESE MUST BE MOVED + TO A NESTED FILTER + """ + items = where.term.items() + if len(items) != 1: + Log.error("Expecting only one term") + k, v = items[0] + nested_path = _get_nested_path(k, schema) + if nested_path: + return {"nested": { + "path": nested_path, + "query": {"filtered": { + "query": {"match_all": {}}, + "filter": {"and": [ + {"term": {k: v}} + ]} + }} + }} + return where + + +def _get_nested_path(field, schema): + if is_keyword(field): + field = join_field([schema.es.alias] + split_field(field)) + for i, f in reverse(enumerate(split_field(field))): + path = join_field(split_field(field)[0:i + 1:]) + if path in INDEX_CACHE: + return join_field(split_field(path)[1::]) + return None + + +def _where_terms(master, where, schema): + """ + USE THE SCHEMA TO CONVERT DIMENSION NAMES TO ES FILTERS + master - TOP LEVEL WHERE (FOR PLACING NESTED FILTERS) + """ + if isinstance(where, Mapping): + if where.term: + # MAP TERM + try: + output = _map_term_using_schema(master, [], where.term, schema.edges) + return output + except Exception, e: + Log.error("programmer problem?", e) + elif where.terms: + # MAP TERM + output = DictList() + for k, v in where.terms.items(): + if not isinstance(v, (list, set)): + Log.error("terms filter expects list of values") + edge = schema.edges[k] + if not edge: + output.append({"terms": {k: v}}) + else: + if isinstance(edge, basestring): + # DIRECT FIELD REFERENCE + return {"terms": {edge: v}} + try: + domain = edge.getDomain() + except Exception, e: + Log.error("programmer error", e) + fields = domain.dimension.fields + if isinstance(fields, Mapping): + or_agg = [] + for vv in v: + and_agg = [] + for local_field, es_field in fields.items(): + vvv = vv[local_field] + if vvv != None: + and_agg.append({"term": {es_field: vvv}}) + or_agg.append({"and": and_agg}) + output.append({"or": or_agg}) + elif isinstance(fields, list) and len(fields) == 1 and is_keyword(fields[0]): + output.append({"terms": {fields[0]: v}}) + elif domain.partitions: + output.append({"or": [domain.getPartByKey(vv).esfilter for vv in v]}) + return {"and": output} + elif where["or"]: + return {"or": [unwrap(_where_terms(master, vv, schema)) for vv in where["or"]]} + elif where["and"]: + return {"and": [unwrap(_where_terms(master, vv, schema)) for vv in where["and"]]} + elif where["not"]: + return {"not": unwrap(_where_terms(master, where["not"], schema))} + return where + + +def _normalize_sort(sort=None): + """ + CONVERT SORT PARAMETERS TO A NORMAL FORM SO EASIER TO USE + """ + + if not sort: + return DictList.EMPTY + + output = DictList() + for s in listwrap(sort): + if isinstance(s, basestring) or Math.is_integer(s): + output.append({"value": s, "sort": 1}) + else: + output.append({"value": coalesce(s.value, s.field), "sort": coalesce(sort_direction[s.sort], 1)}) + return wrap(output) + + +sort_direction = { + "asc": 1, + "desc": -1, + "none": 0, + 1: 1, + 0: 0, + -1: -1, + None: 1, + Null: 1 +} diff --git a/pyLibrary/sql/mysql.py b/pyLibrary/sql/mysql.py index 565e851..d1ea11c 100644 --- a/pyLibrary/sql/mysql.py +++ b/pyLibrary/sql/mysql.py @@ -405,6 +405,7 @@ class MySQL(object): ) @staticmethod + @use_settings def execute_file( filename, host, @@ -424,7 +425,7 @@ class MySQL(object): except Exception, e: pass else: - MySQL.execute_sql(settings, sql, param) + MySQL.execute_sql(sql=sql, param=param, settings=settings) def _execute_backlog(self): if not self.backlog: return diff --git a/pyLibrary/strings.py b/pyLibrary/strings.py index 4ea622f..a877850 100644 --- a/pyLibrary/strings.py +++ b/pyLibrary/strings.py @@ -55,7 +55,7 @@ def unix(value): def url(value): """ - CONVERT FROM dict OR string TO URL PARAMETERS + _CONVERT FROM dict OR string TO URL PARAMETERS """ if not _convert: _late_import() @@ -65,7 +65,7 @@ def url(value): def html(value): """ - CONVERT FROM unicode TO HTML OF THE SAME + _CONVERT FROM unicode TO HTML OF THE SAME """ if not _convert: _late_import() @@ -553,14 +553,14 @@ def utf82unicode(value): _late_import() if not isinstance(value, basestring): - _Log.error("Can not convert {{type}} to unicode because it's not a string", type= type(value).__name__) + _Log.error("Can not _convert {{type}} to unicode because it's not a string", type= type(value).__name__) e = _Except.wrap(e) for i, c in enumerate(value): try: c.decode("utf8") except Exception, f: - _Log.error("Can not convert charcode {{c}} in string index {{i}}", i=i, c=ord(c), cause=[e, _Except.wrap(f)]) + _Log.error("Can not _convert charcode {{c}} in string index {{i}}", i=i, c=ord(c), cause=[e, _Except.wrap(f)]) try: latin1 = unicode(value.decode("latin1")) diff --git a/pyLibrary/testing/elasticsearch.py b/pyLibrary/testing/elasticsearch.py index b60a1de..df6b900 100644 --- a/pyLibrary/testing/elasticsearch.py +++ b/pyLibrary/testing/elasticsearch.py @@ -18,6 +18,8 @@ from pyLibrary.env.files import File from pyLibrary.queries import qb from pyLibrary.dot.dicts import Dict from pyLibrary.dot import unwrap, wrap +from pyLibrary.queries.expressions import qb_expression_to_function + def make_test_instance(name, settings): if settings.filename: @@ -56,7 +58,7 @@ class Fake_ES(): def search(self, query): query=wrap(query) - f = convert.esfilter2where(query.query.filtered.filter) + f = qb_expression_to_function(query.query.filtered.filter) filtered=wrap([{"_id": i, "_source": d} for i, d in self.data.items() if f(d)]) if query.fields: return wrap({"hits": {"total":len(filtered), "hits": [{"_id":d._id, "fields":unwrap(qb.select([unwrap(d._source)], query.fields)[0])} for d in filtered]}}) diff --git a/pyLibrary/testing/fuzzytestcase.py b/pyLibrary/testing/fuzzytestcase.py index 8917bcb..d917f53 100644 --- a/pyLibrary/testing/fuzzytestcase.py +++ b/pyLibrary/testing/fuzzytestcase.py @@ -8,13 +8,12 @@ # Author: Kyle Lahnakoski (kyle@lahnakoski.com) # from collections import Mapping - import unittest + from pyLibrary import dot from pyLibrary.debugs.logs import Log -from pyLibrary.dot import coalesce, Dict, literal_field +from pyLibrary.dot import coalesce, literal_field from pyLibrary.maths import Math -from pyLibrary.dot import wrap from pyLibrary.queries.unique_index import UniqueIndex from pyLibrary.strings import expand_template @@ -68,7 +67,7 @@ def zipall(*args): while True: output = zip(*(_next(a) for a in iters)) if all(output[0]): - return + raise StopIteration else: yield output[1] diff --git a/pyLibrary/thread/README.md b/pyLibrary/thread/README.md index c7534cb..98d9496 100644 --- a/pyLibrary/thread/README.md +++ b/pyLibrary/thread/README.md @@ -10,33 +10,19 @@ Module `threads` The main distinction between this library and Python's is two-fold: 1. **Multi-threaded queues do not use serialization** - Serialization is great in the general case, where you may also be communicating between processes, but it is a needless overhead for single-process multi-threading. It is left to the programmer to ensure the messages put on the queue are not changed, which is not ominous demand. -2. **Shutdown order is deterministic and explicit** - Python's threading library is missing strict conventions for controlled and orderly shutdown. +2. **Shutdown order is deterministic and explicit, if desired** - If there is one aspect of threading library that is missing, it will be a lack of controlled and orderly shutdown. * All threads are required to accept a `please_stop` token and are expected to test for its signal in a timely manner and exit when signalled. - * All threads have a parent - The parent is responsible for ensuring their children get the `please_stop` signal, and are dead, before stopping themselves. + * All threads have a parent, which are ultimately responsible for ensuring their children get the `please_stop` signal, and are dead before stopping themselves. These conventions eliminate the need for `interrupt()` and `abort()`, both of which are unstable idioms when there are resources. Each thread can shutdown on its own terms, but is expected to do so expediently. ###What's it used for### -A good amount of time is spent waiting for underlying C libraries and OS -services to respond to network and file access requests. Multiple -threads can make your code faster despite the GIL when dealing with those -requests. For example, by moving logging off the main thread, we can get -up to 15% increase in overall speed because we no longer have the main thread -waiting for disk writes or remote logging posts. Please note, this level of -speed improvement can only be realized if there is no serialization happening -at the multi-threaded queue. +A good amount of time is spent waiting for underlying C libraries and OS services to respond to network and file access requests. Multiple threads can make your code faster despite the GIL when dealing with those requests. For example, by moving logging off the main thread, we can get up to 15% increase in overall speed because we no longer have the main thread waiting for disk writes or . Please note, this level of speed improvement can only be realized if there is no serialization happening at the multi-threaded queue. ###Asynch vs. Actors### -My personal belief is that [actors](http://en.wikipedia.org/wiki/Actor_model) -are easier to reason about than [asynch tasks](https://docs.python.org/3/library/asyncio-task.html). -Mixing regular methods and co-routines (with their `yield from` pollution) is -dangerous because: -1) calling styles between methods and co-routines can be easily confused -2) actors can use methods, co-routines can not -3) there is no way to manage resource priority with co-routines. -4) stack traces are lost with co-routines +My personal belief is that [actors](http://en.wikipedia.org/wiki/Actor_model) are easier to reason about, and Synchronization Primitives -------------------------- @@ -45,39 +31,10 @@ There are three major aspects of a synchronization primitive: * **Resource** - Monitors and locks can only be owned by one thread at a time * **Binary** - The primitive has only two states -* **Irreversible** - The state of the primitive can only be set, or advanced, never reversed +* **Reversible** - The state of the primitive can be set, or advanced, and reversed again -The last, *irreversibility* is very useful, but ignored in many threading -libraries. The irreversibility allows us to model progression; and -we can allow threads to poll for progress, or be notified of progress. - -These three aspects can be combined to give us 8 synchronization primitives: - -* `- - -` - Semaphore -* `- B -` - Binary Semaphore -* `R - -` - Monitor -* `R B -` - Lock -* `- - I` - Progress -* `- B I` - Signal -* `R - I` - ?limited usefulness? -* `R B I` - ?limited usefulness? +The last, *reversibility* is very useful, but ignored in many threading libraries. The lack of reversibility allows us to model progression; and we can allow threads to poll for progress, or be notified of progress. ###Class `Signal`### -An irreversible binary semaphore used to signal state progression. -**Method `wait_for_go(self, timeout=None, till=None)`** - -Put a thread into a waiting state until the signal is activated - -**Method `go(self)`** - -Activate the signal. Does nothing if already activated. - -**Method `is_go(self)`** - -Test if the signal is activated, do not wait` - -**Method `on_go(self, target)`** - -Run the `target` method when the signal is activated. The activating thread will be running the target method, so be sure you are not accessing resources. diff --git a/pyLibrary/thread/multiprocess.py b/pyLibrary/thread/multiprocess.py index 46c78f9..50c2e02 100644 --- a/pyLibrary/thread/multiprocess.py +++ b/pyLibrary/thread/multiprocess.py @@ -10,102 +10,71 @@ from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import +import subprocess + from pyLibrary.debugs.logs import Log -from pyLibrary.thread.threads import Queue - -# YOU ARE READING AN INCOMPLETE IMPLEMENTATION - -class worker(object): - def __init__(func, inbound, outbound, logging): - logger = Log_usingInterProcessQueue(logging) +from pyLibrary.thread.threads import Queue, Thread, Signal +DEBUG=True -class Log_usingInterProcessQueue(Log): - def __init__(self, outbound): - self.outbound = outbound +class Process(object): - def write(self, template, params): - self.outbound.put({"template": template, "param": params}) + def __init__(self, name, params, cwd=None): + self.name = name + self.service_stopped = Signal() + self.send = Queue("send") + self.recieve = Queue("recieve") - -class Multiprocess(object): - # THE COMPLICATION HERE IS CONNECTING THE DISPARATE LOGGING TO - # A CENTRAL POINT - # ONLY THE MAIN THREAD CAN CREATE AND COMMUNICATE WITH multiprocess.Process - - - def __init__(self, functions): - self.outbound = Queue("out to process") - self.inbound = Queue("in from stdin") - self.inbound = Queue("in from stderr") - - # MAKE - - # MAKE THREADS - self.threads = [] - for t, f in enumerate(functions): - thread = worker( - "worker " + unicode(t), - f, - self.inbound, - self.outbound, + try: + self.service = service = subprocess.Popen( + params, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + bufsize=-1, + cwd=cwd ) - self.threads.append(thread) - - def __enter__(self): - return self - - # WAIT FOR ALL QUEUED WORK TO BE DONE BEFORE RETURNING - def __exit__(self, a, b, c): - try: - self.inbound.close() # SEND STOPS TO WAKE UP THE WORKERS WAITING ON inbound.pop() + self.stopper = Signal() + self.stopper.on_go(lambda: service.kill()) + Thread.run(self.name+" waiter", waiter, self) + Thread.run(self.name+" stdout", reader, service.stdout, self.recieve, please_stop=self.stopper) + Thread.run(self.name+" stderr", reader, service.stderr, self.recieve, please_stop=self.stopper) + Thread.run(self.name+" stdin", writer, service.stdin, self.recieve, please_stop=self.stopper) except Exception, e: - Log.warning("Problem adding to inbound", e) + Log.error("Can not call", e) - self.join() - - - # IF YOU SENT A stop(), OR STOP, YOU MAY WAIT FOR SHUTDOWN - def join(self): - try: - # WAIT FOR FINISH - for t in self.threads: - t.join() - except (KeyboardInterrupt, SystemExit): - Log.note("Shutdow Started, please be patient") - except Exception, e: - Log.error("Unusual shutdown!", e) - finally: - for t in self.threads: - t.keep_running = False - for t in self.threads: - t.join() - self.inbound.close() - self.outbound.close() - - - # RETURN A GENERATOR THAT HAS len(parameters) RESULTS (ANY ORDER) - def execute(self, parameters): - # FILL QUEUE WITH WORK - self.inbound.extend(parameters) - - num = len(parameters) - - def output(): - for i in xrange(num): - result = self.outbound.pop() - yield result - - return output() - - # EXTERNAL COMMAND THAT RETURNS IMMEDIATELY def stop(self): - self.inbound.close() # SEND STOPS TO WAKE UP THE WORKERS WAITING ON inbound.pop() - for t in self.threads: - t.keep_running = False + self.stopper.go() + self.send.add("exit") + + def join(self): + self.service_stopped.wait_for_go() +def waiter(this, please_stop): + this.service.wait() + if DEBUG: + Log.alert("{{name}} stopped", name=this.name) + this.service_stopped.go() + +def reader(stdout, recieve, please_stop): + while not please_stop: + line = stdout.readline() + if line: + recieve.add(line) + Log.note("FROM PROCESS: {{line}}", line=line.rstrip()) + else: + Thread.sleep(1) + stdout.close() + + +def writer(stdin, send, please_stop): + while not please_stop: + line = send.pop() + if line: + stdin.write(line+"\n") + stdin.close() diff --git a/pyLibrary/thread/threads.py b/pyLibrary/thread/threads.py index ef50bb2..b7180a5 100644 --- a/pyLibrary/thread/threads.py +++ b/pyLibrary/thread/threads.py @@ -29,17 +29,17 @@ from pyLibrary.times.dates import Date from pyLibrary.times.durations import SECOND -_Log = None +Log = None DEBUG = True MAX_DATETIME = datetime(2286, 11, 20, 17, 46, 39) def _late_import(): - global _Log + global Log - from pyLibrary.debugs.logs import Log as _Log + from pyLibrary.debugs.logs import Log - _ = _Log + _ = Log class Lock(object): @@ -67,7 +67,7 @@ class Lock(object): def wait(self, timeout=None, till=None): if till: - timeout = (datetime.utcnow() - till).total_seconds() + timeout = (till - Date.now()).seconds if timeout < 0: return self.monitor.wait(timeout=float(timeout) if timeout else None) @@ -94,7 +94,6 @@ class Queue(object): self.lock = Lock("lock for queue " + name) self.queue = deque() self.next_warning = datetime.utcnow() # FOR DEBUGGING - self.gc_count = 0 def __iter__(self): while self.keep_running: @@ -103,9 +102,9 @@ class Queue(object): if value is not Thread.STOP: yield value except Exception, e: - _Log.warning("Tell me about what happened here", e) + Log.warning("Tell me about what happened here", e) - _Log.note("queue iterator is done") + Log.note("queue iterator is done") def add(self, value): @@ -115,6 +114,18 @@ class Queue(object): self.queue.append(value) return self + def push(self, value): + """ + SNEAK value TO FRONT OF THE QUEUE + """ + with self.lock: + self._wait_for_queue_space() + if self.keep_running: + self.queue.appendleft(value) + return self + + + def extend(self, values): with self.lock: # ONCE THE queue IS BELOW LIMIT, ALLOW ADDING MORE @@ -142,7 +153,7 @@ class Queue(object): now = datetime.utcnow() if self.next_warning < now: self.next_warning = now + timedelta(seconds=wait_time) - _Log.alert("Queue {{name}} is full ({{num}} items), thread(s) have been waiting {{wait_time}} sec", + Log.alert("Queue {{name}} is full ({{num}} items), thread(s) have been waiting {{wait_time}} sec", name=self.name, num=len(self.queue), wait_time=wait_time @@ -156,20 +167,21 @@ class Queue(object): with self.lock: return any(r != Thread.STOP for r in self.queue) - def pop(self, till=None): + def pop(self, till=None, timeout=None): """ WAIT FOR NEXT ITEM ON THE QUEUE RETURN Thread.STOP IF QUEUE IS CLOSED IF till IS PROVIDED, THEN pop() CAN TIMEOUT AND RETURN None """ + + if timeout: + till = Date.now() + timeout + with self.lock: - if till == None: + if not till: while self.keep_running: if self.queue: value = self.queue.popleft() - self.gc_count += 1 - if self.gc_count % 1000 == 0: - gc.collect() if value is Thread.STOP: # SENDING A STOP INTO THE QUEUE IS ALSO AN OPTION self.keep_running = False return value @@ -195,7 +207,7 @@ class Queue(object): if self.keep_running: return None - _Log.note("queue stopped") + Log.note("queue stopped") return Thread.STOP @@ -217,6 +229,21 @@ class Queue(object): self.queue.clear() return output + def pop_one(self): + """ + NON-BLOCKING POP IN QUEUE, IF ANY + """ + with self.lock: + if not self.keep_running: + return [Thread.STOP] + elif not self.queue: + return None + else: + v =self.queue.pop() + if v is Thread.STOP: # SENDING A STOP INTO THE QUEUE IS ALSO AN OPTION + self.keep_running = False + return v + def close(self): with self.lock: self.keep_running = False @@ -237,7 +264,7 @@ class AllThread(object): """ def __init__(self): - if not _Log: + if not Log: _late_import() self.threads = [] @@ -256,10 +283,10 @@ class AllThread(object): if "exception" in response: exceptions.append(response["exception"]) except Exception, e: - _Log.warning("Problem joining", e) + Log.warning("Problem joining", e) if exceptions: - _Log.error("Problem in child threads", exceptions) + Log.error("Problem in child threads", exceptions) def add(self, target, *args, **kwargs): @@ -292,7 +319,7 @@ class MainThread(object): children = copy(self.children) for c in reversed(children): if c.name: - _Log.note("Stopping thread {{name|quote}}", name=c.name) + Log.note("Stopping thread {{name|quote}}", name=c.name) c.stop() for c in children: c.join() @@ -317,7 +344,7 @@ class Thread(object): def __init__(self, name, target, *args, **kwargs): - if not _Log: + if not Log: _late_import() self.id = -1 self.name = name @@ -357,14 +384,14 @@ class Thread(object): self.kwargs = None def start(self): - if not _Log: + if not Log: _late_import() try: self.thread = thread.start_new_thread(Thread._run, (self, )) return self except Exception, e: - _Log.error("Can not start thread", e) + Log.error("Can not start thread", e) def stop(self): for c in copy(self.children): @@ -378,7 +405,7 @@ class Thread(object): self.children.remove(child) def _run(self): - if _Log.cprofiler: + if Log.cprofiler: import cProfile self.cprofiler = cProfile.Profile() @@ -398,7 +425,7 @@ class Thread(object): with self.synch_lock: self.response = Dict(exception=e) try: - _Log.fatal("Problem in thread {{name|quote}}", name=self.name, cause=e) + Log.fatal("Problem in thread {{name|quote}}", name=self.name, cause=e) except Exception, f: sys.stderr.write("ERROR in thread: " + str(self.name) + " " + str(e) + "\n") finally: @@ -420,7 +447,7 @@ class Thread(object): import pstats self.cprofiler.disable() - _Log.cprofiler_stats.add(pstats.Stats(self.cprofiler)) + Log.cprofiler_stats.add(pstats.Stats(self.cprofiler)) del self.cprofiler def is_alive(self): @@ -435,7 +462,7 @@ class Thread(object): if till is None: till = datetime.utcnow() + timedelta(seconds=timeout) else: - _Log.error("Can not except both `timeout` and `till`") + Log.error("Can not except both `timeout` and `till`") children = copy(self.children) for c in children: @@ -451,7 +478,7 @@ class Thread(object): self.synch_lock.wait(0.5) if DEBUG: - _Log.note("Waiting on thread {{thread|json}}", thread=self.name) + Log.note("Waiting on thread {{thread|json}}", thread=self.name) else: self.stopped.wait_for_go(till=till) if self.stopped: @@ -464,12 +491,12 @@ class Thread(object): @staticmethod def run(name, target, *args, **kwargs): - if not _Log: + if not Log: _late_import() # ENSURE target HAS please_stop ARGUMENT if "please_stop" not in target.__code__.co_varnames: - _Log.error("function must have please_stop argument for signalling emergency shutdown") + Log.error("function must have please_stop argument for signalling emergency shutdown") Thread.num_threads += 1 @@ -478,7 +505,7 @@ class Thread(object): return output @staticmethod - def sleep(seconds=None, till=None, please_stop=None): + def sleep(seconds=None, till=None, timeout=None, please_stop=None): if please_stop is not None or isinstance(till, Signal): if isinstance(till, Signal): @@ -487,6 +514,8 @@ class Thread(object): if seconds is not None: till = datetime.utcnow() + timedelta(seconds=seconds) + elif timeout is not None: + till = datetime.utcnow() + timedelta(seconds=timeout.seconds) elif till is None: till = MAX_DATETIME @@ -528,9 +557,9 @@ class Thread(object): please_stop.on_go(lambda: MAIN_THREAD.stop()) if Thread.current() != MAIN_THREAD: - if not _Log: + if not Log: _late_import() - _Log.error("Only the main thread can sleep forever (waiting for KeyboardInterrupt)") + Log.error("Only the main thread can sleep forever (waiting for KeyboardInterrupt)") try: if allow_exit: @@ -539,7 +568,7 @@ class Thread(object): _wait_for_interrupt(please_stop) except (KeyboardInterrupt, SystemExit), _: please_stop.go() - _Log.alert("SIGINT Detected! Stopping...") + Log.alert("SIGINT Detected! Stopping...") MAIN_THREAD.stop() @@ -607,7 +636,7 @@ class Signal(object): try: j() except Exception, e: - _Log.warning("Trigger on Signal.go() failed!", e) + Log.warning("Trigger on Signal.go() failed!", e) def is_go(self): """ @@ -642,7 +671,7 @@ class ThreadedQueue(Queue): period=None, # MAX TIME BETWEEN FLUSHES TO SLOWER QUEUE silent=False # WRITES WILL COMPLAIN IF THEY ARE WAITING TOO LONG ): - if not _Log: + if not Log: _late_import() batch_size = coalesce(batch_size, int(coalesce(max_size, 0) / 2), 900) @@ -688,7 +717,7 @@ class ThreadedQueue(Queue): _buffer.append(item) except Exception, e: - _Log.warning( + Log.warning( "Unexpected problem", name=name, cause=e @@ -706,7 +735,7 @@ class ThreadedQueue(Queue): next_time = now + bit_more_time except Exception, e: - _Log.warning( + Log.warning( "Problem with {{name}} pushing {{num}} items to data sink", name=name, num=len(_buffer), @@ -717,7 +746,7 @@ class ThreadedQueue(Queue): # ONE LAST PUSH, DO NOT HAVE TIME TO DEAL WITH ERRORS queue.extend(_buffer) - self.thread = Thread.run("threaded queue for " + name, worker_bee, parent_thread=self) + self.thread = Thread.run("threaded queue for " + name, worker_bee) def add(self, value): with self.lock: @@ -776,15 +805,46 @@ def _wait_for_exit(please_stop): cr_count = -1000000 # NOT /dev/null if strings.strip(line) == "exit": - _Log.alert("'exit' Detected! Stopping...") + Log.alert("'exit' Detected! Stopping...") return def _wait_for_interrupt(please_stop): while not please_stop: if DEBUG: - _Log.note("inside wait-for-shutdown loop") + Log.note("inside wait-for-shutdown loop") try: Thread.sleep(please_stop=please_stop) except Exception, _: pass + + + +class Till(Signal): + """ + MANAGE THE TIMEOUT LOGIC + """ + def __init__(self, till=None, timeout=None, seconds=None): + Signal.__init__(self) + + timers = [] + + def go(): + self.go() + for t in timers: + t.cancel() + + if isinstance(till, Date): + t = threading.Timer((till - Date.now()).seconds, go) + t.start() + timers.append(t) + if timeout: + t = threading.Timer(timeout.seconds, go) + t.start() + timers.append(t) + if seconds: + t = threading.Timer(seconds, go) + t.start() + timers.append(t) + if isinstance(till, Signal): + till.on_go(go) diff --git a/pyLibrary/times/durations.py b/pyLibrary/times/durations.py index 89e182c..0542a17 100644 --- a/pyLibrary/times/durations.py +++ b/pyLibrary/times/durations.py @@ -12,6 +12,7 @@ from __future__ import division from __future__ import absolute_import import datetime +from decimal import Decimal from pyLibrary import regex from pyLibrary.vendor.dateutil.relativedelta import relativedelta @@ -20,14 +21,12 @@ from pyLibrary.maths import Math from pyLibrary.dot import wrap -_Date = None -_Log = None - - +Date = None +Log = None def _delayed_import(): - global _Date - from pyLibrary.times.dates import Date as _Date - _ = _Date(None) + global Date + from pyLibrary.times.dates import Date + _ = Date(None) class Duration(object): @@ -71,7 +70,7 @@ class Duration(object): @staticmethod def range(start, stop, step): if not step: - _Log.error("Expecting a non-zero duration for interval") + Log.error("Expecting a non-zero duration for interval") output = [] c = start while c < stop: @@ -88,12 +87,12 @@ class Duration(object): return output def __radd__(self, other): - if not _Date: + if not Date: _delayed_import() if isinstance(other, datetime.datetime): - return _Date(other).add(self) - elif isinstance(other, _Date): + return Date(other).add(self) + elif isinstance(other, Date): return other.add(self) return self + other @@ -212,10 +211,10 @@ class Duration(object): @property def seconds(self): - return self.milli / 1000.0 + return float(self.milli) / 1000.0 def total_seconds(self): - return self.milli / 1000.0 + return float(self.milli) / 1000.0 def __str__(self): return str(self.__unicode__()) diff --git a/resources/json/bugzilla_aliases.json b/resources/json/bugzilla_aliases.json index 806b098..f3b81fa 100644 --- a/resources/json/bugzilla_aliases.json +++ b/resources/json/bugzilla_aliases.json @@ -1 +1 @@ -{"type": "AES256", "salt": "7WR1b/oOobuC6+51cTWrbg==", "length": 430336, "data": "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"} \ No newline at end of file +{"type": "AES256", "salt": "7WR1b/oOobuC6+51cTWrbg==", "length": 430336, "data": "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"} diff --git a/resources/settings/test_settings.json b/resources/settings/test_settings.json deleted file mode 100644 index 9a3269f..0000000 --- a/resources/settings/test_settings.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "production_es": { - "description": "pointer to es with known good results", - "host": "http://elasticsearch7.metrics.scl3.mozilla.com", - "port": "9200", - "index": "bugs", - "type": "bug_version", - "debug": true - }, - "public_bugs_reference": { - "description": "pointer to es with known good *public* results", - "filename": "./tests/resources/public_bugs_reference_es.json" - }, - "public_comments_reference": { - "description": "pointer to es with known good public comments", - "filename": "./tests/resources/public_comments_reference_es.json" - }, - "private_bugs_reference": { - "description": "pointer to es with known good results", - "filename": "./tests/resources/private_bugs_reference_es.json" - }, - "private_comments_reference": { - "description": "pointer to es with known good private comments", - "filename": "./tests/resources/private_comments_reference_es.json" - }, - "candidate": { - "description": "pointer to es with test results", - "filename": "./tests/results/test_results.json", - "host": "http://localhost", - "port": "9200", - "index": "test_bugs", - "type": "bug_version" - }, - "fake":{ - //FOR TESTING JSON CREATION, NO NEED FOR REAL ES - "bugs": { - "filename":"./tests/results/test_bugs.json" - }, - "comments": { - "filename":"./tests/results/test_comments.json" - } - }, - "real":{ - //FOR TESTING INCREMENTAL ETL (AND GENERAL INTERACTION WITH A REAL ES) - "bugs": { - "host": "http://localhost", - "port": "9200", - "index": "test_bugs", - "type": "bug_version", - "schema_file": "./resources/json/bug_version.json", - "debug": true - }, - "comments": { - "host": "http://localhost", - "port": "9200", - "index": "test_comments", - "type": "bug_version", - "schema_file": "./resources/json/bug_comments.json", - "debug": true - } - }, - "param": { - "increment": 10000, - "bugs": [ 384, 1108, 1045, 1046, 1157, 1877, 1865, 1869, - 2586, 3140, 6810, 9622, 10575, 11040, 12911, 67742, - 96421, 123203, 178960, 367518, 457765, 458397, 471427, 544327, - 547727, 643420, 692436, 726635, 813650 - // ADD 372836 (REVIEW FLAGS TEST) - // 13534 (REVIEW MOVES TO OTHER PERSON) - // 393845 added blocking1.9+ twice - // 671185 *many* review requests - // 937428 whitespace after comma in user story, complex diff - // 248970 another cutoff review request - - ], - "alias_increment": 1000000, - "alias_file": { - "path": "./resources/json/bugzilla_aliases.json" - }, - "temp_dir": "./tests/resources", - "errors": "./tests/results/errors", - "allow_private_bugs": true, - "last_run_time": "./tests/results/last_run_time.txt", - "first_run_time": "./tests/results/first_run_time.txt" - }, - "bugzilla": { - "filename": "./tests/resources/sql/small_bugzilla.sql", - "preamble": "from https://github.com/klahnakoski/Bugzilla-ETL", - "host": "localhost", - "port": 3306, - "username": "user", - "password": "password", - "schema": "test_bugzilla", - "expires_on": 1372867005000, - "debug": false - }, - "debug": { - "profile": false, - "trace": false, - "log": [ - { - "class": "logging.handlers.RotatingFileHandler", - "filename": "./tests/results/logs/test_etl.log", - "maxBytes": 10000000, - "backupCount": 200, - "encoding": "utf8" - }, - { - "log_type": "stream", - "stream": "sys.stdout" - }, - { - "log_type": "elasticsearch", - "host": "http://klahnakoski-es.corp.tor1.mozilla.com", - "index": "debug", - "type": "bz_etl" - } - ] - } -} diff --git a/setup.py b/setup.py index 9a4240f..13e1853 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ def get_resources(source, destination): setup( name='Bugzilla-ETL', - version="0.3.13353", + version="2.0.13353", description='Mozilla Bugzilla Bug Version ETL', long_description=long_desc, author='Kyle Lahnakoski', diff --git a/tests/resources/private_bugs_reference_es.json b/tests/resources/config/private_bugs_reference_es.json similarity index 100% rename from tests/resources/private_bugs_reference_es.json rename to tests/resources/config/private_bugs_reference_es.json diff --git a/tests/resources/private_comments_reference_es.json b/tests/resources/config/private_comments_reference_es.json similarity index 100% rename from tests/resources/private_comments_reference_es.json rename to tests/resources/config/private_comments_reference_es.json diff --git a/tests/resources/public_bugs_reference_es.json b/tests/resources/config/public_bugs_reference_es.json similarity index 100% rename from tests/resources/public_bugs_reference_es.json rename to tests/resources/config/public_bugs_reference_es.json diff --git a/tests/resources/public_comments_reference_es.json b/tests/resources/config/public_comments_reference_es.json similarity index 98% rename from tests/resources/public_comments_reference_es.json rename to tests/resources/config/public_comments_reference_es.json index 921e562..267bf32 100644 --- a/tests/resources/public_comments_reference_es.json +++ b/tests/resources/config/public_comments_reference_es.json @@ -9,7 +9,7 @@ }, "957": { "bug_id": 384, - "comment": "Table of ISO 8859-1 Characters\nThis section gives an overview of the ISO 8859-1 character set. The\nISO 8859-1 character set consists of the following four blocks:\n00 19 CONTROL CHARACTERS\n20 7E BASIC LATIN\n80 9F EXTENDED CONTROL CHARACTERS\nA0 FF LATIN-1 SUPPLEMENT\nThe control characters and basic latin blocks are similar do those\nused in the US national variant of ISO 646 (US-ASCII), so they are not\nlisted here. Nor is the second block of control characters listed,\nfor which not functions have yet been defined.\n+----+-----+---+------------------------------------------------------\n|Hex | Dec |Car| Description ISO/IEC 10646-1:1993(E)\n+----+-----+---+------------------------------------------------------\n| | | |\n| A0 | 160 | | NO-BREAK SPACE\n| A1 | 161 | ¡ | INVERTED EXCLAMATION MARK\n| A2 | 162 | ¢ | CENT SIGN\n| A3 | 163 | £ | POUND SIGN\n| A4 | 164 | ¤ | CURRENCY SIGN\n| A5 | 165 | ¥ | YEN SIGN\n| A6 | 166 | ¦ | BROKEN BAR\n| A7 | 167 | § | SECTION SIGN\n| A8 | 168 | ¨ | DIAERESIS\n| A9 | 169 | © | COPYRIGHT SIGN\n| AA | 170 | ª | FEMININE ORDINAL INDICATOR\n| AB | 171 | « | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK\n| AC | 172 | ¬ | NOT SIGN\n| AD | 173 | ­ | SOFT HYPHEN\n| AE | 174 | ® | REGISTERED SIGN\n| AF | 175 | ¯ | MACRON\n| | | |\n| B0 | 176 | ° | DEGREE SIGN\n| B1 | 177 | ± | PLUS-MINUS SIGN\n| B2 | 178 | ² | SUPERSCRIPT TWO\n| B3 | 179 | ³ | SUPERSCRIPT THREE\n| B4 | 180 | ´ | ACUTE ACCENT\n| B5 | 181 | µ | MICRO SIGN\n| B6 | 182 | ¶ | PILCROW SIGN\n| B7 | 183 | · | MIDDLE DOT\n| B8 | 184 | ¸ | CEDILLA\n| B9 | 185 | ¹ | SUPERSCRIPT ONE\n| BA | 186 | º | MASCULINE ORDINAL INDICATOR\n| BB | 187 | » | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK\n| BC | 188 | ¼ | VULGAR FRACTION ONE QUARTER\n| BD | 189 | ½ | VULGAR FRACTION ONE HALF\n| BE | 190 | ¾ | VULGAR FRACTION THREE QUARTERS\n| BF | 191 | ¿ | INVERTED QUESTION MARK\n| | | |\n| C0 | 192 | À | LATIN CAPITAL LETTER A WITH GRAVE ACCENT\n| C1 | 193 | Á | LATIN CAPITAL LETTER A WITH ACUTE ACCENT\n| C2 | 194 | Â | LATIN CAPITAL LETTER A WITH CIRCUMFLEX ACCENT\n| C3 | 195 | Ã | LATIN CAPITAL LETTER A WITH TILDE\n| C4 | 196 | Ä | LATIN CAPITAL LETTER A WITH DIAERESIS\n| C5 | 197 | Å | LATIN CAPITAL LETTER A WITH RING ABOVE\n| C6 | 198 | Æ | LATIN CAPITAL LIGATURE AE\n| C7 | 199 | Ç | LATIN CAPITAL LETTER C WITH CEDILLA\n| C8 | 200 | È | LATIN CAPITAL LETTER E WITH GRAVE ACCENT\n| C9 | 201 | É | LATIN CAPITAL LETTER E WITH ACUTE ACCENT\n| CA | 202 | Ê | LATIN CAPITAL LETTER E WITH CIRCUMFLEX ACCENT\n| CB | 203 | Ë | LATIN CAPITAL LETTER E WITH DIAERESIS\n| CC | 204 | Ì | LATIN CAPITAL LETTER I WITH GRAVE ACCENT\n| CD | 205 | Í | LATIN CAPITAL LETTER I WITH ACUTE ACCENT\n| CE | 206 | Î | LATIN CAPITAL LETTER I WITH CIRCUMFLEX ACCENT\n| CF | 207 | Ï | LATIN CAPITAL LETTER I WITH DIAERESIS\n| | | |\n| D0 | 208 | Ð | LATIN CAPITAL LETTER ETH\n| D1 | 209 | Ñ | LATIN CAPITAL LETTER N WITH TILDE\n| D2 | 210 | Ò | LATIN CAPITAL LETTER O WITH GRAVE ACCENT\n| D3 | 211 | Ó | LATIN CAPITAL LETTER O WITH ACUTE ACCENT\n| D4 | 212 | Ô | LATIN CAPITAL LETTER O WITH CIRCUMFLEX ACCENT\n| D5 | 213 | Õ | LATIN CAPITAL LETTER O WITH TILDE\n| D6 | 214 | Ö | LATIN CAPITAL LETTER O WITH DIAERESIS\n| D7 | 215 | × | MULTIPLICATION SIGN\n| D8 | 216 | Ø | LATIN CAPITAL LETTER O WITH STROKE\n| D9 | 217 | Ù | LATIN CAPITAL LETTER U WITH GRAVE ACCENT\n| DA | 218 | Ú | LATIN CAPITAL LETTER U WITH ACUTE ACCENT\n| DB | 219 | Û | LATIN CAPITAL LETTER U WITH CIRCUMFLEX ACCENT\n| DC | 220 | Ü | LATIN CAPITAL LETTER U WITH DIAERESIS\n| DD | 221 | Ý | LATIN CAPITAL LETTER Y WITH ACUTE ACCENT\n| DE | 222 | Þ | LATIN CAPITAL LETTER THORN\n| DF | 223 | ß | LATIN SMALL LETTER SHARP S\n| | | |\n| E0 | 224 | à | LATIN SMALL LETTER A WITH GRAVE ACCENT\n| E1 | 225 | á | LATIN SMALL LETTER A WITH ACUTE ACCENT\n| E2 | 226 | â | LATIN SMALL LETTER A WITH CIRCUMFLEX ACCENT\n| E3 | 227 | ã | LATIN SMALL LETTER A WITH TILDE\n| E4 | 228 | ä | LATIN SMALL LETTER A WITH DIAERESIS\n| E5 | 229 | å | LATIN SMALL LETTER A WITH RING ABOVE\n| E6 | 230 | æ | LATIN SMALL LIGATURE AE\n| E7 | 231 | ç | LATIN SMALL LETTER C WITH CEDILLA\n| E8 | 232 | è | LATIN SMALL LETTER E WITH GRAVE ACCENT\n| E9 | 233 | é | LATIN SMALL LETTER E WITH ACUTE ACCENT\n| EA | 234 | ê | LATIN SMALL LETTER E WITH CIRCUMFLEX ACCENT\n| EB | 235 | ë | LATIN SMALL LETTER E WITH DIAERESIS\n| EC | 236 | ì | LATIN SMALL LETTER I WITH GRAVE ACCENT\n| ED | 237 | í | LATIN SMALL LETTER I WITH ACUTE ACCENT\n| EE | 238 | î | LATIN SMALL LETTER I WITH CIRCUMFLEX ACCENT\n| EF | 239 | ï | LATIN SMALL LETTER I WITH DIAERESIS\n| | | |\n| F0 | 240 | ð | LATIN SMALL LETTER ETH\n| F1 | 241 | ñ | LATIN SMALL LETTER N WITH TILDE\n| F2 | 242 | ò | LATIN SMALL LETTER O WITH GRAVE ACCENT\n| F3 | 243 | ó | LATIN SMALL LETTER O WITH ACUTE ACCENT\n| F4 | 244 | ô | LATIN SMALL LETTER O WITH CIRCUMFLEX ACCENT\n| F5 | 245 | õ | LATIN SMALL LETTER O WITH TILDE\n| F6 | 246 | ö | LATIN SMALL LETTER O WITH DIAERESIS\n| F7 | 247 | ÷ | DIVISION SIGN\n| F8 | 248 | ø | LATIN SMALL LETTER O WITH OBLIQUE BAR\n| F9 | 249 | ù | LATIN SMALL LETTER U WITH GRAVE ACCENT\n| FA | 250 | ú | LATIN SMALL LETTER U WITH ACUTE ACCENT\n| FB | 251 | û | LATIN SMALL LETTER U WITH CIRCUMFLEX ACCENT\n| FC | 252 | ü | LATIN SMALL LETTER U WITH DIAERESIS\n| FD | 253 | ý | LATIN SMALL LETTER Y WITH ACUTE ACCENT\n| FE | 254 | þ | LATIN SMALL LETTER THORN\n| FF | 255 | ÿ | LATIN SMALL LETTER Y WITH DIAERESIS\n+----+-----+---+------------------------------------------------------\nFootnote: ISO 10646 calls Æ a `ligature', but this is a\n letter in (at least some) Scandinavian languages. Thus, it\n is not in the same, merely typographic `ligature' class as\n `oe' ({\\oe} in {\\LaTeX} convention) which was not included\n in the ISO8859-1 standard.\n***Tentative info***\nSupposedly the Danish press, some months ago, reported that ISO has\nchanged the standard so from now on æ and Æ are classified as\nletters.", + "comment": "Table of ISO 8859-1 Characters\nThis section gives an overview of the ISO 8859-1 character set. The\nISO 8859-1 character set consists of the following four blocks:\n00 19 CONTROL CHARACTERS\n20 7E BASIC LATIN\n80 9F EXTENDED CONTROL CHARACTERS\nA0 FF LATIN-1 SUPPLEMENT\nThe control characters and basic latin blocks are similar do those\nused in the US national variant of ISO 646 (US-ASCII), so they are not\nlisted here. Nor is the second block of control characters listed,\nfor which not functions have yet been defined.\n+----+-----+---+------------------------------------------------------\n|Hex | Dec |Car| Description ISO/IEC 10646-1:1993(E)\n+----+-----+---+------------------------------------------------------\n| | | |\n| A0 | 160 | | NO-BREAK SPACE\n| A1 | 161 | ¡ | INVERTED EXCLAMATION MARK\n| A2 | 162 | ¢ | CENT SIGN\n| A3 | 163 | £ | POUND SIGN\n| A4 | 164 | ¤ | CURRENCY SIGN\n| A5 | 165 | ¥ | YEN SIGN\n| A6 | 166 | ¦ | BROKEN BAR\n| A7 | 167 | § | SECTION SIGN\n| A8 | 168 | ¨ | DIAERESIS\n| A9 | 169 | © | COPYRIGHT SIGN\n| AA | 170 | ª | FEMININE ORDINAL INDICATOR\n| AB | 171 | « | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK\n| AC | 172 | ¬ | NOT SIGN\n| AD | 173 | ­ | SOFT HYPHEN\n| AE | 174 | ® | REGISTERED SIGN\n| AF | 175 | ¯ | MACRON\n| | | |\n| B0 | 176 | ° | DEGREE SIGN\n| B1 | 177 | ± | PLUS-MINUS SIGN\n| B2 | 178 | ² | SUPERSCRIPT TWO\n| B3 | 179 | ³ | SUPERSCRIPT THREE\n| B4 | 180 | ´ | ACUTE ACCENT\n| B5 | 181 | µ | MICRO SIGN\n| B6 | 182 | ¶ | PILCROW SIGN\n| B7 | 183 | · | MIDDLE DOT\n| B8 | 184 | ¸ | CEDILLA\n| B9 | 185 | ¹ | SUPERSCRIPT ONE\n| BA | 186 | º | MASCULINE ORDINAL INDICATOR\n| BB | 187 | » | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK\n| BC | 188 | ¼ | VULGAR FRACTION ONE QUARTER\n| BD | 189 | ½ | VULGAR FRACTION ONE HALF\n| BE | 190 | ¾ | VULGAR FRACTION THREE QUARTERS\n| BF | 191 | ¿ | INVERTED QUESTION MARK\n| | | |\n| C0 | 192 | À | LATIN CAPITAL LETTER A WITH GRAVE ACCENT\n| C1 | 193 | Á | LATIN CAPITAL LETTER A WITH ACUTE ACCENT\n| C2 | 194 | Â | LATIN CAPITAL LETTER A WITH CIRCUMFLEX ACCENT\n| C3 | 195 | Ã | LATIN CAPITAL LETTER A WITH TILDE\n| C4 | 196 | Ä | LATIN CAPITAL LETTER A WITH DIAERESIS\n| C5 | 197 | Å | LATIN CAPITAL LETTER A WITH RING ABOVE\n| C6 | 198 | Æ | LATIN CAPITAL LIGATURE AE\n| C7 | 199 | Ç | LATIN CAPITAL LETTER C WITH CEDILLA\n| C8 | 200 | È | LATIN CAPITAL LETTER E WITH GRAVE ACCENT\n| C9 | 201 | É | LATIN CAPITAL LETTER E WITH ACUTE ACCENT\n| CA | 202 | Ê | LATIN CAPITAL LETTER E WITH CIRCUMFLEX ACCENT\n| CB | 203 | Ë | LATIN CAPITAL LETTER E WITH DIAERESIS\n| CC | 204 | Ì | LATIN CAPITAL LETTER I WITH GRAVE ACCENT\n| CD | 205 | Í | LATIN CAPITAL LETTER I WITH ACUTE ACCENT\n| CE | 206 | Î | LATIN CAPITAL LETTER I WITH CIRCUMFLEX ACCENT\n| CF | 207 | Ï | LATIN CAPITAL LETTER I WITH DIAERESIS\n| | | |\n| D0 | 208 | Ð | LATIN CAPITAL LETTER ETH\n| D1 | 209 | Ñ | LATIN CAPITAL LETTER N WITH TILDE\n| D2 | 210 | Ò | LATIN CAPITAL LETTER O WITH GRAVE ACCENT\n| D3 | 211 | Ó | LATIN CAPITAL LETTER O WITH ACUTE ACCENT\n| D4 | 212 | Ô | LATIN CAPITAL LETTER O WITH CIRCUMFLEX ACCENT\n| D5 | 213 | Õ | LATIN CAPITAL LETTER O WITH TILDE\n| D6 | 214 | Ö | LATIN CAPITAL LETTER O WITH DIAERESIS\n| D7 | 215 | × | MULTIPLICATION SIGN\n| D8 | 216 | Ø | LATIN CAPITAL LETTER O WITH STROKE\n| D9 | 217 | Ù | LATIN CAPITAL LETTER U WITH GRAVE ACCENT\n| DA | 218 | Ú | LATIN CAPITAL LETTER U WITH ACUTE ACCENT\n| MySQL | 219 | Û | LATIN CAPITAL LETTER U WITH CIRCUMFLEX ACCENT\n| DC | 220 | Ü | LATIN CAPITAL LETTER U WITH DIAERESIS\n| DD | 221 | Ý | LATIN CAPITAL LETTER Y WITH ACUTE ACCENT\n| DE | 222 | Þ | LATIN CAPITAL LETTER THORN\n| DF | 223 | ß | LATIN SMALL LETTER SHARP S\n| | | |\n| E0 | 224 | à | LATIN SMALL LETTER A WITH GRAVE ACCENT\n| E1 | 225 | á | LATIN SMALL LETTER A WITH ACUTE ACCENT\n| E2 | 226 | â | LATIN SMALL LETTER A WITH CIRCUMFLEX ACCENT\n| E3 | 227 | ã | LATIN SMALL LETTER A WITH TILDE\n| E4 | 228 | ä | LATIN SMALL LETTER A WITH DIAERESIS\n| E5 | 229 | å | LATIN SMALL LETTER A WITH RING ABOVE\n| E6 | 230 | æ | LATIN SMALL LIGATURE AE\n| E7 | 231 | ç | LATIN SMALL LETTER C WITH CEDILLA\n| E8 | 232 | è | LATIN SMALL LETTER E WITH GRAVE ACCENT\n| E9 | 233 | é | LATIN SMALL LETTER E WITH ACUTE ACCENT\n| EA | 234 | ê | LATIN SMALL LETTER E WITH CIRCUMFLEX ACCENT\n| EB | 235 | ë | LATIN SMALL LETTER E WITH DIAERESIS\n| EC | 236 | ì | LATIN SMALL LETTER I WITH GRAVE ACCENT\n| ED | 237 | í | LATIN SMALL LETTER I WITH ACUTE ACCENT\n| EE | 238 | î | LATIN SMALL LETTER I WITH CIRCUMFLEX ACCENT\n| EF | 239 | ï | LATIN SMALL LETTER I WITH DIAERESIS\n| | | |\n| F0 | 240 | ð | LATIN SMALL LETTER ETH\n| F1 | 241 | ñ | LATIN SMALL LETTER N WITH TILDE\n| F2 | 242 | ò | LATIN SMALL LETTER O WITH GRAVE ACCENT\n| F3 | 243 | ó | LATIN SMALL LETTER O WITH ACUTE ACCENT\n| F4 | 244 | ô | LATIN SMALL LETTER O WITH CIRCUMFLEX ACCENT\n| F5 | 245 | õ | LATIN SMALL LETTER O WITH TILDE\n| F6 | 246 | ö | LATIN SMALL LETTER O WITH DIAERESIS\n| F7 | 247 | ÷ | DIVISION SIGN\n| F8 | 248 | ø | LATIN SMALL LETTER O WITH OBLIQUE BAR\n| F9 | 249 | ù | LATIN SMALL LETTER U WITH GRAVE ACCENT\n| FA | 250 | ú | LATIN SMALL LETTER U WITH ACUTE ACCENT\n| FB | 251 | û | LATIN SMALL LETTER U WITH CIRCUMFLEX ACCENT\n| FC | 252 | ü | LATIN SMALL LETTER U WITH DIAERESIS\n| FD | 253 | ý | LATIN SMALL LETTER Y WITH ACUTE ACCENT\n| FE | 254 | þ | LATIN SMALL LETTER THORN\n| FF | 255 | ÿ | LATIN SMALL LETTER Y WITH DIAERESIS\n+----+-----+---+------------------------------------------------------\nFootnote: ISO 10646 calls Æ a `ligature', but this is a\n letter in (at least some) Scandinavian languages. Thus, it\n is not in the same, merely typographic `ligature' class as\n `oe' ({\\oe} in {\\LaTeX} convention) which was not included\n in the ISO8859-1 standard.\n***Tentative info***\nSupposedly the Danish press, some months ago, reported that ISO has\nchanged the standard so from now on æ and Æ are classified as\nletters.", "comment_id": 957, "isprivate": 0, "modified_by": "arunr@formerly-netscape.com.tld", @@ -1929,7 +1929,7 @@ }, "452739": { "bug_id": 1046, - "comment": "Reassigned to myself, I have a fix:\n\nIndex: nsTextFrame.cpp\n===================================================================\nRCS file: /m/pub/mozilla/layout/html/base/src/nsTextFrame.cpp,v\nretrieving revision 1.276\ndiff -r1.276 nsTextFrame.cpp\n543a544,545\n> mWordSpacing += mLetterSpacing; // bug 1046\n> \n", + "comment": "Reassigned to myself, I have a fix:\n\nelasticsearch.Index: nsTextFrame.cpp\n===================================================================\nRCS file: /m/pub/mozilla/layout/html/base/src/nsTextFrame.cpp,v\nretrieving revision 1.276\ndiff -r1.276 nsTextFrame.cpp\n543a544,545\n> mWordSpacing += mLetterSpacing; // bug 1046\n> \n", "comment_id": 452739, "isprivate": 0, "modified_by": "pierre@formerly-netscape.com.tld", @@ -2369,7 +2369,7 @@ }, "600534": { "bug_id": 12911, - "comment": "If you add tempdir as well as TempDir in nsResProtocolHandler.cpp, what happens\nis that nsResChannel::AsyncRead calls EnsureNextResolvedChannel, which correctly\nmaps the url to file:///tmp/..., then AsyncRead does\nmResolvedChannel->AsyncRead, then while we're waiting for the read,\nEnsureNextResolvedChannel gets called again many more times from\nnsResChannel::GetLocalFile (and perhaps from other routines), and this time it\ndoesn't find the right match, probably because mCurrentIndex is now wrong inside\nNext. This I think causes mResolvedChannel, which was set correctly before, to\nget reset to null, so the actual load of the url fails (but there's no error\nmessage because netlib now thinks it never had a url to load at all).\n\nNetlib async hell. Is there any chance we could get a netlib person to help\nwith getting this to work?", + "comment": "If you add tempdir as well as TempDir in nsResProtocolHandler.cpp, what happens\nis that nsResChannel::AsyncRead calls EnsureNextResolvedChannel, which correctly\nmaps the url to file:///tmp/..., then AsyncRead does\nmResolvedChannel->AsyncRead, then while we're waiting for the read,\nEnsureNextResolvedChannel gets called again many more times from\nnsResChannel::GetLocalFile (and perhaps from other routines), and this time it\ndoesn't find the right match, probably because mCurrentelasticsearch.Index is now wrong inside\nNext. This I think causes mResolvedChannel, which was set correctly before, to\nget reset to null, so the actual load of the url fails (but there's no error\nmessage because netlib now thinks it never had a url to load at all).\n\nNetlib async hell. Is there any chance we could get a netlib person to help\nwith getting this to work?", "comment_id": 600534, "isprivate": 0, "modified_by": "akkzilla@shallowsky.com", @@ -3617,7 +3617,7 @@ }, "1244147": { "bug_id": 12911, - "comment": "\nthat would simplify some of the code in SetRelativeDescriptor, you'd need less\nXP_MAC stuff because you'd just be able to pass in targetFile\n\n\n\n>+ void initWithFile(in nsILocalFileMac aFile);\n\nI wonder if we should make InitWithFile() exist on \nnsILocalFile()? It seems like this would be useful to more than just the mac...\nespecially since the implementation you've given doesn't actually rely on\nnsILocalFileMac...\n\n\n\n>+#if defined(XP_MAC)\n>+static const nsCAutoString kSlashStr(\"/\");\n>+static const nsCAutoString kESCSlashStr(\"%2F\");\n>+#endif\n\nthis is worrysome because you use these for ReplaceSubstring, and nsString.h\nsays\n> void\n> nsCString::ReplaceSubstring(const nsCString& aTarget,const nsCString& aNewValue){\n> \n> //WARNING: This is not working yet!!!!!\n\nhowever, it kinda looks like the const char* versions work (or at least don't\nhave the warning)\nI remember something about an infinite loop with the broken ReplaceSubstring()\n\n>+ rv = GetUnicodePath(&thisPath);\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ rv = fromFile->GetUnicodePath(&fromPath);\n>+ if (NS_FAILED(rv)) {\n>+ nsMemory::Free(thisPath);\n\nCan you use nsXPIDLString here?\n\n>+ for (nodeIndex = branchIndex; nodeIndex < thisNodeCnt; nodeIndex++) {\n>+ NS_ConvertUCS2toUTF8 nodeStr(thisNodes[nodeIndex]);\n>+#ifdef XP_MAC\n>+ nodeStr.ReplaceSubstring(kSlashStr, kESCSlashStr);\n>+#endif\n\nthis is the spot I was worried about.\n\n\n>+ nsMemory::Free(thisPath);\n>+ nsMemory::Free(fromPath);\n\nagain, more nsXPIDLCString?\n\n>+ const nsCAutoString kParentDirStr(\"../\");\n\nuse NS_NAMED_LITERAL_CSTRING(kParentDirStr, \"../\"); - you'll get length for\nfree, plus no \nextra copying and no extra stack buffer\n\n>+ \n>+ nsCOMPtr parentDir;\n>+ while (FindInReadable(kParentDirStr, nodeBegin, nodeEnd)) {\n>+ rv = targetFile->GetParent(getter_AddRefs(parentDir));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ targetFile = parentDir;\n>+ \n>+ nodeBegin = nodeEnd;\n>+ pos = nodeEnd;\n>+ nodeEnd = strEnd;\n>+ }\n>+ \n\nNot sure I understand the point of this loop.. are you removing \"../\"? can you\ncomment here?\n\n>+ nodeBegin = nodeEnd = pos;\n>+ while (nodeEnd.size_forward() > 0) {\n>+ FindCharInReadable('/', nodeEnd, strEnd);\n>+ nsCAutoString nodeString(Substring(nodeBegin, nodeEnd)); \n>+#ifdef XP_MAC\n>+ nodeString.ReplaceSubstring(kESCSlashStr, kSlashStr);\n>+#endif\n>+ targetFile->AppendUnicode((NS_ConvertUTF8toUCS2(nodeString)).get());\n>+ nodeBegin = ++nodeEnd;\n\nThis last line is a little scary because you might advance past the end of the\nstring - nodeEnd exists just past the end of the \nstring, if FindCharInReadable matched at the end of the string..\nthough now that I look at this loop, I am again confused :) Can you explain\nwhat's going on here? :)\n\n>+ }\n>+\n>+#ifdef XP_MAC\n>+ nsCOMPtr macFile(do_QueryInterface(targetFile, &rv));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ return InitWithFile(macFile);\n>+#else\n>+ nsXPIDLCString nativePath;\n>+ rv = targetFile->GetPath(getter_Copies(nativePath));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ return InitWithPath(nativePath.get());\n>+#endif\n\nThis is the bit that would be simplified by putting InitWithFile into\nnsILocalFile", + "comment": "\nthat would simplify some of the code in SetRelativeDescriptor, you'd need less\nXP_MAC stuff because you'd just be able to pass in targetFile\n\n\n\n>+ void initWithFile(in nsILocalFileMac aFile);\n\nI wonder if we should make InitWithFile() exist on \nnsILocalFile()? It seems like this would be useful to more than just the mac...\nespecially since the implementation you've given doesn't actually rely on\nnsILocalFileMac...\n\n\n\n>+#if defined(XP_MAC)\n>+static const nsCAutoString kSlashStr(\"/\");\n>+static const nsCAutoString kESCSlashStr(\"%2F\");\n>+#endif\n\nthis is worrysome because you use these for ReplaceSubstring, and nsString.h\nsays\n> void\n> nsCString::ReplaceSubstring(const nsCString& aTarget,const nsCString& aNewValue){\n> \n> //WARNING: This is not working yet!!!!!\n\nhowever, it kinda looks like the const char* versions work (or at least don't\nhave the warning)\nI remember something about an infinite loop with the broken ReplaceSubstring()\n\n>+ rv = GetUnicodePath(&thisPath);\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ rv = fromFile->GetUnicodePath(&fromPath);\n>+ if (NS_FAILED(rv)) {\n>+ nsMemory::Free(thisPath);\n\nCan you use nsXPIDLString here?\n\n>+ for (nodeelasticsearch.Index = branchelasticsearch.Index; nodeelasticsearch.Index < thisNodeCnt; nodeelasticsearch.Index++) {\n>+ NS_ConvertUCS2toUTF8 nodeStr(thisNodes[nodeelasticsearch.Index]);\n>+#ifdef XP_MAC\n>+ nodeStr.ReplaceSubstring(kSlashStr, kESCSlashStr);\n>+#endif\n\nthis is the spot I was worried about.\n\n\n>+ nsMemory::Free(thisPath);\n>+ nsMemory::Free(fromPath);\n\nagain, more nsXPIDLCString?\n\n>+ const nsCAutoString kParentDirStr(\"../\");\n\nuse NS_NAMED_LITERAL_CSTRING(kParentDirStr, \"../\"); - you'll get length for\nfree, plus no \nextra copying and no extra stack buffer\n\n>+ \n>+ nsCOMPtr parentDir;\n>+ while (FindInReadable(kParentDirStr, nodeBegin, nodeEnd)) {\n>+ rv = targetFile->GetParent(getter_AddRefs(parentDir));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ targetFile = parentDir;\n>+ \n>+ nodeBegin = nodeEnd;\n>+ pos = nodeEnd;\n>+ nodeEnd = strEnd;\n>+ }\n>+ \n\nNot sure I understand the point of this loop.. are you removing \"../\"? can you\ncomment here?\n\n>+ nodeBegin = nodeEnd = pos;\n>+ while (nodeEnd.size_forward() > 0) {\n>+ FindCharInReadable('/', nodeEnd, strEnd);\n>+ nsCAutoString nodeString(Substring(nodeBegin, nodeEnd)); \n>+#ifdef XP_MAC\n>+ nodeString.ReplaceSubstring(kESCSlashStr, kSlashStr);\n>+#endif\n>+ targetFile->AppendUnicode((NS_ConvertUTF8toUCS2(nodeString)).get());\n>+ nodeBegin = ++nodeEnd;\n\nThis last line is a little scary because you might advance past the end of the\nstring - nodeEnd exists just past the end of the \nstring, if FindCharInReadable matched at the end of the string..\nthough now that I look at this loop, I am again confused :) Can you explain\nwhat's going on here? :)\n\n>+ }\n>+\n>+#ifdef XP_MAC\n>+ nsCOMPtr macFile(do_QueryInterface(targetFile, &rv));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ return InitWithFile(macFile);\n>+#else\n>+ nsXPIDLCString nativePath;\n>+ rv = targetFile->GetPath(getter_Copies(nativePath));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ return InitWithPath(nativePath.get());\n>+#endif\n\nThis is the bit that would be simplified by putting InitWithFile into\nnsILocalFile", "comment_id": 1244147, "isprivate": 0, "modified_by": "alecf@flett.org", @@ -3833,7 +3833,7 @@ }, "1267112": { "bug_id": 12911, - "comment": "A couple quick comments on this:\n\n1) Anything that currently uses a file path that is within the user's profile\ndirectory needs to be converted to use a relative path, but absolute paths\nshould also be allowed. For example, \"ImapMail/mail/rules.dat\" vs\n\"/var/foo/mail/rules.dat\". Perhaps this could be implemented as\nresource://profile/ImapMail/mail/rules.dat vs file:///var/foo/mail/rules.dat? \nWould that be a bad idea?\n\n2) From a UI perspective, I think the user should be shown only absolute paths,\nand they should be converted to relative paths if they are within the profile\ndir. The average user won't notice a difference, until they move their profile\ndir and find that everything still works.\n\n3) Mac OS uses \":\" as a path seperator and \"/\" is a valid character in a\nfilename. If we're storing paths as URLs, \"Folder:file/name.txt\" can just be\nencoded as \"Folder/file%2Fname.txt\" which probably already works in file://\nURLs. Obviously a filename like that isn't portable to Windows, but that's not\nMozilla's problem.\n\n4) I think the ability to copy a profile between platforms is REALLY cool. \nAnything referencing an absolute path will break, but that should only be things\nthe user has explicitly defined (and thus is aware of). If a Windows user keeps\nhis IMAP data at Q:\\Imap\\, he'll be expecting Mac OS not to be able to find it\nthere if he moves his profile over, and he'll know he needs to change the path\nmanually. However, if he keeps everything in the default locations, he should\nbe able to boot Linux and point Mozilla to \"/mnt/windows/Documents\\ and\\\nSettings/username/Application\\ Data/Mozilla/Profiles/default/a1b2c3d4.slt\" and\nhave everything work perfectly. That would rule.", + "comment": "A couple quick comments on this:\n\n1) Anything that currently uses a file path that is within the user's profile\ndirectory needs to be converted to use a relative path, but absolute paths\nshould also be allowed. For example, \"ImapMail/mail/rules.dat\" vs\n\"/var/foo/mail/rules.dat\". Perhaps this could be implemented as\nresource://profile/ImapMail/mail/rules.dat vs file:///var/foo/mail/rules.dat? \nWould that be a bad idea?\n\n2) From a UI perspective, I think the user should be shown only absolute paths,\nand they should be converted to relative paths if they are within the profile\ndir. The average user won't notice a difference, until they move their profile\ndir and find that everything still works.\n\n3) Mac OS uses \":\" as a path seperator and \"/\" is a valid character in a\nfilename. If we're storing paths as URLs, \"Folder:file/name.txt\" can just be\nencoded as \"Folder/file%2Fname.txt\" which probably already works in file://\nURLs. Obviously a filename like that isn't portable to Windows, but that's not\nMozilla's problem.\n\n4) I think the ability to copy a profile between platforms is REALLY cool. \nAnything referencing an absolute path will break, but that should only be things\nthe user has explicitly defined (and thus is aware of). If a Windows user keeps\nhis IMAP data at qb:\\Imap\\, he'll be expecting Mac OS not to be able to find it\nthere if he moves his profile over, and he'll know he needs to change the path\nmanually. However, if he keeps everything in the default locations, he should\nbe able to boot Linux and point Mozilla to \"/mnt/windows/Documents\\ and\\\nSettings/username/Application\\ Data/Mozilla/Profiles/default/a1b2c3d4.slt\" and\nhave everything work perfectly. That would rule.", "comment_id": 1267112, "isprivate": 0, "modified_by": "mozilla7@phroggy.com", @@ -5383,4 +5383,4 @@ "modified_by": "emorley@mozilla.com", "modified_ts": 1355827088000 } -} \ No newline at end of file +} diff --git a/tests/resources/python/leak_check.py b/tests/resources/python/leak_check.py index 861871e..48acfbb 100644 --- a/tests/resources/python/leak_check.py +++ b/tests/resources/python/leak_check.py @@ -6,12 +6,12 @@ from pymysql.times import TimeDelta from bzETL.extract_bugzilla import SCREENED_WHITEBOARD_BUG_GROUPS from pyLibrary.env import startup, elasticsearch from pyLibrary import struct -from pyLibrary.cnv import CNV +from pyLibrary import convert from pyLibrary.env.emailer import Emailer from pyLibrary.env.logs import Log, extract_stack from pyLibrary.maths import Math -from pyLibrary.queries import Q -from pyLibrary.struct import nvl, Struct +from pyLibrary.queries import qb +from pyLibrary.struct import coalesce, Dict # WRAP Log.error TO SHOW THE SPECIFIC ERROR IN THE LOGFILE if not hasattr(Log, "old_error"): @@ -26,7 +26,7 @@ if not hasattr(Log, "old_error"): ##ASSIGN AS CLASS METHOD Log.error=MethodType(new_error, Log) -NOW = CNV.datetime2milli(datetime.utcnow()) +NOW = convert.datetime2milli(datetime.utcnow()) A_WHILE_AGO = int(NOW - TimeDelta(minutes=10).total_seconds()*1000) @@ -58,7 +58,7 @@ class TestLookForLeaks(unittest.TestCase): "facets": {"0": {"statistical": {"field": "bug_id"}}} }).facets["0"].max - return reversed(list(Q.intervals(0, max_bug_id, self.settings.param.increment))) + return reversed(list(qb.intervals(0, max_bug_id, self.settings.param.increment))) def test_private_bugs_not_leaking(self): bad_news = False @@ -103,9 +103,9 @@ class TestLookForLeaks(unittest.TestCase): Log.note("{{num}} leaks!! {{bugs}}", { "num": len(leaked_bugs), - "bugs": Q.run({ + "bugs": qb.run({ "from":leaked_bugs, - "select":["bug_id", "bug_version_num", {"name":"modified_ts", "value":lambda d: CNV.datetime2string(CNV.milli2datetime(d.modified_ts))}], + "select":["bug_id", "bug_version_num", {"name":"modified_ts", "value":lambda d: convert.datetime2string(convert.milli2datetime(d.modified_ts))}], "sort":"bug_id" }) }) @@ -170,7 +170,7 @@ class TestLookForLeaks(unittest.TestCase): fields=["bug_id", "bug_group", "attachments", "modified_ts"] ) - private_attachments = Q.run({ + private_attachments = qb.run({ "from": bugs_w_private_attachments, "select": "attachments.attach_id", "where": {"or": [ @@ -181,7 +181,7 @@ class TestLookForLeaks(unittest.TestCase): try: private_attachments = [int(v) for v in private_attachments] except Exception, e: - private_attachments = Q.run({ + private_attachments = qb.run({ "from": bugs_w_private_attachments, "select": "attachments.attach_id", "where": {"or": [ @@ -263,29 +263,29 @@ class TestLookForLeaks(unittest.TestCase): if leaked_whiteboard: for l in leaked_whiteboard: - l.modified_ts=CNV.datetime2string(CNV.milli2datetime(l.modified_ts)) + l.modified_ts=convert.datetime2string(convert.milli2datetime(l.modified_ts)) Log.error("Whiteboard leaking:\n{{leak|indent}}", {"leak": leaked_whiteboard}) def get(es, esfilter, fields=None, limit=None): - query = struct.wrap({ + query = wrap({ "query": {"filtered": { "query": {"match_all": {}}, "filter": esfilter }}, "from": 0, - "size": nvl(limit, 200000), + "size": coalesce(limit, 200000), "sort": [] }) if fields: query.fields=fields results = es.search(query) - return Q.select(results.hits.hits, "fields") + return qb.select(results.hits.hits, "fields") else: results = es.search(query) - return Q.select(results.hits.hits, "_source") + return qb.select(results.hits.hits, "_source") @@ -300,8 +300,8 @@ def milli2datetime(r): elif isinstance(r, basestring): return r elif Math.is_number(r): - if CNV.value2number(r) > 800000000000: - return CNV.datetime2string(CNV.milli2datetime(r), "%Y-%m-%d %H:%M:%S") + if convert.value2number(r) > 800000000000: + return convert.datetime2string(convert.milli2datetime(r), "%Y-%m-%d %H:%M:%S") else: return r elif isinstance(r, dict): @@ -320,7 +320,7 @@ def milli2datetime(r): if not output: return None try: - return Q.sort(output) + return qb.sort(output) except Exception: return output else: @@ -339,7 +339,7 @@ def main(): if results.errors or results.failures: error(results) except Exception, e: - error(Struct(errors=[e])) + error(Dict(errors=[e])) finally: pass diff --git a/tests/resources/python/scrub_db.py b/tests/resources/python/scrub_db.py index 3c92902..8a5a343 100644 --- a/tests/resources/python/scrub_db.py +++ b/tests/resources/python/scrub_db.py @@ -1,13 +1,13 @@ # encoding: utf-8 # -from pyLibrary.sql.db import DB, SQL +from pyLibrary.sql.db import MySQL, SQL from pyLibrary.env.logs import Log from pyLibrary.env import startup def main(): """ MEANT TO BE RUN JUST ONCE IN DEVELOPMENT TO CONVERT A BIG PUBLIC - DATABASE (8G+) INTO A TINY TESTING DB (FOR ADDING TO REPOSITORY) + DATABASE (8G+) INTO A TINY TESTING MySQL (FOR ADDING TO REPOSITORY) """ try: settings=startup.read_settings() @@ -20,7 +20,7 @@ def main(): Log.note("Scrubbing db of those pesky records.") Log.note("This is going to take hours ...") - DB.execute_file(settings.bugzilla, "./tests/resources/sql/scrub_db.sql", { + MySQL.execute_file(settings.bugzilla, "./tests/resources/sql/scrub_db.sql", { "schema":settings.bugzilla.schema, "bug_list":SQL(settings.param.bugs) }) diff --git a/tests/resources/python/view_aliases.py b/tests/resources/python/view_aliases.py index e442602..cb447dc 100644 --- a/tests/resources/python/view_aliases.py +++ b/tests/resources/python/view_aliases.py @@ -1,19 +1,19 @@ # encoding: utf-8 # from pyLibrary import struct -from pyLibrary.cnv import CNV +from pyLibrary import convert from pyLibrary.env.files import File from pyLibrary.env.logs import Log -from pyLibrary.queries import Q +from pyLibrary.queries import qb from pyLibrary.env import startup def main(settings): file = File(settings.param.alias_file) - aliases = CNV.JSON2object(file.read()) + aliases = convert.json2value(file.read()) for v in aliases.values(): - v.candidates = CNV.dict2Multiset(v.candidates) + v.candidates = convert.dict2Multiset(v.candidates) data = [ { @@ -24,7 +24,7 @@ def main(settings): if d.canonical != None and n != d.canonical ] - sorted = Q.sort(data, "found") + sorted = qb.sort(data, "found") for s in sorted: Log.note("{{found}} == {{lost}}", s) @@ -35,11 +35,11 @@ def main(settings): } rev_clean = struct.inverse(clean) - Log.note(CNV.object2JSON(rev_clean, pretty=True)) + Log.note(convert.value2json(rev_clean, pretty=True)) for k, v in rev_clean.items(): if len(v) > 3: - Log.note(CNV.object2JSON({k: v}, pretty=True)) + Log.note(convert.value2json({k: v}, pretty=True)) def start(): diff --git a/tests/resources/sql/scrub_db.sql b/tests/resources/sql/scrub_db.sql index a5b6044..8522352 100644 --- a/tests/resources/sql/scrub_db.sql +++ b/tests/resources/sql/scrub_db.sql @@ -24,6 +24,9 @@ WHERE ; COMMIT; + + + START TRANSACTION; DELETE FROM tracking_flags_bugs @@ -182,6 +185,8 @@ INSERT INTO keep_profiles SELECT watch_user FROM components; DELETE FROM keep_profiles WHERE id IS NULL; DELETE FROM profiles WHERE userid NOT IN (SELECT DISTINCT id FROM keep_profiles); +DELETE FROM bug_mentors + DROP TABLE IF EXISTS keep_profiles; UPDATE profiles SET public_key=NULL; COMMIT; @@ -387,5 +392,10 @@ DELETE FROM whine_schedules; DELETE FROM quips; COMMIT; + +START TRANSACTION ; +DELETE FROM + + SET foreign_key_checks = 1; diff --git a/tests/resources/sql/small_bugzilla.sql b/tests/resources/sql/small_bugzilla.sql index 912bb77..531638f 100644 --- a/tests/resources/sql/small_bugzilla.sql +++ b/tests/resources/sql/small_bugzilla.sql @@ -1401,7 +1401,7 @@ CREATE TABLE `longdescs` ( LOCK TABLES `longdescs` WRITE; /*!40000 ALTER TABLE `longdescs` DISABLE KEYS */; -INSERT INTO `longdescs` VALUES (384,31,'1998-05-20 00:00:00','testing\n------- Additional Comments From arunr 05/19/98 14:27 -------\ntesting again please ignore',0.00,0,1,956,0,NULL,0),(384,31,'1998-06-01 18:48:59','Table of ISO 8859-1 Characters\nThis section gives an overview of the ISO 8859-1 character set. The\nISO 8859-1 character set consists of the following four blocks:\n00 19 CONTROL CHARACTERS\n20 7E BASIC LATIN\n80 9F EXTENDED CONTROL CHARACTERS\nA0 FF LATIN-1 SUPPLEMENT\nThe control characters and basic latin blocks are similar do those\nused in the US national variant of ISO 646 (US-ASCII), so they are not\nlisted here. Nor is the second block of control characters listed,\nfor which not functions have yet been defined.\n+----+-----+---+------------------------------------------------------\n|Hex | Dec |Car| Description ISO/IEC 10646-1:1993(E)\n+----+-----+---+------------------------------------------------------\n| | | |\n| A0 | 160 | | NO-BREAK SPACE\n| A1 | 161 | ¡ | INVERTED EXCLAMATION MARK\n| A2 | 162 | ¢ | CENT SIGN\n| A3 | 163 | £ | POUND SIGN\n| A4 | 164 | ¤ | CURRENCY SIGN\n| A5 | 165 | ¥ | YEN SIGN\n| A6 | 166 | ¦ | BROKEN BAR\n| A7 | 167 | § | SECTION SIGN\n| A8 | 168 | ¨ | DIAERESIS\n| A9 | 169 | © | COPYRIGHT SIGN\n| AA | 170 | ª | FEMININE ORDINAL INDICATOR\n| AB | 171 | « | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK\n| AC | 172 | ¬ | NOT SIGN\n| AD | 173 | ­ | SOFT HYPHEN\n| AE | 174 | ® | REGISTERED SIGN\n| AF | 175 | ¯ | MACRON\n| | | |\n| B0 | 176 | ° | DEGREE SIGN\n| B1 | 177 | ± | PLUS-MINUS SIGN\n| B2 | 178 | ² | SUPERSCRIPT TWO\n| B3 | 179 | ³ | SUPERSCRIPT THREE\n| B4 | 180 | ´ | ACUTE ACCENT\n| B5 | 181 | µ | MICRO SIGN\n| B6 | 182 | ¶ | PILCROW SIGN\n| B7 | 183 | · | MIDDLE DOT\n| B8 | 184 | ¸ | CEDILLA\n| B9 | 185 | ¹ | SUPERSCRIPT ONE\n| BA | 186 | º | MASCULINE ORDINAL INDICATOR\n| BB | 187 | » | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK\n| BC | 188 | ¼ | VULGAR FRACTION ONE QUARTER\n| BD | 189 | ½ | VULGAR FRACTION ONE HALF\n| BE | 190 | ¾ | VULGAR FRACTION THREE QUARTERS\n| BF | 191 | ¿ | INVERTED QUESTION MARK\n| | | |\n| C0 | 192 | À | LATIN CAPITAL LETTER A WITH GRAVE ACCENT\n| C1 | 193 | Á | LATIN CAPITAL LETTER A WITH ACUTE ACCENT\n| C2 | 194 | Â | LATIN CAPITAL LETTER A WITH CIRCUMFLEX ACCENT\n| C3 | 195 | Ã | LATIN CAPITAL LETTER A WITH TILDE\n| C4 | 196 | Ä | LATIN CAPITAL LETTER A WITH DIAERESIS\n| C5 | 197 | Å | LATIN CAPITAL LETTER A WITH RING ABOVE\n| C6 | 198 | Æ | LATIN CAPITAL LIGATURE AE\n| C7 | 199 | Ç | LATIN CAPITAL LETTER C WITH CEDILLA\n| C8 | 200 | È | LATIN CAPITAL LETTER E WITH GRAVE ACCENT\n| C9 | 201 | É | LATIN CAPITAL LETTER E WITH ACUTE ACCENT\n| CA | 202 | Ê | LATIN CAPITAL LETTER E WITH CIRCUMFLEX ACCENT\n| CB | 203 | Ë | LATIN CAPITAL LETTER E WITH DIAERESIS\n| CC | 204 | Ì | LATIN CAPITAL LETTER I WITH GRAVE ACCENT\n| CD | 205 | Í | LATIN CAPITAL LETTER I WITH ACUTE ACCENT\n| CE | 206 | Î | LATIN CAPITAL LETTER I WITH CIRCUMFLEX ACCENT\n| CF | 207 | Ï | LATIN CAPITAL LETTER I WITH DIAERESIS\n| | | |\n| D0 | 208 | Ð | LATIN CAPITAL LETTER ETH\n| D1 | 209 | Ñ | LATIN CAPITAL LETTER N WITH TILDE\n| D2 | 210 | Ò | LATIN CAPITAL LETTER O WITH GRAVE ACCENT\n| D3 | 211 | Ó | LATIN CAPITAL LETTER O WITH ACUTE ACCENT\n| D4 | 212 | Ô | LATIN CAPITAL LETTER O WITH CIRCUMFLEX ACCENT\n| D5 | 213 | Õ | LATIN CAPITAL LETTER O WITH TILDE\n| D6 | 214 | Ö | LATIN CAPITAL LETTER O WITH DIAERESIS\n| D7 | 215 | × | MULTIPLICATION SIGN\n| D8 | 216 | Ø | LATIN CAPITAL LETTER O WITH STROKE\n| D9 | 217 | Ù | LATIN CAPITAL LETTER U WITH GRAVE ACCENT\n| DA | 218 | Ú | LATIN CAPITAL LETTER U WITH ACUTE ACCENT\n| DB | 219 | Û | LATIN CAPITAL LETTER U WITH CIRCUMFLEX ACCENT\n| DC | 220 | Ü | LATIN CAPITAL LETTER U WITH DIAERESIS\n| DD | 221 | Ý | LATIN CAPITAL LETTER Y WITH ACUTE ACCENT\n| DE | 222 | Þ | LATIN CAPITAL LETTER THORN\n| DF | 223 | ß | LATIN SMALL LETTER SHARP S\n| | | |\n| E0 | 224 | à | LATIN SMALL LETTER A WITH GRAVE ACCENT\n| E1 | 225 | á | LATIN SMALL LETTER A WITH ACUTE ACCENT\n| E2 | 226 | â | LATIN SMALL LETTER A WITH CIRCUMFLEX ACCENT\n| E3 | 227 | ã | LATIN SMALL LETTER A WITH TILDE\n| E4 | 228 | ä | LATIN SMALL LETTER A WITH DIAERESIS\n| E5 | 229 | å | LATIN SMALL LETTER A WITH RING ABOVE\n| E6 | 230 | æ | LATIN SMALL LIGATURE AE\n| E7 | 231 | ç | LATIN SMALL LETTER C WITH CEDILLA\n| E8 | 232 | è | LATIN SMALL LETTER E WITH GRAVE ACCENT\n| E9 | 233 | é | LATIN SMALL LETTER E WITH ACUTE ACCENT\n| EA | 234 | ê | LATIN SMALL LETTER E WITH CIRCUMFLEX ACCENT\n| EB | 235 | ë | LATIN SMALL LETTER E WITH DIAERESIS\n| EC | 236 | ì | LATIN SMALL LETTER I WITH GRAVE ACCENT\n| ED | 237 | í | LATIN SMALL LETTER I WITH ACUTE ACCENT\n| EE | 238 | î | LATIN SMALL LETTER I WITH CIRCUMFLEX ACCENT\n| EF | 239 | ï | LATIN SMALL LETTER I WITH DIAERESIS\n| | | |\n| F0 | 240 | ð | LATIN SMALL LETTER ETH\n| F1 | 241 | ñ | LATIN SMALL LETTER N WITH TILDE\n| F2 | 242 | ò | LATIN SMALL LETTER O WITH GRAVE ACCENT\n| F3 | 243 | ó | LATIN SMALL LETTER O WITH ACUTE ACCENT\n| F4 | 244 | ô | LATIN SMALL LETTER O WITH CIRCUMFLEX ACCENT\n| F5 | 245 | õ | LATIN SMALL LETTER O WITH TILDE\n| F6 | 246 | ö | LATIN SMALL LETTER O WITH DIAERESIS\n| F7 | 247 | ÷ | DIVISION SIGN\n| F8 | 248 | ø | LATIN SMALL LETTER O WITH OBLIQUE BAR\n| F9 | 249 | ù | LATIN SMALL LETTER U WITH GRAVE ACCENT\n| FA | 250 | ú | LATIN SMALL LETTER U WITH ACUTE ACCENT\n| FB | 251 | û | LATIN SMALL LETTER U WITH CIRCUMFLEX ACCENT\n| FC | 252 | ü | LATIN SMALL LETTER U WITH DIAERESIS\n| FD | 253 | ý | LATIN SMALL LETTER Y WITH ACUTE ACCENT\n| FE | 254 | þ | LATIN SMALL LETTER THORN\n| FF | 255 | ÿ | LATIN SMALL LETTER Y WITH DIAERESIS\n+----+-----+---+------------------------------------------------------\nFootnote: ISO 10646 calls Æ a `ligature\', but this is a\n letter in (at least some) Scandinavian languages. Thus, it\n is not in the same, merely typographic `ligature\' class as\n `oe\' ({\\oe} in {\\LaTeX} convention) which was not included\n in the ISO8859-1 standard.\n***Tentative info***\nSupposedly the Danish press, some months ago, reported that ISO has\nchanged the standard so from now on æ and Æ are classified as\nletters.',0.00,0,1,957,0,NULL,0),(384,31,'1998-06-01 18:58:59','update - 1',0.00,0,0,958,0,NULL,0),(384,31,'1998-06-01 19:19:59','update - 3',0.00,0,0,959,0,NULL,0),(384,31,'1998-06-24 23:59:59','Testing bugs assigning it to myself',0.00,0,0,960,0,NULL,0),(384,31,'1998-06-24 23:59:59','Test bug moved to fixed',0.00,0,0,961,0,NULL,0),(384,3794,'1998-10-06 14:48:59','The database is being reorganized a bit. Instead of the Bugzilla product,\na new Webtools product has been created, with Bugzilla being a component of it.\n\nThis bug is being moved from the old Bugzilla product to the new Webtools\nproduct.',0.00,0,1,962,0,NULL,0),(1045,3881,'1998-10-09 17:29:37','It would be nice to support the CSS1 properties background-position and\nbackground-attachment. There seems to be some attempt at supporting background-\nposition, since it sometimes seems to cause a background that is tiled only in\none direction (using background-repeat) to run twice in that direction\n(parallel) rather than once. See the URL given for an example. See tests\n5.3.4, 5.3.6, and 5.3.7 (link above) for examples of these properties.‰',0.00,0,1,4602,0,NULL,0),(1045,3824,'1998-10-09 18:01:59','Note that we do support some of background-position; currently only the pixel\nvalues work, percentages and the enumerateds do not.',0.00,0,1,4603,0,NULL,0),(1045,3824,'1998-10-27 11:36:59','Background position is now working fully. So I changed the bug title...\n\nSupporting background-attachment is currently waiting on a css2 spec\nclarification.',0.00,0,1,4604,0,NULL,0),(1045,3881,'1998-12-22 12:07:59','I am curious what the spec clarification was that you were waiting for. I had\nassumed it was related to the relation between background-position and\nbackground-attachment when background-attachment was fixed (on a non-BODY\nelement), but I now think that is actually well defined in the CSS2 spec (at\nthe end of the section on background-position).',0.00,0,1,4605,0,NULL,0),(1045,4054,'1999-01-16 13:20:59','In case the clarification required is what to do with fixed background\non non-BODY elements, here is how I understand the spec:\n\nThe image should be fixed relative to the viewport, but hidden except\nthe element is over the viewport, when the image \"shines through\" the\nelement. Thus in:\n\n http://www.bath.ac.uk/%7Epy8ieh/internet/eviltests/bgafixed.html\n\n...the navy bar should be plain navy, except when it is in the middle of\nthe viewport, when you should be able to see the two cats in the navy box,\nabove the drawing of the other cat (Astrophy).\n\nRight, David?',0.00,0,1,4606,0,NULL,0),(1045,3881,'1999-01-16 14:27:59','Basically, except the blue DIV should hide the first cat, so you should never\nbe able to see both cat images at once.\n\nHere\'s my way of explaining it:\n\n1) Position and tile the background as if it were a background on the viewport.\n2) Clip whatever the result is at the edges of the element whose background it\n actually is.\n\nThis means:\n1) A tiled background image that is fixed shouldn\'t move around when the\n document is scrolled. The element whose background it is should \"move over\n it.\"\n2) A non-tiled background image should appear only when the (padding edge of\n the) element whose background it is is over that part of the viewport.',0.00,0,1,4607,0,NULL,0),(1045,3826,'1999-01-17 20:17:59','Ok, now what happens to the background when it is inside an element, say a DIV\nwith width & height properties and overflow: scroll? What about two DIVs that\nscroll nested inside each other?',0.00,0,1,4608,0,NULL,0),(1045,3881,'1999-01-17 21:25:59','Nothing different. The background is still fixed with respect to the viewport.\n\n(Background fixing with respect to an arbitrary (scrolling) element is an\ninteresting idea. I think this would best be handled by additional values on\nbackground-attachment. It is an interesting feature to think about, but it\nisn\'t in the spec now. Background fixing is wrt viewport.)',0.00,0,1,4609,0,NULL,0),(1045,3853,'1999-02-03 08:09:59','Setting all current Open/Normal to M4.',0.00,0,0,4610,0,NULL,0),(1045,3819,'1999-03-05 22:38:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,4611,0,NULL,0),(1045,3824,'1999-03-16 19:36:59','Since you\'ve been working with michael to get all the basic features we need to\nsupport this, and since you\'ll probably end up writing the code to make it work,\nI\'m giving the bug to you so you can enjoy closing it when finished :-)',0.00,0,1,4612,0,NULL,0),(1045,3825,'1999-03-22 07:54:59','*** Bug 3963 has been marked as a duplicate of this bug. ***',0.00,0,0,4613,0,NULL,0),(1045,3825,'1999-03-25 11:21:59','*** Bug 3478 has been marked as a duplicate of this bug. ***',0.00,0,0,4614,0,NULL,0),(1045,3825,'1999-04-07 17:43:59','Per my conversation with Hakon:\n\n> Okay, that\'s what we\'ll do then. Treat fixed background images as fixed with\n> regard to the nearest scrolling container\n\nYes. I can\'t make any guaratees what solution the WG will settle on,\nbut I would be very surprised if it\'s different from yours.',0.00,0,1,4615,0,NULL,0),(1045,3825,'1999-04-24 20:12:59','Okay, layout has been changed and it works correctly except in one case. Fixing\nthat requires compositor changes.\n\nThe way fixed background attachment works is that layout sets the\nNS_VIEW_PUBLIC_FLAG_DONT_BITBLT flag which tells the compositor that the view\nshould be repainted and not bitblt when moving or scrolling the view.\n\nThe nsScrollingView::Scroll() code has been changed to check the scrolled view\'s\nflags and if that flag is set, then the view is repainted and not bitblt\'d\n\nThe case that doesn\'t currently work is when there\'s a non-scrollable nested\nelement that has a fixed background attachment (see example below). What happens\nin this case is that because the scrolled view can be bitblt\'d we go ahead and\nbitblt it. However, one of its child views can not be bitblt\'d, and see we need\nto make sure that it is repainted after doing the scroll.\n\nDoing this efficiency (i.e., not walking each of the scrolled view\'s\nchild frames each time checking if any of them have this flag bit set) requires\ncompositor changes.\n\n\n\nSome text\n
\nSome text in a DIV\n
\n\n',0.00,0,1,4616,0,NULL,0),(1045,4151,'1999-04-25 14:26:59','This also looks suspicously similar to bug #1045.',0.00,0,0,4617,0,NULL,0),(1045,4151,'1999-04-25 14:28:59','which it is, anybody else confused by bugzilla sometimes? what bug is this?',0.00,0,0,4618,0,NULL,0),(1045,3823,'1999-04-27 13:59:59','Moving to M6.',0.00,0,0,4619,0,NULL,0),(1045,3831,'1999-05-20 11:15:59','Patrick, This is a view/compositor bug so I am re-assigning back to you. Troy\ndescribes the solution in his 4/24 message.',0.00,0,1,4620,0,NULL,0),(1045,2687,'1999-07-07 19:32:59','moving to m9. beard\'s on vacation',0.00,0,0,4621,0,NULL,0),(1045,3825,'1999-09-16 07:55:59','*** Bug 12008 has been marked as a duplicate of this bug. ***',0.00,0,0,4622,0,NULL,0),(1045,4151,'1999-09-18 15:57:59','The test cases work as they should. Is this really a performance bug? I\'ll defer\nperformance for later.',0.00,0,0,4623,0,NULL,0),(1045,4054,'1999-09-27 06:10:59','beard: I don\'t think this is a performance issue. Take a look at this page:\n http://www.bath.ac.uk/%7Epy8ieh/internet/projects/mozilla/overflowscroll.html\n\nScroll it up and down. The white box in the middle explains the problem:\nbasically, we seem to be only repainting the inner element (overflow:scroll)\nwhen the scrolling has finished, which leads to trails during the scroll.\nIts difficult to explain; have a look.',0.00,0,1,4624,0,NULL,0),(1045,4054,'2000-01-13 15:58:59','Migrating from {css1} to css1 keyword. The {css1}, {css2}, {css3} and {css-moz}\nradars should now be considered deprecated in favour of keywords.\nI am *really* sorry about the spam...',0.00,0,1,4625,0,NULL,0),(1046,3881,'1998-10-09 17:34:25','It would be nice to support the CSS attributes word-spacing and letter-spacing.\nAlthough I would have to say I would put them among the lowest priorities in\nCSS1, I think they are still definitely worth implementing, especially if you\nwant to claim complete CSS1 support.‰',0.00,0,1,4626,0,NULL,0),(1046,3824,'1998-10-27 11:39:59','We now support them fully; however, the spec is unclear about how some aspects\nshould be handled so don\'t go nuts if it renders oddly; the implementation will\nbe updated when our css guy gets clarification back from the working group.\n\nI\'m reassigning this to peter so that he can assign it back once the\nclarification has arrived.',0.00,0,1,4627,0,NULL,0),(1046,70,'1998-11-18 10:58:59','Last I heard from the CSS list, the clarification was that the value of this\nproperty is the delta to the default value. In other words, if default letter\nspacing is 0.1em, and the author says letter-spacing: -0.1em, the total letter\nspacing applied should be 0.0em, not -0.1em. I thought this was extremely\ncounterintuitive, but it\'s what the CSS gods said.',0.00,0,1,4628,0,NULL,0),(1046,3826,'1998-11-18 11:16:59','Actually, the latest clarification from the CSS w/g is that _I_ write up a\nproposal to define the normative behavior, since the spec doesn\'t. Expect\nsomething next week.',0.00,0,1,4629,0,NULL,0),(1046,3819,'1999-03-05 22:38:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,4630,0,NULL,0),(1046,4054,'1999-05-21 10:25:59','Isn\'t this resolved now??? The last relevant comment is from six months ago!',0.00,0,0,4631,0,NULL,0),(1046,3826,'1999-09-07 17:45:59','Pushing off non-beta 1 issues',0.00,0,0,4632,0,NULL,0),(1046,4126,'1999-10-21 01:06:59','Reassigning peterl\'s bugs to myself.',0.00,0,0,4633,0,NULL,0),(1046,4126,'1999-10-21 01:12:59','Accepting peterl\'s bugs that have a Target Milestone',0.00,0,0,4634,0,NULL,0),(1046,3881,'1999-10-26 15:34:59','My opinion is that the default value of \'word-spacing\' (i.e., \'normal\') should\n*not* be equivalent to 0 (and 0 should mean that \"a bc\" and \"abc\" should look\nthe same), while the default value of \'letter-spacing\' (again,\n\'normal\') *should* be equivalent to 0 (since you don\'t adjust letter spacing for\njustification). I think this can (mostly) be implied from CSS1.',0.00,0,1,4635,0,NULL,0),(1046,4126,'1999-12-20 21:10:59','Pushing my M15 bugs to M16',0.00,0,0,4636,0,NULL,0),(1046,4054,'2000-01-13 15:58:59','Migrating from {css1} to css1 keyword. The {css1}, {css2}, {css3} and {css-moz}\nradars should now be considered deprecated in favour of keywords.\nI am *really* sorry about the spam...',0.00,0,1,4637,0,NULL,0),(1108,70,'1998-10-15 19:51:24','I can\'t modify the line-height property via the CSS OM.',0.00,0,0,5070,0,NULL,0),(1108,1679,'1998-10-16 11:31:59','I\'m doing the right thing as far as I can tell. It\'s the style system that needs\nto respond to the change.',0.00,0,0,5071,0,NULL,0),(1108,3826,'1998-11-05 16:09:59','Note that the example URL doesn\'t actually attempt to modify the line-height\nproperty, but when I hack it to do that, it works fine...',0.00,0,1,5072,0,NULL,0),(1157,3988,'1998-10-19 23:02:08','(Note: I ran these tests with both the plugins from\nNavigator 4.5 PR2 and the old versions from Navigator 3.0.\nI changed the plugins by modifying the registry at\n\"hkey_current_user/software/netscape/netscape\nnavigator/main/install directory\".)\n\nTrouble with AVI and WAV OBJECTs. The following\nproblems occurred on any OBJECT with the MIME type\n\"video/x-msvideo\" or \"audio/wav\".\n\nThe plugin gets loaded, but the video/audio clip won\'t play.\n\nWhen using the plugins from 4.5 PR2, the AVI object is just\nan empty space where the previous page shows through.\nClicking right button on the space gives a NPAVI32 menu, but\nselecting \"Play\" or anything else does nothing. When I use\nthe plugins from Nav3.0, NGLayout crashes immediately on\nloading the page!\n\nIn the WAV tests, a LiveAudio plugin panel saying \"Loading\naudio file...\" is shown. Clicking on the panel a few times\ncauses a crash. The behaviour is identical with both plugin\nversions.\n\nHere\'s a sample output from my NGLayout on a WAV object test:\n\n loaded plugin npaudio.dll for mime type audio/wav\n result of creating plugin adapter: 0\n successfully created plugin instance 01253dd0 for\n npaudio.dll, mimetype audio/wav\n instance start called\n\nThe output is similar in the AVI tests.',0.00,0,1,5339,0,NULL,0),(1157,3682,'1998-11-23 18:15:59','I can\'t even get to the stage where you\'re experiencing the bug. I crash when I\ncall into the initial entry point. The plugin calls NPN_GetJavaEnv(), and since\nwe no longer support a JRI based LiveConnect, we return NULL. It looks like the\nplugin does not handle this correctly.\n\nCan you try your test with a more recent build of NGLayout? Also what is the\nexact version of the plugin you\'re using (I have been using npaudio 1.1.1515)',0.00,0,0,5340,0,NULL,0),(1157,3853,'1998-11-23 20:55:59','Putting on ss: radar.',0.00,0,0,5341,0,NULL,0),(1157,3988,'1998-11-24 00:38:59','Right, I ran the tests again with an Nov-18 debug build of NGLayout:\n\n- The WAV test doesn\'t crash any more. It doesn\'t matter if I use npaudio.dll\n version 1.1.1515 or 1.01. The sound still won\'t play, though!\n\n- The AVI test crashes immediately on loading the page when using the\n npavi32.dll from Nav3.0. It doesn\'t crash when using the npavi32.dll\n from Nav4.5. Again, the video clip won\'t play either.',0.00,0,1,5342,0,NULL,0),(1157,4367,'1999-01-26 12:52:59','Don\'t forget to implement the attribute TABINDEX for element OBJECT.',0.00,0,0,5343,0,NULL,0),(1157,3853,'1999-02-03 08:04:59','Setting all current Open Critical and Major to M3',0.00,0,0,5344,0,NULL,0),(1157,3819,'1999-03-05 23:15:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,5345,0,NULL,0),(1157,3849,'1999-03-06 07:45:59','reassigning to Greg Lynn as QA contact',0.00,0,0,5346,0,NULL,0),(1157,4082,'1999-03-06 15:16:59','Antti please try again with recent build of NGLayout, March 5 or later. Code at\ntime you tried last in November was in early Dev phase. Please enter new\nfindings with updates to test cases.',0.00,0,0,5347,0,NULL,0),(1157,3988,'1999-03-07 11:14:59','OK, I downloaded the March 4th nightly build for Win32 and tried again.\nIt seems that the build has no support for plugins whatsoever, which\neffectively solves the problem for the time being - no plugins, no\ncrashes. :-)\n\nThe viewer just renders a grey box in the place of any audio or video\nOBJECT.',0.00,0,1,5348,0,NULL,0),(1157,3988,'1999-03-07 11:15:59','Sorry, I meant March 5th build - *not* 4th.',0.00,0,0,5349,0,NULL,0),(1157,4082,'1999-03-08 21:57:59','Leaving bug open to track inclusion of ability to play avi and wav files now\nthat crash is solved.',0.00,0,1,5350,0,NULL,0),(1157,3682,'1999-03-12 18:32:59','This works for me now.',0.00,0,0,5351,0,NULL,0),(1157,3988,'1999-03-13 05:59:59','Update on a March 12th Win32 build:\n\nViewer now seems to crash on any OBJECT with a MIME type other than\nimage/gif, image/jpeg or image/png (which render correctly). Audio and\nvideo OBJECTs, too, crash the viewer immediately on loading the page.\n\nAlso noteworthy: any OBJECT with no \'type\' attribute whatsoever crashes\nthe build, too.',0.00,0,1,5352,0,NULL,0),(1157,3682,'1999-03-15 11:11:59','There are a few different bugs going on here:\n- bug with no mimetype specified on image content (crash in CSS code)\n- bug with no height or width specified on plugin content (crash in webshell)\n- bug with no mimetype specified on plugin content (no crash, plugin does not\nget loaded, alternative content gets displayed)\n\nLet\'s concentrate this bug on the second matter and I\'ll open a separate bug for\nthe other two (basically problems when no mimetype is specified).\n\nThe crash in this case occurs when you go to the above url and then go back to a\nprevious page. First, you get a precondition violation in\nnsParser::OnDataAvailable():\n\nNS_PRECONDITION(((eOnStart==mParserContext->mStreamListenerState)||(eOnDataAvail\n==mParserContext->mStreamListenerState)),kOnStartNotCalled);\n\nThen you crash in: nsWebShell::OnConnectionsComplete(). I\'m cc\'ing rickg so he\ncan comment on the parser precondition. Also, who owns web shell problems?\n\nNOTE: you might have to go back and forth on the test page more than once to\nmake it crash.',0.00,0,1,5353,0,NULL,0),(1157,3682,'1999-03-15 11:16:59','There are a few different bugs going on here:\n- bug with no mimetype specified on image content (crash in CSS code)\n- bug with no height or width specified on plugin content (crash in webshell)\n- bug with no mimetype specified on plugin content (no crash, plugin does not\nget loaded, alternative content gets displayed)\n\nLet\'s concentrate this bug on the second matter and I\'ll open a separate bug for\nthe other two (basically problems when no mimetype is specified).\n\nThe crash in this case occurs when you go to the above url and then go back to a\nprevious page. First, you get a precondition violation in\nnsParser::OnDataAvailable():\n\nNS_PRECONDITION(((eOnStart==mParserContext->mStreamListenerState)||(eOnDataAvail\n==mParserContext->mStreamListenerState)),kOnStartNotCalled);\n\nThen you crash in: nsWebShell::OnConnectionsComplete(). I\'m cc\'ing rickg so he\ncan comment on the parser precondition. Also, who owns web shell problems?\n\nNOTE: you might have to go back and forth on the test page more than once to\nmake it crash.',0.00,0,1,5354,0,NULL,0),(1157,3682,'1999-03-15 15:16:59','Reassigning to Andrei as he is more familiar with object tag issues.',0.00,0,0,5355,0,NULL,0),(1157,3682,'1999-03-16 17:26:59','Now I can\'t repro this anymore.\n\nAndrei - can you verify this?',0.00,0,1,5356,0,NULL,0),(1157,4059,'1999-03-16 18:05:59','No it does not crash any longer',0.00,0,0,5357,0,NULL,0),(1157,4082,'1999-03-17 17:08:59','First time I tried URL it crashed on win98 optimized March 17 current build,\napprunner causes invalid page fault in module unknown. (Went to bugzilla, pulled\nup bug, clicked on URL to repro and adios application.) Mac and Linux did not\ncrash but no sound is played. 2nd pass on win98 worked in same fashion as Mac/\nLinux, third pass crashed again. Reopening.',0.00,0,1,5358,0,NULL,0),(1157,3682,'1999-03-18 13:23:59','Looks like this only crashes in Apprunner, not viewer.\n\nAndrei has a fix.',0.00,0,1,5359,0,NULL,0),(1157,2687,'1999-03-18 14:37:59','marking fixed',0.00,0,0,5360,0,NULL,0),(1157,4082,'1999-03-18 20:44:59','Ok, latest M3 build timestamped after 8pm does work, i.e. it does not crash.\nSound still does not play but at least it does not crash. Marking verified.',0.00,0,1,5361,0,NULL,0),(1157,3988,'1999-04-21 05:02:59','AVI and WAV OBJECT are crashing again.\n\nThat is, all tests at\nhttp://www.student.oulu.fi/%7esairwas/object-test/audio/ and\nhttp://www.student.oulu.fi/%7esairwas/object-test/video/\ncrash the Apr 20 Win32 build.',0.00,0,1,5362,0,NULL,0),(1157,4059,'1999-04-22 14:37:59','We checked in a fix for a crash which could be related yesterday. Try today\'s\nbuild. I cannot reproduce the crash.',0.00,0,1,5363,0,NULL,0),(1157,3988,'1999-04-23 01:25:59','OK, no crash anymore on April 22th Win32 build.\nWhat is more, the audio/video plug-ins actually work! This is\nthe first time I\'ve seen them in action. Just impressive.\n\nThere\'s still a problem with unsized video OBJECTs (with no width\nand height attributes) - they are not displayed at all - but I\'ll\nfile another bug about that as soon as I have created some more\nthorough test cases for the issue.',0.00,0,1,5364,0,NULL,0),(1157,4059,'1999-04-23 11:43:59','And assign it to me. Marking this one fixed.',0.00,0,0,5365,0,NULL,0),(1157,4130,'1999-06-01 21:25:59','beppe, do you get these(plugin stuff) now?',0.00,0,0,5366,0,NULL,0),(1157,3849,'1999-06-02 09:12:59','I just tested all 4 audio clip tests and they all work perfectly, used build\n1999060108',0.00,0,1,5367,0,NULL,0),(1865,4211,'1998-12-10 22:15:18','Take a look at http://home.dipswitch.com.\nNotice the animated background.\nThe latest version of mozilla refreshes animated GIF backgrounds every second.',0.00,0,1,10579,0,NULL,0),(1865,4150,'1999-01-05 15:17:59','batch-reassigning all Garrett Blythe bugs to Don Melton',0.00,0,0,10580,0,NULL,0),(1865,1674,'1999-01-06 12:21:59','Re-assinged to pnunn@netscape.com.\n\nPam, do you have any idea who should get this bug? Someone in layout maybe?',0.00,0,1,10581,0,NULL,0),(1865,1681,'1999-01-07 18:02:59','In an attempt to reproduce the problem I generated:\nhttp://jazz/users/pnunn/publish/anibkgif.html\nto replace\nhttp://www.dipswitch.com',0.00,0,1,10582,0,NULL,0),(1865,1681,'1999-01-08 11:46:59','My test page does show the problem. Interestingly enough, an\nanimated gif in table bkground works, but a page bkground does not.\n-pn',0.00,0,1,10583,0,NULL,0),(1865,1681,'1999-01-08 12:01:59','The bkground image animation does work sometimes. So its an intermittant bug.\n(pn: note to self:?timer/layout related problem?)',0.00,0,1,10584,0,NULL,0),(1865,3853,'1999-02-25 11:22:59','beppe...can you put in a QA Contact please to check this with latest build?\nThanks!',0.00,0,1,10585,0,NULL,0),(1865,1681,'1999-02-25 11:48:59','Just check this on linux 02-23-99 build and it all animates\nbut very very very slowly. very.\nfyi,\n-pn',0.00,0,1,10586,0,NULL,0),(1865,3849,'1999-02-27 10:13:59','assigning Eli as QA assigned',0.00,0,0,10587,0,NULL,0),(1865,3853,'1999-03-02 15:01:59','Bulk moving Mozilla/ImageLig bugs to NGLayout/Image in preparation for a move to\nBrowser/ImageLib.',0.00,0,0,10588,0,NULL,0),(1865,1698,'1999-04-26 20:23:59','On Mac OS (4.26.99 build), Seamonkey performs the animation on Jazz at\napproximately half the speed of Communicator 4.5 on the same system (about 5.5\nseconds per iteration on Seamonkey, versus about 2 seconds on 4.5).\n\n(The speed is equivalent to Communicator 4.5 on Win32 & Linux. Also, on Linux,\nthere\'s a 6th column of animated moons that appears to the right of the table,\nflickering on and off. If it\'s still present when this is actually fixed, I\'ll go\nahead and break it into a separate bug. Thanks!)',0.00,0,1,10589,0,NULL,0),(1865,1681,'1999-04-27 12:17:59','changing milestone.\n-pn',0.00,0,1,10590,0,NULL,0),(1865,1681,'1999-05-10 13:29:59','I don\'t see this problem. marking worksforme.\nps. it looks like the extra \"moon\" column is fixed too.\n-pn',0.00,0,1,10591,0,NULL,0),(1865,1698,'1999-05-10 14:44:59','Re-opening; the application behavior is unchanged from the 4.26.99 comment that I\ntossed in.\n\nTo reproduce, take a Macintosh, go to the test page (I\'m using a full 1024x768,\nwindow, 16-bit video), and compare the animation speed in Gecko vs. Communicator;\nit\'s about 4 seconds per cycle on Communicator, but about 8-10 seconds per cycle\non Gecko.',0.00,0,0,10592,0,NULL,0),(1865,1698,'1999-05-10 14:48:59','(And, yes, I\'m still seeing the flashing moon on Linux, too, although only for\nthe first few cycles; let me know if you\'d like me to show it to you.)',0.00,0,1,10593,0,NULL,0),(1865,1698,'1999-05-11 20:08:59','I\'ve now broken down the moon issue from 4.26.99 comment into bug #6302.\n\n(strangely enough, I\'m listening to \"Over the Moon\" from Rent while typing the\nabove... ;)',0.00,0,1,10594,0,NULL,0),(1865,1681,'1999-05-12 10:22:59','I\'m pushing this bug out. crashers get priority over\nperformance.\n-pn',0.00,0,1,10595,0,NULL,0),(1865,1681,'1999-05-14 12:07:59','?Could this be because NU_Cache is not enabled for mac?\n-pn',0.00,0,1,10596,0,NULL,0),(1865,1681,'1999-06-11 17:41:59','I\'m marking this one as a dupe of #3958.\\\n-pnunn\n\n*** This bug has been marked as a duplicate of 3958 ***',0.00,0,1,10597,0,NULL,0),(1865,1698,'1999-06-15 12:57:59','Verifying as duplicate, with a note in 3958 to double-check that the bug\ndescribed in this report is also fixed upon verification of 3958.',0.00,0,1,10598,0,NULL,0),(1869,4218,'1998-12-11 07:03:24','These tags work in current browsers, but I couldn\'t get it to work with gecko:\n\n
\n\n
\n\nI use these, and switch between the two via javascipt and the z-index.',0.00,0,1,10613,0,NULL,0),(1869,3824,'1998-12-11 08:07:59','Can you give me a better test case? I made a simple test case and it works for\nme...Also, the url you\'ve given me is a frame-set. Which frame-cell has the\nproblem page?\n\nthanks...',0.00,0,1,10614,0,NULL,0),(1869,3824,'1998-12-14 20:57:59','Email from dustin:\nHere\'s the frame link:\n\nhttp://www.e-corp.com/home_nav.asp\n\nwhen i looked at it in gecko, all the text in the hidden divisions was\nshown. now that i think about it, it could be a javascript or a css\nproblem, because javascript unhides layers according to which image you\nclick on.\n\nThanks,\n\nDustin',0.00,0,1,10615,0,NULL,0),(1869,3853,'1999-02-03 08:08:59','Setting all current Open/Normal to M4.',0.00,0,0,10616,0,NULL,0),(1869,3819,'1999-03-05 22:38:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,10617,0,NULL,0),(1869,3824,'1999-03-23 19:25:59','Probably fixed, but since you are the minister of things positioned absolute\n(ahem), I figured you should look into it.',0.00,0,1,10618,0,NULL,0),(1869,3825,'1999-03-23 20:10:59','Looks like it works to me, too',0.00,0,0,10619,0,NULL,0),(1869,4110,'1999-03-26 22:24:59','Using the 3/26 build, there is still bug behavior. The frame should display with\n8 orange menu items. When clicked on, the orange bar turns yellow and a drop\ndown menu displays. Geckco is displaying the 8 menu items in yellow, not orange.\nClicking on them does not display a drop down menu and, at the end of the items\nthere is residual drop down information from the \'Press Room\' section.\n\nReopening bug.',0.00,0,0,10620,0,NULL,0),(1869,3825,'1999-03-27 08:44:59','You\'re describing three separate problems, and they need to be addressed in\nthree separate bugs. We need very specific test cases that determine whether\neach of the problems are layout of HTML or DOM\n\nThe problem is it is very time consumming to narrow these kind of bugs down',0.00,0,1,10621,0,NULL,0),(1869,2687,'1999-05-20 21:37:59','unlikey this is going to be fixed in M6.\nchris, any luck in trying to get to a narrower test case?',0.00,0,1,10622,0,NULL,0),(1869,4110,'1999-06-15 12:28:59','Using 6/14 Apprunner, the display problems spelled out in the 3/26 comments no\nlonger appear. However, drop down (using the frame link from 12/14 comments) do\nnot work. It looks to be a javascript problem but that is not my expertise so I\nam unable to break down the sample test case further. Reassigning back to\nengineer.',0.00,0,1,10623,0,NULL,0),(1869,3828,'1999-06-15 23:29:59','Chris -- Running viewer under NT looks exactly like Nav4.5.\nI need a test case to see what the problem is, or we should close this.',0.00,0,1,10624,0,NULL,0),(1869,4110,'1999-06-16 12:17:59','I tested the frame link using 6/19 Viewer and Apprunner on NT:\n\nNav 4.5 behavior:\nWhen you click on a dark orange option, two things happen - (1) orange link\nturns yellow and you get a drop down menu (2) a new window comes up related to\nthe first drop down item.\n\nViewer behavior:\nWhen you click on a dark orange option, a new window comes up related, but the\ndark orange option does NOT turn yellow and a drop down menu DOES NOT display.\n\nApprunner behavior:\nWhen you click on a dark orange option, nothing happens. However, the console\ndoes indicate that a page is loading.',0.00,0,1,10625,0,NULL,0),(1869,3828,'1999-06-17 10:48:59','Ah -- missed that. Thanks Chris. Kevin -- let\'s start with widgets, but this\ncould be a script or event bug. Please take a closer look.',0.00,0,1,10626,0,NULL,0),(1869,3831,'1999-06-17 17:51:59','Looks like they are using document.layers to display and animate the drop-down\nmenus.\n\n document.layers[moveobj].ypos = parseInt(document.layers[moveobj].top)\n if (document.layers[moveobj].ypos > (tabtops[movetab] - mfactor)) {\n for(movetab; movetab < arraylen; movetab++) {\n moveobj = tabs[movetab]\n document.layers[moveobj].ypos = parseInt(document.layers[moveobj].top)\n document.layers[moveobj].ypos -= 5\n document.layers[moveobj].top = document.layers[moveobj].ypos}\n setTimeout(\"objslide()\",30)}\n\nAre we supporting document.layers?\nVidur, Please take a look at the document.layer code in the far left frame.',0.00,0,1,10627,0,NULL,0),(1869,1679,'1999-06-17 18:01:59','Wow, this one\'s been around.\n\nThe original initial layout issues look OK. The nifty sliding menus aren\'t going\nto work because our lack of JS access to the document.layers array.\n\nPassing along to ekrock to put on our layers pile.',0.00,0,1,10628,0,NULL,0),(1869,3845,'2000-01-03 13:22:59','INVALID. LAYER, ILAYER, document.layers[] not supported in Gecko/Nav5. Closed.\nNotified reporter and site owner via template at\nhttp://sites.netscape.net/ekrock/fixit/layer.html',0.00,0,1,10629,0,NULL,0),(1869,4110,'2000-01-07 17:14:59','Verified invalid',0.00,0,0,10630,0,NULL,0),(1877,4224,'1998-12-11 13:06:35','Hi,\nI have a file with the following code. When I try to load in the NGlayout (Geko)\nit fails to load.\n\n\n\n\nJavascript error: Screen is not defined.\nURL: file ://N:/alerts/index.html, LineNo:3\nLine text: \'(null)\', Error text: \'null\'\n\n\nThanks',0.00,0,1,10684,0,NULL,0),(1877,3827,'1999-01-28 18:21:59','I\'ve added the screen object so as to stop causing errors. The value it\nreturns are still bogus, though. Rick, passing this to you as a reminder that\nI need this api for screen info. Pass it back to me when you\'re done.',0.00,0,1,10685,0,NULL,0),(1877,3853,'1999-02-03 08:03:59','Setting all current Open Critical and Major to M3',0.00,0,0,10686,0,NULL,0),(1877,1674,'1999-03-05 16:55:59','Changed platform and OS to all, and component to Apprunner.\n\nRick, figure out whether you or Nisheeth should implement this.',0.00,0,1,10687,0,NULL,0),(1877,1674,'1999-03-05 17:29:59','Can we downgrade the severity to normal on this one?',0.00,0,0,10688,0,NULL,0),(1877,3819,'1999-03-05 21:58:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,10689,0,NULL,0),(1877,3853,'1999-03-10 07:27:59','Setting QA Contact to rpotts since eng will have to verify this code fix.',0.00,0,0,10690,0,NULL,0),(1877,1674,'1999-03-10 21:02:59','Changed component to XPApps and milestone to M4.',0.00,0,0,10691,0,NULL,0),(1877,1674,'1999-04-07 01:15:59','Re-assigned to davidm@netscape.com and changed target milestone to M5.',0.00,0,0,10692,0,NULL,0),(1877,1008,'1999-04-07 01:59:59','Is implementing js objects really an XPApp task? I don\'t mind doing it if someone\npoints me in the right direction but I would like to know how many of these\nobjects there are so I can fix them before they make it to the bug list.',0.00,0,0,10693,0,NULL,0),(1877,1008,'1999-04-15 01:16:59','so I don\'t get spammed',0.00,0,0,10694,0,NULL,0),(1877,1674,'1999-04-23 00:06:59','Changed milestone to M6.',0.00,0,0,10695,0,NULL,0),(1877,1008,'1999-04-24 21:37:59','*** Bug 5463 has been marked as a duplicate of this bug. ***',0.00,0,0,10696,0,NULL,0),(1877,1008,'1999-05-18 16:38:59','m7',0.00,0,1,10697,0,NULL,0),(1877,1008,'1999-06-08 14:55:59','Filed bugs against layout for not implimenting\nnsDeviceContextMac::GetDeviceSurfaceDimensions. Still have to figure out how to\ndetermine which chrome is on a screen when given a window',0.00,0,1,10698,0,NULL,0),(1877,1008,'1999-06-11 14:24:59','',0.00,0,1,10699,5,'383',0),(1877,1008,'1999-06-11 14:25:59','Checked in code. The avail functions currently return default values ( 0 for the\noffsets or the hieght/width). On Mac/GTK the values will be garabage until the\ndependant bugs are fixed. Still have to work out a strategy for calculating\nwindow chrome location and size. Moving off to m9. I have attached my sample test\nfile',0.00,0,0,10700,0,NULL,0),(1877,1008,'1999-06-28 16:49:59','*** Bug 8763 has been marked as a duplicate of this bug. ***',0.00,0,0,10701,0,NULL,0),(1877,1008,'1999-07-01 18:29:59','added dependency',0.00,0,0,10702,0,NULL,0),(1877,159,'1999-07-13 17:57:59','*** Bug 9731 has been marked as a duplicate of this bug. ***',0.00,0,0,10703,0,NULL,0),(1877,1008,'1999-07-23 20:14:59','Not going to happen for m9 lets try ,11',0.00,0,0,10704,0,NULL,0),(1877,1008,'1999-09-04 19:52:59','Fix checked in an verified on the mac.',0.00,0,0,10705,0,NULL,0),(2586,4054,'1999-01-23 06:27:55','Quite comical, really.\n\nIn Print Preview, animated GIFs are still animated. I would love to say\nthat it is not a bug, but unless the printing code can then back the\npreview up by animating the printed copy, I suggest the Print Preview\nshould show a static image.\n\nThis also applies to applets, Javascript, \"hover\" and \"active\" pseudo\nclasses, and so on.',0.00,0,1,16615,0,NULL,0),(2586,3825,'1999-01-23 10:05:59','Yeah, if we\'re going to be WYSIWYG then animating an image seems wrong.\n\nMichael, this is a fun one',0.00,0,1,16616,0,NULL,0),(2586,3819,'1999-03-05 22:01:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,16617,0,NULL,0),(2586,4110,'1999-03-07 12:18:59','changing QA contact to elig@netscape.com',0.00,0,0,16618,0,NULL,0),(2586,4048,'1999-09-22 15:37:59','There is no way to have layout do a static image on an animated gif at the\nmoment. Maybee sometime in the future we can make a switch that will stop the\nanimation.. but for the time being.. this will be a low priority.',0.00,0,1,16619,0,NULL,0),(2586,1698,'1999-10-07 15:14:59','Verified REMIND.',0.00,0,0,16620,0,NULL,0),(3140,4084,'1999-02-12 14:50:53','When catching events on top level (or in the body node) the target points at\nthe HTML node in cases it should point at BODY node. I\'ll give you an example.\n\n \n\nGives \"HTML\" when I enter a \"BODY\" part of the page.',0.00,0,1,21618,0,NULL,0),(3140,3827,'1999-04-13 14:27:59','There are compatibility issues here based on old Navigator behavior for things\nin the Body tag which reflected into the document (onload, for example).\nPushing out to M6 to give more time to resolve these.',0.00,0,1,21619,0,NULL,0),(3140,3827,'1999-05-17 18:49:59','Moving out to M7',0.00,0,0,21620,0,NULL,0),(3140,3924,'1999-07-27 05:49:59','',0.00,0,1,21621,5,'1002',0),(3140,3924,'1999-07-27 05:51:59','To create the test case (bugathon) I simply reformatted the URL that is listed\nabove (created by d96erik@dtek.chalmers.se) to reduce extraneous tags. I tested\nit both in Win95 and in Linux on the 1999/07/26 daily build, and this is still\nbroken.',0.00,0,1,21622,0,NULL,0),(3140,3827,'1999-07-27 20:14:59','Troy, can I get your comments on this? My question is what should define the\nbody of the doc? In this test, the body no larger than the textual content and\nthus you immediately mouse into the HTML area, not the BODY. If you expand the\ncontent, and therefore the body, you can then hit the body. I think the current\nbehavior may be correct.\n\nIn any case, not a pressing issue.',0.00,0,1,21623,0,NULL,0),(3140,3825,'1999-07-27 20:26:59','From the CSS perspective the BODY isn\'t special and so the events going to\nthe document element is correct. Certainly for non-HTML documents (e.g., XML)\nthat\'s what should happen\n\nThere are some places where the CSS2 spec makes concessions for HTML documents,\ne.g., the body\'s background is rendered by the HTML element (unless there\'s a\nbackground specified for the HTML element)\n\nSo I suppose you could treat events on the HTML element as associated with the\nBODY element if you wanted to. Only for HTML elements, of course. We won\'t\nconsider expanding the BODY frame, because the BODY isn\'t special and can be\neither block or inline depending on style',0.00,0,1,21624,0,NULL,0),(3140,3924,'1999-07-29 17:29:59','Even if it is the correct behavior for the HTML tag to recieve the event, why\nshould that trigger the onMouseOver on the BODY tag, with an\nevent.target.nodeName of HTML? It seems to me that if the target is HTML, the\nHTML tag should recieve the event, which it does not (See bug 10702). If the\nevent on the body tag recieves the event, shouldn\'t it have a target.nodeName of\nBODY? It seems to work that way with every other element.',0.00,0,1,21625,0,NULL,0),(3140,3827,'1999-11-04 10:15:59','Moving multiple bugs to m12',0.00,0,0,21626,0,NULL,0),(3140,3828,'1999-12-01 14:15:59','Moving to m13 because Joki seems to be distracted.',0.00,0,0,21627,0,NULL,0),(6810,4432,'1999-05-20 11:45:20','Unix printing should launch lp/lpr with a title (that banner pages get a more\nusefull info than \"job xxxx\", for example).\n\nMaybe this can be implemented by printf-Style formattings:\n%t Page title (be carefull with the charset; maybe page charset must be\nconverted to system charset, chars like \" must be escaped...)\n%f Page file (e.g. xxx.html)\n%u URL\n\n----\n\nThe default should be\nlpr -T \"%t\"\n(for BSD systems like Linux)\n\nlp -t \"%t\"\nfor Solaris (System 5 !?) OSes',0.00,0,1,50753,0,NULL,0),(6810,4144,'1999-06-30 11:27:59','This issue still occurs in the June 30th Build (1999063009).',0.00,0,0,50754,0,NULL,0),(6810,4048,'1999-08-03 07:55:59','This is just for you.',0.00,0,0,50755,0,NULL,0),(6810,4432,'1999-08-03 07:59:59','????\nWhat is for me ? And who is \"me\" ??',0.00,0,1,50756,0,NULL,0),(6810,4529,'1999-08-31 14:06:59','I\'ll look into this for M11.',0.00,0,0,50757,0,NULL,0),(6810,4432,'1999-09-24 02:29:59','What is the problem with this feature ?\n\nThe implementation should be easy:\n(java pseudo-code:)\n-- snip --\nString s = doc.getTitle();\nString cmdstring = \"lp -t \\\" + s + \"\\\";\nruntime.runCmd( cmdstring, stdin, postscriptOut, stderr );\n-- snip --\n\nThe only thing we should take care is that the title is correctly escaped that\nspecial chars won\'t be interpreted anything else than a title...',0.00,0,1,50758,0,NULL,0),(6810,3819,'1999-11-19 16:52:59','Sorry for the spam, changing QA contact on printing bugs to our new printing\ntester, Shrirang!',0.00,0,1,50759,0,NULL,0),(6810,4529,'1999-12-01 22:12:59','Mass moving these bugs to M13',0.00,0,0,50760,0,NULL,0),(6810,3682,'2000-01-12 18:48:59','Moving Syd\'s non-PDT+ bugs to M15 to indicate that he will not have time to get\nto them for Beta.',0.00,0,1,50761,0,NULL,0),(6810,4432,'2000-01-12 23:45:59','OK, then please tell me where to get the following things:\n- The current page title, e.g. something like getPageTitle()\n- A encoder which transforms the page encoding into the local encoding\nThen I\'ll write this little piece of code...',0.00,0,1,50762,0,NULL,0),(9622,4150,'1999-07-11 19:08:09','Drag in: Incoming drags need to generate proper Gecko events 2d mcafee\n0%',0.00,0,1,72571,0,NULL,0),(9622,4150,'1999-07-11 19:43:59','Mass changing all XPToolkit M9 feature \'bugs\' to target as p2 for M9',0.00,0,0,72572,0,NULL,0),(9622,4150,'1999-07-11 22:57:59','Mass changing all M9 feature \'bugs\' to \'enhancement severity.',0.00,0,0,72573,0,NULL,0),(9622,1672,'1999-07-24 02:24:59','I think we\'ve pretty much got this working.',0.00,0,0,72574,0,NULL,0),(9622,4078,'1999-07-26 14:49:59','chris, is there some way for me to verify this, or should i just mark it\nverified?',0.00,0,1,72575,0,NULL,0),(9622,1672,'1999-07-26 15:05:59','I think you should just verify it.',0.00,0,0,72576,0,NULL,0),(9622,4078,'1999-07-26 15:42:59','ok, marking verified. (thanks :)',0.00,0,0,72577,0,NULL,0),(9622,4078,'1999-07-26 15:42:59','[clearing status whiteboard]',0.00,0,0,72578,0,NULL,0),(10575,3849,'1999-09-29 09:14:59','changing QA contact to Leger since this is a tracking bug',0.00,0,0,79391,0,NULL,0),(10575,3794,'1999-09-29 16:31:59','This bug was stomped all over by rudiklm@indosat.net.id; I am undoing the\ndamage.',0.00,0,1,79392,0,NULL,0),(10575,3853,'1999-12-08 13:41:59','Updating QA Contact.',0.00,0,0,79393,0,NULL,0),(10575,1674,'1999-12-22 18:39:59','Getting rid of this old tracking bug that caused lots of unecessary\ndependencies.',0.00,0,1,79394,0,NULL,0),(11040,4410,'1999-08-01 13:34:59','I was thinking of doing this - it\'s just a matter of adding a filter action, and\ndoing a folder notification. But if someone beats me to it, that\'s fine too.',0.00,0,0,82747,0,NULL,0),(11040,1869,'1999-08-24 10:28:59','Bulk-resolving requests for enhancement as \"later\" to get them off the Seamonkey\nbug tracking radar. Even though these bugs are not \"open\" in bugzilla, we\nwelcome fixes and improvements in these areas at any time. Mail/news RFEs\ncontinue to be tracked on http://www.mozilla.org/mailnews/jobs.html',0.00,0,0,82748,0,NULL,0),(11040,1869,'1999-08-31 17:35:59','Reopen mail/news HELP WANTED bugs and reassign to nobody@mozilla.org',0.00,0,0,82749,0,NULL,0),(12911,3858,'1999-08-31 17:25:27','I\'m having a problem where my prefs are being saved in\n/builds/akkana/.mozilla/akkana/prefs.js instead of\n$HOME/.mozilla/akkana/prefs.js. I switched my home directory some time ago from\n/builds to /u, and hadn\'t realized \'til now that my prefs were still being saved\nin the old location. Where is it getting this path? Not from anything in the\nbuild tree (I pull a new tree nearly every day), and not from $HOME/.mozilla\nsince the whole problem is that it isn\'t looking there. What do I have to\nchange to get it to use $HOME the way other apps do?',0.00,0,1,96239,0,NULL,0),(12911,3822,'1999-09-02 17:18:59','The original description of this bug resolved down to a problem of using\nabsolute pathnames in the registry file. I\'m changing this bug to capture the\nidea that the registry file should store relative pathnames instead of absolute\npathnames. The pathnames should be stored relative to the directory that\ncontains the registry file and the pathname handling must be careful to rebuild\nthe absolute name correctly (i.e. the CWD must NOT be used :-)\n\nIf the user enters a pathname for the profile directory, we must detect whether\nit is an absolute or relative pathname and store/rebuild it accordingly.\n\nThe problem we\'re solving here is that on Unix the user\'s home directory was\ncopied to a new place - including the registry that still pointed to the old\nplace. At best this is confusing, at worst it would fail because the old place\ngot deleted. By using relative names, the whole problem is avoided.',0.00,0,1,96240,0,NULL,0),(12911,3853,'1999-09-13 21:15:59','Putting on [PP] list.',0.00,0,0,96241,0,NULL,0),(12911,3853,'1999-09-15 11:35:59','Removing [PP] since this is only relative to Unix.',0.00,0,0,96242,0,NULL,0),(12911,3853,'2000-01-20 09:17:59','Moving all Profile Manager bugs to new Profile Manager Backend component.\nProfile Manager component to be deleted.',0.00,0,1,96243,0,NULL,0),(13534,4412,'1999-09-09 19:33:25','I think that we should endeavour to remove REMIND and LATER from Bugzilla. I\nbelieve that they achieve more harm than good.\n\nThere are many disadvantages:\n\n(a) They can easily not appear as queries. After all, they are _unresolved_.\n(b) Effort to reopen, resulting in comments/activity which clutter the bug\nreport.\n(c) They are usually set by Netscape employees and hence imply Netscape\'s agenda\nfor what will go in. Mozilla, at least, is a open project, where anyone can\ncontribute.\n\nSo, what\'s the alternative? The obvious answer is, the milestone.\n\nRemind can already be handled by moving the bugs to a later milestone where\nthey need to get reevaluated. Remind could even get turned into a bug flag\n(see bug #11155).\n\nFor LATER, there needs to be an \"No Target\" milestone. This means that there is\ncurrently no plan for implementation, but it has been considered, and hence\nwon\'t appear on groups\' new bugs radar (ie having a blank milestone, which might\nbe renamed to \"To Be Considered\").\n\nThis would require a little modification of queries by Netscape employees to\nexclude untargetted bug reports, but they generally know how to use Bugzilla.\nIt is a lot more important that Bugzilla newbies can quickly find the issues\nthat do not have a target date and they should help out on, and point (a) can\nprevent this. This, combined with the introduction of assigning to\n\"nobody@mozilla.org\", covers all the issues that I know of.\n\nNote that this works just as well for closed or in-house projects that use\nBugzilla.',0.00,0,1,100413,0,NULL,0),(13534,3881,'1999-09-09 20:16:59','Remind and later could just be added to the milestone list (and removed\nelsewhere). This seems like a good idea.',0.00,0,1,100414,0,NULL,0),(13534,4412,'1999-09-09 23:03:59','I think remind is unnecessary, and \"No Target\" is a better, although longer name\nfor \"Later\".',0.00,0,0,100415,0,NULL,0),(13534,8444,'2000-01-16 19:09:59','Here\'s a more general solution: merge the Status and Resolution fields.\n\n* Have Status be one of {New, Assigned, Reopened, Fixed, Later, Wontfix,\n Invalid, Worksforme, Duplicate, Closed}.\n\n* Have a single `Verified\' checkbox. Whenever the bug\'s Status is changed,\n `Verified\' is unchecked, so that the new status can be verified by someone\n else (usually a QA person).\n\n* `New\' + `Verified\' == triaged. This makes things easier for people like me who\n spend time triaging bugs, to tell which bugs haven\'t been processed yet.\n\n* If `Assigned\', a bug can only be `Verified\' by the person who it is assigned\n to. This is equivalent to accepting the bug, so the `Accept bug\' control is\n no longer needed. Elegant, eh?\n\n* `Remind\' and `Later\' are nuked, as explained by matty.',0.00,0,1,100416,0,NULL,0),(13534,4403,'2000-01-16 19:54:59','I think the mpt@mailandnews.com comment is orthogonal to this bug.',0.00,0,0,100417,0,NULL,0),(13534,3794,'2000-01-17 16:27:59','Leaving this bug open, but be warned I\'m not likely to do anything about it.\n\nPeople making their own installation of bugzilla can customize away REMIND and\nLATER.',0.00,0,1,100418,0,NULL,0),(13534,4403,'2000-01-17 16:58:59','This is really a mozilla.org policy issue. What is the proper forum for\nresolving it?',0.00,0,1,100419,0,NULL,0),(13534,3794,'2000-01-17 17:01:59','You can try the netscape.public.mozilla.qa.general newsgroup.',0.00,0,0,100420,0,NULL,0),(13534,4412,'2000-01-17 19:00:59','True, but the \"No Target\"/\"To Be Determined\" milestone separation is something\nthat should be Bugzilla standard I think, and if not implemented first, the\nLATER removal will be shot down in flames.',0.00,0,1,100421,0,NULL,0),(3140,3845,'2000-01-21 13:50:58','Bulk moving [testcase] code to new testcase keyword. Sorry for the spam!',0.00,0,0,169926,0,NULL,0),(6810,10982,'2000-02-03 10:15:49','Even if I cannot get the title/URL/etc. in the script to print the page, the\npostscript code for it should contain the same information as the windows\nversion (URL, Title, Page number, Date, etc). I just don\'t get why Netscape for\nWindows has these since ever and Unix doesn\'t. It\'s not that it would be hard to\nadd this :-(',0.00,0,1,183349,0,NULL,0),(1045,4151,'2000-02-07 11:13:27','Both test cases appear to work fine now in my 7-Feb-2000 build, using \nnsViewManager2. I should be able to close this bug when final migration is \ncomplete.\n',0.00,0,1,187120,0,NULL,0),(1045,4151,'2000-02-09 12:47:00','Fixed by nsViewManager2\n',0.00,0,1,190173,0,NULL,0),(13534,4403,'2000-02-16 23:35:07','Every bug should either have a target or be closed WONTFIX. It would be \nreasonable to have a target of 5.1M1 for things not expected to be fixed in 5.0.\n',0.00,0,1,200436,0,NULL,0),(1045,4054,'2000-02-21 16:35:13','I\'m verifying this and reopening a new bug. This bug has gotten unwieldy.\nThe new bug is bug 27841.\n',0.00,0,1,205568,0,NULL,0),(1045,3881,'2000-02-21 16:53:38','No, it\'s bug 28741. :-)',0.00,0,0,205612,0,NULL,0),(1045,4054,'2000-02-21 17:18:59','Well... You knew what I meant, right? ;-)\nThanks David.\n',0.00,0,1,205665,0,NULL,0),(13534,4412,'2000-03-04 00:26:07','Every bug maybe, but what about enhancements? There are lots in this system.',0.00,0,0,219079,0,NULL,0),(13534,4412,'2000-03-04 00:27:55','MPT, one problem with your proposal is that Closed loses the\nFixed/WontFix/Invalid/etc. resolution. Have you filed this separately yet?',0.00,0,1,219080,0,NULL,0),(13534,4403,'2000-03-04 11:44:03','Enhancements without assigned resources are now regularly left open and assigned \nto nobody@mozilla.org.\n',0.00,0,0,219222,0,NULL,0),(13534,4412,'2000-03-04 18:05:39','Yes, a lot are, but not all, and I\'m not sure everyone would want to do it this\nway. If the vast majority of developers were happy with this I would be too.',0.00,0,1,219363,0,NULL,0),(13534,8444,'2000-03-04 21:06:33','matty: No, I\'m still thinking about how to represent the unverified/verified \nscheme from a user\'s point of view, in order to make it obvious what it\'s for. \nInterestingly, Bugzilla\'s the extra UNCONFIRMED status was introduced after my \nsuggestion, but it provides another example of something that could be simplified \nusing the verified/unverified scheme -- by having NEW -verified and\nNEW +verified.\n\nHowever, the simple fix for this bug is the same as I described in my earlier \nsuggestion: simply to move REMIND and LATER from the Resolution field into the \nStatus field. (I have to admit I don\'t follow the logic behind the existence of \nCLOSED -- it seems to me to be based on a fallacious assumption that bugs can\'t \npossibly regress after a particular version of the product has been shipped.)\n',0.00,0,1,219432,0,NULL,0),(384,4412,'2000-03-07 02:50:23','Verified that this was a test. No correspondence will be entered into.',0.00,0,0,221881,0,NULL,0),(13534,4412,'2000-03-08 14:41:37','Not suprisingly, I found someone the other day whose most popular votes query\ndidn\'t have REMIND and LATER.',0.00,0,1,224456,0,NULL,0),(1046,9018,'2000-03-27 15:02:36','Letterspacing is defined as space between characters, but that doesn\'t include \nspaces, does it? \nCurrently, letterspacing is (effectively) added to the space between words.\nAlso, trailing letterspacing affects whether a word fits on a line and the width \nof a line. IMO, this should not be so.\n\n(See attachment.)',0.00,0,1,243674,0,NULL,0),(1046,9018,'2000-03-27 15:05:45','',0.00,0,1,243675,5,'6996',0),(3140,3827,'2000-04-04 12:22:28','Mass-moving bugs out of M15 that I won\'t get to. Will refit individual \nmilestones after moving them.',0.00,0,1,250600,0,NULL,0),(6810,3682,'2000-04-06 14:21:47','Moving to M20\n',0.00,0,1,254909,0,NULL,0),(6810,4432,'2000-04-07 04:55:03','To digulla@hepe.com: Printing banner (info), page number etc. is the job of the\nprint system and should not be part of Mozilla itself. \nIn Unix/X11 the Xprt (X print server) or a special filter in the lp-printsystem\nwould be the location where to \"enable\" page count/number printing...',0.00,0,1,255673,0,NULL,0),(1046,3828,'2000-04-07 14:39:18','non-essential for m16',0.00,0,0,256342,0,NULL,0),(1157,12902,'2000-04-08 04:33:36','don\'t know if linux is supposed to be able to do avi files, since there is no\nplace i can specify which app to use for it, but clicking on a link to an avi\nfile crashes build ID 2000040708. Expected functionality in this case - IF no\nplayer was defined - would be a request to download the file, i believe.\n-\nHow to reproduce:\nWent to http://www.wapland.no/art/450.html\nClicked link millennium.avi (about middle down the page)\nThis happens:\nDocument http://www.wapland.no/art/450.html loaded successfully\nDocument: Done (12.044 secs)\nError loading URL http://www.wapland.no/art/450.html \nDocument: Done (3.454 secs)\n\nProgram received signal SIGSEGV, Segmentation fault.\n0x40b73156 in NSGetModule ()\n(gdb) bt\n#0 0x40b73156 in NSGetModule ()\n#1 0x40ba853f in NSGetModule ()\n#2 0x40eb0d18 in NSGetModule ()\n#3 0x40ebe9ba in NSGetModule ()\n#4 0x40eaf87d in NSGetModule ()\n#5 0x4048f00a in nsWidget::DispatchEvent ()\n#6 0x4048ef35 in nsWidget::DispatchWindowEvent ()\n#7 0x4048efaa in nsWidget::DispatchFocus ()\n#8 0x404934c4 in nsWindow::SetFocus ()\n#9 0x401ea5f6 in GlobalWindowImpl::Focus ()\n#10 0x404273ab in NSGetModule ()\n#11 0x4048f00a in nsWidget::DispatchEvent ()\n#12 0x40495641 in handle_toplevel_focus_in ()\n#13 0x40545809 in gtk_marshal_BOOL__POINTER ()\n#14 0x4057333d in gtk_handlers_run ()\n#15 0x40572782 in gtk_signal_real_emit ()\n#16 0x405708d5 in gtk_signal_emit ()\n#17 0x405a5c9c in gtk_widget_event ()\n#18 0x40544a5a in gtk_main_do_event ()\n#19 0x404885e8 in handle_gdk_event ()\n#20 0x405eefcb in gdk_event_dispatch ()\n#21 0x4061cf96 in g_main_dispatch ()\n#22 0x4061d561 in g_main_iterate ()\n#23 0x4061d701 in g_main_run ()\n#24 0x405442f9 in gtk_main ()\n#25 0x40481e0a in nsAppShell::Run ()\n#26 0x4042563a in NSGetModule ()\n#27 0x804b20c in JS_PushArguments ()\n#28 0x804b523 in JS_PushArguments ()\n#29 0x40300a1b in __libc_start_main (main=0x804b3a0 ,\nargc=1, argv=0xbffffa34, \n init=0x804938c <_init>, fini=0x804c284 <_fini>, rtld_fini=0x4000ae60\n<_dl_fini>, stack_end=0xbffffa2c)\n at ../sysdeps/generic/libc-start.c:92\n(gdb) \n\n',0.00,0,1,257100,0,NULL,0),(6810,10982,'2000-04-10 01:26:28','So that\'s why Unix and Windows printouts differ: Mozilla just passes this\ninformation to the Windows printer and omits it on Unix. In that case, you\nreally have to put these information into ENV variables or replace specific\nparts of the commandline (as suggested in the first post in this thread).',0.00,0,1,258119,0,NULL,0),(13534,3794,'2000-04-13 07:36:34','tara@tequilarista.org is the new owner of Bugzilla and Bonsai. (For details,\nsee my posting in netscape.public.mozilla.webtools,\nnews://news.mozilla.org/38F5D90D.F40E8C1A%40geocast.com .)',0.00,0,1,262321,0,NULL,0),(10575,7298,'2000-04-24 15:35:48','Sorry for the spam. changing qa contact.',0.00,0,0,272461,0,NULL,0),(10575,8793,'2000-04-24 15:52:02','verif.',0.00,0,1,272520,0,NULL,0),(2586,4054,'2000-05-20 15:00:47','Reopening and marking Future.\n\nIt would be nice to get this fixed, though. Animated GIFs in a print preview\nis quite silly...',0.00,0,1,301396,0,NULL,0),(2586,1749,'2000-05-21 09:29:02','Someone is working on flags to control gif animations which should be useable \nfor this bug (see bug 33810). This is to be able to control animations in the \neditor (see bug 14768) where they don\'t want animations either. I\'ll mark this \nbug as dependent on that so that the solution they used can be copied to the \nprint preview.\n',0.00,0,1,301742,0,NULL,0),(2586,4048,'2000-05-21 19:41:27','There are no API\'s to do this, will give this to Pam Nunn.. I suggest a remind \nsince I don\'t think this is a high priority for this release.',0.00,0,1,301947,0,NULL,0),(2586,1681,'2000-05-22 11:42:54','Don:\n\nAs of last week you can set \'animation controls\' from\nnsPresContext. The editor folk needed it too.\n\n\nGo to nsIFrameImageLoader.h \nHere are the possible settings:\n\nenum nsImageAnimation {\n eImageAnimation_Normal = 0, // looping controlled by image\n eImageAnimation_None = 1, // don\'t loop; just show first frame\n eImageAnimation_LoopOnce = 2 // loop just once\n};\n\nIn image lib the control field (for now) is\nic->animate_request.\n\nTo set it from nsPresContext, take a look at\nmozilla/layout/base/src/nsPresContext.cpp ~line 941\nwhere loader->init() is called in nsPresContext::StartLoadImage().\n\nReassigning to you, since you know where the \nprint stuff should be hooked up.\nCall me if you need to know more...\n-Pam\n\n',0.00,0,1,302403,0,NULL,0),(12911,4423,'2000-05-31 14:15:28','Reassigning to myself. Moving to M20.',0.00,0,0,313637,0,NULL,0),(1046,3845,'2000-06-05 14:42:49','I\'ve asked dbaron to research what the \"Right Thing\" really is for this bug. \nOnce we know that, we can figure out what to do for FCS.',0.00,0,1,318359,0,NULL,0),(1157,15928,'2000-06-11 01:09:40','I\'m still getting the problem on the Linux 2000060908 build. The URL is\nhttp:\n//www.nizkor.org/ftp.cgi/r/people/z/zundel.ernst/Yecheskeli_Interview/Zundel-\nTsadok-001.avi\n\nThe stack trace I get is:\n\n0x2b6fd5c2 in NSGetModule ()\n(gdb) where\n#0 0x2b6fd5c2 in NSGetModule ()\n#1 0x2b737111 in NSGetModule ()\n#2 0x2b73701f in NSGetModule ()\n#3 0x2bae5825 in NSGetModule ()\n#4 0x2baf394a in NSGetModule ()\n#5 0x2bae444d in NSGetModule ()\n#6 0x2b05d5ca in NSGetModule ()\n#7 0x2b05d4ed in NSGetModule ()\n#8 0x2b05d569 in NSGetModule ()\n#9 0x2b061c2f in NSGetModule ()\n#10 0x2ae7a00e in GlobalWindowImpl::Focus ()\n#11 0x2ae30d2b in NSGetModule ()\n#12 0x2b05d5ca in NSGetModule ()\n#13 0x2b064195 in NSGetModule ()\n#14 0x2b1176cf in gtk_marshal_BOOL__POINTER ()\n#15 0x2b1489a8 in gtk_handlers_run ()\n#16 0x2b147d7f in gtk_signal_real_emit ()\n#17 0x2b145d37 in gtk_signal_emit ()\n#18 0x2b17e61c in gtk_widget_event ()\n#19 0x2b1873cb in gtk_window_real_set_focus ()\n#20 0x2b11795b in gtk_marshal_NONE__POINTER ()\n#21 0x2b147dbd in gtk_signal_real_emit ()\n#22 0x2b145d37 in gtk_signal_emit ()\n#23 0x2b18464e in gtk_window_set_focus ()\n#24 0x2b17f14a in gtk_widget_real_grab_focus ()\n#25 0x2b117b63 in gtk_marshal_NONE__NONE ()\n#26 0x2b147dbd in gtk_signal_real_emit ()\n#27 0x2b145d37 in gtk_signal_emit ()\n#28 0x2b17ef98 in gtk_widget_grab_focus ()\n#29 0x2b0640b2 in NSGetModule ()\n#30 0x2b1176cf in gtk_marshal_BOOL__POINTER ()\n#31 0x2b1489a8 in gtk_handlers_run ()\n#32 0x2b147d7f in gtk_signal_real_emit ()\n#33 0x2b145d37 in gtk_signal_emit ()\n#34 0x2b17e61c in gtk_widget_event ()\n#35 0x2b1167bb in gtk_main_do_event ()\n#36 0x2b0587c8 in NSGetModule ()\n#37 0x2b1c85a4 in gdk_event_dispatch ()\n#38 0x2b1f3f96 in g_main_dispatch ()\n#39 0x2b1f4561 in g_main_iterate ()\n#40 0x2b1f4701 in g_main_run ()\n#41 0x2b115fdc in gtk_main ()\n#42 0x2b05146c in NSGetModule ()\n#43 0x2ae2ee3a in NSGetModule ()\n#44 0x804d207 in JS_PushArguments ()\n#45 0x804d60d in JS_PushArguments ()\n#46 0x2acf0fb3 in __libc_start_main (main=0x804d508 ,\nargc=1, argv=0x7ffff924, init=0x804a77c <_init>, fini=0x8051d28 <_fini>,\nrtld_fini=0x2aab55d0 <_dl_fini>, stack_end=0x7ffff91c)\nat ../sysdeps/generic/libc-start.c:78\n',0.00,0,1,325666,0,NULL,0),(1046,4126,'2000-06-12 04:05:11','This bug has been marked \"future\" because the original netscape engineer working \non this is over-burdened. If you feel this is an error, that you or another known \nresource will be working on this bug, or if it blocks your work in some way -- \nplease attach your concern to the bug for reconsideration. \n\n',0.00,0,0,326148,0,NULL,0),(1046,3845,'2000-06-14 18:23:51','Marking nsbeta3 for tracking. Recc. nsbeta3+. This is a CSS1 W3C Official \nTest Suite bug. Have asked dbaron to investigate this issue and try to determine \nwhat the Right Thing is, then we need to see if we can do it.',0.00,0,1,330009,0,NULL,0),(1046,3881,'2000-06-14 22:19:41','',0.00,0,1,330147,5,'10171',0),(1046,3881,'2000-06-14 22:21:14','The above testcase (which shows that we are doing deltas from normal, rather \nthan values, which I don\'t like but is what the spec says), along with:\nhttp://www.w3.org/Style/CSS/Test/current/sec541.htm\nhttp://www.w3.org/Style/CSS/Test/current/sec542.htm\nshow that our behavior is correct except possibly for the issue mentioned by \nfantasai@escape.com above. I will raise this on www-style.',0.00,0,1,330150,0,NULL,0),(1046,3881,'2000-06-14 22:44:41','I take that back. I think the remaining issues are the following:\n * How does \'letter-spacing\' apply at word gaps? Should it:\n + not apply\n + apply once\n + apply twice (once on each side of space)\n * What happens where \'letter-spacing\' and \'word-spacing\' change? Should it \nwork like collapsed margins, as Matthew Brealey proposed in \nhttp://lists.w3.org/Archives/Public/www-style/1999Nov/0237.html ? Do we care?',0.00,0,1,330162,0,NULL,0),(1046,4126,'2000-06-16 02:46:58','We should apply letter-spacing twice at word-gaps like MacIE5 does. It preserves \nthe legibility of the text when letter-spacing becomes larger than the normal \nword-spacing.\n\nIn the 2 lines below, letter-spacing is 3 times the width of the space. In the \nfirst line, it is applied once between words; in the second one, it is applied \ntwice.\n\n g a p s a r e n o t v i s i b l e\n\n g a p s a r e v i s i b l e\n\nReassigned to erik who is taking care of Text Layout. Changed the summary line to \n\"letter-spacing should apply on space characters too\". Reset the milestone from \n\"future\" to M20 because of nsbeta3 nomination.\n',0.00,0,0,331750,0,NULL,0),(1046,4126,'2000-06-16 02:48:53','',0.00,0,1,331751,5,'10238',0),(3140,12990,'2000-06-21 13:39:05','M16 has been out for a while now, these bugs target milestones need to be \nupdated.',0.00,0,1,336860,0,NULL,0),(3140,3827,'2000-06-26 21:45:34','Adding [DOM] prefix to bugs related to DOM Level 0, 1, or 2 \ncompatibility/compliance.',0.00,0,1,342479,0,NULL,0),(3140,3827,'2000-06-27 18:47:39','Updating Milestone to M18.',0.00,0,0,343640,0,NULL,0),(1046,3845,'2000-07-20 11:18:59','correctness of compliance with official W3C CSS1 test suite. Passing this is a\nkey product goal. Test suite results will be closely watched by reviewers.\nPlease approve for nsbeta3.',0.00,0,1,363985,0,NULL,0),(12911,4423,'2000-07-24 19:19:13','I need to examine the registry and debug this further.\n\nIf the directory doesn\'t exists (say deleted), we recreate the directory\ndepending on the path we get from the registry and launch the browser...we don\'t\ncrash.\n\nAfter finding the actual work involved, I will consider nominating this for nsbeta3.\n',0.00,0,1,368254,0,NULL,0),(3140,4120,'2000-08-09 16:31:46','PDT: Nominating nsbeta3+. Standards Compliance.',0.00,0,0,388191,0,NULL,0),(3140,4030,'2000-08-09 16:47:37','I am the virtual joki.',0.00,0,0,388230,0,NULL,0),(3140,4030,'2000-08-09 17:22:46','Per discusion with Nisheeth, marking nsbeta3+. Will email ekrock to verify.',0.00,0,0,388315,0,NULL,0),(1046,1904,'2000-08-15 15:04:27','mark nsbeta3+ P2 per bug meeting (ekrock)',0.00,0,0,395091,0,NULL,0),(3140,4030,'2000-08-15 16:45:06','Bug triage with nisheeth & ekrock: nsbeta3-. Adding relnote3 keyword.',0.00,0,0,395406,0,NULL,0),(3140,4030,'2000-08-15 17:17:56','This bug has been marked \"future\" because the original netscape engineer working \non this is over-burdened. If you feel this is an error, that you or another\nknown resource will be working on this bug,or if it blocks your work in some way \n-- please attach your concern to the bug for reconsideration.',0.00,0,0,395494,0,NULL,0),(1046,4126,'2000-08-17 08:42:43','Marking M18 because it\'s been approved for beta3\n',0.00,0,1,397450,0,NULL,0),(1046,16235,'2000-08-24 14:23:01','Adding buster to cc: list.',0.00,0,0,406383,0,NULL,0),(1046,1904,'2000-08-29 16:19:48','mark it as P4. shanjian, can you help to look at this bug ?',0.00,0,0,412014,0,NULL,0),(1046,3845,'2000-08-29 18:12:03','Marking [nsbeta3-] and Future because Netscape engineering is overburdened. \nLetter spacing on space characters is frankly a rather obscure issue. Will \ndocument this as a known issue in release notes. Please feel free to note your \nconcerns or objections, but please don\'t clear nsbeta3- unless you are \ncommitting to accept the bug and implement the fix yourself in the nsbeta3 \ntimeframe.',0.00,0,1,412246,0,NULL,0),(1046,3881,'2000-08-29 18:19:25','For the record, letter-spacing on space characters isn\'t an obscure issue. It\nmakes letter-spacing look horrible on any multi-word text. The workaround is to\nuse word-spacing, but then once the bug is fixed it will look horrible on any\npages with that workaround.',0.00,0,1,412262,0,NULL,0),(1869,3845,'2000-08-30 19:06:53','Moving all [LAYER] bugs to Evangelism component for tracking and open-source\nevangelism by mozilla community members of sites that need to upgrade to support \nweb standards such as HTML 4.0 (instead of LAYER/ILAYER) and the W3C DOM\n(instead of Nav4 document.layers[] or IE document.all()). Sites should be\nlobbied to do the upgrade using the email templates that are linked to from\nhttp://www.mozilla.org/newlayout/bugathon.html#layerbugs . When a site\'s owner\nhas confirmed receipt of the message requesting an upgrade, the bug should be\nmarked with the keyword evangelized to indicate that evangelism for that bug is\ncomplete. When the site finishes the upgrade and supports standards, the bug\nshould be closed.',0.00,0,1,413896,0,NULL,0),(1869,3845,'2000-08-30 19:48:36','Marking bug evangelized and clearing cc:s.',0.00,0,0,413960,0,NULL,0),(1869,3845,'2000-08-30 19:50:57','Reopening to register fact that this page isn\'t yet upgraded (until it is, at \nwhich point we\'ll close the bug).',0.00,0,1,413963,0,NULL,0),(1869,15368,'2000-08-31 20:32:15','SPAM:Changing QA contact on 111 evang bugs as I am now the new QA contact for \nthis component.\n\nSorry about the spam\n\nzach',0.00,0,1,415793,0,NULL,0),(1869,13548,'2000-08-31 22:21:13','Reassigning Evangelism bugs to me, the component\'s new owner. I would like to \ntake this opportunity to thank nobody@mozilla.org for all of his dedication, \ncontributions, and hard work, and wish him luck at his new job. Thanks, nobody.',0.00,0,1,415967,0,NULL,0),(1046,3845,'2000-09-01 10:55:43','Possible hack workaround I thought of: since letter spacing on characters works \nbut space characters doesn\'t, if you want to create the visual appearance of \nspaces but have letter spacing work correctly, simulate spaces by surrounding a \nnon-space character (e.g. an \"a\" or an \"m\" or a \"_\" or something) with a SPAN \nand set STYLE=\"visibility:hidden\" on the SPAN. If the enclosure within the SPAN \ndoesn\'t change how spacing is calculated, that ought to work both in the \ninitial release with the bug and future releases without it. If anyone has a \nsecond to test this and confirm this idea that would be great!',0.00,0,0,416360,0,NULL,0),(1869,15368,'2000-09-04 10:02:09','Removing the evangwanted keyword from 49 evangilizm bugs that also \nhave the evangelized keyword. Having both of these keywords on a bug \nmakes it really hard to do a query for all open evangilizm bugs that are \nevangwanted. Sorry for the spam.',0.00,0,1,418545,0,NULL,0),(1869,15368,'2000-09-08 16:57:23','Sorry about this problem. I somehow screwed up the keyword changes. \nSorry about this spam.',0.00,0,1,425155,0,NULL,0),(1046,3881,'2000-09-22 20:03:51','That workaround won\'t work on any browsers that don\'t support CSS2\'s visibility \nproperty. We also shouldn\'t expect authors to do things that messy.\n',0.00,0,0,444557,0,NULL,0),(13534,11608,'2000-09-26 09:56:05','To fix this, query for *browser* bugs marked as remind/later and click \"change \nseveral bugs at once\", select the \"future\" milestone, and add a comment \nlike \"replacing remind/later resolutions with future milestone.\" Then do \nsimilar things for other products, which have different milestone systems.',0.00,0,1,448052,0,NULL,0),(1046,4054,'2000-09-27 16:59:30','This bug basically kills \'letter-spacing\' for multi-word spans. I would \nrecommend removing support for this property altogether if we do not fix it.\n\nIf nothing is done then:\n\nRELEASE NOTE ITEM:\n Netscape 6 does not support the CSS \'letter-spacing\' property correctly when \n applied to spaces. Work around: Do not use \'letter-spacing\' to affect any \n multi-word phrases in any of your documents until such time as Netscape 6 is\n no longer in use (probably some time in 2004).',0.00,0,1,451831,0,NULL,0),(1046,3845,'2000-09-27 21:30:39','No, documentation group, do *not* put the above text into the release notes, \nit\'s a complete overreaction. We should document the problem and my hack \nworkaround instead. See me for details; I\'ll supply appropriate text. \n\nIan: I applaud your passion for standards compliance, but let\'s please try to \nkeep things in proper perspective. The tone of that proposed text was simply \ninappropriate for release notes. We\'re talking about a problem with *spacing* \nfor the first release; the text can still be read. If authors are really steamed \nabout this, they can client-sniff and tell folks to upgrade to Netscape 6.0x or \n6.x that fixes this or to use IE. This bug is *nothing* like the Nav4 CSS1 \n*crash* bugs that so hampered adoption of CSS on the web. Is the glass 0.5% \nempty or 99.5% full? And does any other browser support this many standards this \ndeeply simultaneously across platforms? No. It is not the few-and-far-between \nflaws in standards compliance of Netscape 6 that will be holding back the \nusability of standards; it is overwhelmingly the yawning holes of IE5.5 Win and \nIE5 Mac.\n\nDavid: Since Nav4+ and IE4+ and Opera 4+ support visibility, that covers the \noverwhelming majority of current browser users. They can use the workaround, \naccept the bug in the first release, or not use the feature; their call.',0.00,0,1,452361,0,NULL,0),(1046,3881,'2000-09-28 07:04:38','I agree with Ian\'s proposal. Eric\'s workaround is inappropriate and will mess\nup lots of other user-agents (for example, non-CSS browsers, browsers with CSS\nor author styles turned off, CSS1 browsers that don\'t support CSS2\'s visibility\nproperty, search engines, etc.).',0.00,0,1,452687,0,NULL,0),(1046,4126,'2000-09-28 08:09:16','Reassigned to myself, I have a fix:\n\nIndex: nsTextFrame.cpp\n===================================================================\nRCS file: /m/pub/mozilla/layout/html/base/src/nsTextFrame.cpp,v\nretrieving revision 1.276\ndiff -r1.276 nsTextFrame.cpp\n543a544,545\n> mWordSpacing += mLetterSpacing; // bug 1046\n> \n',0.00,0,1,452739,0,NULL,0),(1046,3829,'2000-09-28 08:46:21','looks fine, a=buster',0.00,0,0,452792,0,NULL,0),(1046,3845,'2000-09-28 11:05:47','Thank God, a fix! (Actually, thank Pierre! ;-> ) I strongly endorse for RTM. \nNote that this is extremely high profile standards compliance. It\'s a test where \nGecko is failing and IE5 Mac is succeeding on the W3C CSS1 Standards Compliance \ntest suite--the only standard for which an official W3C-blessed test suite \nexists.\n\nDavid, Ian: to help us make the case to PDT, would you please summarize as a \nlist of bullet points the impact of *not* accepting this fix? Points to note: \nretard ability of content developers to use feature going forward, the fact that \nworkarounds won\'t then be forwardly compatible with a fixed version, \naccessibility, etc.\n\nPierre: am I right in thinking that this fix is very low-risk?',0.00,0,1,452992,0,NULL,0),(1046,4054,'2000-09-28 14:37:49','Thanks Pierre.\n\nPDT: Eric summmed it up quite well.\n * High profile CSS1 test suite bug.\n * Relatively low risk (one line fix)\n * Improves readability/accessibility of any page using this property\n * Bug would cause headaches for any web author trying to migrate to CSS\n * No usable workaround exists\n\nI t m a k e s t h e d i f f e r e n c e b e t w e e n t e x t \ns p a c e d l i k e t h i s a n d t e x t s p a c e d l i k e t h i s.',0.00,0,1,453527,0,NULL,0),(1046,178851,'2000-09-29 10:30:47','Looks good to me to. r=erik',0.00,0,0,454988,0,NULL,0),(1046,3823,'2000-09-29 13:55:47','Adding rtm+. This is css1 compliance and low risk.',0.00,0,0,455491,0,NULL,0),(1046,1728,'2000-10-02 16:46:35','Marking rtm++. Let\'s get this one checked into the branch.\n',0.00,0,1,458295,0,NULL,0),(1046,4126,'2000-10-09 01:48:32','Fix checked in nsTextFrame.cpp (trunk + Netscape_20000922_BRANCH).\n',0.00,0,1,466759,0,NULL,0),(1046,4110,'2000-10-11 17:43:20','Using Pierre\'s 6/16 textcase, verified fixed on Win, Mac and Linux with 10_11 \nbranch build. Added vtrunk keyword.',0.00,0,1,471968,0,NULL,0),(1046,5003,'2000-10-17 15:37:10','This testcase seems to be fine for Mozilla win32 and Mac builds on the trunk\n(101704) but it fails for me on trunk (101708) and trunk (101712) linux builds.\n\n',0.00,0,1,480296,0,NULL,0),(6810,4529,'2000-10-23 17:22:43','assigning to kevin ',0.00,0,0,487694,0,NULL,0),(6810,3831,'2000-10-25 17:32:47','Reassigning to waqar',0.00,0,0,491404,0,NULL,0),(1046,4113,'2000-10-31 09:56:26','The testcase worksforme with the 10/31 Linux trunk build.',0.00,0,0,497195,0,NULL,0),(1046,4110,'2000-11-02 12:18:35','Marking verified as it has been tested successfully for fix on branch and trunk\nbuilds across platform',0.00,0,1,500722,0,NULL,0),(3140,4030,'2000-11-07 13:54:41','Sending most of my events bugs to joki.',0.00,0,0,506431,0,NULL,0),(1869,13548,'2000-11-17 17:06:02','Site has been evangelized.',0.00,0,0,515087,0,NULL,0),(12911,4423,'2000-12-04 18:29:48','Doing a mass reassign to Conrad Carlen.\n\nConrad is going address all current and upcoming profile manager issues. Please\ndo not hesitate to involve me in any of the issues.',0.00,0,1,526417,0,NULL,0),(12911,18780,'2000-12-11 10:10:12','We could use an object that represents an XP relative file spec. If the file\nspec is truly XP, the only way to do it is relative. We could make the file\nrelative not to the registry but to any key defined by nsIDirectoryService that\nis defined on all platforms (most of them). Then, we store a flattened\nrepresentation of this object in the registry. It\'s more complex than that\nthough - all files which were stored in prefs, etc, would have to use this\ntechnique. If we had an XP way to specify relative files, you could even use\n(copy) the same profile from one platform to another (yea!) as well as just move\nyour home dir on Unix. Making this object should go to the XPCOM folks though.',0.00,0,1,531520,0,NULL,0),(12911,18780,'2000-12-19 05:32:30','*** Bug 63204 has been marked as a duplicate of this bug. ***',0.00,0,0,539315,0,NULL,0),(3140,3847,'2001-01-11 17:10:53','Nominating for nsbeta1\n',0.00,0,1,561141,0,NULL,0),(13534,4412,'2001-01-12 07:02:10','I\'d like to see this happen in 2.12 for new installations. I don\'t expect it\'d\nbe much effort. I\'d like it if other installations don\'t repeat mozilla.org\'s\nmistakes.',0.00,0,1,561659,0,NULL,0),(13534,10297,'2001-01-17 18:53:07','bugzilla.mozilla.org currently has 239 bugs that still have REMIND or LATER \nresolutions. Do we need to force them to fix those before this gets implemented?\nAre they willing to do it this way?\n',0.00,0,1,567925,0,NULL,0),(13534,4897,'2001-01-17 19:58:31','This one is a bit of a pain to change being that it\'s an enum. I suppose we \ncould just change the line at:\nhttp://lxr.mozilla.org/mozilla/source/webtools/bugzilla/checksetup.pl#626\n\nREMIND also shows up at:\nhttp://lxr.mozilla.org/mozilla/source/webtools/bugzilla/checksetup.pl#1638\n(where the UNCONFIRMED status gets added). I haven\'t looked at this second \nchunk of code to see what impact removing REMIND and LATER from it would have. \n\nChanging the first line shouldn\'t have any ill side effects (as it is only run \nif the \"bugs\" table doesn\'t exist.',0.00,0,1,567952,0,NULL,0),(13534,4412,'2001-01-17 23:10:52','I wanted to change this for the default setting, not for existing installations,\nso it shouldn\'t matter what mozilla.org is doing.\n\nI don\'t know of any systems that use this other than mozilla.org (who are\nphasing it out), which suggests that:\n\n(a) some installations know it\'s unnecessary and remove it\n(b) the rest don\'t need it anyway and we shouldn\'t encourage them to do so\n\nWrt the effort required to change this, I would have thought it would be easier,\nbut it seems maybe it isn\'t if it\'s in code, although if it\'s only in\nchecksetup.pl it might be easy - I can\'t tell.\n\nWe might want to let this slide for 2.12, and at some stage should let\nresolutions be specified by the admin (in a table) rather than hardcoded.',0.00,0,0,568044,0,NULL,0),(13534,11345,'2001-01-18 11:09:55','definitely not for 2.12 at this point',0.00,0,0,568555,0,NULL,0),(12911,8020,'2001-01-31 02:06:09','wow, this is an old bug',0.00,0,0,582423,0,NULL,0),(6810,7298,'2001-01-31 20:13:57','spam : changing qa to sujay (new qa contact for Printing)',0.00,0,0,583744,0,NULL,0),(67742,24936,'2001-02-05 19:01:26','From Bugzilla Helper:\nUser-Agent: Mozilla/5.0 (X11; U; SunOS 5.7 sun4u; en-US; m18) Gecko/20010204\nBuildID: 2001020409\n\n\n\nReproducible: Always\nSteps to Reproduce:\n1.start mozilla\n2.go to https://www.fortify.net/sslcheck.html\n3.Observe error\n\nActual Results: Error loading URL https://www.fortify.net/sslcheck.html:\n804b0033 shows up in terminal that mozilla was started from. The browser makes\nno further effort to load page\n\nExpected Results: Should have loaded page\n\nThe good fellows at #mozcrypto helped me deduce that the psm module isn\'t being\ncompiled into the nightly build on Solaris (no start-psm, libpsmglue.so, etc)\n\nIs it broken in solaris or is it something else?',0.00,0,1,589315,0,NULL,0),(67742,18534,'2001-02-06 00:52:21','I built mozilla from CVS today from scratch. No leftovers from previous builds,\nnot even a ~/.mozilla/ directory. I get the same error on https sites, so I\nsuspect something is missing in some Makefiles. This is on Linux.',0.00,0,1,589588,0,NULL,0),(67742,4113,'2001-02-06 08:27:16','Reassigning',0.00,0,1,589788,0,NULL,0),(67742,11097,'2001-02-06 10:26:02','leaf:\n\nWho\'s the right person to get in touch with about this?\n\nAndreas, if you want to build PSM, follow the instructions at:\nhttp://www.mozilla.org/projects/security/pki/psm/buildpsm.html',0.00,0,1,589965,0,NULL,0),(67742,4016,'2001-02-06 17:11:01','first question: does it build? =)\ni can pretty easily add it to the build automation for solaris, provided it\nbuilds the same way as it does on linux.',0.00,0,1,590748,0,NULL,0),(67742,11097,'2001-02-06 17:17:15','I haven\'t been able to build Mozilla on a solaris box in ages. It always barfs \nin layout during the link phase.\n\nSolaris was a supported platform back in the days of Communicator 4.7x support, \nso the trunk should still build on Solaris.\n\nSo, I can\'t 100% guarantee that it builds, but I\'m fairly confident that it will \nbuild.',0.00,0,0,590765,0,NULL,0),(67742,18534,'2001-02-06 20:13:31','Javier, why do I have to go through the PSM build page, then NSS build page, and\nfinally end up with multiple build options? I would expect that \'gmake -f\nclient.mk\' builds the same mozilla as the nightlies are. If it doesn\'t, \nit should be explained in http://www.mozilla.org/build/unix.html. Or there\nshould be a link to the script used to build the nightlies.',0.00,0,0,590988,0,NULL,0),(67742,24936,'2001-02-07 08:38:08','I second that motion. When I tried to build from source I got lost somewhere in\nthere and had to delete my entire tree because \"make clean\" wouldn\'t work\nanymore :(',0.00,0,1,591496,0,NULL,0),(67742,11097,'2001-02-07 10:08:02','You don\'t have to build NSS as a step in building PSM.\n\nFrom your top level build directory you run\n\nconfigure --enable-modules=psm\ngmake BUILD_MODULES=psm\n\nand that\'s pretty much it. I don\'t know where you got the idea to go build NSS\nfirst. The web page doesn\'t tell you to do that.',0.00,0,1,591615,0,NULL,0),(67742,4424,'2001-02-07 11:02:47','cc\'ing jdunn since he\'s the OEM ports guru. We currently do not build PSM in\nthe Solaris verification builds as far as I know.',0.00,0,1,591714,0,NULL,0),(67742,18534,'2001-02-07 11:35:52','Javier, the first thing I tried, was exactly what you say:\n\n% ./configure --enable-module=psm\nAdding configure options from /home/k/.mozconfig:\n --enable-idltool\n --enable-svg\nloading cache ./config.cache\nchecking host system type... i686-pc-linux-gnu\nchecking target system type... i686-pc-linux-gnu\n[...further output omitted...]\n% make BUILD_MODULES=psm\nmake: *** No rule to make target `security/Makefile.in\', needed by\n`security/Makefile\'. Stop.\nzsh: exit 2 make BUILD_MODULES=psm\n\n\nSo I carefully reread the first sentence on\nhttp://www.mozilla.org/projects/security/pki/psm/buildpsm.html, and it says:\n\nThese instructions also assume you have a completed NSS build tree.\n',0.00,0,1,591803,0,NULL,0),(67742,3117,'2001-02-07 11:54:36','\nMargaret Chan (sun) is looking at PSM on the trunk.\nShe has a couple of diffs already that she feels is needed\nto get PSM working on solaris.\n\nHowever, you are running into a different problem here.\nI will give solaris is a try to see what I find...\n\nthe configure --enable-psm should have generated the makefile\nin security... not sure why it didn\'t. Is there anything in\nthe config.log?\n\n\n',0.00,0,1,591841,0,NULL,0),(67742,11021,'2001-02-07 12:27:35','Jim has pointed out this bug to me.\n\nI had successfully built psm with the tip of the trunk on my Solaris 8 box\nusing gcc2.95.2. That was about 2 weeks ago. I have to add some ifdef in the\npsm/server/Makefile to make it build because it seems to assume that I will\nalways use Sun\'s Compiler, which I don\'t at the moment. We are still in the\nprocess of building it on other Solaris platforms.\nI had been using a slightly different approach to build it however. See\nbelow:\n\nsetenv NO_MDUPDATE 1\nsetenv BUILD_OFFICIAL 1\nsetenv NS_USE_GCC 1\ngmake -f client.mk checkout BUILD_MODULES=psm\ngmake -f client.mk build BUILD_MODULES=psm\n\nI have not got the time to build it by feeding the enable option into\nconfigure, so I don\'t know if I will have any problem with that.\nI will post out the diffs of the Makefile changes later. However, I think\nthat my change will only affect building on Solaris using gcc. If the\nnightlies are built using Sun\'s Compiler, then that makefile should work.\n ',0.00,0,1,591886,0,NULL,0),(67742,11021,'2001-02-07 12:35:19','Would that make a difference if the --enable-module=psm is put inside\nthe .mozconfig file, i.e.,\n\n --enable-idltool\n --enable-svg\n --enable-module=psm\n\nSorry if it is an ignorant question because I am not keeping up-to-date as\nto what configure will pick up if you have the command line option and\na .mozconfig file.',0.00,0,1,591902,0,NULL,0),(67742,18534,'2001-02-07 20:11:36','If I add\n ac_add_options --enable-module=psm\nto ~/.mozconfig and then run\n gmake -f client.mk build\nthen the resulting mozilla does not connect to https either. If I try\n gmake -f client.mk BUILD_MODULES=psm\nthen I get a mozilla that cannot start up. Instead it says\n ./mozilla-bin: error in loading shared libraries:\n /home/k/bin/moz/mozilla-20010205/mozilla/dist/bin/components/libnecko.so:\n undefined symbol: Left__C8nsStringR8nsStringi\nIf I run\n ./configure --enable-module=psm\n gmake -f client.mk BUILD_MODULES=psm build\nthen I get the same error. If I try\n make BUILD_MODULES=psm\nthen I get the same error.\n\nThe config.log reports four fails: one for sizeof(long), two for \"nspr.h: No\nsuch file or directory\", and one for PNG_LIBPNG_VER.\n\nI\'m ready to try other suggestions. But still I consider it a bug that the\ndefault build is without PSM. The default build should be the same as the\nnightlies.',0.00,0,1,592680,0,NULL,0),(67742,4016,'2001-02-07 21:29:20','it was decided to have it off by default to shield third party distributors of\nbinaries and source from possible breach of export restriction (any change to\nthe source must be reported to a government agency, and even then i\'m not sure\nnon-netscape, non-mozilla.org parties have an export license with that agency).\n\nI\'m not sure if there were issues other than that, but that still seems pretty\nvalid.',0.00,0,1,592722,0,NULL,0),(67742,18534,'2001-02-07 23:02:53','Oh, thanks for the background info. Certainly I can\'t argue with legal\nrestrictions:-( Still, it is quite a handicap that PSM can\'t be en-/disabled in\nthe same way as IDL or SVG.',0.00,0,1,592774,0,NULL,0),(67742,3117,'2001-02-08 05:50:26','\nI just built it too:\nsetenv NO_MDUPDATE 1\nsetenv BUILD_OFFICIAL 1\nsetenv NS_USE_GCC 1\ncvs co mozilla/client.mk\ncd mozilla\ngmake -f client.mk pull_all\ngmake -f client.mk build_all\ngmake -f client.mk pull_all BUILD_MODULES=psm\ngmake -f client.mk build_all BUILD_MODULES=psm\n\nNOTE: I had to modify security/psm/server/Makefile\nI changed line 42:\n< ifeq ($(OS_ARCH), Linux)\n---\n> ifneq (,$(filter Linux SunOS,$(OS_ARCH)))\n\nthis isn\'t a good permanent fix, but it should get you building.\nbasically sunos using gcc needs to link in the c++ stuff just like\nLinux, so the ifneq - filter thing sets this up. I know Margaret\nis working on the \'correct\' set of fixes and will be working with\nJavi/security to get these checked in at some time.',0.00,0,1,592969,0,NULL,0),(67742,11097,'2001-02-08 10:34:23','Everyone who\'s having problems building from instructions on the web site.\n\nThere was a type-o brought to my attention yesterday.\n\nThe configure line should read:\n\nconfigure --enable-modules=psm [--enable-nspr-autoconf]\n ^\n\nPlease try again with the correction.',0.00,0,1,593244,0,NULL,0),(67742,18534,'2001-02-08 15:50:06','Success! I can confirm that Jim\'s solution worked. After that I also tried\nJavier\'s typo-fix and it worked too. As the sources were not virgin anymore at\nthat point, there may be a small chance that this is not a perfect proof.\nAnyway, thanks so much for your help.\n\nIf you want me to try again with a fresh directory, let me know.\n',0.00,0,1,593898,0,NULL,0),(67742,24936,'2001-02-12 12:43:29','I\'ve been able to build a working copy of mozilla with PSM following the\ndirections from Jim Dunn. :)\n\nSo the next step is to wait for the nightlies to incorporate this.',0.00,0,1,597307,0,NULL,0),(67742,3117,'2001-02-12 12:52:07','\nnot quite...\nFirst Margaret (or someone) needs to check into the solaris \nspecific psm changes (security/psm/server/Makefile) so that \na \'clean\' tree builds. \nThen margaret (or someone) needs to get granrose & co to update\nthe nightly build scripts to set BUILD_PSM=\"true\" for solaris gcc\nbuilds.',0.00,0,1,597318,0,NULL,0),(67742,11021,'2001-02-12 16:28:07','I have the diffs for the ../mozilla/psm/server/Makefile available (will attach\nlater).\nThe changes are mainly made to allow it to build with gcc as well.\nOur build went fine on the Sparc platform using gcc, but it failed on the\nIntel platform. The intel build failed to compile libfreebl.a. I am \nstill checking on the reason for the failure. Below is the error we have got\nfrom our intel build:\n\ngcc -o SunOS5.7_i86pc_gcc_OPT.OBJ/arcfour.o -c -pedantic -Wno-long-long -O3 -O \n-DNDEBUG -DTRIMMED -O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__\n-DSOLARIS -D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG\n-DNDEBUG -I/usr/dt/include -I/usr/openwin/include\n-I../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/ \n-O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__ -DSOLARIS\n-D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG -DNDEBUG\n-DMP_API_COMPATIBLE -I/usr/dt/include -I/usr/openwin/include\n-I../../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/security\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/security \narcfour.c\narcfour.c: In function `rc4_wordconv\':\narcfour.c:349: warning: `nextInWord\' might be used uninitialized in this\nfunction\ngcc -o SunOS5.7_i86pc_gcc_OPT.OBJ/desblapi.o -c -pedantic -Wno-long-long -O3 -O \n-DNDEBUG -DTRIMMED -O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__\n-DSOLARIS -D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG\n-DNDEBUG -I/usr/dt/include -I/usr/openwin/include\n-I../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/ \n-O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__ -DSOLARIS\n-D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG -DNDEBUG\n-DMP_API_COMPATIBLE -I/usr/dt/include -I/usr/openwin/include\n-I../../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/security\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/security \ndesblapi.c\ngcc -o SunOS5.7_i86pc_gcc_OPT.OBJ/des.o -c -pedantic -Wno-long-long -O3 -O \n-DNDEBUG -DTRIMMED -O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__\n-DSOLARIS -D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG\n-DNDEBUG -I/usr/dt/include -I/usr/openwin/include\n-I../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/ \n-O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__ -DSOLARIS\n-D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG -DNDEBUG\n-DMP_API_COMPATIBLE -I/usr/dt/include -I/usr/openwin/include\n-I../../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/security\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/security \ndes.c\ncd mpi; cp mpi-config.h ..\ncd mpi; cp mpi.h ..\ncd mpi; cp mpi-priv.h ..\ncd mpi; cp mplogic.h ..\ncd mpi; cp mpprime.h ..\ncd mpi; cp logtab.h ..\ncd mpi; cp primes.c ..\ngcc -o SunOS5.7_i86pc_gcc_OPT.OBJ/dh.o -c -pedantic -Wno-long-long -O3 -O \n-DNDEBUG -DTRIMMED -O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__\n-DSOLARIS -D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG\n-DNDEBUG -I/usr/dt/include -I/usr/openwin/include\n-I../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/ \n-O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__ -DSOLARIS\n-D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG -DNDEBUG\n-DMP_API_COMPATIBLE -I/usr/dt/include -I/usr/openwin/include\n-I../../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/security\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/security \ndh.c\nIn file included from dh.c:46:\nmpi.h:114: too many `l\'s in integer constant\ngmake[5]: *** [SunOS5.7_i86pc_gcc_OPT.OBJ/dh.o] Error 1\ngmake[5]: Leaving directory\n`/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/security/nss/lib/freebl\'\n\n',0.00,0,1,597752,0,NULL,0),(67742,11021,'2001-02-12 16:32:50','',0.00,0,1,597808,5,'25101',0),(12911,3858,'2001-02-13 15:22:37','For several other reasons, we need a url scheme to reference the profile dir\n(e.g. profile:///prefs.js or profile:///chrome/userContent.css). Such a scheme\nwould also solve the relative url problem, since prefs and other code needing to\nrefer to profile files could refer to them via the scheme. For any of the uses\nI\'ve seen, we wouldn\'t need to flatten out the whole profile directory (e.g. it\nwould be okay to specify chrome/userContent.css instead of just userContent.css\n-- the important thing is not to have to specify\n/u/user/.mozilla/blah/blah/chrome/userContent.css (and then have security refuse\nto load it because it\'s a file url).\n\nWhat do we need to do to make this happen? Do we need approval from anyone? \nSounds like it just needs little bit of netlib love (should it be added to the\ncached handlers in nsIOService.h?) Besides, wouldn\'t we then get relative\npathnames for free if we still wanted them, via nsIoService::ResolveRelativePath?',0.00,0,1,599106,0,NULL,0),(12911,1214,'2001-02-13 16:18:17','I thought warren already solved a more general problem, whereby\nres://profile/... or perhaps res://$profile/... did the trick. Isn\'t there a\none-level (host part) macro-like facility in res: or resource: already?\n\nI\'d rather see something generic and plugable that didn\'t add a new URI scheme\nfor each new macro.\n\n/be\n\n\n/be',0.00,0,1,599204,0,NULL,0),(12911,18780,'2001-02-14 06:08:51','There is something like that in the resource: protocol. See\nhttp://lxr.mozilla.org/seamonkey/source/netwerk/protocol/res/src/nsResProtocolHandler.cpp#94.\nProfile relative files are not dealt with their but I don\'t see why they\ncouldn\'t be. Akkana - maybe this isn\'t as relevant to your problem as I first\nthought. More on this elsewhere. I need this on the nsLocalFile level for\nprofile registry and prefs.',0.00,0,1,599714,0,NULL,0),(12911,302291,'2001-02-14 09:34:51','if anything, I would like to have this as a res protocol extension as suggested:\n\nresource:///res/profile/dougt/xxx\n\nWe also have to make sure that this is cool with mstoltz who owns some code\nwhich protects local URLs. ccing him.',0.00,0,0,599835,0,NULL,0),(12911,6444,'2001-02-14 11:58:36','We went through a big effort to keep web content from being able to find your\nprofile directory. The resource URL pointing at the user profile directory seems\nlike a good idea, but we have to make sure it can only be used locally, not by\ncontent.',0.00,0,1,600028,0,NULL,0),(12911,3858,'2001-02-14 12:24:48','I tried every combination I could think of of resource:/*[$]profile/filename and\nthey all stayed within the resource directory, none of them went to my profile\ndirectory.\n\nSomething like Brendan suggests would be great (I don\'t care if it\'s profile:,\nI\'d be perfectly happy using resource:) but it doesn\'t appear to be hooked up.\n\nShould I add some code to nsResProtocolHandler to implement the $profile syntax?\nWhere should the security issue (not allowing external pages to access the url)\nbe handled, using what mechanism?',0.00,0,0,600064,0,NULL,0),(12911,1214,'2001-02-14 13:51:24','akkana: see ccarlen\'s comment with the lxr link. Someone needs to extend the\nsubstitution list to include ProfileDir, and make sure \"relative\" paths work.\n\n/be',0.00,0,1,600196,0,NULL,0),(12911,6444,'2001-02-14 17:59:58','I will double check but I think it\'s already the case that Web content can\'t\ncall resource: URLs. So we should be OK on security. Is there still such a thing\nas \"res:\" (as opposed to resource:) URLs, and is that relevant here?',0.00,0,1,600518,0,NULL,0),(12911,3858,'2001-02-14 18:08:41','There\'s a res: protocol, which is handled by the same objects (under slightly\ndifferent rules) as the resource: protocol.\n\nBrendan and I spent some time going through the code to figure out why the\nspecial dirs don\'t work, e.g. resource://TempDir/foo.html (that appears to be\nthe correct syntax) doesn\'t work. There appear to be several problems,\nincluding TempDir being treated as a hostname and case folded, so it no longer\nmatches the key in the hash table; and if that problem is fixed, there are other\nproblems as well. Perhaps this worked once. :-)',0.00,0,1,600526,0,NULL,0),(12911,3858,'2001-02-14 18:19:42','If you add tempdir as well as TempDir in nsResProtocolHandler.cpp, what happens\nis that nsResChannel::AsyncRead calls EnsureNextResolvedChannel, which correctly\nmaps the url to file:///tmp/..., then AsyncRead does\nmResolvedChannel->AsyncRead, then while we\'re waiting for the read,\nEnsureNextResolvedChannel gets called again many more times from\nnsResChannel::GetLocalFile (and perhaps from other routines), and this time it\ndoesn\'t find the right match, probably because mCurrentIndex is now wrong inside\nNext. This I think causes mResolvedChannel, which was set correctly before, to\nget reset to null, so the actual load of the url fails (but there\'s no error\nmessage because netlib now thinks it never had a url to load at all).\n\nNetlib async hell. Is there any chance we could get a netlib person to help\nwith getting this to work?',0.00,0,1,600534,0,NULL,0),(12911,1214,'2001-02-14 19:24:19','Cc\'ing warren in case he can enlighten us as to how this stuff should work.\n\n/be',0.00,0,1,600560,0,NULL,0),(12911,1214,'2001-02-14 22:48:20','And adding gagan. The ToLowerCase (which could use \'s tolower, no?)\nroutine was added a year or more ago, and its use in nsStdURLParser.cpp almost\nthat far back. What changed to break these resource://TempDir/... paths by\nlowercasing to tempdir? Or did they never quite work?\n\nI think we should fix up this code, obviously. Conrad, you up for it?\n\n/be',0.00,0,1,600631,0,NULL,0),(12911,18780,'2001-02-15 05:04:46','I\'m up for fixing it. I\'ll take a look at what pointed out on this bug in the\npast day.',0.00,0,1,600758,0,NULL,0),(12911,1214,'2001-02-15 11:10:04','valeski was in the cvs annotate output; Jud, do you remember any of this\nresource://MagicVar/... jazz, and why it stopped working? The ToLowerCase\'ing\nof host parts is implicated, but that\'s old.\n\n/be',0.00,0,1,601004,0,NULL,0),(12911,18780,'2001-02-15 12:38:46','If resource://MagicVar/ used to work and now it doesn\'t, I\'d say it\'s time for a\nnew bug. This bug started out being \"Use relative pathnames for profile\ndirectories\" and then morphed into a necko issue.',0.00,0,0,601100,0,NULL,0),(12911,3858,'2001-02-15 12:56:37','Good point. I\'ve split off bug 68950, and made this bug dependant on that one.',0.00,0,0,601121,0,NULL,0),(13534,4412,'2001-02-15 22:05:01','At least 3.0 fix: Should redesign so that the admin can specify resolutions. \nDupe is probably a special case as it is universally applicable and has special\nfunctionality. Also need to update bug_status.html documentation appropriately.',0.00,0,1,601646,0,NULL,0),(67742,6582,'2001-02-23 14:42:01','Does the routine for building PSM suggested here still work for anyone?\nI can\'t get it to work. \n\nThere are still problems pulling the security part of the source with cvs, so\nI first download th e source with ftp. Then I (following Javier\'s suggestion):\n\n1. Build mozilla without psm.\n2. Patch the security/psm/server/Makefile with patch from above.\n3. Set NS_USE_GCC. This is all with gcc 2.95.2 on Sparc Solaris 2.7\n4. Set --enable-modules=psm in ~/.mozconfig \n5. Run make -f client.mk\n\nI then get errors:\n\ncd nsinstall; make libs\nmake[5]: Entering directory\n`/net/aurora/a1/crumley/sun/mozilla/security/coreconf/nsinstall\'\ngcc -o SunOS5.7_LOCAL_OPT.OBJ/nsinstall.o -c -O -Wall -Wno-format -fPIC -DSVR4\n-DSYSV -D__svr4 -D__svr4__ -DSOLARIS -DSOLARIS2_7 -D_SVID_GETTOD -MDupdate\nSunOS5.7_LOCAL_OPT.OBJ/.md -DXP_UNIX -UDEBUG -DNDEBUG -I/usr/dt/include\n-I/usr/openwin/include -I../../../dist/SunOS5.7_LOCAL_OPT.OBJ/include\n-I/net/aurora/a1/crumley/sun/mozilla/dist/SunOS5_sparc_LOCAL_OPT.OBJ/include\n-I/net/aurora/a1/crumley/sun/mozilla/dist/SunOS5_sparc_LOCAL_OPT.OBJ/public/coreconf\n-I/net/aurora/a1/crumley/sun/mozilla/dist/SunOS5_sparc_LOCAL_OPT.OBJ/private/coreconf\n nsinstall.c\ngcc: cannot specify -o with -c or -S and multiple compilations\nmake[5]: *** [SunOS5.7_LOCAL_OPT.OBJ/nsinstall.o] Error 1\n\n\nSo it looks like there are still cc/gcc problems. I also tried \nJim Dunn\'s suggestions with similar results. Anybody having any luck some\nother way? Does it work better with Sun cc?',0.00,0,1,611212,0,NULL,0),(67742,24936,'2001-02-25 22:11:00','I ran into that. You have to make sure that you set the NO_MDUPDATE \nenvironmental variable to 1 or else that error shows up.',0.00,0,1,612468,0,NULL,0),(6810,3831,'2001-02-27 15:10:25','Setting milestone to future.',0.00,0,0,614525,0,NULL,0),(13534,10297,'2001-02-27 19:52:42','Moving to real milestones...\n',0.00,0,1,615446,0,NULL,0),(13534,4054,'2001-03-14 14:53:47','Taking all Bugzilla 3.0 bugs -- congratulations to MattyT for the triage, it\nreally was spot on. Note: I may end up pushing some of these bugs back to 3.2,\nwe\'ll see. However, I believe all these bugs should just fall out of the \nredesign. Let\'s hope I\'m right!\n\n(Note: I\'m also resetting the priority field to \"---\" so that I can retriage any\nthat I consider important or likely to be dropped.)',0.00,0,1,634273,0,NULL,0),(67742,24709,'2001-03-19 07:55:53','Any definitive info as to whether there are plans to get PSM working in Solaris\nnightlies? I\'d build it myself but (1) I cant pull cvs through the corporate\nfirewall here (2) I\'ve got enough bandwidth issues without dragging a full\ntarball through the pipe everytime I want to update my mozilla. Everybodies\npatches, fixes and instructions assume (quite understandably) that the user is\nbuilding mozilla from cvs but for those of us that depend on the nightlies to\nstay updated it isnt much help.',0.00,0,1,638664,0,NULL,0),(67742,11021,'2001-03-22 14:44:02','Javier: Can you approve these changes/new files to be checked in to the tip of\nthe trunk please?\n1. ../mozilla/security/server/Makefile \n (changes to allow both gcc & Sun Workshop/Forte build)\n2. ../mozilla/security/coreconf/SunOS5.9.mk \n (new file to allow builds on Solaris 9 - Sun\'s next release)\n3. ../mozilla/security/coreconf/SunOS5.9_i86pc.mk\n (new file to allow builds on Solaris 9 - Sun\'s next release)\nAttachments follow.\n\n ',0.00,0,1,645149,0,NULL,0),(67742,11097,'2001-03-22 14:55:03','You\'ll have to get approval from the NSS team to check-in to\nmozilla/security/coreconf\n\nWhere are the patches/contents of the new files?',0.00,0,1,645166,0,NULL,0),(67742,11021,'2001-03-22 15:13:02','',0.00,0,1,645205,5,'28529',0),(67742,11021,'2001-03-22 15:16:13','',0.00,0,1,645212,5,'28530',0),(67742,11021,'2001-03-22 15:20:04','',0.00,0,1,645217,5,'28532',0),(67742,11021,'2001-03-22 15:26:18','Encountered some weird problems trying to attached these files.\nAll the files are attached now. \n\nCaught a typo. This line should read as:\n\n1. ../mozilla/security/psm/server/Makefile \n (changes to allow both gcc & Sun Workshop/Forte build)\n\nJavier: Who from the NSS team should I ask? wtc is on sabbatical, right?\n\n',0.00,0,1,645240,0,NULL,0),(67742,11097,'2001-03-22 15:28:58','relyea: could you review the changes to NSS/coreconf?',0.00,0,0,645252,0,NULL,0),(67742,11099,'2001-03-22 16:09:11','Are these targetted for the tip (NSS 3.3) or the NSS 3.2.1 branch?\n\nbob',0.00,0,1,645312,0,NULL,0),(67742,11021,'2001-03-22 18:04:33','All these changes should go into the trunk.\n\nAs to whether they need to go into the other branch (i.e., NSS 3.2.1 branch)\nwhich you have mentioned, that depends on what PSM2.0 is picking up.\nJavier: Is PSM2.0 (planning to go into Netscape6.5) picking up\nNSS from the trunk or from the branch? If it is from the branch, which\nbranch exactly?\n',0.00,0,1,645526,0,NULL,0),(67742,27047,'2001-03-28 00:48:23','It seems like someone accidentally changed the components to \"activeX wrapper\"',0.00,0,0,651102,0,NULL,0),(67742,26315,'2001-03-28 02:13:42','If anyone is interested, I\'ve uploaded a 0.81 package I\'m using to:\nhttp://www.crosswinds.net/~alfandary/mozilla-sparc-sun-solaris2.6.tar.bz2\n',0.00,0,1,651151,0,NULL,0),(67742,11021,'2001-03-30 17:35:59','The psm/server/Makefile has already been checked in by Javier (see 64713). \nI still need the coreconf files to be checked in. \nrelyea: can we check them in to the trunk? \nWe can worry about the branch later.',0.00,0,1,655302,0,NULL,0),(6810,1548,'2001-04-06 07:18:18','\nRM> To digulla@hepe.com: Printing banner (info), page number etc. is the job of the\nRM> print system and should not be part of Mozilla itself.\nRM> In Unix/X11 the Xprt (X print server) or a special filter in the lp-printsystem\nRM> would be the location where to \"enable\" page count/number printing...\n\n I don\'t think that\'s the case. You might be right if what the printer\nsystem is handed over is just a plain text file. Then, the printing system\ncan do whatever it wants to do (adding header, footer with page number,\ntitle, etc). However, what Netscape gives the printing system is, in\nUnix/X11, a postscript file. Do you think the printer system has to/can\nmanipulate this postscript file (e.g. resizing the whole page and adding\nheader and footer)? Things like n-page up, duplex printing, banner page\nwith title are certainly in the realm of the printing system. However,\nadding headers and footer with the page title, page number, date, the\nURL of the page has to be taken care of by Mozilla. Please, also note\nthat Unix/X11 version offers a way to print to a file. If the printing\nsystem has to add header and footer, PS file obtained by \'printing to\na file\' would be different from the hardcopy.\n\n\nAD> So that\'s why Unix and Windows printouts differ: Mozilla just passes this\nAD> information to the Windows printer and omits it on Unix. In that case, you\nAD> really have to put these information into ENV variables or replace specific\nAD> parts of the commandline (as suggested in the first post in this thread).\n\n I guess your original question is still valid. I\'ve been also wondering\nwhy Windows version of NS can add date, page number, URL (which is very\nhandy), title while Unix/X11 version can\'t.\n\n When I printed out with 2001-04-03 build for Linux, I was pleasantly\nsuprised to see the page title, page number ( x of y ) and date (current)\nwere printed in header and footer. However, there\'s still one item\nmissing which is present in print-out of MS-Windows version, which is\nthe URL of the page being printed. Now, I got really curious as to why\non earth MS-Windows version can print all four items (title, url, date,\nand page number) while Unix/X11 version can only three of them (title,\ndate and page number). I guess this(printing out URL as well in Unix/X11\nversion of Mozilla) should be an easy fix.\n\n Jungshik Shin',0.00,0,1,662891,0,NULL,0),(67742,25631,'2001-04-09 07:13:20','\nThe last builds I have tries are as follows:\n\n20010321: Makefile broken, but PSM Good when compiled.\n20010408: Makefile good. PSM builds, and I can open the window from the Tasks\nmenu. I cannot however open a secure page. e.g.\nhttps://www.fortify.net/sslcheck.html\njust gives be a blank page, (\"Document: Done\"), no error messages.',0.00,0,1,665071,0,NULL,0),(67742,20369,'2001-04-09 13:20:53','Tested on Windows 2000.\nUsed Mozilla Build 2001040504.\nThe bug DID occur in Windows.\nThe URL took a long time to load, so I checked the Task Manager and found that\nmy CPU is at 100% (I have a P3, 600) and under applications the \"Fortify For\nNetscape was Not Responding\". I had to \"end task\" mozilla to resume using my\nsystem.',0.00,0,1,665549,0,NULL,0),(3140,4030,'2001-04-13 16:31:07','nsbeta1-, but moving to 1.0 to have another look, might be a simple fix.',0.00,0,0,673139,0,NULL,0),(67742,15540,'2001-04-17 16:38:57','Updating Platform/OS categories to windows 2000',0.00,0,0,678012,0,NULL,0),(67742,4424,'2001-04-17 17:01:07','resetting back to Solaris. This bug is about getting PSM in Solaris, not Win2k.\n If you\'re having problems with win2k file a different bug.',0.00,0,0,678078,0,NULL,0),(67742,11021,'2001-04-17 17:35:34','There is some confusions with the original nature of this bug, and hence\nthe accidental change of category. This should be Solaris only as stated\nin the summary. One more update: thanks to relyea@netscape.com, the last\n2 patches have been checked in to the trunk as well as to the NSS3.2.1 branch\nas well. With PSM2.0 landed (I am still trying to build it), I am not sure\nif we should include PSM2.0 in the nightlies instead.',0.00,0,1,678164,0,NULL,0),(67742,11107,'2001-04-23 17:59:32','Mass changing of product. Browser:Security:Crypto --> PSM 2.0',0.00,0,0,686890,0,NULL,0),(3140,3827,'2001-04-25 09:13:15','*** Bug 73940 has been marked as a duplicate of this bug. ***',0.00,0,0,689680,0,NULL,0),(6810,4432,'2001-04-30 12:40:48','OT: Who wrote the header/footer stuff for Unix ? I currently have much \"fun\"\nwith this feature because it breaks a lot of stuff in Xprint (header/footer font\nis incredibly large (~~1/6 of page height)... ;-((',0.00,0,1,696778,0,NULL,0),(3140,3847,'2001-05-03 17:03:37','not my area, off to desale',0.00,0,0,703802,0,NULL,0),(67742,5443,'2001-05-03 20:19:14','Is this matter still pending? Or has this it been resolved? I\'m tempted to\nmark this as FIXED, but I\'d appreciate it if someone could give an update before\nI do that.\n',0.00,0,1,704178,0,NULL,0),(67742,11021,'2001-05-03 20:39:54','Hi Bob:\n\nI cannot really answer your question on whether or not it has been resolved\ncompletely or not. We have been fixing it so that it can build PSM1.x. \nBy the time we get all the fixes in, PSM2.0 is coming out. We then see common\nproblem for building PSM1.x and PSM2.0. And we have switched to tackle PSM2.0\'s\nbuild problems (77123,77788,77792...). Eventually, when PSM2.0 is built, I\nthink we\'ll check with leaf/granrose to see how we can get it built in the\nnightlies. ',0.00,0,1,704198,0,NULL,0),(67742,5443,'2001-05-30 14:50:37','-> 2.0\n-> P3\n-> ssaux\n\n',0.00,0,1,749985,0,NULL,0),(67742,5521,'2001-05-30 17:29:18','Uh, it seems to be working for me. I\'m typing this text in a nightly Mozilla\nbuild with the \"--enable-crypto\" configure option set. Does this mean that PSM\nis in Solaris nightlies?\nMargaret, maybe you can comment as well.',0.00,0,1,750580,0,NULL,0),(67742,11021,'2001-05-31 13:48:40','Yes. Now psm2.0 is fully integrated into mozilla. We can simply build mozilla\nwith --enable-crypto to get all the psm functionalities. It is built the same\nway as Linux. I guess now we can go back to one of Leaf\'s earlier comments to\nget this into the nightlies:\n\n\"first question: does it build? =)\ni can pretty easily add it to the build automation for solaris, provided it\nbuilds the same way as it does on linux.\"\n\nLeaf: can you make this happen for us please? Thanks\n',0.00,0,1,752111,0,NULL,0),(67742,20209,'2001-06-03 17:47:44','*** Bug 83916 has been marked as a duplicate of this bug. ***',0.00,0,0,756361,0,NULL,0),(3140,4616,'2001-06-05 11:58:52','Updating QA contact to Shivakiran Tummala.',0.00,0,0,759439,0,NULL,0),(6810,4432,'2001-06-12 03:50:33','Xprint module now supports this feature without problems...',0.00,0,0,771280,0,NULL,0),(67742,20209,'2001-06-15 11:39:37','*** Bug 82767 has been marked as a duplicate of this bug. ***',0.00,0,0,778309,0,NULL,0),(67742,11021,'2001-06-15 12:04:28','Hi Leaf:\n\nCan you add this to the build automation for solaris please?\n\nThanks, Margaret',0.00,0,1,778373,0,NULL,0),(67742,4424,'2001-06-15 12:19:19','\nLoan\'s coming up to speed on the SeaMonkey unix builds so she should take care\nof this. Assuming PSM is built on Solaris like it is on Linux, I think the\nautomation just has an environment variable that needs to be set for Solaris builds.',0.00,0,1,778416,0,NULL,0),(67742,6582,'2001-06-15 12:26:29','WFM. PSM seems to building on Solaris nightlies, already. At least https\nsites have worked for me under Solaris nightlies for at least the last couple of\nweeks. Works right now with 2001061322 on the fortify.net url listed in this bug.',0.00,0,1,778433,0,NULL,0),(67742,11021,'2001-06-15 14:25:38','Yep, right you are. Just download the bit from:\n\nftp://ftp.mozilla.org/pub/mozilla/nightly/2001-06-15-09-trunk/\n\nAll the psm files below are there:\n\n/dist/bin/libnssckbi.so\n /components/libpipnss.so\n /components/libpippki.so\n /chrome/pippki.jar\n /chrome/pipnss.jar\n/dist/bin/libfreebl_hybrid_3.so\n /libfreebl_pure32_3.so\n\nso PSM is in Solaris nightlies now. Mark it resolved.\n\n\n\n\n\n',0.00,0,1,778670,0,NULL,0),(67742,4113,'2001-06-18 08:24:03','Verified.',0.00,0,1,781308,0,NULL,0),(2586,29007,'2001-06-18 17:03:40','I don\'t even see a print preview anymore... (someone tell me how to get to it?)\n What\'s the status here?\n',0.00,0,0,782791,0,NULL,0),(2586,4048,'2001-06-22 07:36:42','print preview is not a feature.. so this is invalid till that feature is \nworking.',0.00,0,1,791205,0,NULL,0),(2586,4054,'2001-06-22 07:51:55','Reopening and reassigning to me so that I don\'t lose track of this bug.',0.00,0,0,791224,0,NULL,0),(2586,4054,'2001-06-22 07:53:36','I\'ll reassign as appropriate once we have print preview again.',0.00,0,0,791225,0,NULL,0),(3140,29320,'2001-07-25 14:32:53','not my area --- how did i end up as contact person for this ',0.00,0,0,842277,0,NULL,0),(13534,4412,'2001-07-27 11:26:21','Just thinking - we don\'t need to remove REMIND and LATER from the schema to do\nthis in BZ2. All we really need to do is have a param called remindandlater. \nIf on, people can resolve bugs and REMIND and LATER, if off, they can\'t but\nexisting REMIND and LATER bugs can still exist.\n\nI\'m thinking we should just make this off by default but I guess we\'re gonna\nsuprise some admins if we don\'t ask. Something like:\n\n---\n\nThe resolutions REMIND and LATER are deprecated.\n\nIt is suggested you use a target milestone to mean \"Future\" instead, and that\nyou remove the REMIND and LATER resolutions from your installation.\n\nIf you choose to remove these resolutions, existing bugs will continue to have\nthese resolutions, but users will be unable to mark new bugs as REMIND or\nLATER. Remove them (Y/N)?\n\n---\n\nIf we are creating a new database, or if we don\'t find any bugs with these\nresolutions, just turn the parameter off.',0.00,0,1,845100,0,NULL,0),(2586,11608,'2001-07-27 12:54:25','Why isn\'t print preview handled by operating systems?',0.00,0,0,845245,0,NULL,0),(1869,23402,'2001-08-10 20:08:10','All Evangelism Bugs are now in the Product Tech Evangelism. See bug 86997 for\ndetails.',0.00,0,1,867264,0,NULL,0),(13534,10297,'2001-08-10 21:15:46','The Bugzilla 3 component is going away. We\'re going to depend on the Milestones \nfor this. At the time this component was created, we didn\'t have milestones for \nBugzilla.\n',0.00,0,0,867408,0,NULL,0),(13534,4412,'2001-08-11 06:25:29','I am working on a solution for this by implementing customised resolutions over\nat bug #94534.',0.00,0,1,867719,0,NULL,0),(96421,20606,'2001-08-22 07:36:33','From Bugzilla Helper:\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.3+) Gecko/20010821\nBuildID: 2001082108\n\nCould you add a keyborad shortcut to \"Mark thread as read\"? It\'s a feature I use\noften, and ot\'ll be easier to have a shortcut rather than clicking in \"mark\" and\nthen on \"thread as read\".\n\nReproducible: Always\nSteps to Reproduce:\nn/a\n\nActual Results: n/a\n\nExpected Results: n/a',0.00,0,1,882821,0,NULL,0),(96421,25000,'2001-08-22 08:50:35','You\'d think this would be a dup, but I don\'t see it... confirming.\n\nOS/Platform -> ALL/ALL',0.00,0,1,882924,0,NULL,0),(96421,21544,'2001-08-22 08:53:29','\n\n*** This bug has been marked as a duplicate of 75027 ***',0.00,0,1,882932,0,NULL,0),(96421,25000,'2001-08-22 09:08:30','my old nemesis hwaara has foiled me again.... :) verified',0.00,0,0,882957,0,NULL,0),(13534,4412,'2001-08-27 13:16:40','As such, taking this ...',0.00,0,0,889653,0,NULL,0),(12911,18780,'2001-08-27 14:52:44','Front-burnering to 0.9.5\nAlso, changing the summary. This bug was originally about using relative paths\nin the profile registry file. It also needs to include using relative names for\nall paths *within* a profile dir. Mainly, paths in prefs.js which are used by\nmailnews.',0.00,0,1,889881,0,NULL,0),(13534,4412,'2001-08-27 16:22:57','Moving to new Bugzilla product ...',0.00,0,0,890117,0,NULL,0),(2586,7289,'2001-08-28 18:08:49','It appears to be, by Mac OS X.',0.00,0,0,892324,0,NULL,0),(13534,4412,'2001-08-30 18:35:50','Taking (again) ...',0.00,0,0,896318,0,NULL,0),(2586,4054,'2001-09-04 05:40:45','Jesse: On Linux, exactly how would you say that should work?',0.00,0,0,901377,0,NULL,0),(2586,11608,'2001-09-07 19:39:03','I don\'t use Linux much, and I haven\'t written any graphical programs for it, so \nI don\'t know how it would work.\n\nThis is what I would expect to happen if print preview worked at the OS level \n(I haven\'t seen Mac OS X\'s print preview feature):\n\n- Application developers would be able to add a print preview feature much more \neasily, so more apps would have the feature. (The OS-level feature might even \nbe a button in the print dialog, making it work with old applications as well \nas new ones.)\n\n- Users wouldn\'t have to figure out a new UI each time they select \"print \npreview\" in a new application.\n\n- The print preview window would be grayscaled if the printer is a black-and-\nwhite printer, so the user would be able to tell if there are contrast problems \nwith the colors chosen.\n\n- The print preview window would be able to show the actual fonts that will be \nused to print, rather than the font shown in a normal document window scaled to \nthe zoom factor of the print preview window.',0.00,0,0,909361,0,NULL,0),(12911,20209,'2001-09-09 23:24:11','*** Bug 99030 has been marked as a duplicate of this bug. ***',0.00,0,0,911133,0,NULL,0),(384,10297,'2001-09-15 01:51:24','moving to Bugzilla product\nreassign to default owner/qa for INVALID/WONTFIX/WORKSFORME/DUPLICATE',0.00,0,1,919319,0,NULL,0),(2586,4054,'2001-09-15 09:37:17','Jesse: The problem on Linux is that there is no one subsystem that is in charge\nof both the windowing system and the printing system, and the OS doesn\'t do either.',0.00,0,1,919839,0,NULL,0),(3140,29320,'2001-09-27 16:52:00','Vladimir, the described failure is about the event.target property, in DOM 2 Events.\n\n',0.00,0,0,942605,0,NULL,0),(12911,20209,'2001-10-01 13:38:06','*** Bug 102540 has been marked as a duplicate of this bug. ***',0.00,0,0,947629,0,NULL,0),(12911,9911,'2001-10-01 14:04:24','That last-marked duplicate has a list of all the places where we are using\nabsolute paths in the prefs. This is also a problem in the mail cache file,\npanacea.dat.\n\nGerv',0.00,0,1,947737,0,NULL,0),(12911,18780,'2001-10-01 14:42:24','Copying that useful info to this bug:\n\nHowever, mail stores absolute paths in\nthe following places:\n\na) Throughout the file panacea.dat\n\nb) In the following pref keys:\nmail.directory\nmail.imap.root_dir\nmail.newsrc_root\nmail.root.imap\nmail.root.nntp\nmail.root.none\nnews.directory\nmail.server.serverX.directory\nmail.server.serverX.newsrc.file\n(for multiple values of X)\n',0.00,0,1,947872,0,NULL,0),(12911,18780,'2001-10-04 08:15:32','-> 0.9.6',0.00,0,0,953179,0,NULL,0),(6810,3831,'2001-10-04 16:22:51','bulk reassigning Waqar\'s bugs to Don.',0.00,0,0,954879,0,NULL,0),(12911,22599,'2001-10-10 15:05:16','The user\'s search provider (incl. default, I think) is stored as absolute path\nto the sherlock file (last time I checked). (Note that this lives in the\ninstalaltion dir, not the profile dir.) That most likely the reason why the\ndefault pref for the search provider doesn\'t work for me.',0.00,0,1,965754,0,NULL,0),(2586,12280,'2001-11-07 13:04:17','Just a heads up: print preview is back in recent builds. Gifs are still \nanimated.',0.00,0,1,1013049,0,NULL,0),(1869,23402,'2001-11-10 12:20:04','it\'s dead jim ',0.00,0,0,1018908,0,NULL,0),(12911,20209,'2001-11-13 06:38:22','*** Bug 109873 has been marked as a duplicate of this bug. ***',0.00,0,0,1021640,0,NULL,0),(2586,3821,'2001-11-13 12:12:44','taking bug',0.00,0,0,1022290,0,NULL,0),(2586,3821,'2001-11-13 12:14:06','I don\'t think this is a compositor issue, changing to \"printing\"',0.00,0,0,1022292,0,NULL,0),(2586,3821,'2001-11-13 12:16:58','This also includes the beginnings of code for switching back to galley mode\nwhen in PrintPreview',0.00,0,1,1022299,5,'57624',0),(2586,3821,'2001-11-13 13:28:08','Overview patch:\nRenamed the mIsDoingPrintPreview to mIsCreatingPrintPreview and added a new \nvariable mIsDoingPrintPreview which is NOT static and is per DocViewer, that way \nthe DocumentViewer knows whether it is in PP mode.\n\nFor now the Print Preview menu item toggles between print preview and galley \nmode.\n\nAlso, added method for switching back to galley mode (re-creates lall the \nframes)\n\nAdded code to the PresContext to walk the content tree looking for images and \nits hash table of images, so when the Animation mode changes they can be turned \non or off.\n\nAdded code in the imgContainer to start and stop animation depending on the \ncurrent state of the animation.',0.00,0,1,1022462,0,NULL,0),(2586,10025,'2001-11-13 13:44:02','sr=attinasi\nOne thing I dislike about the change is having to walk every image to disable\nthe animation when, in reality, very few of the images will even be animated.\nIt would be far better to tell the imageLib that animation is globally\ndisabled, and then every animation would be overridden until that global flag\nwas cleared. Granted, PP is not a performance intensive operation, but an O1 is\nbetter than an O2n algo anyday.',0.00,0,1,1022501,6,'57624',0),(2586,4048,'2001-11-13 14:47:41','r=dcone.\none comment.. it would be nice to have #defines or enums for\neven if its just in this file.. it would make it easier to maintain.. and \ndocument what your trying to test for.\nif (mAnimationMode == 0 && (aAnimationMode == 1 || aAnimationMode == 2))',0.00,0,1,1022639,0,NULL,0),(2586,3821,'2001-11-14 11:05:04','fixed',0.00,0,1,1023968,0,NULL,0),(12911,18780,'2001-11-15 07:01:37','Mass move to 0.9.7',0.00,0,0,1025514,0,NULL,0),(13534,10297,'2001-11-17 18:17:19','We are currently trying to wrap up Bugzilla 2.16. We are now close enough to\nrelease time that anything that wasn\'t already ranked at P1 isn\'t going to make\nthe cut. Thus this is being retargetted at 2.18. If you strongly disagree with\nthis retargetting, please comment, however, be aware that we only have about 2\nweeks left to review and test anything at this point, and we intend to devote\nthis time to the remaining bugs that were designated as release blockers.',0.00,0,1,1029819,0,NULL,0),(12911,12902,'2001-11-23 04:44:34','*** Bug 111591 has been marked as a duplicate of this bug. ***',0.00,0,0,1037889,0,NULL,0),(12911,18780,'2001-11-27 13:27:04','-> 0.9.8',0.00,0,0,1043543,0,NULL,0),(3140,5003,'2001-12-03 10:55:43','Bugs targeted at mozilla1.0 without the mozilla1.0 keyword moved to mozilla1.0.1 \n(you can query for this string to delete spam or retrieve the list of bugs I\'ve \nmoved)',0.00,0,0,1053837,0,NULL,0),(12911,18780,'2001-12-17 13:54:29','*** Bug 76245 has been marked as a duplicate of this bug. ***',0.00,0,0,1075731,0,NULL,0),(12911,3858,'2001-12-21 17:54:14','This was with 0.9.7, BTW.',0.00,0,0,1082842,0,NULL,0),(12911,14534,'2001-12-22 14:32:28','*** Bug 116601 has been marked as a duplicate of this bug. ***',0.00,0,0,1083409,0,NULL,0),(12911,14534,'2001-12-23 09:38:13','*** Bug 116685 has been marked as a duplicate of this bug. ***',0.00,0,0,1083875,0,NULL,0),(3140,4833,'2002-01-04 13:48:50','The testcase in attachment 1002 is wrong. it does not tell you where the event\nrecieved, just where the originate from. It was always showing HTML because the\n element had no border or padding (seems like margin doesn\'t count as\npart of the body), However the event listener is to the \"Window\" object as the\ncurrentTarget in the testcase I\'m attaching shows.',0.00,0,1,1096047,5,'63566',0),(2586,7924,'2002-01-10 09:05:31','Verified with 2002010703 on Win2K using bongo.gif out of res/samples/sampleimages.\nMac? Linux?',0.00,0,0,1105131,0,NULL,0),(12911,14534,'2002-01-11 11:04:44','*** Bug 119445 has been marked as a duplicate of this bug. ***',0.00,0,0,1107772,0,NULL,0),(12911,33436,'2002-01-12 02:21:23','Just want to stress the fact that this would be a severe \"ship stopper\" for\npeople who want to use Mozilla with shared profiles on a network. In my case,\nsome directories\nP:\\Daten\\Netscape\\Thommie\\w2patixq.slt\\ImapMail\\192.168.0-1.1\nP:\\Daten\\Netscape\\Thommie\\w2patixq.slt\\ImapMail\\post.gaia-1.de\nP:\\Daten\\Netscape\\Thommie\\w2patixq.slt\\ImapMail\\post.gaia-2.de\nP:\\Daten\\Netscape\\Thommie\\w2patixq.slt\\ImapMail\\post.gaia.de\nare created in the networked (Unix) /home/thommie directory when I open \nMozilla. This is not a Unix-specific issue but a thing which is caused when the\nprofile is stored under Unix but mapped (e.g. through Samba) to a networked Win\nclient.\n\nI would nominate this for mozilla1.0.',0.00,0,1,1109004,0,NULL,0),(12911,14534,'2002-01-12 16:25:42','*** Bug 119707 has been marked as a duplicate of this bug. ***',0.00,0,0,1109500,0,NULL,0),(12911,32335,'2002-01-12 20:08:58','Nominating for mozilla1.0 on behalf of Thommie Rother in comment 43, and\nchanging OS to All.',0.00,0,1,1109619,0,NULL,0),(12911,18780,'2002-01-15 09:35:57','Mass move to 0.9.9',0.00,0,0,1113341,0,NULL,0),(12911,11608,'2002-01-21 14:01:51','*** Bug 118921 has been marked as a duplicate of this bug. ***',0.00,0,0,1123843,0,NULL,0),(6810,4432,'2002-01-24 06:35:17','rods:\nAny idea how we can implement this ?',0.00,0,1,1128462,0,NULL,0),(2586,4079,'2002-01-31 14:42:22','verified.',0.00,0,1,1141599,0,NULL,0),(123203,20048,'2002-02-02 22:57:02','nsHttpChannel should own a nsStandardURL instead of a generic nsIURI. this\nwould allow nsHttpChannel to save on space my making mSpec reference\nnsStandardURL::mSpec directly. it would also avoid a number of other pointless\nbuffer copies throughout the HTTP impl.',0.00,0,1,1144873,0,NULL,0),(12911,42246,'2002-02-08 15:57:46','Also, make sure Downloaded Pop/IMAP Mail and Newsgroups Data can be shared\nbetween different Intallations / OSes (e.g. Windows and Linux on same Laptop)',0.00,0,1,1157241,0,NULL,0),(12911,35848,'2002-02-09 09:48:45','What about the seperator characters used in stored pathnames (Unix \"/\" vs.\nWindows \"\\\\\")? If people want to use the same profile data across different\nOSes, it needs to be standardized (-> \"/\").\n\nAt this time Windows-like separators are not recognized on Unix and vice versa.',0.00,0,1,1158188,0,NULL,0),(12911,18780,'2002-02-09 11:04:44','That\'s right - the path separators will be taken care of. I plan on using a\nUTF-8 encoded descriptor. This descriptor will have the same format on all\nplatforms. Internally, the nsLocalFile impls of each platform will convert this\nto native format for that platform.',0.00,0,1,1158255,0,NULL,0),(12911,14753,'2002-02-09 20:16:51','I really don\'t think a utf-8 descriptor is necessary. Up unit now, the file is\nquite editable in 7-bit ascii, unless the user is using higher characters. At\nleast in the Unix and Windows cases, \'/\' is quite acceptable for a path\nseparator. All of the internal windows API\'s accept \'/\' as a path separator.\nOn the other hand, I don\'t know anything at all about the Mac API\'s, so I don\'t\nknow what is acceptable there.\nThere is a related problem with line separators, that is not directly covered by\nthis bug. One of the primary purposes of this bug is to allow profiles to be\nportable between OS\'s, so the line separator issue may be related.',0.00,0,1,1158728,0,NULL,0),(12911,15223,'2002-02-09 21:43:26','F:\\build\\mozilla>cd js/src\nF:\\build\\mozilla\\js>\n\nplease stop making the assertion that / is well recognized by windows. under \nXP this would work, on 2k it does not.\n\nccarlen\'s suggestion is fine. your justification for you suggestion is \nabsolutely not.',0.00,0,1,1158756,0,NULL,0),(12911,7978,'2002-02-09 21:46:08','Timeless -- he didn\'t say \"the windows command prompt\". he said \"all of the\ninternal windows API\'s\". There\'s obviously a difference there.\n\n',0.00,0,1,1158758,0,NULL,0),(12911,14753,'2002-02-10 00:21:03','Timeless, Mathew Miller pretty much covered my point. The internal Windows API\'s\nare quite agnostic about \'/\' versus \'\\\' going right back to DOS 2.0. In DOS 1.0\nthere were no subdirectories, so the issue mever came up The comand line\ninterface, which is a very different thing from the API\'s, had support for \'/\'\nup until DOS 5.0, I believe. Once they went to a GUI, I believe that support for\n\'/\' in the edit boxes was spotty at best.\nDoes anybody know what Apple uses in their API\'s? As of OS-X, I presume that the\nUnix base for the underlying OS implies that \'/\' will work.\nOne of the strengths of the prefs.js file is the ability to edit it in an\nemergency. If it depends on non-7-bit-ASCII characters, It will be much harder\nto deal with.\nThis shouldn\'t be the only factor in the decision, of course, but I see no\nreason to mess with a fairly widespread standard unnecessarily.\nIdeally, the path separator could be either \'/\' or \'\\\' (and any others in use as\nwell) and Mozilla versions from all OS\'s would recognize all of them.\nI am by no means claiming that \'/\' is common to all OS\'s. There was a recent\nthread on alt.folklore.computers that went into this at great length. Some of\nthe older OS\'s had positively byzantine methods of specifying the path. As far\nas I could tell, a lot of them used \' \' as a separator, but they usually were\nquite limited as to how far you could nest the directories.',0.00,0,0,1158824,0,NULL,0),(12911,22599,'2002-02-10 01:20:36','Can\'t we separate cross-platform profiles from this bug? That\'s a superset of\nprofiles being movable on one machine or on machines with the same architecture\n(which is what this bug was about) and a less common case.',0.00,0,1,1158858,0,NULL,0),(12911,15223,'2002-02-10 01:33:02','Here\'s the deal as i see it, you\'re arguing against an arbitrary character \nbased on the assumption that it\'s a useful character to the end user. / is not \nuseful to me as an end user.\n\nI can\'t |cd \"/build\"| (i can |cd \"js/src\"|) and your average dos/windows user \nwill *not* figure out that quoting paths will make a few more paths work.\n\nEntering \"f:/build\" into a windows filepicker gives me a nice error message, \nand even your average prefs.js editor does *not* write or know dos api calls, \nand isn\'t going to know that they can magically quote escape in some cases.\n\nThe simplest XP approach is to use file:/// or resource:/// for paths. Both of \nthese would be recognizable as taking / as their path separator and have well \nknown escaping algorithms. resource: can be extended to handle home \ndirectories and other magical things. See comments up to 20.\n\nAs long as we make paths look like urls instead of native paths, there isn\'t a \nproblem.\n\nOn MacOS classic, only : is a path sep, and using full paths is about the most \nevil thing you can do (it gets you stoned and worse).',0.00,0,1,1158862,0,NULL,0),(12911,7978,'2002-02-10 06:28:41','Maybe I\'m confused; I thought the talk was about the internal representation of\ndirectory separators. Obviously the UI should use whatever is native to the\nplatform.',0.00,0,1,1158968,0,NULL,0),(12911,15223,'2002-02-10 09:03:21','you\'re crazy. the goal of this bug is to make prefs portable. the only way \nreasonable way to make it portable is to use URLs. any \'internal\' \nrepresentation that isn\'t a URL is a disaster. I really don\'t understand why we \nhave any need for this discussion.\n\nComment 49 caused the problems, here\'s a minor quote: \"At this time \nWindows-like separators are not recognized on Unix and vice versa.\" If you \nread the recognizer as users instead of operating systems then you\'re where I \nsit. Before comment 49 we were clearly leaning to URLs, the fact that the bug \nhadn\'t been fixed is just the bug and not an indication of a rational \ndirection.',0.00,0,1,1159067,0,NULL,0),(12911,7978,'2002-02-10 09:12:54','Don\'t call me names. That\'s totally inappropriate. I\'m wasn\'t even advocating\nanything: just trying to clarify the situation. \n\nNote that comment 49 starts by saying \"What about the seperator characters used\nin stored pathnames [...]\" -- *stored* pathnames, not user representation.\n\nBut anyway, I agree with you that using file:/// urls is the right and sensible way.',0.00,0,1,1159080,0,NULL,0),(12911,31092,'2002-02-10 10:57:18','Unfortunately file:/// URLs are not relative but absolute. See the Summary of\nthis bug for more details...',0.00,0,1,1159157,0,NULL,0),(12911,15223,'2002-02-10 14:29:59','that\'s why we\'d use resource: or an equivalent.',0.00,0,0,1159358,0,NULL,0),(12911,1833,'2002-02-10 16:38:35','this bug is about storing relative pathnames in your prefs.js file - not for how\nyou\'re calling APIs, what you see in the UI, etc etc. Conrad has already\nasserted that the format he has in mind is both relative and cross-platform.\n\nThe actual storage format is irrelevant to all the above discussion, please take\nthis rediculous debate to the newsgroups.',0.00,0,0,1159458,0,NULL,0),(12911,14753,'2002-02-10 19:23:19','I agree that the paths should be stored as some form of resource: urls. Anything\nis better than the current absolute paths, and a resource: makes a lot of sense. \nMy main argument, appearances notwithstanding, is that it would be preferable to\navoid the use of a unicode(non-ascii) character for the separator. The\ndiscussion of API\'s, command line options, etc. was entirely to establish that\nthe \'/\' shouldn\'t break anything in particular, and preserves compatibility with\nexisting editors. While it is certainly not a requirement for the file to be\ncompatible with ASCII editors, I also don\'t see any good reason to break that\ncompatibility just because we can.\nIt is quite possible that I misinterpreted Conrad\'s meaning when he said he\nwould use a UTF-8 encoded descriptor, but he seemed pretty clear (Unlike me,\napparently)\n\n',0.00,0,0,1159583,0,NULL,0),(12911,20209,'2002-02-10 19:31:23','You missed the point. The separator is not in question. The question is how to\npoint to files which may have non-ASCII characters in the filenames. Conrad\nsaid that he will just encode the filenames as UTF8 which means that as long as\nyour filenames are 7-bit clean your prefs file will be too.',0.00,0,0,1159596,0,NULL,0),(12911,14753,'2002-02-10 20:21:22','Unfortunately, my reading of Conrad\'s comment# 50 doesn\'t agree with that\ninterpretation. I expect that Conrad will be able to clear up any\nmisunderstandings that have arisen.\n',0.00,0,1,1159621,0,NULL,0),(12911,44558,'2002-02-17 19:37:31','I\'d also like the ability to specify a remote path so that users could store their profiles on a network \nserver and have access to them from anywhere on the LAN. This should be specified through the \nuse of environment variables or usernames -- on a Windows workstation on a Netware network or \nSaMBA/Win network in the system login script a virtual drive letter like U: would be created \npointing at the user\'s , and each user\'s profiles are in U:\\Netscape\\Users\\Default. On a \n*BSD/Linux network I\'m sure the same procedure could be worked out. This would allow a use to \nlog in to the network from any workstation and have personal settings. THIS IS NOT A ROAMING \nPROFILE where the profile is copied to the server when Mozilla shuts down and then copied to the \nlocal workstation when Mozilla starts. The profile info stays on the server all the time.',0.00,0,0,1173553,0,NULL,0),(123203,20048,'2002-02-20 18:50:27','-> future',0.00,0,0,1180958,0,NULL,0),(6810,4048,'2002-02-22 07:35:15','-> I think this is a UI issue on linux.. is this fixed already?',0.00,0,0,1184271,0,NULL,0),(12911,6183,'2002-02-22 08:38:41','Unless I\'m misunderstanding, the last comment asks for something which is\nalready in place- you can tell Mozilla where to find your profile using the\nprofile wizard as long as the profile is on a filesystem visible to your\nmachine. I\'d just like to add my voice to ask for an implementation to fix this\nASAP. What\'s in the way of fixing it via a resource: url? Perhaps it would be a\ngood idea to split off the unicode pref encoding idea into a different bug and\nresolve this quickly- after all, not that many people use non-ascii characters\nin their directory and file names. Does the resource: fix have a shot at being\nimplemented for .9.9, the current target? With 23 votes and a dup count\napproaching mostfreq [and definitely mostfreq if you count the bugs which are\ndups of the dependent bugs 7067 and 58647 which appear to me to be dups of this\n(with the additional request for big vs. little endian in 7067 and a UI mention\nor hack in 58647)] this bug seems to deserve a quick squashing.',0.00,0,1,1184369,0,NULL,0),(6810,4079,'2002-02-22 09:39:54','Roland, please check if this is fixed...thanks.',0.00,0,0,1184456,0,NULL,0),(6810,4432,'2002-02-25 02:10:36','No, this has not been fixed.\n\nThis bug is about setting the print jobs title for the print spooler. Currently\nwe include the title in the page itself but to not pass it to the print spooler\nsystem.',0.00,0,1,1188174,0,NULL,0),(12911,18780,'2002-02-25 08:40:58','> this bug seems to deserve a quick squashing.\n\nI\'m glad you think this problem is so easy - why don\'t you supply a patch then ;-)\n\nSeriously, my patch is coming along. I\'m using a resource: URL, because it\'s\nhere, it works, etc. A resource URL is not quite as XP as what I had in mind.\nThough escaped, non-ASCII chars will be in the native charset for that platform.\nI don\'t think that\'s such a problem because all of the files created within a\nprofile dir are made programatically, under our control. We don\'t create files\nwithin the profile dir with non-ASCII characters anyway. The path *to* the\nprofile dir can contain any characters of whatever charset. The laborious part\nof this is fixing up the many callsites in mailnews. ',0.00,0,1,1188479,0,NULL,0),(12911,9769,'2002-02-25 09:04:39','> profile dir are made programatically, under our control.\nActually not all - You could create Mail/Folder with local names (just tested).\nIt will then create directory or FILE + FILE.msf, where \"FILE\" contains\ndifferent charset (for me it is Russian languange + Koi8-r charset for Linux OS)\n\nAlso some RFE to this talk. Onece on discuassion forum I was asked \"if it\npossible to have mail/news archive on CD (CD-RW or CD-R) and still have ability\nto read it from newsreader. The answer was \"no for MS OE\", \"yes for Netscape4\".\nThere you could specify different directory location for mail/news instead of\nsubdirectory of Profile. I do not know how to solve this problem if separate\n\"profile\" URL whould be used, but just keep in mind that there is need in\nseparate storage for mail/news archives.\n',0.00,0,1,1188506,0,NULL,0),(12911,18780,'2002-02-25 10:59:03','> Actually not all - You could create Mail/Folder with local names (just tested).\nIt will then create directory or FILE + FILE.msf, where \"FILE\" contains\ndifferent charset (for me it is Russian languange + Koi8-r charset for Linux OS)\n\nYou\'re right - but the folder names are not stored in the prefs as part of\nabsolute paths. The prefs which need to be fixed for this are the ones which are\nabsolute paths to the top-level mail directories. For example, \"mail.directory\",\n\"mail.server.server1.directory\", etc. Once those top-level dirs are resolved,\nfolder names can be appended in whatever charset.\n\n> There you could specify different directory location for mail/news instead of\nsubdirectory of Profile.\n\nYeah, relative paths cannot always be used - as in this case. If the file pref\nto be saved is not a subdirectory of the profile dir, it will be written out as\nan absolute file path. BTW, even if a file pref can be made relative, the\nabsolute path pref will still be written out until some point when compatibility\nwith older builds can be dropped (maybe never). Given that, we\'ll have to\nsupport both kinds of paths anyway.',0.00,0,0,1188725,0,NULL,0),(12911,19670,'2002-02-25 11:48:46','>Seriously, my patch is coming along. I\'m using a resource: URL, because it\'s\n>here, it works, etc. A resource URL is not quite as XP as what I had in mind.\n>Though escaped, non-ASCII chars will be in the native charset for that platform.\n\nCcarlen: would fix for bug 84186 and bug 124042 make it possible to use UTF-8\nencoding for resource: URLs? If so, it might be worth to store everything\nencoded as UTF-8...\nAscii is just a subset of UTF-8, so it would only be necessary to ensure\ngraceful support for rare cases where there are some multibyte characters in\nsuch an URL (just a suggestion, correct me if I got something wrong).',0.00,0,1,1188857,0,NULL,0),(12911,14534,'2002-02-25 16:28:28','*** Bug 127771 has been marked as a duplicate of this bug. ***',0.00,0,0,1189769,0,NULL,0),(12911,14534,'2002-02-25 18:46:26','*** Bug 127771 has been marked as a duplicate of this bug. ***',0.00,0,0,1190170,0,NULL,0),(12911,18780,'2002-02-27 10:25:42','',0.00,0,1,1193005,5,'71696',0),(12911,18780,'2002-02-27 10:30:37','This snippet of the actual patch shows how the code is used in mailnews. There\nare many callsites that need to be changed which will make for a long, boring\npatch. Also, I changed nsIFileSpec usage to nsILocalFile in any method I\ntouched which makes the final patch bigger.\n\nAlec, before I do the tedium of converting the rest of mailnews, can you tell\nme what you think of the approach?',0.00,0,1,1193012,5,'71697',0),(12911,1833,'2002-02-27 10:31:55','I have to admit that I\'m not fond of this approach. I feel like this would\nincrease our security risk w.r.t. profiles - essentially hiding the \"salt\"\ndirectory name behind a URL, rendering it useless (in effect, it makes access\nto resource://default/prefs.js incredibly easy if there is every a URL-based\nsecurity breach.\n\nHonestly, it seems like this bug ought to be something handled internal to the\npref service',0.00,0,1,1193013,6,'71696',0),(12911,14753,'2002-02-27 11:10:24','Regarding Alec\'s comment, this bug is at least partially INTENDED to hide the\n\'salt\' directory name. We have a conflict here between the security granted by\nthe \'salt\' dir, and the overall usability of prefs file.\nI\'m usually pretty paranoid about security issues, but in this case I\'m pretty\nsure that we only have a problem if resource:// urls are accessible to the user.\nIf that happens, I imagine the lack of \'salt\' protection is perhaps not the\ngreatest problem we will have to deal with.\nOn the other hand, at least some of the benefits of the relative paths could be\nhad if we use resource://profiledir/foo.SLT/prefs.js.\nThis happens to eliminate the benefits of relative paths that I am personally\ninterested in, but isn\'t totally bad.\n',0.00,0,1,1193106,0,NULL,0),(12911,1833,'2002-02-27 11:49:49','Woah there.. we can hide the salt directory within prefs, because the mechanism\nis more convoluted than adding this capability to necko..\n\ni.e. if I say that a pref has the value:\nuser_pref(\"wallet.SchemaValueFileName\", \"${profiledir}/abcd.w\");\n\nand then prefs internally handles this wacky syntax, then this does not give us\nany further indication about salt directory name. It does give us the name of\nthe wallet schema file, but that risk is already present in the current codebase.\n\nIf we add this capability in a more global space, such as necko, then it makes\nit easier for code which is searching for well-known filenames (such as\nprefs.js) to read these files.\n\nI\'ve intentionally made a lame strawman syntax above.. I\'m not suggesting that\nwe use the ${ } syntax, I just stole it from perl. I welcome other suggestions.\nThe resource:// syntax is interesting, but I\'m against it mostly because it\nimplies that it works elsewhere, such as in necko, where I don\'t think it should!',0.00,0,1,1193212,0,NULL,0),(12911,18780,'2002-02-27 12:22:49','Bad idea. Alec\'s right. Working on a new scheme which will solve problem with\nresource:// URLs.',0.00,0,1,1193304,6,'71696',0),(12911,14753,'2002-02-27 19:27:24','I see what Alec is saying, now. It makes a lot of sense. I was working on the\nassumption that it had already been decided to use resource: urls. I suppose\nnothing is really decided until it is checked in to the trunk. I definitely\nagree that there are security concerns with putting this functionality into Necko.\nI\'ll go lurk again...',0.00,0,1,1194445,0,NULL,0),(12911,18780,'2002-02-28 10:33:22','Here\'s the funtionality needed in prefs to support this. Next, I\'m working on\nnsLocalFile::Get/SetRelativeDescriptor. At that point, we\'ll have support for\nrelative file prefs and I\'ll check that in as the first phase. It won\'t have\nany effect until mailnews uses it everywhere but, with everything at once, the\npatch will be frightenly large.',0.00,0,1,1195276,5,'71905',0),(12911,18780,'2002-03-04 08:32:10','-> 1.0, in progress though...',0.00,0,0,1201185,0,NULL,0),(12911,4448,'2002-03-04 19:20:18','Moving Netscape owned 0.9.9 and 1.0 bugs that don\'t have an nsbeta1, nsbeta1+,\ntopembed, topembed+, Mozilla0.9.9+ or Mozilla1.0+ keyword. Please send any\nquestions or feedback about this to adt@netscape.com. You can search for\n\"Moving bugs not scheduled for a project\" to quickly delete this bugmail.',0.00,0,1,1202967,0,NULL,0),(12911,18780,'2002-03-05 10:36:59','Putting back to 1.0 since it\'s topembed now.',0.00,0,0,1203966,0,NULL,0),(12911,302291,'2002-03-07 17:11:40','the javascript component loader requires this functionality.',0.00,0,0,1209541,0,NULL,0),(2586,20209,'2002-03-07 23:35:21','*** Bug 129471 has been marked as a duplicate of this bug. ***',0.00,0,0,1210042,0,NULL,0),(12911,4346,'2002-03-13 09:07:50','Another profile directory bug.... It\'d be nice if we fix this in MachV.',0.00,0,0,1218967,0,NULL,0),(12911,16235,'2002-03-13 09:43:17','If this would be \"nice for MachV\", please explain why, and nominate it. ',0.00,0,0,1219037,0,NULL,0),(12911,18780,'2002-03-13 10:02:04','> If this would be \"nice for MachV\", please explain why, and nominate it.\n\nIt already is topembed+ and in-progress.\n',0.00,0,1,1219107,0,NULL,0),(12911,338084,'2002-03-13 23:08:19','so are relative pathnames part of the reason map-networked profiles dont work as\nin bug 79419?',0.00,0,0,1221018,0,NULL,0),(12911,18780,'2002-03-14 10:05:03','',0.00,0,1,1221795,5,'74104',0),(12911,14534,'2002-03-14 17:09:42','*** Bug 131054 has been marked as a duplicate of this bug. ***',0.00,0,0,1223158,0,NULL,0),(12911,18780,'2002-03-19 15:52:34','This patch gets around the skanky *this = *(nsLocalFile *)targetFile business\nin the previous patch. On the Mac, it was a little involved - I needed a new\niface for private getters in order to init a file with an existing file. On\nother platforms, a GetPath()/SetPath() is cheap and non-lossy.',0.00,0,1,1232165,5,'75079',0),(12911,18780,'2002-03-19 15:55:58','Adding Brian to review the prefs portion. Can Doug and Alec r=/sr= attachment\n71905 and attachment 75079?',0.00,0,1,1232178,0,NULL,0),(12911,16517,'2002-03-19 16:42:03','I\'m sorry, I must be stupid... in GetComplexValue() I don\'t see where you are\never storing your object into the return value...\n\n+ nsCOMPtr relativePref;\n+ rv = NS_NewRelativeFilePref(theFile, key.get(), getter_AddRefs(relativePref));\n+ if (NS_FAILED(rv))\n+ return rv;\n+\n+ NS_ADDREF(NS_STATIC_CAST(nsIRelativeFilePref*, *_retval));\n+ return NS_OK;\n\nOther than that, the prefs patch seems ok...',0.00,0,1,1232307,0,NULL,0),(12911,18780,'2002-03-20 16:13:04','D\'oh - nice catch. I\'m stupid. Here\'s a patch which was actually tested.',0.00,0,1,1234525,5,'75295',0),(12911,16517,'2002-03-21 09:11:54','r=bnesse on the prefs patch.',0.00,0,1,1235592,6,'75295',0),(12911,1833,'2002-03-26 10:14:57','\nthat would simplify some of the code in SetRelativeDescriptor, you\'d need less\nXP_MAC stuff because you\'d just be able to pass in targetFile\n\n\n\n>+ void initWithFile(in nsILocalFileMac aFile);\n\nI wonder if we should make InitWithFile() exist on \nnsILocalFile()? It seems like this would be useful to more than just the mac...\nespecially since the implementation you\'ve given doesn\'t actually rely on\nnsILocalFileMac...\n\n\n\n>+#if defined(XP_MAC)\n>+static const nsCAutoString kSlashStr(\"/\");\n>+static const nsCAutoString kESCSlashStr(\"%2F\");\n>+#endif\n\nthis is worrysome because you use these for ReplaceSubstring, and nsString.h\nsays\n> void\n> nsCString::ReplaceSubstring(const nsCString& aTarget,const nsCString& aNewValue){\n> \n> //WARNING: This is not working yet!!!!!\n\nhowever, it kinda looks like the const char* versions work (or at least don\'t\nhave the warning)\nI remember something about an infinite loop with the broken ReplaceSubstring()\n\n>+ rv = GetUnicodePath(&thisPath);\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ rv = fromFile->GetUnicodePath(&fromPath);\n>+ if (NS_FAILED(rv)) {\n>+ nsMemory::Free(thisPath);\n\nCan you use nsXPIDLString here?\n\n>+ for (nodeIndex = branchIndex; nodeIndex < thisNodeCnt; nodeIndex++) {\n>+ NS_ConvertUCS2toUTF8 nodeStr(thisNodes[nodeIndex]);\n>+#ifdef XP_MAC\n>+ nodeStr.ReplaceSubstring(kSlashStr, kESCSlashStr);\n>+#endif\n\nthis is the spot I was worried about.\n\n\n>+ nsMemory::Free(thisPath);\n>+ nsMemory::Free(fromPath);\n\nagain, more nsXPIDLCString?\n\n>+ const nsCAutoString kParentDirStr(\"../\");\n\nuse NS_NAMED_LITERAL_CSTRING(kParentDirStr, \"../\"); - you\'ll get length for\nfree, plus no \nextra copying and no extra stack buffer\n\n>+ \n>+ nsCOMPtr parentDir;\n>+ while (FindInReadable(kParentDirStr, nodeBegin, nodeEnd)) {\n>+ rv = targetFile->GetParent(getter_AddRefs(parentDir));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ targetFile = parentDir;\n>+ \n>+ nodeBegin = nodeEnd;\n>+ pos = nodeEnd;\n>+ nodeEnd = strEnd;\n>+ }\n>+ \n\nNot sure I understand the point of this loop.. are you removing \"../\"? can you\ncomment here?\n\n>+ nodeBegin = nodeEnd = pos;\n>+ while (nodeEnd.size_forward() > 0) {\n>+ FindCharInReadable(\'/\', nodeEnd, strEnd);\n>+ nsCAutoString nodeString(Substring(nodeBegin, nodeEnd)); \n>+#ifdef XP_MAC\n>+ nodeString.ReplaceSubstring(kESCSlashStr, kSlashStr);\n>+#endif\n>+ targetFile->AppendUnicode((NS_ConvertUTF8toUCS2(nodeString)).get());\n>+ nodeBegin = ++nodeEnd;\n\nThis last line is a little scary because you might advance past the end of the\nstring - nodeEnd exists just past the end of the \nstring, if FindCharInReadable matched at the end of the string..\nthough now that I look at this loop, I am again confused :) Can you explain\nwhat\'s going on here? :)\n\n>+ }\n>+\n>+#ifdef XP_MAC\n>+ nsCOMPtr macFile(do_QueryInterface(targetFile, &rv));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ return InitWithFile(macFile);\n>+#else\n>+ nsXPIDLCString nativePath;\n>+ rv = targetFile->GetPath(getter_Copies(nativePath));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ return InitWithPath(nativePath.get());\n>+#endif\n\nThis is the bit that would be simplified by putting InitWithFile into\nnsILocalFile',0.00,0,1,1244147,6,'75079',0),(12911,1833,'2002-03-26 10:38:42','>+ * \n>+ */\n>+\n>+[scriptable, uuid(2f977d4e-5485-11d4-87e2-0010a4e75ef2)]\n>+interface nsIRelativeFilePref : nsISupports\n>+{\n>+ /**\n>+ * file\n>+ *\n>+ * The file whose location is stored or retrieved.\n>+ */\n>+ attribute nsILocalFile file;\n>+\n>+ /**\n>+ * relativeToKey\n>+ *\n>+ * A directory service key for the directory\n>+ * from which the file path is relative.\n>+ */\n>+ attribute string relativeToKey;\n\nActually, I\'m thinking this should be an ACString, because then:\n\n>+inline nsresult\n>+NS_NewRelativeFilePref(nsILocalFile* aFile, const char* relativeToKey, nsIRelativeFilePref** result)\n>+{\n\nthis could take a |const nsACString&|\n\nand then:\n\n>+ nsCAutoString key(Substring(keyBegin, keyEnd));\n\nthis could become \nconst nsAString& key = Substring(keyBegin, keyEnd);\n\n>+ rv = directoryService->Get(key.get(), NS_GET_IID(nsILocalFile), getter_AddRefs(fromFile));\n\nhere you\'d use PromiseFlatCString()\n\n>+ rv = NS_NewRelativeFilePref(theFile, key.get(), getter_AddRefs(relativePref));\n\nbut here this could just be \"key\"\n\n\n>+ nsCOMPtr mFile;\n>+ nsCAutoString mRelativeToKey;\n\nand, possibly, this could be nsSharableCString..(that\'s not as important)\nbut even if this is an nsCAutoString, I think we should comment as to why this\nis good\n(i.e. that keys are never longer than xxx bytes, so we know we\'ll never\noverflow autostring\'s buffer,\nso this just saves us an allocation)\n\noverall the approach looks great though, just these minor tweaks.',0.00,0,1,1244197,6,'75295',0),(12911,20048,'2002-03-26 10:52:06','what is the charset of relativeToKey? ASCII? UTF-8? platform dependent?',0.00,0,0,1244228,0,NULL,0),(12911,18780,'2002-03-26 11:13:10','\n> what is the charset of relativeToKey? ASCII? UTF-8? platform dependent?\nIt\'s ASCII. The charset isn\'t really an issue there - the key is just a constant\nfrom nsDirectoryServiceDefs.h or nsAppDirectoryServiceDefs.h\n\nWorking on alec\'s points...',0.00,0,1,1244291,0,NULL,0),(12911,18780,'2002-03-26 11:53:40','> I wonder if we should make InitWithFile() exist on nsILocalFile()?\n\nHmm - probably so.\n\n> this is worrysome because you use these for ReplaceSubstring, and nsString.h\nsays\n\nYikes - thanks for catching that. Just checked and nsString.h doesn\'t say that\nthough it does in .cpp. It worked in my testing of that case though. I\'ll ask\nscc or jag and, if that really is broken, not use it.\n\n> >+ rv = fromFile->GetUnicodePath(&fromPath);\n>+ if (NS_FAILED(rv)) {\n>+ nsMemory::Free(thisPath);\n\n> Can you use nsXPIDLString here?\n\nI would sure like to. Problem was, I chop the string into substrings by\ninserting NULL chars. Is it recomended to use GetWritableFragment() with an\nnsXPIDL[C]String and operate on that?\n\n> use NS_NAMED_LITERAL_CSTRING(kParentDirStr, \"../\"); - you\'ll get length for\n free, plus no extra copying and no extra stack buffer\n\nOK\n\n> Not sure I understand the point of this loop.. are you removing \"../\"? can you\n comment here?\n\nYes. While we have leading \"../\" they get removed and I get the parent of the\nfile. That\'s what \"resolves\" or normalizes the \"../\" in an XP way.\n\n> This last line is a little scary because you might advance past the end of the\n string - nodeEnd exists just past the end of the \n string, if FindCharInReadable matched at the end of the string..\n though now that I look at this loop, I am again confused :) Can you explain\n what\'s going on here? :)\n\nwhat\'s going on here is that I\'m taking each node, which are separated by \'/\'s\nand appending that to the file. You\'re right that the loop is wrong. After\nputting up this patch, I changed it. It\'ll be in the next patch.\n\n> Actually, I\'m thinking this should be an ACString, because then:\n\nOK - A[C]String classes everywhere!',0.00,0,1,1244400,0,NULL,0),(12911,1833,'2002-03-26 12:05:23','oh! I didn\'t see that :)\nYou can use Substring() to get access to fragments of strings, though now that I\nsee what you\'re doing maybe that isn\'t the best option. Eh, nevermind :) back to\nraw PRUnichar I suppose, unless you can find a neat way of doing Substring() tricks.\n\nbtw, you can do stuff like this:\nconst nsAString& sub = Substring(str, start, len);\n\nif \"str\" is a any kind of nsAString',0.00,0,1,1244421,0,NULL,0),(12911,1833,'2002-03-26 12:07:05','> OK - A[C]String classes everywhere!\n\nAll the k00l kids are doing it :)',0.00,0,1,1244423,0,NULL,0),(12911,18780,'2002-03-26 12:29:33','> back to raw PRUnichar I suppose\nFor this, it\'s hard to beat for efficiency as well as easy code. If only there\nwas such a thing as an nsMemoryAutoPtr ;-)',0.00,0,1,1244473,0,NULL,0),(12911,18780,'2002-03-27 13:17:22','I made the API change to nsIRelativeFilePref to use ACString for the key. It\nmade things easier in the impl and saved some allocations. One suggestion I\ndidn\'t take was this one (though I tried it):\n\n>+ nsCAutoString key(Substring(keyBegin, keyEnd));\n\nthis could become \nconst nsAString& key = Substring(keyBegin, keyEnd);\n\n>+ rv = directoryService->Get(key.get(), NS_GET_IID(nsILocalFile),\ngetter_AddRefs(fromFile));\n\nhere you\'d use PromiseFlatCString()\n\nUsing the nsCAutoString in this case is better because no allocation ever\nhappens. If I were to use PromiseFlatCString on the nsACString& made from\nSubstring, PromiseFlatCString would be forced to allocate so it could make its\npromised string null-terminated. I stepped though this, and saw how the\nallocation happens.\n\nBrian, can you r= again? Alec, can you sr?',0.00,0,1,1246813,5,'76452',0),(12911,1833,'2002-03-27 14:13:16','true enough. I think in the future stack allocation will happen automatically\nthough. Until that happens, I guess nsAutoString is best..I\'ll try to review\nthis today',0.00,0,1,1246923,0,NULL,0),(12911,16517,'2002-03-27 14:52:39','r=bnesse.',0.00,0,1,1246990,6,'76452',0),(12911,1833,'2002-03-27 15:39:15','looks great!\n\nsr=alecf',0.00,0,1,1247094,6,'76452',0),(12911,18780,'2002-03-27 16:13:15','This patch differs from the previous this way:\n(1) Puts InitWithFile on nsILocalFile instead of only nsILocalFileMac. The Mac\nhas its own implementation though.\n(2) Fixed up the logic in a loop in SetRelativeDesc\n(3) Using the const char* versions of ReplaceSubstring()\n(4) Using NS_NAMED_LITERAL_CSTRING where I can.\n\nThis patch also has the test program I\'ve been using on this stuff.',0.00,0,1,1247145,5,'76482',0),(12911,1833,'2002-03-28 09:42:42','ok, everything looks good...except for one thing that I just realized with this\npatch.\n\nWhen you do the ReplaceSubstring() on a UTF8 string, you run the danger of\nreplacing a single byte in a fragment of a UTF8 character sequence, and thus\nchanging its UCS2-encoded value.\nWhat I mean is, say you have a UTF8-encoded string and the first \"character\" is\na 4-byte sequence that would translate to a single UCS2 character. If the 3rd\nbyte of that sequence happens to be \'/\', then you\'ll be inserting \"%2F\" which\nwill make the last 2 bytes of that sequence \"%2\" which would mean the\ntranslated UCS2 byte would be a different byte, plus you\'d be adding in an\nextra \'F\' before the next character.\n\nAll this basically means is that you have to do the ReplaceSubstring() step on\nthe UCS2 string rather than the UTF8 string.. \n\nfortunately, SplitPath() is working on PRUnichar strings, so it is safe.\n\nI see this in two places. It will unfortunately complicate the code because\nyou\'ll have to make a temporary nsAutoString somewhere, but I think its the\nonly way to avoid this problem.\n\nother than that, the patch looks great!',0.00,0,1,1248213,6,'76482',0),(12911,20048,'2002-03-28 10:25:25','> What I mean is, say you have a UTF8-encoded string and the first \"character\" \n> is a 4-byte sequence that would translate to a single UCS2 character. If the \n> 3rd byte of that sequence happens to be \'/\'\n\nalecf: no, its not possible for \'/\' to appear as part of a UTF-8 multibyte\ncharacter. that\'s in fact why UTF-8 is so nice. the 8-th bit is set on each\nbyte in a UTF-8 multibyte sequence :-)\n\nUTF-8 bits mapped to UCS2 bits goes like this:\n\n 110xxxxx 10xxxxxx -> 00000xxx xxxxxxxx\n 1110xxxx 10xxxxxx 10xxxxxx -> xxxxxxxx xxxxxxxx\n\nnotice that the UTF-8 bytes all have the high bit set.',0.00,0,1,1248316,0,NULL,0),(12911,1833,'2002-03-28 10:43:00','oh! neat. I thougt it was only the leading byte of a multi-byte sequence that\nhad the high-bit set.\n\nThat explains why it can take so many bytes to represent one UCS2 character :)\nsr=alecf then!',0.00,0,1,1248359,6,'76482',0),(12911,18780,'2002-04-02 15:19:18','',0.00,0,1,1257525,5,'77309',0),(12911,1833,'2002-04-02 15:30:45','adding seth for account manager stuff (I don\'t know who the current mail account\nmanager owner is, but I\'d like seth\'s input on this)\n\nI\'m a bit concerned about just going with the new pref, or at least just tacking\n-rel onto the end of the pref name. I like the idea in general but I\'m wondering\nif mail will have any preferences in this area..\n\nanother possible approach is to add stuff to the pref migration code to convert\nall the mail prefs over automatically. I don\'t think we\'ve generally worried\nabout backwards-compatibility (i.e. at least making old browsers work with\ncurrent prefs) so its possible that a one-time migration may be all we really need.',0.00,0,0,1257562,0,NULL,0),(12911,302291,'2002-04-02 16:44:30','r-dougt. this needs to land before mozilla 1.0. After mozilla 1.0, these API\nchanges will not be allowed.',0.00,0,1,1257786,6,'76482',0),(12911,18780,'2002-04-02 18:43:40','> another possible approach is to add stuff to the pref migration code to convert\nall the mail prefs over automatically. I don\'t think we\'ve generally worried\nabout backwards-compatibility\n\nI think we should be worried about backward compatibilty. It is an headache for\n users who download nightlies. You\'d be surprised at the number of bugs that\ncome in against profile mgr where people say \"I ran the new build and it\ncorrupted the profile for my old build.\" Compatibilty in both directions should\nalways be maintained, at least for a few milestones. Then, as the number of\nusers who would run into this problem drop, support for the old pref can be dropped.',0.00,0,0,1258040,0,NULL,0),(12911,93208,'2002-04-03 13:57:38','Wow, this is some pretty scary stuff. Particularly for mailnews. May I ask a\nsilly question. I don\'t see this listed on the mozilla.org branch landing plan.\nNor do I see the branch name that this is on? Is it not a branch? A change this\nsize definetly needs to be on a branch AND it needs to be on the landing page.\nBranch bits need to be given to QA for testing purposes as well. \n\nGiven where we are in the cycle, I really would rather not see the mailnews\nchanges go into the tree for this. If you can land the prefs and xpcom stuff\nwithout taking the mailnews changes, I\'d prefer that. That\'s my take....',0.00,0,1,1259946,0,NULL,0),(12911,14753,'2002-04-03 15:04:21','While I agree that in some ways this is a scary change, that is the point of\nhaving to get it in for 1.0. If it doesn\'t make 1.0, there will be no good way\nto work it in later without breaking the prefs file. ',0.00,0,1,1260256,0,NULL,0),(12911,16235,'2002-04-04 13:57:47','When would you be thinking about landing this, and where (1.0 branch/trunk)?',0.00,0,0,1262546,0,NULL,0),(12911,5003,'2002-04-04 14:22:40','a=asa (on behalf of drivers) for checkin to the 1.0 trunk',0.00,0,1,1262624,6,'76452',0),(12911,5003,'2002-04-04 14:24:03','a=asa (on behalf of drivers) for checkin to the 1.0 trunk',0.00,0,1,1262631,6,'76482',0),(12911,16235,'2002-04-04 15:00:18','adding myself.',0.00,0,0,1262723,0,NULL,0),(12911,16235,'2002-04-05 17:30:58','adt1.0.0+ (on behalf of ADT) for checkin to 1.0, for all reviewed changes except\nthe mailnews patch.',0.00,0,0,1265765,0,NULL,0),(12911,19345,'2002-04-06 22:50:38','A couple quick comments on this:\n\n1) Anything that currently uses a file path that is within the user\'s profile\ndirectory needs to be converted to use a relative path, but absolute paths\nshould also be allowed. For example, \"ImapMail/mail/rules.dat\" vs\n\"/var/foo/mail/rules.dat\". Perhaps this could be implemented as\nresource://profile/ImapMail/mail/rules.dat vs file:///var/foo/mail/rules.dat? \nWould that be a bad idea?\n\n2) From a UI perspective, I think the user should be shown only absolute paths,\nand they should be converted to relative paths if they are within the profile\ndir. The average user won\'t notice a difference, until they move their profile\ndir and find that everything still works.\n\n3) Mac OS uses \":\" as a path seperator and \"/\" is a valid character in a\nfilename. If we\'re storing paths as URLs, \"Folder:file/name.txt\" can just be\nencoded as \"Folder/file%2Fname.txt\" which probably already works in file://\nURLs. Obviously a filename like that isn\'t portable to Windows, but that\'s not\nMozilla\'s problem.\n\n4) I think the ability to copy a profile between platforms is REALLY cool. \nAnything referencing an absolute path will break, but that should only be things\nthe user has explicitly defined (and thus is aware of). If a Windows user keeps\nhis IMAP data at Q:\\Imap\\, he\'ll be expecting Mac OS not to be able to find it\nthere if he moves his profile over, and he\'ll know he needs to change the path\nmanually. However, if he keeps everything in the default locations, he should\nbe able to boot Linux and point Mozilla to \"/mnt/windows/Documents\\ and\\\nSettings/username/Application\\ Data/Mozilla/Profiles/default/a1b2c3d4.slt\" and\nhave everything work perfectly. That would rule.',0.00,0,1,1267112,0,NULL,0),(12911,5834,'2002-04-06 23:02:28','FWIWk, I really think the mailnews prefs need to be able to use both relative\nand absolute paths.',0.00,0,1,1267121,0,NULL,0),(12911,18780,'2002-04-08 05:45:19','>3) Mac OS uses \":\" as a path seperator and \"/\" is a valid character in a\nfilename. If we\'re storing paths as URLs\n\nThat\'s taken care of in the current patch and, no, URLs are not being used.\n\n\n> 1) Anything that currently uses a file path that is within the user\'s profile\ndirectory needs to be converted to use a relative path, but absolute paths\nshould also be allowed.\n\n> FWIWk, I really think the mailnews prefs need to be able to use both relative\nand absolute paths.\n\nThe current patch does that.\n\nCan people refrain from this sort of comment unless they\'ve read the patches and\nknow what they do?',0.00,0,1,1268353,0,NULL,0),(12911,16235,'2002-04-08 09:15:41','really adt1.0.0+ this time!',0.00,0,0,1268634,0,NULL,0),(12911,5834,'2002-04-08 09:30:48','Re: Comment #126\n\nConrad, perhaps I should have referenced Comment #117 in the original comment. \nI can read the patches, I know what they are doing. It seemed like a fairly\nlarge dissenting voice, to not do the diffs to the mailnews area, and I thought\nI would chime up, in favor of the changes not that my voice matters much.',0.00,0,1,1268656,0,NULL,0),(12911,18780,'2002-04-09 07:29:10','Prefs and xpcom patches are landed. As soon as I can make test builds on all\nplatforms with the mailnews patch which makes use of this, that tests well, adt\nwants it, this could be fixed. ',0.00,0,1,1270708,0,NULL,0),(12911,18780,'2002-04-11 17:28:48','The part of this which was adt1.0.0+ (the facility for having XP relative file\ndescs) is in so I\'m calling it fixed.\n\nThe new bug which will have mailnews use this (and actually do some good) is bug\n137006. ',0.00,0,1,1276615,0,NULL,0),(6810,4432,'2002-05-14 02:07:19','Updating summary, this is PostScript-module only; feature is working in Xprint\nmodule...',0.00,0,1,1340652,0,NULL,0),(12911,29655,'2002-05-20 00:49:47','*** Bug 139514 has been marked as a duplicate of this bug. ***',0.00,0,0,1350630,0,NULL,0),(12911,4395,'2002-06-04 11:55:39','verified code fixes',0.00,0,0,1378957,0,NULL,0),(12911,16235,'2002-06-04 13:43:08','If this was verified on 1.0.0 or 1.0.1, pls add the keyword vefified1.0.0 or\nvefified1.0.1. thanks!',0.00,0,1,1379210,0,NULL,0),(12911,8020,'2002-06-05 09:17:10','For better understanding:\n1. Will this bug fix old profiles? Will old profiles be \"converted\"?\n2. What are the *filenames* where the pathname is now stored as \"relative\"?\n3. What are the things that users can *do*, now that this bug is fixed?',0.00,0,1,1380884,0,NULL,0),(12911,35848,'2002-06-05 10:03:26','-> 3. Users can\n\n(a) move their profile directories *without* getting all of their mail folders\nlost (=> without having to correct all related path settings manually)\n\n(b) use their profile directories across different os. this was impossible as\nlong as idividual mail folder paths were given as absolute names\n(e:\\mozilla\\mail\\mymail... not working under linux, /home... not under windows etc.)\n\njust read the comments to find more problems described that ware issued by this bug.',0.00,0,1,1381024,0,NULL,0),(12911,18780,'2002-06-05 10:21:22','Sorry, what was checked in from this bug offers no gain whatsoever to the end\nuser. See comment 117. That was the consensus - to check in the portion which\nprovided the facility of XP relative paths in the codebase but not the mailnews\ncode which would make use of the facility. That portion was split off into bug\n137006 so that the part of this bug which had adt approval (prefs and xpcom)\ncould be closed out. Probably, when this was still on adt radar, it should have\nbeen re-summarized as \"Add support for XP relative paths\" and 137006 should have\nbeen given this bug\'s summary. I think it\'s better just to move along to bug 137006.',0.00,0,1,1381059,0,NULL,0),(2586,12280,'2002-07-07 14:13:21','Not really sure if bug 133808 is a dupe of this bug, the former involves\nchanging orientation in Print Preview and GIFs becoming reanimated (but only on\npages with frames). I was able to verify this behavior on trunk build\n2002070708 under Windows 98. Would bug 2586 need to be reopened for this\nspecial case?',0.00,0,1,1434534,0,NULL,0),(12911,62773,'2002-08-12 13:06:25','This is not fixed. I\'ve been using Mozilla a few months, starting with a 0.9\nrelease, moving to 1.0 and finally 1.1\n\nHear my saga...\n\nI run a home business and we had set up all the Windows98 computers to save all\nuser data to an NT server. This means everything, the MyDocuments folder,\nFavorites for IE, Navigator profiles, Outlook email folders, etc. The reason we\ndid this is because I don\'t want work stopping because a computer is fubar\'d (we\ncan\'t ghost easily because each machine ahs different hardware - we\'re using a\nlot of used equipment). If I have a work deadline, and my machine gets toasted,\nI need to be able to move to another machine, login and have everything, and go\nto work ASAP. All our machines were setup so anyone could login and work on any\nof them as needed.\n\nWhen we decided to move to Mozilla for browsing, mail, news and calendaring, we\nset up all the profiles on the same server. At the same time, we set up our own\nIMAP on a Redhat server and gathered our email via fetchmail and pointed to our\nIMAP server. This worked great. Even in the field with a laptop (different\nprofile, of course), I just hit my IMAP server and had access to all my email.\n\nThen we moved to a very rural location where we could not get cable, DSL or\nwireless. Being back on dial-up meant I could not access our IMAP server away\nfrom home. So I reconfigured Mozilla to grab my email via POP, turned off\nfetchmail, and manually moved all my email from the IMAP folders to the newly\ncreated Mozilla mail folders via the mail-and-news application. \n\nI did this on a stationary PC at home. I then copied the profile to my laptop.\n Since Mozilla was entirely fubar\'d, and a reinstall didn\'t help, I rebuilt my\nlaptop from scratch. Then I then wrote a little DOS batch file to copy the\nentire profile from my home box (which is on a network server) to my laptop\nmanually and vice-versa (and copy a few other things I need).\n\nBasically, it took me over a week, and way more research than was necessary, to\nfix my laptop due to all the absolute paths in various files within the profile.\n In spite of folders for each POP address already present, Mozilla made new ones\nand I had to manually change the directory in each case.\n\nIt\'s taken me scores of hours to get Mozilla working properly on both boxes, and\nmy batch files are about ten times longer than necessary since I have to specify\nthe exact path of every single file to be copied (now that I know which are safe\nto copy and which are not). \n\nAnd once that was working properly, Mozilla crashed on every form submission (an\n*entire* crash of all applications) due to some problem with copying the .w and\n.s files.\n\nAt a minimum, the location of the main profile directory needs to exist in one\nhuman-editable file... all other paths should be relative to it. \n\nAnd frankly, the profile manager should have a button to click to copy a profile\nfrom wherever it actually is to *exactly* the directory where I want it to be -\nand auto-convert anything that eneds to be converted. \n\nI should not have needed to learn this much about Mozilla and what all the\nspecific files do in order to copy a profile. It\'s been a bit much, and I can\'t\nsee the average user going through all this. And it makes Mozilla look bad, my\nco-workers know I am the only Mozilla person around, and also know I have been\nunable to do my email at work for a few weeks now.\n\nI\'m not writing to criticize, I don\'t know enough programming to actually help.\n Sorry. I\'m writing to clarify the types of issues that come up. I need to\nstore my profile on a server *and* on a local machine *and* be able to\nsynchronize the two. I\'ve been using Mozilla just a couple months and this\nreally drove me crazy to the degree of thinking seriously about going back to IE\nand Outlook (god forbid!) I can\'t go back now, I have learned too much. ;)',0.00,0,1,1492942,0,NULL,0),(12911,18780,'2002-08-12 13:41:19','Jackie, read comment #136.',0.00,0,0,1493046,0,NULL,0),(12911,4395,'2002-08-13 08:48:25','v',0.00,0,1,1494337,0,NULL,0),(12911,9700,'2002-08-14 23:54:38','Have you read the comments for bug 12911 ? Could be a bug caused by solving bug\n12911',0.00,0,1,1497248,0,NULL,0),(2586,12280,'2002-08-18 19:15:03','Bug 133808 still exists in Win98 build 2002081716 and seems quite related to\nthis bug, so I\'m reopening it...',0.00,0,1,1502163,0,NULL,0),(11040,4080,'2002-11-05 18:36:19','mozillamail@myrealbox.com - when you added yourself to the cc: list, you cut off\nthe summary. Restoring summary.',0.00,0,0,1622274,0,NULL,0),(11040,27980,'2002-11-06 16:42:21','Very odd. Nonetheless, sorry! I\'ll be more careful.',0.00,0,0,1624018,0,NULL,0),(178960,48391,'2002-11-07 14:54:52','Time announcements should at least include the GMT offset.\n\nNotes like the one that was being shown at 20:06 BRDT (GMT -02:00) \"Bugzilla\nwill be down for an upgrade on Friday, November 8 from 6:00PM to midnight PST\"\nmeans almost nothing to me. It only means that sometime in between November 8\nand 9 Bugzilla will be down. I don\'t know what does \"PST\" mean, and, honestly, I\ndon\'t care, nor will you care what does \"BRDT\" mean, now you have the GMT\noffset. So, the announcements should look like the following ( <> means optional):\n\n(1)\"This bug is being written at 20:46 (GMT - 02:00)\"\nor\n(2)\"This bug is being written at 20:46 (22:00 GMT)\"\nor, using am/pm:\n(3)\"This bug is being written at 08:46 pm (GMT - 02:00)\"\nor\n(4)\"This bug is being written at 08:46 pm (10:00 pm GMT)\"\nor even only GMT:\n(5)\"This bug is being written at 22:46 GMT\"\nor\n(6)\"This bug is being written at 10:46 pm GMT\"\n\nMy personal vote is for (2) or (5).',0.00,0,1,1625571,0,NULL,0),(178960,27300,'2002-11-07 15:22:31','I did (3).',0.00,0,0,1625627,0,NULL,0),(3140,59276,'2002-11-25 04:02:46','I confirm everything said in comment #29. Attachment 63566 WFM without a\nproblem. XP Pro SP1 and build 2002112204.',0.00,0,1,1649983,0,NULL,0),(11040,46544,'2002-12-09 11:30:00','*** Bug 184391 has been marked as a duplicate of this bug. ***',0.00,0,0,1670151,0,NULL,0),(11040,46544,'2002-12-12 12:06:29','*** Bug 185016 has been marked as a duplicate of this bug. ***',0.00,0,0,1675020,0,NULL,0),(11040,46544,'2002-12-12 12:31:13','Reassigning to correct component (I think) - maybe that way this might get some\nattention too...',0.00,0,1,1675051,0,NULL,0),(11040,9136,'2002-12-12 13:32:48','Restoring old assignment, component and CC: fields. ',0.00,0,0,1675115,0,NULL,0),(11040,31814,'2002-12-13 00:31:46','Maybe this should be in mail notidication component anyway (I was responsible\nfor the 185016 dupe, just because I was looking for this feature in the \'mail\nnotification\' component (which would make more sense from a user point of view)',0.00,0,1,1675856,0,NULL,0),(3140,17252,'2003-01-08 17:23:03','wfm based on coments, and the last testcase. ',0.00,0,0,1702923,0,NULL,0),(11040,46544,'2003-02-05 16:01:57','*** Bug 162780 has been marked as a duplicate of this bug. ***',0.00,0,0,1735262,0,NULL,0),(2586,11171,'2003-02-10 16:11:38','Now that bug 133808 is confirmed as fixed, this can be closed as well.',0.00,0,0,1740227,0,NULL,0),(3140,17252,'2003-02-14 10:00:28','verifying',0.00,0,1,1745835,0,NULL,0),(12911,51898,'2003-03-07 07:37:45','Please change someone the summary as mentioned in comment 136. It\'s confusing.',0.00,0,0,1770985,0,NULL,0),(11040,46544,'2003-03-28 16:35:25','*** Bug 199697 has been marked as a duplicate of this bug. ***',0.00,0,0,1798224,0,NULL,0),(13534,46638,'2003-04-30 15:00:16','Are there any news regarding this bug? (Last comment is from November 2001)\n',0.00,0,1,1834106,0,NULL,0),(13534,10297,'2003-05-01 23:09:55','They\'ve already been removed (via local hack) at mozilla.org :-)\n\nSomeone was going to do custom resolutions at some point, at which time this\nwould get removed from the defaults on new installations and existing\ninstallations could feel free to delete them (see the dependency).\n\nBut I haven\'t seen any action there in a while either. Matty?',0.00,0,1,1835703,0,NULL,0),(11040,29552,'2003-05-24 07:41:22','*** Bug 206983 has been marked as a duplicate of this bug. ***',0.00,0,0,1860470,0,NULL,0),(11040,43202,'2003-05-24 11:00:18','Nothing seems to be happening with this bug. The way I see it, although this is\nmarked as enhancement, this is a major pain in the ass, whoever is using filters\nto weed out junk mail. Mozilla has an excellent Junk Mail Control right now, I\nam really really happy with it. Except now I keep getting these mail\nnotifications, when I go check I don\'t see any mail, because it has been moved\nto Junk folder. It will be really really nice to have this\n',0.00,0,0,1860618,0,NULL,0),(6810,34853,'2003-06-03 22:37:50','It looks like this should be fairly easy to implement. Simply extend\nnsPostScriptObj::settitle() to set an environment variable holding the document\ntitle (say MOZ_DOCUMENT_TITLE), with code similar to that used to set\nMOZ_PRINTER_NAME in nsPostScriptObj::Init(). As with the Xprint code, the title\nwould need to be converted from UCS2 first.\n\nThen it is a simple matter of modifying print.postscript.print_command in\nunix.js to include \'-J \"${MOZ_DOCUMENT_TITLE}\"\' in the print command.',0.00,0,1,1870277,0,NULL,0),(11040,57902,'2003-09-29 07:07:33','*** Bug 220461 has been marked as a duplicate of this bug. ***',0.00,0,0,1968757,0,NULL,0),(11040,57902,'2003-09-29 07:09:11','Updating component, because I missed finding this when looking for the dupe of \n220461.',0.00,0,1,1968758,0,NULL,0),(11040,119363,'2003-11-14 18:21:17','As written, this strikes me as an overly complex solution to the problem. The problem as I see it is \nthat when junk arrives, even if you have the Junk Mail Controls set to move it to a junk folder, you \nstill get the same notification that you would if it weren\'t junk.\n\nIf you want a whole extra feature that lets you finely control the relationship between filters, that\'s \nmore complicated. But how about a simple change to notification that makes ti ignore messages \nthat have been marked as junk? And add a checkbox to the Junk Mail Controls window that turns \nthis behavior on or off.',0.00,0,0,2005701,0,NULL,0),(11040,31814,'2003-11-17 00:37:51','Well, junk is one part, but mailinglists are, for me, just as big of a problem.\nI\'ve got several mailinglist generating, in total, hundreds of messages a day\n(more than the amount of spam I receive). I don\'t want to be notified of those\neither. ',0.00,0,1,2007593,0,NULL,0),(11040,57902,'2003-11-25 09:52:29','*** Bug 226745 has been marked as a duplicate of this bug. ***',0.00,0,0,2014370,0,NULL,0),(12911,16008,'2003-12-29 07:28:55','a quote from http://www.mozilla.org/unix/customizing.html#key_example\n> For editor and browser windows, create a file called userHTMLBindings.xml and \n> link it into res/builtin wherever mozilla is installed on your machine. \n> (Eventually we want this to live in the user\'s chrome directory, but that doesn\'t \n> work yet; watch bug 12911 for progress on this. We recommend, for now, that you \n> keep the real user bindings file in your chrome directory and make a symbolic \n> link (=shortcut on Windows, alias on Mac) from there to res/builtin.)\n\nthis bug is supposedly fixed (though bug 201011 is not), \nand that should be reflected in the documentation on that page.\nthe current text is confusing, mentioning this bug is not needed.',0.00,0,1,2036072,0,NULL,0),(13534,10297,'2004-01-04 13:22:05','Taking Jake\'s bugs... his Army Reserve unit has been deployed.',0.00,0,0,2039473,0,NULL,0),(6810,35075,'2004-01-19 18:31:51','This patch sets MOZ_DOCUMENT_TITLE to the title of the document (duh), using\nnsIPlatformCharset and nsIUnicodeEncoder to convert from PRUnichar to native\nencoding.\nIt does _not_ make it suitable for inserting in a command line, so the patch is\nnot ready for checkin.\nJust looking for some feedback.\n\n(This is also my first c++-ish patch, so there may well be horrible things in\nit.)',0.00,0,1,2051737,5,'139469',0),(6810,34853,'2004-01-20 21:43:40','In what way is the environment variable set by the patch not suitable for use on\na command line? The whole point of using an environment variable here (as\nopposed to substituting in the document title directly) is so it can be used on\nthe command line without worrying about shell quoting issues.\n\nThe shell should just pass \"${MOZ_DOCUMENT_TITLE}\" to lpr as a single argument\n(unevaluated), no matter whether it includes spaces, quotes, dollar signs or\nother punctuation. You can test this quite easily with a few Python scripts,\nfor example:\n\n--- Start printargs.py ---\n#!/usr/bin/python\nimport sys; print sys.argv\n--- End printargs.py ---\n\n--- Start call-system.py ---\n#!/usr/bin/python\nimport os\nos.environ[\"MOZ_DOCUMENT_TITLE\"] = \"abc def \\\" \\\" `echo foo` $USER\"\nos.system(\"./printargs.py \\\"${MOZ_DOCUMENT_TITLE}\\\"\")\n--- End call-system.py ---\n\n(I chose Python here because it doesn\'t do any special substitutions in strings\nitself). If you run the second program, it should show that the first was\ncalled with only a single argument and none of the potentially evil characters\ngot touched.',0.00,0,0,2052827,0,NULL,0),(6810,35075,'2004-01-21 09:18:23','Ok, let me rephrase that, I did not check it to be suitable for use in a command\nline. (=\nI think we should at least check it\'s length before passing it to system.\n\nIf that\'s not a problem, we still have the design issue, setting environment\nvariables is not a particulary nice way to do this. One solution could be to set\nthe variables on the same command line (\"MOZ_PRINTER_NAME=sumthin\nMOZ_DOCUMENT_TITLE=\\\"a title\\\" lpr \").\n',0.00,0,0,2053198,0,NULL,0),(6810,10982,'2004-01-21 12:39:11','When you do that, why not \n \n lpr -T$(title) \n \n? When Mozilla prints the page, it could expand some variables (like $(title), \n$(url), $(date)) in the command which would allow for some very sophisticated \nthings. \n \nAs for whitespace and variable processing (example: The title of the document \nis \"make $$$ fast\" -> \"lpr -Tmake $$$ fast\"), mozilla should first split the \nprint command into words (space delimited) and then call execv(const char \n*path, char *const argv[]);. ',0.00,0,1,2053347,0,NULL,0),(6810,35075,'2004-01-21 13:13:07','re #31:\nProblem is, we don\'t want to pass on -T if there is no title, just as we don\'t\nwant to pass -P if we don\'t want to specify a printer.\n\n> which would allow for some very sophisticated things. \nSophistication is not the goal here, IMHO. Simple, clean code is. Right now\npopen()/system() or whatever seems to be a lot simpler than exec*(). Let /bin/sh\ndo the dirty work instead of us reinventing the wheel.',0.00,0,1,2053385,0,NULL,0),(11040,9186,'2004-02-10 14:19:45','A suggestion (don\'t know if this is hard to imlpement or not) is to have the\nability to mark a folder as \"don\'t send biffnotifications for this folder\". That\nway you could set up such a folder for your mailinglist or whatever you want to\nnot be notified and create a filter to move messages to that folder.\n\nFor me that would even allow me to not use filters at all since my imap server\nsorts messages for me.\n\nThis could also solve bug 91498 since you could just mark the trashfolder with\nthis flag.',0.00,0,1,2070406,0,NULL,0),(11040,5671,'2004-02-12 21:52:33','as of bug 206050 this can be done with filters\n\nis this now fixed, wfm or wontfix?',0.00,0,1,2073143,0,NULL,0),(11040,4410,'2004-02-12 21:54:30','no, this is separate from bug 206050 - you might want the filtered message to\nremain unread, but not trigger biff.',0.00,0,1,2073145,0,NULL,0),(11040,62128,'2004-03-14 10:11:13','I special notification (sound f.e.) should be available for newsgroups, too.',0.00,0,0,2101171,0,NULL,0),(13534,10297,'2004-03-14 23:17:26','Enhancements which don\'t currently have patches on them which are targetted at\n2.18 are being retargetted to 2.20 because we\'re about to freeze for 2.18. \nConsideration will be taken for moving items back to 2.18 on a case-by-case\nbasis (but is unlikely for enhancements)',0.00,0,1,2101645,0,NULL,0),(11040,44845,'2004-05-24 04:08:48','This would solve bug 91052 , too, I think. Duplicate?!',0.00,0,0,2158488,0,NULL,0),(11040,57902,'2004-05-24 08:09:56','This might not solve bug 91052, depending on the implementation. I suspect that \nthis bug would be fixed by having the filter action reduce the count of \n\"messages requiring notification\" and after all messages were processed, Moz \nwould only notify if the count were greater than zero. Since there is currently \nno notification for newsgroups, such an action wouldn\'t change the behavior \nthere.',0.00,0,0,2158607,0,NULL,0),(248970,144221,'2004-06-28 16:30:15','User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040615 Firefox/0.9\nBuild Identifier: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040615 Firefox/0.9\n\nIn the next version of OS X, Safari will have a \"Private Browsing\" mode which,\nbasically, disables writing to cache, URL history, etc.\nI think this is a good idea, and it\'s small and useful enough that it should go\ninto the browser, not an extension.\n\nReproducible: Always\nSteps to Reproduce:',0.00,0,0,2188772,0,NULL,0),(248970,96908,'2004-06-28 17:23:18','So basically, implement some sort of universal pref to toggle all of the various\ncache/cookies/etc off without opening prefs? I don\'t know if this deserves a\ntoggle in this manner, or how practical that is.\n\nmorphing summary to describe what this actually does in Safari (whenever Tiger\ncomes out)\n\nThe flipside to this is the plan to have Ctrl-Shift-C act as a global privacy\nclear option, so that if you want to clear a certain group of things, you can\nset it to do that.\n\n',0.00,0,0,2188806,0,NULL,0),(248970,144221,'2004-06-29 02:18:39','(In reply to comment #1)\nNo, more like a \"don\'t remember what I\'m doing now\" toggle, which would allow\nbrowsing sites without cookies/history/cache being written to. This would allow\nusers to do any privacy-sensitive browsing (online banking on a public computer,\nshopping for gifts on the family computer, etc.) without having to completely\nclear history/cache/cookies afterwards. This is more useful because when\nclearing all privacy sensitive material you would loose for example login\ncookies for other sites, the complete history which may contain useful items,\nand all of the cache making browsing slower until the cache is refilled.\nPrivacy mode is also more complicated than a global privacy clear option, as it\nmeans cookies and history would have to be moved to a two-layer memory/disk\nmodel like cache, and individual items would need to have a flag that prevents\nthem to move from memory to disk. This is necessary beause the browser would\nstill need to handle cookies and history, just not write them to disk\ncompletely. I\'m not sure wether this can be done in an extension at all.',0.00,0,1,2189080,0,NULL,0),(248970,11608,'2004-06-29 10:07:24','See also bug 155300 (guest profiles) and bug 103765 (anonymous mode).',0.00,0,0,2189453,0,NULL,0),(11040,57902,'2004-08-18 13:54:42','*** Bug 237938 has been marked as a duplicate of this bug. ***',0.00,0,0,2236067,0,NULL,0),(13534,10297,'2004-09-18 18:08:16','Bugzilla 2.20 feature set is now frozen as of 15 Sept 2004. Anything flagged\nenhancement that hasn\'t already landed is being pushed out. If this bug is\notherwise ready to land, we\'ll handle it on a case-by-case basis, please set the\nblocking2.20 flag to \'?\' if you think it qualifies.',0.00,0,1,2264923,0,NULL,0),(248970,69136,'2004-10-02 11:57:54','*** Bug 260266 has been marked as a duplicate of this bug. ***',0.00,0,0,2280922,0,NULL,0),(248970,49640,'2004-10-21 03:26:08','would be a great addition for Firefox, esp. if you have to use a public Terminal\n\n(and it would be great for the Mac 1.0 to have this feature before safari gets it)\n\nbtw: shouldnt this be moved to browser, since the suite could use this too?',0.00,0,0,2301299,0,NULL,0),(12911,15150,'2004-10-29 07:03:45','(In reply to comment #142)\n> this bug is supposedly fixed (though bug 201011 is not), \n> and that should be reflected in the documentation on that page.\n> the current text is confusing, mentioning this bug is not needed.\n\nI\'ve raised bug#266695 about updating the key binding customisation docs\n\n',0.00,0,1,2310723,0,NULL,0),(12911,3858,'2004-10-29 18:41:15','Conrad: could you or someone else involved with the patch explain how these\nprofile-relative paths are used? Is it a resource://MagicVar url, or something\nelse? I didn\'t get a response asking in bug 201011, but the xbl key binding\ncode needs to be fixed to reference a profile-relative file in order to fix that\nbug.',0.00,0,1,2311468,0,NULL,0),(12911,15223,'2004-10-31 16:39:22','akk: they kinda look like this:\n\nmail.server.server4.directory-rel\n[ProfD]../../../../../../../Documents and Settings/user/Application\nData/Mozilla/Profiles/default/random.slt/ImapMail/127.1\nmail.server.server4.directory\nC:\\Documents and Settings\\user\\Application\nData\\Mozilla\\Profiles\\default\\random.slt\\ImapMail\\127.1\n\nEspecially when the code messes up, as it clearly did here.\n\nA better version would be:\nmail.server.server4.directory-rel\n[ProfD]ImapMail/127.1\n\nexcept, that the code is clearly not working well (fixing it is on my todo list).\n\nnote that code has to specifically pick a pref and treat it as a Complex pref w/\na certain type (nsIRelativeFilePref)',0.00,0,1,2313296,0,NULL,0),(248970,96908,'2004-11-18 07:27:36','If Browser needs a bug for it too, great, file a bug there. No one still\nworking/triaging Seamonkey really cares about Firefox.',0.00,0,1,2334100,0,NULL,0),(11040,152096,'2004-12-06 14:59:52','I am surprised with 40+ votes this bug hasn\'t seen any bugzilla activity in\nseveral months. I am using 0.9, and this is the one thing about TB that\nirritates me right now. I am on a mailing list for school with a pop3 account.\n I have to be on this list, and I have to read this mail occssionally, so I\ncan\'t just delete it. Currently, I mark it as junk and filter it to its own\n\"listserv\" folder (different than a general junk/spam folder). However, 90% of\nmy new mail notifications are this dumb listserv, which doesn\'t need my\nattention but once every few days. I would expect that a message flagged as\njunk should *not* notify the user the email has arrived. It is, afterall, \"junk\".',0.00,0,1,2353890,0,NULL,0),(11040,76735,'2005-01-11 23:14:00','I totally agree with orion. I also searched for bugs with as many votes as this\none (46 today), and only found around 150 such bugs (in all of bugzilla) - so\nhow can such a bug just lie there for over 5 years?\n\n(In reply to comment #26)\n',0.00,0,1,2383731,0,NULL,0),(11040,123868,'2005-01-18 11:28:59','*** Bug 216624 has been marked as a duplicate of this bug. ***',0.00,0,0,2389869,0,NULL,0),(11040,83436,'2005-02-05 09:42:35','After having users wait over 5 years for a solution, I\'ll take a stab at\ndefining the problem and proposing a potential solution. This is all I can\ncontribute since I know very little about coding stuff for T-bird. I keep\nrevisiting the bug because the current notification system is worthless to me\nbecause of spam and mailing lists.\n\nObservations:\n\nFirst, it appears the notifications are simply a result of receiving any new\nmessages -- this check apparently is done prior to any processing. In order to\nprevent unwanted notifications the check would have to be moved to after\nfiltering stage. Also it appears the mail is first loaded into the Inbox, then\nfiltered.\n\nOne possible solution is:\n\no Move notifications check to later stage\no When new mail is available first note the old inbox size and/or time stamp.\no Set alert flag to false\no Add filtering options for disable alerts.\no When processing filters, set flag to true as appropriate\no Compare the inbox size and/or time stamp. If these have changed then\n set the alert flag to true.\no Now if the alert flag is true then notify per the general preferences\n settings.\n\nLet\'s get feedback then hopefully someone is willing to pick-up the coding.\n\n\n-Noel',0.00,0,1,2407000,0,NULL,0),(11040,83436,'2005-02-05 09:49:07','Change flag to counter, since I just realized the notification show the number\nof new messages. The counter would be increased for each new message in the\nfilter stage and in the later inbox new message count stage.\n\n\n-Noel',0.00,0,1,2407007,0,NULL,0),(11040,29552,'2005-02-22 12:31:26','*** Bug 283196 has been marked as a duplicate of this bug. ***',0.00,0,0,2422241,0,NULL,0),(6810,61337,'2005-03-07 13:42:13','This bug hasn\'t had activity for quite a few months, so excuse me if I\'m\ndigging up a corpse. But I wanted to add that this feature would be extremely\nuseful for people who print to community printers. These print systems, which\nare used by hundreds or thousands of people, often print cover pages which\ninclude the job title (along with the print date, user name, etc.). Right now,\nthe job title is nondescript (to be exact, it says \"stdin\"). I can see this as\na particular inconvenience for users at universities (as myself) and\nbusinesses, among others.\n\nI\'ve attached an update to the previous patch, so that it applies cleanly.\nUnfortunately, I\'m not at all qualified to back up its validity. Just hoping I\nmight encourage someone else who knows better.',0.00,0,1,2437308,5,'176614',0),(6810,35075,'2005-03-07 16:21:33','obsoleted by new patch',0.00,0,1,2437523,6,'139469',0),(6810,35075,'2005-03-07 16:32:53','(In reply to comment #33)\n> This bug hasn\'t had activity for quite a few months, so excuse me if I\'m\n> digging up a corpse. \n\nThe reason I didn\'t push my patch was that Someone was rewriting the ps module.\nRight now it\'s sort of messy, with lots of global variables, env variables,\netc.. Which makes it impossible to print several documents simultaneously and\nstuff. My patch added more globals and sort of made the change to a new ps\neven harder, so I dropped it.\n\nNow it seems like nobody cares(?) about postscript, so maybe some \"bad\" code to\nfix a problem is the way to go. I still think somebody should check it for \nsecurity reasons, though. (The XXX in the patch.)\n',0.00,0,1,2437541,0,NULL,0),(6810,34853,'2005-03-08 00:25:45','I think the XXX can be removed. Since the document title is in an environment\nvariable, if the print command is written appropriately, the string shouldn\'t\nget interpreted by the shell.\n\nThe appropriate print command would look something like this:\n\n lpr ${MOZ_PRINTER_NAME:+\'-P\'}${MOZ_PRINTER_NAME} \\\n -T \"${MOZ_DOCUMENT_TITLE:-Mozilla: Untitled Document}\"\n\nThis way, lpr will be passed 2 or 3 arguments (depending on whether\n$MOZ_PRINTER_NAME is set), no matter what characters are in $MOZ_DOCUMENT_TITLE\n(it also provides a slightly nicer document title in the case where no title is\nset).',0.00,0,1,2437913,0,NULL,0),(123203,15223,'2005-03-18 15:28:50','at some point my company is going to try to force http to use some other impl of\nnsIURI. we don\'t want to have to reimplement http or all of necko, we like\nmozilla, but this would be fairly bad for us.',0.00,0,0,2448640,0,NULL,0),(11040,198208,'2005-04-28 00:51:00','*** Bug 292087 has been marked as a duplicate of this bug. ***',0.00,0,0,2488623,0,NULL,0),(248970,198492,'2005-04-28 14:05:14','See http://live.gnome.org/Epiphany_2fFeatureDesign_2fPrivateBrowsing for a\ndiscussion related to this.',0.00,0,1,2489213,0,NULL,0),(6810,5077,'2005-04-28 16:38:22','(In reply to comment #35)\n> Now it seems like nobody cares(?) about postscript, so maybe some \"bad\" code to\n> fix a problem is the way to go. I still think somebody should check it for \n> security reasons, though. (The XXX in the patch.)\n\nActually, I\'m hoping to work on this during the gecko 1.9 development cycle, by\nadding a print job class that can construct an lpr command rather than just\nsetting some environment variables and launching an opaque command. See bug\n135695 comment 20.\n\nI\'d prefer not to add any more environment variables to the classic printing\nsupport, though I\'m not absolutely opposed to it. Any new code should definitely\nsupport multiple simultaneous print operations though, which means treating the\nenvironment as a shared resource. If you want to pursue this, you should look at\ngfx/src/ps/nsPrintJobPS.cpp, specifically the nsPrintJobPipePS class and the\nenvironment-handling functions toward the end of the file.',0.00,0,1,2489402,0,NULL,0),(248970,128546,'2005-05-10 04:34:07','It is an extremely useful feature specifically for internet cafes or machines\nwhich are used by multiple users with the same login or even for the security\nparanoid. It is not that difficult to implement either. Definately something I\nwould be keen to see and would be one less feature safari has that we don\'t.',0.00,0,1,2498195,0,NULL,0),(6810,35075,'2005-06-26 17:32:13','Hopefully this should work with multiple simultaneous print jobs.\nBut it\'s a one-night-job so please be merciful. (:\nAdding a global here, for unicode->native charset(locale) conversion of title. ',0.00,0,1,2536391,5,'187366',0),(6810,35075,'2005-06-26 17:34:07','also changed the lpr and lp lines as in comment #36.',0.00,0,0,2536392,0,NULL,0),(6810,35075,'2005-06-27 02:39:27','',0.00,0,1,2536554,5,'187379',0),(6810,5077,'2005-06-29 13:37:55','Alge,\n\nTo start with, I think it\'d be better design to set MOZ_DOCUMENT_TITLE for\nevery print job, rather than setting it only for jobs that have a title. In\nreality, virtually every print job has a title, so I\'d rather not junk up the\nmodel command line with the fallback title logic. Also, the fallback title\nshould not contain \"Mozilla\"; see bug 293268 and bug 285696.\n\nIt looks like you\'re leaking the unicode encoder object. EnvLockInit()\nunconditionally creates a new encoder for every print job, and it\'s not freed\nanywhere. Also, based on other uses of unicode encoders, it looks like you\nshould set the encoder\'s error behavior with SetOutputErrorBehavior().\n\nI don\'t know how large this encoder object is, or how expensive it is to\ninitialize it. I also don\'t know if it\'s possible for the local character set\nto change while mozilla is running. I suspect it\'d be better to allocate an\nencoder for each print job, rather than allocating it once and caching it for\nreuse. If you take that route, you should store the encoder in an nsCOMPtr<>\ninstead of a raw pointer.\n\nPersonally, I think I\'d do the character set conversion inside of\nSetJobTitle(), and then substitute the fallback title in StartSubmission() as\nis done with the CUPS logic. SetJobTitle() has to be threadsafe, so if I were\nusing a cached encoder I\'d do the whole thing in StartSubmission().\n\n\n>-/* Routines to set the MOZ_PRINTER_NAME environment variable and to\n>- * single-thread print jobs while the variable is set.\n>+/* Routines to set the MOZ_PRINTER_NAME and MOZ_DOCUMENT_TITLE environment variables \n>+ * and to single-thread print jobs while the variable is set.\n> */\n\nCould you format your code to fit in 80 columns where it\'s not inconvenient?\nAlso, \"the variable is\" should be \"these variables are\".\n\n\n>+ nsresult res = gNativeEncoder->GetMaxLength(PromiseFlatString(aTitle).get(), srcLength, &destLength);\n>+ if( NS_SUCCEEDED(res) ) {\n>+ nativeTitle = NS_STATIC_CAST(char*, nsMemory::Alloc(destLength+1));\n>+ if(nativeTitle) {\n>+ gNativeEncoder->Convert(PromiseFlatString(aTitle).get(), &srcLength, nativeTitle, &destLength);\n>+ }\n>+ }\n>+ \n>+ if(!nativeTitle)\n>+ return PR_FAILURE;\n>+\n>+ /* Make sure title is null-terminated */\n>+ nativeTitle[destLength] = \'\\0\';\n>+ \n>+ /* Construct the new environment string */\n>+ char *newVar = PR_smprintf(\"%s=%s\", EnvJobTitle, nativeTitle);\n>+ if (!newVar)\n>+ return PR_FAILURE;\n\nIf you leave the character set conversion in this function, could you avoid\ndoing two separate memory allocations here? You could make your first\nallocation large enough for the full environment string, or you could just\nconvert into a fixed-size buffer on the stack. It wouldn\'t be a big deal if\nlong titles were truncated.',0.00,0,1,2538988,6,'187379',0),(13534,5603,'2005-07-12 08:30:05','Since we continue to release bugzillas with this embarassing bug, and bug 94534\ndoesn\'t seem to be going anywhere. So attached are some patches. They don\'t\nhandle the upgrade path for reports and such; I\'m not sure what that would look\nlike. But applied, they\'d at least remove them from fresh installs, which seems\nlike a step.\n\n[And yes, these patches are brain-dead simple, but... something has to jumpstart\nthis.]',0.00,0,1,2549549,0,NULL,0),(13534,5603,'2005-07-12 08:34:24','Probably worth pointing out that we basically don\'t even document REMIND +\nLATER, just one note in the dia diagram. If this group of patches is not\naccepted, I\'ll submit a patch to document that you should remove these\nimmediately after install.',0.00,0,1,2549554,5,'189061',0),(13534,5603,'2005-07-12 09:02:11','',0.00,0,1,2549585,5,'189062',0),(13534,5603,'2005-07-12 09:04:52','Note:\n* doesn\'t attempt to handle the upgrade case (hence I assume it will be\nrejected.)\n* this doesn\'t attempt to change how the collectstats stuff is configured-\nAFAICT, if these fields don\'t exist, things will fail quietly (though I have\nonly read the code, and not tested it)',0.00,0,1,2549587,5,'189063',0),(13534,5603,'2005-07-12 09:06:01','',0.00,0,1,2549589,5,'189064',0),(6810,35075,'2005-07-26 20:45:37','(In reply to comment #41)\n\nKenneth, thanks for you time and comments. (=\n\n> (From update of attachment 187379 [edit])\n> To start with, I think it\'d be better design to set MOZ_DOCUMENT_TITLE for\n> every print job, rather than setting it only for jobs that have a title. \n\nAgreed. Should the fallback be localizable by some means, though? For the time\nbeing I\'ve made it a static const char and use it for both PS and CUPS.\n\n> It looks like you\'re leaking the unicode encoder object. EnvLockInit()\n> unconditionally creates a new encoder for every print job, and it\'s not freed\n> anywhere. Also, based on other uses of unicode encoders, it looks like you\n> should set the encoder\'s error behavior with SetOutputErrorBehavior().\n\nAs far as I can tell, EnvLockInit is only called once (by PR_CallOnce()),\nso it shouldn\'t be leaking? I\'ll look at the error behaviour.\n\n> I don\'t know how large this encoder object is, or how expensive it is to\n> initialize it. I also don\'t know if it\'s possible for the local character set\n> to change while mozilla is running. I suspect it\'d be better to allocate an\n> encoder for each print job, rather than allocating it once and caching it for\n> reuse. \n\nYou think so? If the charset can change, I\'ll agree, but I can\'t see how the\nlocale can change while an application is running on *nix..\n\n> Personally, I think I\'d do the character set conversion inside of\n> SetJobTitle(), and then substitute the fallback title in StartSubmission() as\n> is done with the CUPS logic. SetJobTitle() has to be threadsafe, so if I were\n> using a cached encoder I\'d do the whole thing in StartSubmission().\n\nI\'ll stick with the cached encoder, so.. You think I should move the conversion\nfrom EnvSetJobTitle to StartSubmission?\n\n> Could you format your code to fit in 80 columns where it\'s not inconvenient?\n> Also, \"the variable is\" should be \"these variables are\".\n\nOK.\n\n>> [EnvSetJobTitle]\n> If you leave the character set conversion in this function, could you avoid\n> doing two separate memory allocations here? You could make your first\n> allocation large enough for the full environment string, or you could just\n> convert into a fixed-size buffer on the stack. It wouldn\'t be a big deal if\n> long titles were truncated.\n\nSure, I\'ll just allocate one string that\'s big enough.\n\nNow I\'ll just have to get a better network connection so I can do cvs diff to\nmake a new patch. GPRS is a bit too expensive and slow. (=',0.00,0,1,2563482,0,NULL,0),(11040,76735,'2005-12-13 22:53:46','How is it possible to elevate the priority of this bug?\n',0.00,0,0,2723161,0,NULL,0),(11040,168663,'2006-01-14 00:26:04','I was looking into writing an extension to do this but am having trouble understanding how the current biff system works. Any starting hints would be welcome: e.g. what are the variable names, function names, broadcasters associated with the new message indicators? I see lots of references to biff, but they lead lots of directions. Which js file should I be hunting in?',0.00,0,0,2747906,0,NULL,0),(11040,57902,'2006-01-17 11:54:33','*** Bug 323758 has been marked as a duplicate of this bug. ***',0.00,0,0,2750440,0,NULL,0),(248970,24356,'2006-02-17 19:39:11','FWIW, this feature has been seperately implemented by both the Stealther and Distrust extensions.\n\nWhich means someone can probably close this bug.',0.00,0,0,2780374,0,NULL,0),(248970,144221,'2006-02-18 10:19:03','(In reply to comment #9)\n> Which means someone can probably close this bug.\nsecond.',0.00,0,0,2780684,0,NULL,0),(11040,160370,'2006-03-08 07:27:04','No real helpful coding suggestion. I just want to add to the clamor begging someone knowledgable enough to take a stab at it. I turn notifications off entirely now because it\'s too irritating that they\'re frequently not my main inbox. I just don\'t need to read mailing list emails the second they come in, and I already know how to set up filters to sort them by folder. The notification suppression is just an obvious extension of that. ',0.00,0,0,2796879,0,NULL,0),(248970,25585,'2006-05-01 07:49:28','(In reply to comment #9)\n> FWIW, this feature has been seperately implemented by both the Stealther and\n> Distrust extensions.\n> \n> Which means someone can probably close this bug.\n\nSince when should bugs be closed because there is an extension for it?\n\n',0.00,0,0,2843663,0,NULL,0),(6810,29811,'2006-05-22 14:03:06','reassigning to defaults as no one seems to be on top of the patch.',0.00,0,0,2862342,0,NULL,0),(11040,57902,'2006-06-19 06:36:46','*** Bug 341777 has been marked as a duplicate of this bug. ***',0.00,0,0,2886699,0,NULL,0),(123203,20048,'2006-06-21 16:11:13','-> default owner',0.00,0,0,2890054,0,NULL,0),(13534,120380,'2006-08-15 02:53:25','Now that bug 94534 is fixed, it should be easy to remove these resolutions so that they do not appear by default for new installations.',0.00,0,0,2945287,0,NULL,0),(13534,127400,'2006-08-15 15:31:24','',0.00,0,0,2946083,5,'233867',0),(13534,173190,'2006-08-22 16:55:50','On its own, this looks good from here. I thought through this asking myself - what conditions could possibly break this removal... Since we\'re off ENUM types, the only possible conflict I could see is if someone is trying to merge legacy Bugzilla installations and RESOLVED/LATER or REMIND was used there. It wouldn\'t hurt to include documentation somewhere in the release notes about this.',0.00,0,0,2953747,6,'233867',0),(13534,120380,'2006-09-02 16:59:24','You also have to fix contrib/gnats2bz.pl @ line 652: $resolution = \"LATER\";, docs/images/bzLifecycle.xml @ line 1123: LATER# and template/en/default/global/field-descs.none.tmpl @ 94: \"LATER\" => \"LATER\",. That\'s for LATER. About REMIND, you have to fix the same places, except contrib/gnats2bz.pl which doesn\'t use it.\n\nElse your patch works fine. I just tested it on a fresh installation.',0.00,0,0,2967966,6,'233867',0),(13534,120380,'2006-09-02 17:03:07','About contrib/gnats2bz.pl, you should probably force it to make sure that LATER is a valid resolution, and if not, use another valid one.',0.00,0,0,2967969,0,NULL,0),(13534,127400,'2006-09-03 04:22:48','changes made per communication on IRC',0.00,0,0,2968206,5,'236598',0),(13534,120380,'2006-09-03 04:26:58','r=LpSolit',0.00,0,0,2968208,6,'236598',0),(13534,120380,'2006-09-03 13:37:51','Checking in Bugzilla/DB.pm;\n/cvsroot/mozilla/webtools/bugzilla/Bugzilla/DB.pm,v <-- DB.pm\nnew revision: 1.85; previous revision: 1.84\ndone\nChecking in contrib/gnats2bz.pl;\n/cvsroot/mozilla/webtools/bugzilla/contrib/gnats2bz.pl,v <-- gnats2bz.pl\nnew revision: 1.8; previous revision: 1.7\ndone\nChecking in docs/images/bzLifecycle.xml;\n/cvsroot/mozilla/webtools/bugzilla/docs/images/bzLifecycle.xml,v <-- bzLifecycle.xml\nnew revision: 1.3; previous revision: 1.2\ndone\nChecking in template/en/default/global/field-descs.none.tmpl;\n/cvsroot/mozilla/webtools/bugzilla/template/en/default/global/field-descs.none.tmpl,v <-- field-descs.none.tmpl\nnew revision: 1.17; previous revision: 1.16\ndone\n',0.00,0,0,2968461,0,NULL,0),(3140,151347,'2006-09-04 09:47:11','If this is working can someone update: http://www.mozilla.org/docs/dom/mozilla/bug-events.html',0.00,0,0,2968915,0,NULL,0),(3140,59276,'2006-09-06 02:00:35','http://www.mozilla.org/docs/dom/mozilla/bug-events.html\n \nhas been updated accordingly.',0.00,0,0,2970831,0,NULL,0),(13534,73187,'2006-09-07 17:53:52','Added to relnotes in bug 349423. Please let me know if I missed any critical information about this bug in the release notes.',0.00,0,0,2973051,0,NULL,0),(11040,240395,'2006-10-14 08:54:48','My added two cents: I have 10 or 20 filters categorizing mail into various mailing list folders, and often automatically marking them as \"read\". Biff (moztraybiff.mozdev.org) often indicates I have new mail, and I\'ll take a look at the Thunderbird window, only to find an Inbox folder with no new messages, yet still has a star next to it indicating new mail. That\'s one issue.\n\nIdeally, biff would only be activated if my inbox folder has new mail, and none of that new mail was automatically marked as junk and/or scam. I don\'t know how much of that is configuration, how much of it is this bug, and how much of it is in other bugs (e.g. Bug 232104), but such a system would be perfect for me.\n',0.00,0,0,3010837,0,NULL,0),(11040,57902,'2006-11-12 11:06:26','(In reply to comment #0)\n> I was thinking of doing this - it\'s just a matter of adding a filter action,\n> and doing a folder notification.\n\nFolder notification is bug 201420. This is a more important issue for IMAP (and maybe other mail types, but not POP) where the mail can be filtered into folders on the server.\n\nSuppression of notification when mail moved to certain folders is bug 224573; and suppression of notification for certain mail accounts is bug 104809. Both features could be handled via a filter suppressing notification on a per-message basis, altho I think a per-account setting would be a reasonable feature to implement above and beyond \n\nI think the primary aspect of this bug is a filter action to control notification. There are many aspects of this that could be implemented; perhaps the action could be:\n Notify as: None, Normal, Priority\nwhere Normal is the default action taken if no filters change the notification status. If *all* new items are filtered with Notify As, None, then no new notification occurs. If *any* new item is filtered with Notify As, Priority,\nthen the priority alert would apply -- a different sound, a colored tray icon.\n\nThis could obviously be much more complex, with individually configurable sounds, slide-up appearance, and tray-icon appearance, and there are many RFEs to that effect. Also note that TB has implemented a different alert popup (in Windows, anyway) that shows information about the new messages, and that could also be finetuned even further with filters, if these were allowed to grow to that level of complexity. I think in terms of maintainability and overall usefulness, a three-level scheme as I propose is a decent compromise; it would cover bug 190989, bug 219510, and possibly others I haven\'t found.',0.00,0,0,3036070,0,NULL,0),(367518,31324,'2007-01-19 10:40:49','User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1\nBuild Identifier: \n\nFor some reason, suddendly, parts of the files of my email accounts were gone.\n(missed inbox, outbox, etc...)\nI saw this, because I compared with a backup.\nI did a re-install, re-created my profile and tried to get my mailboxes back using the backup and the descriptions at :\nhttp://kb.mozillazine.org/Importing_and_exporting_your_mail#Manually_importing_and_exporting\nhttp://kb.mozillazine.org/Migrating_settings_to_a_new_profile\n\nMy mailboxes still aren\'t showing.\nSo apart from data loss, the recovery procedure is \na) incomplete\nb) I\'ve forgotten something\nc) we\'ve run into a new situation\n\nWhat bothers me very much is the absence of an importing tool for Thunderbird mailboxes. Outlook yes. Eudora yes. Thunderbird\'s own mailboxes : NO (loop entry after entry of some faq page somewhere).\nSecondly, I\'ve tried to find a page describing me how to enable logging in Thunderbird, but couldn\'t find none.\nFor some reason, the mailboxes in my profile are skipped and I want to know why.\n\nReproducible: Always\n\nSteps to Reproduce:\n1.\n2.\n3.',0.00,0,0,3087891,0,NULL,0),(367518,31324,'2007-01-19 11:18:46','I got it back to work.\nI re-created my account in Thunderbird as if it was the first time.\nQuitted Thunderbird and tried copying my inbox as a test.\nThis worked.\nThen I copied all other, everything seems to be working normal.\nWhy the restore didn\'t work before... I dunno.\n\nThis is not a forum to discuss development.\nYet I\'d like to know : when Thunderbird launches, how does it scan the Mail folder ? Where is the info kept which accounts have been made and are present in the \'mail\'folder ?\nIf it just scans subfolders, then something weird just happened to me.\nI\'d really like a toggle to put debugging info on.\nWhich byte or file or entry that has caused all of this : I wouldn\'t know as there are no recordings. (I did make a backup of my old Thunderbird Program Files folder).\nPlease allow a logfile : In the end, it\'s up to the user to deal with a megabyte-eating file.\nFurthermore it might help find errors much more quickly !',0.00,0,0,3087913,0,NULL,0),(367518,31324,'2007-01-19 11:31:49','The paths to the mailboxes are in prefs.js\n\nWhy is it mentioned in the migration guide (http://kb.mozillazine.org/Migrating_settings_to_a_new_profile) that migrating prefs.js is not recommended ?\nIt seems very necessary to put the paths of the mailboxes you\'d like to copy in the new prefs.js.\nNeither is mentioned in the chapter on \'corrupted mailboxes\' (http://kb.mozillazine.org/Profile_folder#What_do_I_do_if_my_profile_is_corrupted.3F)\nthat it is possible to create a new profile/new account and just copy your mailboxes, to get it back to work.\n',0.00,0,0,3087922,0,NULL,0),(367518,101158,'2007-01-23 09:19:19','I don\'t see what more we could do here, since you got it working. ->WFM\n\nIf the wiki pages say something wrong, do correct the wrong parts. That\'s the thing with wikis... \n\nThe full debug info you seem to want can only be seen if you build your own build and enable debug info. I don\'t know exactly how the scanning for mails work, but after the account is found, all mail folders in it should appear.',0.00,0,0,3090820,0,NULL,0),(367518,31324,'2007-01-23 09:56:14','If I would know, I\'d adjust the wikis.\nMy attempt was just trial and error.\nFew added value, especially since I\'m not a developer.\n\nThe ultimate solution is adding proper import of Thunderbird\'s own mailboxes.\nThere\'s a request for that (yet untouched for six years) :\nhttps://bugzilla.mozilla.org/show_bug.cgi?id=63389\n\nConcerning log : If it requires a separate build, why not releasing debug versions of Thunderbird, allowing (customisable) log ?',0.00,0,0,3090874,0,NULL,0),(367518,101158,'2007-01-23 10:11:33','Because debug builds are usually really huge, and also all the logging slows them down enough to make them not (IMO) usable for real business. You may be able to find someone who can provide you with one in some third party build forum (see mozillazine), if you really a interested.',0.00,0,0,3090897,0,NULL,0),(367518,31324,'2007-01-25 11:09:02','Two remarks on this.\n\n1) Of course no one will use these debug versions in production, this is obvious to most. So that\'s not what I meant. Don\'t take this personally, but this kind of reply is symptomatic for the way a lot of bugs on Mozilla products are handled.\nMe, not a Mozilla developer but somebody kind enough to report bugs/enhancements on your product, makes a suggestion which might enable you to fix bugs easier and quicker, and gets a non-answer as a reply.\nA better reply might have been : \"Gee, indeed a logfile might sometimes come in handy. We currently have to rely on third parties to make these debugbuilds. Why not include them in our build procedure ? You know what, if you\'d like a debugbuild of Thunderbird, you could find one there http://blabla. Kind of you offering to use install these slow debugbuilds in your spare time. If the current situation is indeed all or nothing (nothing is logged or EVERYTHING), then maybe we ought to consider a more flexible logging. Or a medium logbuild.\"\n\n2) The guys from Qualcomm\'s Eudora, did manage to have logging in Eudora. Seemingly without much loss of speed. In case of a bug, one could easily attach this log to the report. Since they are coming aboard, ask them how :-)\nhttp://www.qualcomm.com/press/releases/2006/061011_project_collaboration_mozilla.html',0.00,0,0,3093081,0,NULL,0),(367518,4410,'2007-01-25 11:16:02','we do actually have a fair amount of logging in release builds. But not for the folder scanning part - and we\'ve never actually had a request for that before. Folder scanning for local folders is so simple (we literally enumerate the files in your mail directory, and then sub-folders with the name .sbd',0.00,0,0,3093092,0,NULL,0),(367518,101158,'2007-01-25 11:25:55','For logging support in non-debug builds, see\nhttp://www.mozilla.org/quality/mailnews/mail-troubleshoot.html#imap\n(though I think that page is missing a few options)\n\nI think the point of not making debug builds in the GB-size per build available for download is also that you need to look at the code to understand what\'s going on. If you can look at the code, building it isn\'t a huge step, on linux that is;). To pinpoint the problem you would most likely still have to make some small changes and build.',0.00,0,0,3093098,0,NULL,0),(367518,31324,'2007-01-25 12:00:10','Thanks for the feedback.\nRandom remarks :\n\n1) Good to know that a protocol log exists and can be enabled without the need of an external build!\n1a) These variables(NSPR_LOG_MODULES and NSPR_LOG_FILE), can they also be set through \"Tools – Options – Advanced – General and press the Config Editor... button\" ?\n1b) \"Renaming logs after Mozilla quits\" : In Java, there\'s a library called Log4J http://logging.apache.org/log4j/. This incredibly flexible logging lib features something called a RollingFileAppender. As the name implies, log files will be rotated automatically per day or size or ... .\n\n2) Of course, Magnus, I won\'t look at the code myself (maybe one day I will). The logs really aren\'t that much for me. They are meant for the Mozilla development team to decipher why something went wrong. The privilege of interpretation is rather reserved for them :-)\nEasy things like \'file x not found at location y\' can of course be sufficient for me to fix it myself.\n\n3) I\'m quite sure that somebody with a reproducable bug won\'t mind installing this debug version. The developers on their part are most likely interested in getting this logfile. Why then not making a single debug build available ? One of the latest nightly, one of the latest official. About how many MB are we talking ?',0.00,0,0,3093152,0,NULL,0),(372836,7044,'2007-03-06 08:39:20','These minor changes allow tinderbox to build with MSYS/MozillaBuild.',0.00,0,0,3127923,5,'257522',0),(372836,17036,'2007-03-06 11:12:31','Looks find, I am curious why these are needed though (see below)\n\n>Index: build-seamonkey-util.pl\n>===================================================================\n>RCS file: /cvsroot/mozilla/tools/tinderbox/build-seamonkey-util.pl,v\n>retrieving revision 1.351\n>diff -u -8 -r1.351 build-seamonkey-util.pl\n>--- build-seamonkey-util.pl 9 Feb 2007 02:19:18 -0000 1.351\n>+++ build-seamonkey-util.pl 6 Mar 2007 16:30:26 -0000\n>@@ -287,16 +287,19 @@\n> #$Settings::ObjDir = \'\';\n> my $build_type = $Settings::BuildDepend ? \'Depend\' : \'Clobber\';\n> my $host = ShortHostname();\n> chomp($Settings::OS, $os_ver, $Settings::CPU, $host);\n> \n> # Redirecting stderr to stdout works on *nix, winnt, but not on win98.\n> $Settings::TieStderr = \'2>&1\';\n> \n>+ # Mingw uname -r returns 1.0.10(0.46/3/2) - remove the parens section\n>+ $os_ver =~ s/\\(.*\\)//;\n>+\n\n\nWhy is this important? Do the parens cause problems elsewhere?\n\n\n> if ($Settings::OS eq \'AIX\') {\n> my $osAltVer = `uname -v`;\n> chomp($osAltVer);\n> $os_ver = \"$osAltVer.$os_ver\";\n> }\n> \n> $Settings::OS = \'BSD_OS\' if $Settings::OS eq \'BSD/OS\';\n> $Settings::OS = \'IRIX\' if $Settings::OS eq \'IRIX64\';\n>@@ -413,22 +416,16 @@\n> \n> # Assume this file lives in the base dir, this will\n> # avoid human error from setting this manually.\n> $Settings::BaseDir = get_system_cwd();\n> \n> my $topsrcdir = \"$Settings::BaseDir/$Settings::DirName/mozilla\";\n> $objdir = \"$topsrcdir/${Settings::ObjDir}\";\n> \n>- if (not -e $objdir) {\n>- # Not checking errors here, because it\'s too early to set $status and the \n>- # build will fail anyway; failing loudly is better than failing silently.\n>- run_shell_command(\"mkdir -p $objdir\");\n>- }\n>-\n\n\nIt\'s not really clear to me from the CVS log why this was added.. shouldn\'t the build system create the objdir if it doesn\'t exist? Why does this cause a problem for MSYS?',0.00,0,0,3128076,6,'257522',0),(372836,7044,'2007-03-06 13:23:58','> Why is this important? Do the parens cause problems elsewhere?\n\nYes. This becomes the directory name, and both parens and slashes in the directory name cause major hiccups. Besides which it is ugly and unwieldy.\n\n> It\'s not really clear to me from the CVS log why this was added.. shouldn\'t the\n> build system create the objdir if it doesn\'t exist? Why does this cause a\n> problem for MSYS?\n\nThe build system does create the objdir in every incantation I know of. The problem is with stock cvs 1.11 if you check out into a directory that already exists but doesn\'t have a CVS/ directory:\n\n$ mkdir mozilla\n$ cvs co mozilla/client.mk\ncvs checkout: in directory mozilla:\ncvs checkout: cannot open CVS/Entries for reading: No such file or directory.',0.00,0,0,3128223,0,NULL,0),(372836,7044,'2007-03-08 07:40:02','Fixed on trunk.',0.00,0,0,3130269,0,NULL,0),(11040,101158,'2007-04-25 04:01:44','',0.00,0,0,3169543,2,'249938',0),(11040,101158,'2007-04-26 22:39:48','',0.00,0,0,3171508,2,'378844',0),(11040,111144,'2007-06-01 09:21:37','I was looking at how I organized my folders, and it occurred to me that it might be possible to simplify this feature, and yet retain the bulk of it\'s power.\n\nSuggestion: \nInstead of having sophisticated controls on a per-filter or per-folder basis, have a single flag which can be turned on and off.\n\nIf this flag is active, then biff notifications are only displayed for mail messages which end up in the \"Inbox\" folder or one of it\'s children.\n\nThis means that you can create child folders under the \"Inbox\" folder and use filters to route messages there, and still have notifications.\n\nOther messages can be routed to folders outside of the \"Inbox\" folder, and will then will then not result in biff notifications.\n',0.00,0,0,3201475,0,NULL,0),(248970,243208,'2007-06-03 05:35:26','I\'ll take this. I managed to get a working mode today (purely back-end and pref based, no UI just yet), and I\'ll post the patch in the morning once I find suitable reviewers.',0.00,0,0,3202846,0,NULL,0),(248970,243208,'2007-06-04 16:19:44','If Private Browsing (\"privacy.privatebrowsing\") is turned on:\n\n* Cache won\'t be touched.\n* Nothing will be added to Places history.\n* No new entries will be saved in autocomplete.\n* Download records will delete themselves when the download is complete.\n* Cookies are kept until Private Browsing is turned off, or the browser closes, at which point the cookies will be deleted.\n\nI can almost guarantee this won\'t break anything, because all this does is it sneakily manipulates pref-check functions and return values in each section to do the right thing.',0.00,0,0,3204500,5,'267216',0),(248970,20209,'2007-06-04 20:24:38','> I can almost guarantee this won\'t break anything\n\nview-source and meta charset reloads come to mind as things it could break. Also wyciwyg:. I assume you\'ve tested all of these? I assume you\'ve also tested the performance impact of getting the pref every single time and determined that it\'s cheap enough that caching it is not worth it?\n\nThis probably also breaks visited link coloring, unless I\'m missing something.\n\nIn any case, I\'m not going to be able to review this thoroughly in a reasonable timeframe. Please ask someone else? biesi might be a good idea.',0.00,0,0,3204641,0,NULL,0),(248970,243208,'2007-06-04 22:45:01','(In reply to comment #14)\n> view-source and meta charset reloads come to mind as things it could break.\n\nview-source works.\n\n> Also wyciwyg:. I assume you\'ve tested all of these? \n\nI haven\'t yet tested meta charset reloads or wyciwyg, I\'m not really sure how to test them. The reason for my (over)confidence is that this patch only really changes existing preference or policy checks.\n\n> I assume you\'ve also\n> tested the performance impact of getting the pref every single time and\n> determined that it\'s cheap enough that caching it is not worth it?\n\nI can\'t find an impact at all. Some of the functions which I change already seem to check a pref every time they\'re called.\n\n> This probably also breaks visited link coloring, unless I\'m missing something.\n\nNo, this does as expected (expected IMO being: visited link colours show up when a link is visited outside of Private Browsing, but not when its visited while turned on).\n\n> In any case, I\'m not going to be able to review this thoroughly in a reasonable\n> timeframe. Please ask someone else? biesi might be a good idea.\n> \n\nOK.',0.00,0,0,3204709,6,'267216',0),(248970,243208,'2007-06-04 23:05:47','(In reply to comment #15)\n> I can\'t find an impact at all. Some of the functions which I change already\n> seem to check a pref every time they\'re called.\n\nI actually forgot to mention the primary reason, many existing pref listeners in each section of Mozilla that this patch touches have a branch (eg \"browser.foo\") and changing the existing nsIPrefBranch2, or implementing a separate one, for each section would be messier than just reading the pref when needed.',0.00,0,0,3204724,0,NULL,0),(248970,24534,'2007-06-05 18:07:02','I\'m not the right person to review this, and I don\'t think biesi is the right sr -- you really want mconnor, at the very least.',0.00,0,0,3205948,6,'267216',0),(248970,243208,'2007-06-05 18:22:29','(In reply to comment #17)\n> (From update of attachment 267216 [details])\n> I\'m not the right person to review this, and I don\'t think biesi is the right\n> sr -- you really want mconnor, at the very least.\n> \n\nThats precisely the problem I had before I submitted a patch like this, which touched different sections of Mozilla. From the list of reviewers at http://www.mozilla.org/hacking/reviewers.html you were under toolkit and biesi was under netwerk. \n\nI\'ll get mconnor.',0.00,0,0,3205958,6,'267216',0),(248970,233280,'2007-06-11 17:42:02','\n> PRInt32 \n> nsDownloadManager::GetRetentionBehavior()\n> {\n> // We use 0 as the default, which is \"remove when done\"\n> nsresult rv;\n> nsCOMPtr pref = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv);\n> NS_ENSURE_SUCCESS(rv, 0);\n>+\n>+ // The user is in private browsing mode, delete the download record when\n>+ // completed\n>+ PRBool privMode = PR_FALSE;\n>+ pref->GetBoolPref(\"privacy.privatebrowsing\", &privMode);\n>+ if (privMode)\n>+ return 0;\nPlease declare a constant at the top of the file, just as everything else that uses a pref does in the file.\n\nAlso, this will require some UI changes if the download manager is already open:\nhttp://mxr.mozilla.org/seamonkey/source/toolkit/mozapps/downloads/content/downloads.js#152',0.00,0,0,3212391,6,'267216',0),(248970,14419,'2007-06-18 16:55:51','',0.00,0,0,3220668,2,'283024',0),(248970,96908,'2007-06-25 22:17:00','So, I thought I\'d commented here, but I didn\'t. I think this is a good start, but there\'s some things I think need addressing:\n\n* Toggling the mode on/off\n\nUsing prefs and/or pref observers seems kinda wrong, why not just have observers/notifications?\n\n* Cookies\n\nThis is a pretty painful impl, since this would mean that you\'ll lose cookies that you had before you started in private browsing mode and accessed while you\'re there. Fortunately, the cookie service now has a creationTime that would be useful here. I think only clearing new cookies is acceptable for this feature, since stuff you\'ve already been to will likely be in your history as well...\n\n* History\n\nIt makes more sense to kill everything from the visits table, and remove any URLs that have zero visits. Achieves the same thing, but means link coloring etc still work during the session. I\'m not sure if we can suppress flushing to disk, but if not I\'m not as concerned about \"must never touch magnetic media\" as some are.\n\n* Cache\n\nTotally disabling cache feels like a mistake. Why not just disable the disk cache, and clear memory cache before re-enabling disk cache? (biesi, does disabling the disk cache preclude reloading from disk on exit of private browsing?)\n\n* Downlaods\n\nI bet sdwilsh\'s comments are bang on, so I\'ll stay quiet.',0.00,0,0,3229604,0,NULL,0),(248970,230739,'2007-06-26 00:16:51','A non-programmer suggestion:\n\nWhat would happen if a \'guest\' temporary user were whipped up and the browser were restarted using that profile? Would this sort of feature be more thorough or be a more \"clean\" way to implement a feature like this?\n\nA restart isn\'t not as convenient as having a button/hotkey to enable/disable private browsing, but it might be something to think about.\n',0.00,0,0,3229666,0,NULL,0),(248970,21544,'2007-06-26 11:22:21','(In reply to comment #22)\n> A non-programmer suggestion:\n> \n> What would happen if a \'guest\' temporary user were whipped up and the browser\n> were restarted using that profile? Would this sort of feature be more thorough\n> or be a more \"clean\" way to implement a feature like this?\n\nThat would not be this feature (see comment 0), since you wouldn\'t be able to access to any of your current bookmarks or history.\n\nNote that this feature already exists in Safari, and it looks like we\'re going to try to implement it more or less the same way.',0.00,0,0,3230165,0,NULL,0),(248970,243208,'2007-06-28 01:42:27','(In reply to comment #21)\n> * Toggling the mode on/off\n> \n> Using prefs and/or pref observers seems kinda wrong, why not just have\n> observers/notifications?\n\nIt\'d be more code, but I suppose that\'s best.\n\n> * Cookies\n> \n> This is a pretty painful impl, since this would mean that you\'ll lose cookies\n> that you had before you started in private browsing mode and accessed while\n> you\'re there. Fortunately, the cookie service now has a creationTime that\n> would be useful here. I think only clearing new cookies is acceptable for this\n> feature, since stuff you\'ve already been to will likely be in your history as\n> well...\n\nI wrote this patch before the cookie rewrite ;) I wanted to do that but couldn\'t before because creation \"time\" was just an incremented counter. I can do that now that the DB uses a proper creationTime.\n\n> * History\n> \n> It makes more sense to kill everything from the visits table, and remove any\n> URLs that have zero visits. Achieves the same thing, but means link coloring\n> etc still work during the session. I\'m not sure if we can suppress flushing to\n> disk, but if not I\'m not as concerned about \"must never touch magnetic media\"\n> as some are.\n\nPut on a tinfoil hat for a sec. Do we want link colouring to work? It can be used as another method to trace your steps...\n\n> * Cache\n> \n> Totally disabling cache feels like a mistake. Why not just disable the disk\n> cache, and clear memory cache before re-enabling disk cache? (biesi, does\n> disabling the disk cache preclude reloading from disk on exit of private\n> browsing?)\n\nI don\'t know much about how cache works, that just seemed like an easy way to go.\n\n> * Downlaods\n> \n> I bet sdwilsh\'s comments are bang on, so I\'ll stay quiet.\n\nLike I said, I should probably know more about the code I\'m touching before I touch it ;)\nThat being said, this isn\'t a top priority for me right now as I have other bugs I really want fixed. I wouldn\'t object if anyone else wanted to take this in the meantime.\n\n',0.00,0,0,3232299,0,NULL,0),(248970,11608,'2007-06-28 02:26:17','> Put on a tinfoil hat for a sec. Do we want link colouring to work? It can be\n> used as another method to trace your steps...\n\nI think the idea is to make link coloring work, but just during the private browsing session. After the session, that (temporary) history data goes away, and the links are no longer marked as visited.',0.00,0,0,3232319,0,NULL,0),(248970,243208,'2007-06-28 03:25:00','(In reply to comment #25)\n> > Put on a tinfoil hat for a sec. Do we want link colouring to work? It can be\n> > used as another method to trace your steps...\n> \n> I think the idea is to make link coloring work, but just during the private\n> browsing session. After the session, that (temporary) history data goes away,\n> and the links are no longer marked as visited.\n> \n\nI know, but I was wondering if we even want that....',0.00,0,0,3232348,0,NULL,0),(248970,283305,'2007-07-26 14:33:32','Michael, thanks for working on this bug, this is a feature I would personally very much like to see land in Firefox 3.\n\nI have a few questions about the implementation that might impact the UI:\n\n1) Are we still considering launching a new instance, which would potentially enable us to display Firefox with a modified theme?\nhttp://wiki.mozilla.org/PrivateBrowsing\n\n2) If not, would it be possible to modify the color and opacity of the current theme, similar to how Personas for Firefox doesn\'t require a restart?\nhttp://www.puffinlabs.com/personas/\n\nThere hasn\'t been much activity on this bug over the last month, can anyone give me an update on what the status is?',0.00,0,0,3261333,0,NULL,0),(372836,12567,'2007-08-08 18:14:42','I\'m gonna reopen this and reassign it to me.\n\nI guess MSYS doesn\'t support symlinks, and we rely extensively on symlinks for things like tinderbox autoupdate and cvs-based configs.\n\nI can fix this, but I\'ll have to tweak the tinderbox code to do it.',0.00,0,0,3274740,0,NULL,0),(372836,7044,'2007-08-08 18:41:36','Can you use hardlinks?',0.00,0,0,3274758,0,NULL,0),(372836,39022,'2007-08-08 19:02:57','This should fix the goofy OS version on the tinderbox.',0.00,0,0,3274766,5,'275913',0),(248970,137548,'2007-08-08 23:48:31','(In reply to comment #27)\n> 1) Are we still considering launching a new instance, which would potentially\n> enable us to display Firefox with a modified theme?\n> http://wiki.mozilla.org/PrivateBrowsing\n> \n> 2) If not, would it be possible to modify the color and opacity of the current\n> theme, similar to how Personas for Firefox doesn\'t require a restart?\n> http://www.puffinlabs.com/personas/\n\nAlex, Madhava, Connor and I discussed this in various fora, and I think we\'ve actually agreed that heavy modifications to the theme on entry of Private Browsing mode would probably be antithetical to its purpose, as it would call attention to the very fact that the user had entered a mode all about being unobserved.\n',0.00,0,0,3274907,0,NULL,0),(372836,3881,'2007-08-09 00:59:53','(In reply to comment #1)\n> It\'s not really clear to me from the CVS log why this was added.. shouldn\'t the\n> build system create the objdir if it doesn\'t exist? Why does this cause a\n> problem for MSYS?\n\nLast I checked (pretty recently, I think), the build system doesn\'t use mkdir -p to create the objdir, so it fails if the objdir\'s parent directory doesn\'t exist.',0.00,0,0,3274952,0,NULL,0),(372836,12567,'2007-08-09 12:33:34','(In reply to comment #5)\n> Can you use hardlinks?\n\nAccording to the test I did, no. Not sure if this is because MSYS doesn\'t support linking at all, or because we\'re using FAT32 on this filesystem, for build performance reasons.',0.00,0,0,3275513,0,NULL,0),(372836,12567,'2007-08-09 14:12:20','This is a patch (untested, BTW; I\'m gonna do that while people are pointing and laughing at this patch...) to manually copy files into place in all the locations where we expected (haha, joke\'s on us!) that symlinks would work.\n\nIn MSYS, symlinks don\'t exist (because they don\'t exist in Win32... except in Vista, but there are a lot of issues with... well... nevermind...), and hardlinks only work on NTFS. We use FAT32 for performance reasons in these directories.',0.00,0,0,3275668,5,'276034',0),(372836,12567,'2007-08-09 19:24:33','Don\'t bother reviewing this patch... it\'s close, but I had to jump through a couple of extra hoops to get things working (oh, how I hate thee, post-mozilla.pl!)\n\nExpect another patch tomorrow when I see the one I currently have stays running all night.',0.00,0,0,3275943,6,'276034',0),(372836,12567,'2007-08-13 13:46:41','Just a few changes that I had to make to get this reliably working...',0.00,0,0,3279364,5,'276529',0),(372836,12567,'2007-08-13 17:39:13','This fixes the problem where the builds wouldn\'t run on the testing tinderboxen.',0.00,0,0,3279656,5,'276570',0),(372836,17036,'2007-08-13 23:10:11','ugh :P',0.00,0,0,3279889,6,'276570',0),(372836,30066,'2007-08-14 16:22:34','I\'d much prefer a situation where we didn\'t rely on having an existing local checkout already on each machine and simply checked the harness code out fresh each time. It\'s not that much code, and it avoids much of this hackery.\n\nI also wish we didn\'t rely on the presence of a file (post-mozilla-rel.pl) to determine the release status for the current build instance. Is it the future yet?\n\nI\'m r+ing this because it\'s tinderbox and you\'re simply adding more crap to the pile that is tinderbox, which is really the only short-term way to proceed. ;-)',0.00,0,0,3280793,6,'276529',0),(372836,12567,'2007-08-15 15:58:56','Landed both of these patches, painful and ouchy though they are, and stabby though they make me.',0.00,0,0,3281858,0,NULL,0),(393845,55600,'2007-08-27 04:58:28','See testcase, when clicking 1 or 2 times on the button while the movie is playing, Mozilla crashes. Probably because the Windows Media Player 10 is crashing.\n\nThis started crashing between 2005-09-21 and 2005-09-23, I guess somehow a regression of bug 1156.\n\nIt doesn\'t crash on my Windows Vista computer which has the Windows Media Player 11 installed.',0.00,0,0,3292863,5,'278393',0),(393845,15661,'2007-08-27 09:54:31','do you have a stacktrace/breakpad id?',0.00,0,0,3293080,0,NULL,0),(393845,55600,'2007-08-27 15:02:29','Ok, for some reason I do get a breakpad id now with the testcase online, I didn\'t get one offline.\n\nhttp://crash-stats.mozilla.com/report/index/e995110f-54e6-11dc-b1c0-001a4bd43e5c\n0 nsObjectFrame::StopPluginInternal(int) mozilla/layout/generic/nsObjectFrame.cpp:1575\n1 nsObjectFrame::PrepareInstanceOwner() mozilla/layout/generic/nsObjectFrame.cpp:1378\n2 nsObjectFrame::Instantiate(char const*, nsIURI*) mozilla/layout/generic/nsObjectFrame.cpp:1414\n3 nsObjectLoadingContent::Instantiate(nsIObjectFrame*, nsACString_internal const&, nsIURI*) mozilla/content/base/src/nsObjectLoadingContent.cpp:1502\n4 nsObjectLoadingContent::TryInstantiate(nsACString_internal const&, nsIURI*) mozilla/content/base/src/nsObjectLoadingContent.cpp:1471\n5 nsObjectLoadingContent::LoadObject(nsIURI*, int, nsCString const&, int) mozilla/content/base/src/nsObjectLoadingContent.cpp:991\n6 nsObjectLoadingContent::LoadObject(nsAString_internal const&, int, nsCString const&, int) mozilla/content/base/src/nsObjectLoadingContent.cpp:818\n7 nsHTMLSharedObjectElement::SetAttr(int, nsIAtom*, nsIAtom*, nsAString_internal const&, int) mozilla/content/html/content/src/nsHTMLSharedObjectElement.cpp:285\n8 nsGenericHTMLElement::SetAttrHelper(nsIAtom*, nsAString_internal const&) mozilla/content/html/content/src/nsGenericHTMLElement.cpp:2313\n9 nsHTMLSharedObjectElement::SetSrc(nsAString_internal const&) mozilla/content/html/content/src/nsHTMLSharedObjectElement.cpp:327\n10 NS_InvokeByIndex_P mozilla/xpcom/reflect/xptcall/src/md/win32/xptcinvoke.cpp:101\n11 AutoJSSuspendRequest::SuspendRequest() mozilla/js/src/xpconnect/src/xpcprivate.h:3317\n12 xul.dll@0x68218f\n\nThis testcase doesn\'t crash with the Windows Media Player 11, however I do have a testcase that also crashes with this kind of stacktrace with the Windows Media Player 11, though. (I have a bit of trouble getting it minimized further).\n\nThe stacktrace looks like it\'s related to bug 354102. I can\'t find it anymore on the topcrasher list, though.',0.00,0,0,3293399,0,NULL,0),(393845,15661,'2007-08-27 18:34:31','If you could attach even the non-minimized WMP11 testcase that would be great, since I don\'t have WMP10 available to test with here.',0.00,0,0,3293706,0,NULL,0),(393845,55600,'2007-08-27 18:41:29','Ok, this is a not completely minimized testcase that crashes with the windows media player 11 for me with current trunk build, usually after 10 seconds or so. I hope it does the same for you.',0.00,0,0,3293712,5,'278511',0),(393845,55600,'2007-08-27 18:45:25','Oh, you need to download that testcase, using right-click Save As.. and also download the video file from http://martijn.martijn.googlepages.com/testmovie.wmv',0.00,0,0,3293715,0,NULL,0),(393845,55600,'2007-08-28 04:32:20','Feel free to open the testcase up, if you don\'t think it should remain security sensitive.',0.00,0,0,3294024,0,NULL,0),(393845,15661,'2007-08-28 16:02:57','OK, the original testcase crashes here (winxp home/wmp11).\n\n0012d4a8 01f8d2b4 gklayout!nsPluginInstanceOwner::SetOwner+0xd [c:\\mozilla\\layout\\generic\\nsobjectframe.cpp @ 386]\n0012d4c8 01f8ca13 gklayout!nsObjectFrame::StopPluginInternal+0xb4 [c:\\mozilla\\layout\\generic\\nsobjectframe.cpp @ 1639]\n0012d4e0 01f8cc0a gklayout!nsObjectFrame::PrepareInstanceOwner+0x13 [c:\\mozilla\\layout\\generic\\nsobjectframe.cpp @ 1380]\n0012d544 02529d62 gklayout!nsObjectFrame::Instantiate+0x4a [c:\\mozilla\\layout\\generic\\nsobjectframe.cpp @ 1414]\n0012d578 02529bd8 gklayout!nsObjectLoadingContent::Instantiate+0x182 [c:\\mozilla\\content\\base\\src\\nsobjectloadingcontent.cpp @ 1502]\n0012d598 025280dd gklayout!nsObjectLoadingContent::TryInstantiate+0x98 [c:\\mozilla\\content\\base\\src\\nsobjectloadingcontent.cpp @ 1472]\n0012d7dc 02527828 gklayout!nsObjectLoadingContent::LoadObject+0x88d [c:\\mozilla\\content\\base\\src\\nsobjectloadingcontent.cpp @ 991]\n0012d870 0251aab0 gklayout!nsObjectLoadingContent::LoadObject+0x1c8 [c:\\mozilla\\content\\base\\src\\nsobjectloadingcontent.cpp @ 818]\n0012d8ec 02171129 gklayout!nsHTMLSharedObjectElement::SetAttr+0x70 [c:\\mozilla\\content\\html\\content\\src\\nshtmlsharedobjectelement.cpp @ 286]\n0012d90c 0217c5fb gklayout!nsGenericHTMLElement::SetAttr+0x29 [c:\\mozilla\\content\\html\\content\\src\\nsgenerichtmlelement.h @ 213]\n0012d928 0251af19 gklayout!nsGenericHTMLElement::SetAttrHelper+0x1b [c:\\mozilla\\content\\html\\content\\src\\nsgenerichtmlelement.cpp @ 2314]\n0012d938 00305137 gklayout!nsHTMLSharedObjectElement::SetSrc+0x19 [c:\\mozilla\\content\\html\\content\\src\\nshtmlsharedobjectelement.cpp @ 327]\n0012d94c 00feb1e3 xpcom_core!NS_InvokeByIndex_P+0x27 [c:\\mozilla\\xpcom\\reflect\\xptcall\\src\\md\\win32\\xptcinvoke.cpp @ 102]\n\n\n\n 384: void SetOwner(nsObjectFrame *aOwner)\n 385: {\n> 386: mOwner = aOwner;\n\n|this| is null... (and so\'s aOwner)\n',0.00,0,0,3294802,0,NULL,0),(393845,15661,'2007-08-28 17:22:57','OK, this is a fun (?) bug.\n\nSo StopPluginInternal gets reentered:\ngklayout!nsObjectFrame::StopPluginInternal+0x32\ngklayout!nsObjectFrame::Destroy+0x4f\ngklayout!nsBlockFrame::DoRemoveFrame+0x41f\ngklayout!nsBlockFrame::RemoveFrame+0x32\ngklayout!nsFrameManager::RemoveFrame+0x3f\ngklayout!nsCSSFrameConstructor::ContentRemoved+0x413\ngklayout!nsCSSFrameConstructor::RecreateFramesForContent+0xf5\ngklayout!nsCSSFrameConstructor::RestyleElement+0x9b\ngklayout!nsCSSFrameConstructor::ProcessOneRestyle+0x9c\ngklayout!nsCSSFrameConstructor::ProcessPendingRestyles+0x163\ngklayout!PresShell::DoFlushPendingNotifications+0xcf\ngklayout!PresShell::WillPaint+0x39\ngklayout!nsViewManager::DispatchEvent+0x38b\ngklayout!HandleEvent+0x46\ngkwidget!nsWindow::DispatchEvent+0xc1\ngkwidget!nsWindow::DispatchWindowEvent+0x24\ngkwidget!nsWindow::OnPaint+0x694\ngkwidget!nsWindow::ProcessMessage+0x6aa\ngkwidget!nsWindow::WindowProc+0x142\nUSER32!InternalCallWinProc+0x28\nUSER32!UserCallWinProcCheckWow+0x150\nUSER32!DispatchClientMessage+0xa3\nUSER32!__fnDWORD+0x24\nntdll!KiUserCallbackDispatcher+0x13\nUSER32!NtUserDispatchMessage+0xc\nUSER32!DispatchMessageW+0xf\nWARNING: Stack unwind information not available. Following frames may be wrong.\nwmp!Ordinal3003+0x8b902\nwmp!Ordinal3002+0x116aae\nwmp!Ordinal3003+0x860eb\nwmp!Ordinal3002+0x88bf3\nwmp!Ordinal3003+0xacf0b\nwmp!Ordinal3003+0xadafb\nwmp!DllGetClassObject+0xa2a0\nwmpdxm!CWMPShim::SetClientSite+0xb7\nnpdsplay!unuse_netscape_plugin_Plugin+0x1a4e\nnpdsplay!native_NPDS_npDSJavaPeer_StreamSelect+0x25b8\nnpdsplay!NP_Shutdown+0x1fd\ngkplugin!ns4xPluginInstance::Stop+0x1bb\ngklayout!DoStopPlugin+0x195\ngklayout!nsObjectFrame::StopPluginInternal+0xdb\ngklayout!nsObjectFrame::PrepareInstanceOwner+0x25\ngklayout!nsObjectFrame::Instantiate+0x4a\ngklayout!nsObjectLoadingContent::Instantiate+0x182\ngklayout!nsObjectLoadingContent::TryInstantiate+0x98\ngklayout!nsObjectLoadingContent::LoadObject+0x88d\ngklayout!nsObjectLoadingContent::LoadObject+0x1c8\ngklayout!nsHTMLSharedObjectElement::SetAttr+0x70\ngklayout!nsGenericHTMLElement::SetAttr+0x29\ngklayout!nsGenericHTMLElement::SetAttrHelper+0x1b\ngklayout!nsHTMLSharedObjectElement::SetSrc+0x19\n\nSo we stop the plugin, which processes events (!?), we get a paint event, attempting to paint flushes the pending notifications (there\'s a pending restyle event due to the setting of position to absolute), which destroys the frame, which calls StopPluginInternal again.\n',0.00,0,0,3294917,0,NULL,0),(393845,15661,'2007-08-28 17:46:02','btw, the reason why this works pre-1156 is that setting src didn\'t have any effect, and once the new frame got constructed it just instantiated the plugin again.',0.00,0,0,3294964,0,NULL,0),(393845,15661,'2007-08-28 18:05:51','A similar testcase (changes display to none instead of changing position)',0.00,0,0,3294989,5,'278687',0),(393845,15661,'2007-08-28 18:44:19','',0.00,0,0,3295023,5,'278696',0),(393845,20209,'2007-08-28 19:00:15','Oh, the usual \"Windows processes events any time you destroy a widget\" thing? Fun times.',0.00,0,0,3295035,0,NULL,0),(393845,20209,'2007-08-28 19:31:49','>Index: layout/generic/nsObjectFrame.cpp\n>Index: content/base/src/nsObjectLoadingContent.cpp\n>+ // We came here via eState_Loading. Therefore, our frame if newly\n\ns/if/is/\n\n>+ // Stop the plugin first. As that might destroy the frame,\n\ns/As/Since/\n\nr+sr=bzbarsky',0.00,0,0,3295064,6,'278696',0),(393845,15661,'2007-09-05 13:33:42','Checking in content/base/src/nsObjectLoadingContent.cpp;\n/cvsroot/mozilla/content/base/src/nsObjectLoadingContent.cpp,v <-- nsObjectLoadingContent.cpp\nnew revision: 1.62; previous revision: 1.61\ndone\nChecking in layout/generic/nsObjectFrame.cpp;\n/cvsroot/mozilla/layout/generic/nsObjectFrame.cpp,v <-- nsObjectFrame.cpp\nnew revision: 1.615; previous revision: 1.614\ndone\n',0.00,0,0,3302922,0,NULL,0),(393845,55600,'2007-09-06 21:10:37','Verified fixed using WMP11 and windows vista:\nMozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9a8pre) Gecko/2007090604 Minefield/3.0a8pre\n\nAlso verified fixed with that same dated build on windowsXP using WMP10.\nNo crash anymore with any of the testcases.\n\nNice job!',0.00,0,0,3304706,0,NULL,0),(393845,235989,'2007-09-07 10:09:49','Sorry Folks,\n\nbut it seems that this bug is not fully fixed.\n\nWe have another crash related to Java with AdBlock Plus 0.7.5.1 installed.\n\nSteps to reproduce:\nWith AdBlock Plus 0.7.5.1 installed, go to http://www.java.com/en/download/installed.jsp and click on the green \"Verify Installation\" button.\n\nRegressionwindow:\nWorks as expected in 20070905_1328\nBroken in 20070905_1344 (crash)\n\nBreakpad:\nhttp://crash-stats.mozilla.com/report/index/da4932d7-5d5e-11dc-96ec-001a4bd46e84\nhttp://crash-stats.mozilla.com/report/index/3d3753e3-5d5e-11dc-a943-001a4bd43ef6\n',0.00,0,0,3305207,0,NULL,0),(393845,55600,'2007-09-07 12:27:20','Gerd, could you file a new bug on that and make it blocking this bug? Thanks.',0.00,0,0,3305345,0,NULL,0),(393845,235989,'2007-09-08 07:27:08','OK, filed \nBug 395412 – Crash on Java install verification with AdBlock Plus 0.7.5.1 installed',0.00,0,0,3305906,0,NULL,0),(393845,144324,'2007-09-21 16:48:52','It looks like this patch caused bug 397051',0.00,0,0,3319411,0,NULL,0),(393845,55600,'2007-09-25 04:33:05','Maybe this patch should be backed out for now, because of the regressions it\'s causing?',0.00,0,0,3322115,0,NULL,0),(393845,103593,'2007-09-25 13:42:43','I\'ve backed this patch out per IRC discussion with Peter and Christian.\n\nmozilla/layout/generic/nsObjectFrame.cpp 1.616\nmozilla/content/base/src/nsObjectLoadingContent.cpp 1.64 ',0.00,0,0,3322655,0,NULL,0),(11040,289144,'2007-10-15 10:35:41','I too think that the filter action would be the best.\nNoel, if you were using IMAP you would know that all folders are children of the Inbox folder. The flag solution would be useless with IMAP and busy Mailinglists.',0.00,0,0,3341932,0,NULL,0),(11040,111144,'2007-10-16 00:07:42','Joao, that may be true of the IMAP data model, but that does not appear to be how Thunderbird organises it\'s data model.\n',0.00,0,0,3342607,0,NULL,0),(11040,289144,'2007-10-16 03:07:55','So you are saying that a folder that is a children of the INBOX folder in the IMAP model isn\'t a children of the INBOX in the Thunderbird data model?\n\nI always leave all my mail on the server because I switch computer and OS a lot.\nPlease configure an IMAP account in 2 thunderbird profiles and try to use it like I do. Then you will realize that your suggestion doesn\'t help me.\n\nThe only thing I could accept as a compromise would be not to display biff notifications of any folder except the Inbox. But then all the important (as notification worthy) messages would end up in the Inbox.',0.00,0,0,3342731,0,NULL,0),(11040,292894,'2007-11-15 01:19:21','I\'ve attached a patch and tested it on my local build, both debug and optimized release. Please test and review it.\n\nmail/locales/en-US/chrome/messenger/folderProps.dtd appears to be the dtd that is used, but I added the ENTITY tags to mailnews/base/resources/locale/en-US/folderProps.dtd as well.\n\nPlease also assign the bug to me.',0.00,0,0,3373482,5,'288816',0),(11040,101158,'2007-11-15 08:30:22','That doesn\'t seem to fix this bug, isn\'t it more bug 201420/bug 224573? (I don\'t really see what the difference between those is.) ',0.00,0,0,3373730,0,NULL,0),(11040,292894,'2007-11-15 10:04:34','Yes, I agree. I think comment #19 confused me.\n\nMarking the attachment as obsolete and will post to bug 201420.',0.00,0,0,3373840,6,'288816',0),(393845,55600,'2007-11-21 12:01:44','Any chance for a patch without causing the regressions?',0.00,0,0,3380508,0,NULL,0),(11040,14534,'2008-01-06 20:24:19','',0.00,0,0,3428046,2,'411074',0),(11040,293331,'2008-01-07 07:32:10','Today is my birthday (23) and I\'d like to see the Guinness world record attempt aborted and this enhancement enacted :D',0.00,0,0,3428423,0,NULL,0),(248970,251051,'2008-01-10 12:17:55','I\'m going to give this one a serious shot... :-)',0.00,0,0,3433206,0,NULL,0),(248970,251051,'2008-01-10 12:27:38','(In reply to comment #19)\n> Also, this will require some UI changes if the download manager is already\n> open:\n> http://mxr.mozilla.org/seamonkey/source/toolkit/mozapps/downloads/content/downloads.js#152\n> \n\nShawn: I\'m afraid that the link above may not point to what you intended to say any more. Would you mind re-stating your concern in comment 19 so that I can make sure to consider it?\n\nThanks!',0.00,0,0,3433216,0,NULL,0),(248970,75420,'2008-01-10 12:36:33','(In reply to comment #30)\n> Shawn: I\'m afraid that the link above may not point to what you intended to say\n> any more.\n\nfyi, you can use bonsai to figure it out - load up the cvs log for the file:\nhttp://bonsai.mozilla.org/cvslog.cgi?file=/mozilla/toolkit/mozapps/downloads/content/downloads.js&rev=HEAD&mark=1.130\nfind the appropriate revision based on date, click on the linkified revision number, click on \'blame\' at the bottom of the diff screen, then find the appropriate line number.\n\nfor this reason, it\'s always better to provide bonsai links to a particular revision & line number - that way, they don\'t change with time. ;)',0.00,0,0,3433225,0,NULL,0),(248970,251051,'2008-01-10 12:47:04','(In reply to comment #21)\n> So, I thought I\'d commented here, but I didn\'t. I think this is a good start,\n> but there\'s some things I think need addressing:\n> \n> * Toggling the mode on/off\n> \n> Using prefs and/or pref observers seems kinda wrong, why not just have\n> observers/notifications?\n\nHmm, using prefs, users can switch to private browsing mode, close the browser,\nand open it and continue in the private browsing mode... Unless of course we\ndon\'t want that; but not saving this value for next startups seems inconsistent\nwith what we do in other parts of the UI.\n\nExample: we put a check mark besides View > Status Bar to indicate that the\nstatus bar is shown. We save this value for next startups. If we put a check\nmark next to the \"Private Browsing Mode\" menu item, the users would expect the\n\"check mark\" to be preserved in the next startup, and may assume that it is and\ngets bitten later on when she discovers that this value has not been saved.\n\nOr am I totally missing something here?\n\n> * Cookies\n> \n> This is a pretty painful impl, since this would mean that you\'ll lose cookies\n> that you had before you started in private browsing mode and accessed while\n> you\'re there. Fortunately, the cookie service now has a creationTime that\n> would be useful here. I think only clearing new cookies is acceptable for this\n> feature, since stuff you\'ve already been to will likely be in your history as\n> well...\n\nI should delve into some code to get how I should use the creationTime value...\n\n> * History\n> \n> It makes more sense to kill everything from the visits table, and remove any\n> URLs that have zero visits. Achieves the same thing, but means link coloring\n> etc still work during the session. I\'m not sure if we can suppress flushing to\n> disk, but if not I\'m not as concerned about \"must never touch magnetic media\"\n> as some are.\n\nTwo concerns:\n\n1. The goal here is to respect user\'s privacy. Suppose that the user enters\nthe private browsing mode, and performs a Google search and navigates to one of\nthe results in a new tab. Now, if someone sees the Google results page over\nthe user\'s shoulders, they would immediately figure out what page the user has\nvisited. If I want to get over-paranoid, I could even imagine them to memorize\nthe page title and then do a Google search of their own to find out exactly\nwhat the user has viewed in their private browsing mode...\n\n2. A more serious issue: if we write the URLs to the Places DB, with the\nintention of clearing them off later, and in between we crash or get closed, on\nthe next startup, the URLs visited in the *private* mode exist in the DB (and\nwe guarantee that the DB survives our crash...). Even if we add code to handle\nthat in the startup, what happens if someone takes the raw sqlite DB file from\nthe user\'s profile, and open it in their own app/viewer?\n\nThe paragraph I quote below from \nseems to be very relevant here:\n\n\"By choosing to write *some* data to disk (perhaps in an encrypted format) we\nhave broken a clear and easy to understand contract between Firefox and the\nuser. The user / security expert will not be sure that there is no security\nrisk.\"\n\nWe don\'t want that, I guess. Not getting visited link colors is something that\nthe ordinary user may not even notice (there are a lot of sites which disable\nour default coloring via CSS) and the advanced user will appreciate (see point\n1 above). And we can document that this is intentional in the user docs for\nthe private browsing feature...\n\n> * Cache\n> \n> Totally disabling cache feels like a mistake. Why not just disable the disk\n> cache, and clear memory cache before re-enabling disk cache? (biesi, does\n> disabling the disk cache preclude reloading from disk on exit of private\n> browsing?)\n\nI guess this is the right approach here...',0.00,0,0,3433238,0,NULL,0),(248970,251051,'2008-01-10 12:50:32','(In reply to comment #31)\n> (In reply to comment #30)\n> > Shawn: I\'m afraid that the link above may not point to what you intended to say\n> > any more.\n> \n> fyi, you can use bonsai to figure it out - load up the cvs log for the file:\n> http://bonsai.mozilla.org/cvslog.cgi?file=/mozilla/toolkit/mozapps/downloads/content/downloads.js&rev=HEAD&mark=1.130\n> find the appropriate revision based on date, click on the linkified revision\n> number, click on \'blame\' at the bottom of the diff screen, then find the\n> appropriate line number.\n\nThanks for the tip!\n\n> for this reason, it\'s always better to provide bonsai links to a particular\n> revision & line number - that way, they don\'t change with time. ;)\n\nAgreed! For future reference, here\'s the bonsai link to the code Shawn was talking about: ',0.00,0,0,3433243,0,NULL,0),(248970,251051,'2008-01-10 12:54:34','(In reply to comment #28)\n> (In reply to comment #27)\n> > 1) Are we still considering launching a new instance, which would potentially\n> > enable us to display Firefox with a modified theme?\n> > http://wiki.mozilla.org/PrivateBrowsing\n> > \n> > 2) If not, would it be possible to modify the color and opacity of the current\n> > theme, similar to how Personas for Firefox doesn\'t require a restart?\n> > http://www.puffinlabs.com/personas/\n> \n> Alex, Madhava, Connor and I discussed this in various fora, and I think we\'ve\n> actually agreed that heavy modifications to the theme on entry of Private\n> Browsing mode would probably be antithetical to its purpose, as it would call\n> attention to the very fact that the user had entered a mode all about being\n> unobserved.\n\nI agree. In fact, I think that having a small icon in the status bar would be sufficient (if we even decide to have *that*), plus a notification (as mentioned in on the point when the user enters (or leaves) the private browsing mode.',0.00,0,0,3433250,0,NULL,0),(248970,251051,'2008-01-11 01:00:17','Firstly, thanks to Michael Ventnor for his work on this bug which allowed me to take over and build upon it.\n\nHere is the first version of my WIP. This is an unbitrotted version of Michael\'s patch. I have completed the implementation regarding disk cache in this patch according to mconnor\'s comments.\n\nThis patch disables the disk and offline cache devices when the privacy.privatebrowsing pref is set to true, and re-enables them when it\'s set to false. Upon the change of this pref\'s value to false, the code empties the memory cache, so that the items entered into the cache during user\'s private browsing period are no longer accessible after exiting this mode. No data is written to disk when the user is in private browsing mode.',0.00,0,0,3434045,5,'296499',0),(248970,251051,'2008-01-11 01:20:05','(In reply to comment #19)\n> Also, this will require some UI changes if the download manager is already\n> open:\n> http://mxr.mozilla.org/seamonkey/source/toolkit/mozapps/downloads/content/downloads.js#152\n\nBug 394039 has reworked the download manager UI to get notified when a download is removed, so downloads.js no longer touches the browser.download.manager.retention pref, and the change you mentioned is no longer necessary.\n\n(See the check-in for bug 394039: )',0.00,0,0,3434065,0,NULL,0),(248970,251051,'2008-01-11 02:40:15','Since nsNavHistory::CanAddURI() is executed commonly, and since we expect privacy.privatebrowsing to change only occasionally, it makes sense to cache the value of this pref, thus speeding up nsNavHistory::CanAddURI(). This should address part of the concerns in comment 14.',0.00,0,0,3434134,5,'296508',0),(248970,283305,'2008-01-11 02:48:25','I\'m really happy to see some activity in this bug. Should we spin off a separate bug for designing the user interface for entering and exiting private browsing mode?',0.00,0,0,3434140,0,NULL,0),(248970,251051,'2008-01-11 02:57:43','Yes. I\'m willing to work on that as well. I\'ll file a bug and add the dependency here.\n\nIn the meamntime, I\'d like to have your opinion on comment 34. Thanks!',0.00,0,0,3434149,0,NULL,0),(248970,251051,'2008-01-11 03:00:02','BTW, I\'ll do my best to land both the back-end and the UI for Beta 3, if I can get timely reviews. I think it\'s important that this gets tested by users in Beta 3 and we get some user feedback about it.',0.00,0,0,3434154,0,NULL,0),(248970,283305,'2008-01-11 03:14:27','The last time the ux team talked about private browsing we agreed that a small indicator to the left of the site button was the best way to go. Let me check with Beltzner to see if I can give this some cycles, and I\'ll post some mockups. ',0.00,0,0,3434162,0,NULL,0),(248970,137548,'2008-01-11 07:55:25','(In reply to comment #34)\n> I agree. In fact, I think that having a small icon in the status bar would be\n> sufficient (if we even decide to have *that*), plus a notification (as\n> mentioned in http://wiki.mozilla.org/PrivateBrowsing#Making_Sure_the_User_has_the_Correct_Mental_Model\n>on the point when the user enters (or leaves) the private browsing mode.\n\nYup, I think that\'s right. The idea that Alex is referring to in comment #41 was that upon entering the mode a small indicator would appear somewhere near (or in?) the location bar that would also act as the \"exit private browsing mode\" button. Having it only in the status bar might not provide a good enough affordance for ending the \"private mode\" transaction.\n',0.00,0,0,3434361,0,NULL,0),(248970,251051,'2008-01-11 09:35:33','I filed bug 411929 to track the progress on the private browsing UI. Some mockups would be great, Alex. I agree that something near the location bar could be better noticed by the users.\n\nBTW, Beltzner, did you intentionally change the Target Milestone field to Future?',0.00,0,0,3434458,0,NULL,0),(248970,251051,'2008-01-11 10:21:26','This patch includes the same optimization (comment 37) to nsFormHistory-related part.',0.00,0,0,3434532,5,'296562',0),(248970,75420,'2008-01-11 10:25:50','(In reply to comment #24)\n> > * Cookies\n> > \n> > This is a pretty painful impl, since this would mean that you\'ll lose cookies\n> > that you had before you started in private browsing mode and accessed while\n> > you\'re there. Fortunately, the cookie service now has a creationTime that\n> > would be useful here. I think only clearing new cookies is acceptable for this\n> > feature, since stuff you\'ve already been to will likely be in your history as\n> > well...\n> \n> I wrote this patch before the cookie rewrite ;) I wanted to do that but\n> couldn\'t before because creation \"time\" was just an incremented counter. I can\n> do that now that the DB uses a proper creationTime.\n\nyep, this sounds good to me - note that we don\'t expose that information via the cookie interface yet, it\'d live here:\nhttp://mxr.mozilla.org/mozilla/source/netwerk/cookie/public/nsICookie2.idl\n\nbut file a bug against me if you want it, and i\'ll whip up a patch.',0.00,0,0,3434538,0,NULL,0),(248970,251051,'2008-01-11 10:41:00','(In reply to comment #45)\n> yep, this sounds good to me - note that we don\'t expose that information via\n> the cookie interface yet, it\'d live here:\n> http://mxr.mozilla.org/mozilla/source/netwerk/cookie/public/nsICookie2.idl\n> \n> but file a bug against me if you want it, and i\'ll whip up a patch.\n\nDone: bug 411952. Thanks!\n\nI\'ll modify the cookies related part of this patch as soon as you post a patch on that bug. The updated IDL would suffice for me to get started. :-)',0.00,0,0,3434571,0,NULL,0),(248970,251051,'2008-01-11 11:07:47','SessionStoreService must also be modified to make sure the data for windows/tabs are not saved during the private browsing mode. A patch containing this change will be posted shortly.',0.00,0,0,3434588,0,NULL,0),(248970,160571,'2008-01-11 12:23:15','(In reply to comment #47)\nYeah, you\'ll probably want to make SessionStore behave as when .resume_from_crash is disabled (nothing will be written to disk) and at the end clean up similarly to what we do for \"browser:purge-session-history\"... and just ask me for review when you\'re ready.',0.00,0,0,3434686,0,NULL,0),(248970,251051,'2008-01-12 00:25:32','(In reply to comment #48)\n> (In reply to comment #47)\n> Yeah, you\'ll probably want to make SessionStore behave as when\n> .resume_from_crash is disabled (nothing will be written to disk) and at the end\n> clean up similarly to what we do for \"browser:purge-session-history\"... and\n> just ask me for review when you\'re ready.\n\nThis patch changes the SessionStore service to support privacy.privatebrowsing pref, as suggested above by Simon.\n\nThe user experience is summarized as below:\n\nWhen the user enters private browsing mode, the entire session is considered private, so the SessionStore service gets is prevented from writing anything to the disk, and the existing sessionstore.js file is deleted from the user\'s profile. The only services from the SessionStore available during this period are the window/tab undo features. The SessionStore continues to collect information about open tabs/windows in the memory.\n\nWhen the user leaves the private browsing mode, the entire data collected in the memory would be deleted (so that after leaving the private browsing mode, the closed windows/tabs from the sessions cannot be restored. Then, the data for current windows/tabs are collected from scratch, and saved (if necessary) to disk. This way, nothing done inside the private browsing mode can be reflected by the SessionStore service after leaving this mode. The reason that the data for current windows/tabs are recollected is that the user should not consider any tabs/windows she leaves open before leaving the private browsing mode private.',0.00,0,0,3435359,5,'296679',0),(248970,251051,'2008-01-12 02:56:04','The Password Manager should not prompt the user to save new passwords or change already saved passwords in the private browsing mode. I\'ll post a new WIP patch with this change shortly.',0.00,0,0,3435410,0,NULL,0),(248970,49640,'2008-01-12 03:26:17','Should the \"Private Browsing\" mode use the normal cookies?\n\nReason for my question is: What exactly is this private browsing mode?\n\nJust dont keep any local tracks during this session?\nOr dont use my \"Identity\" (aka cookies) for the webpages during the session?\nOr Both?',0.00,0,0,3435421,0,NULL,0),(248970,251051,'2008-01-12 03:36:10','(In reply to comment #51)\n> Should the \"Private Browsing\" mode use the normal cookies?\n\nYes.\n\n> Reason for my question is: What exactly is this private browsing mode?\n\nSee .\n\nQuote:\n\"The purpose of private browsing is to put Firefox into a temporary state where no information about the user\'s browsing session is stored locally.\"\n\nBased on the above definition:\n\n> Just dont keep any local tracks during this session?\n> Or dont use my \"Identity\" (aka cookies) for the webpages during the session?\n> Or Both?\n\nThe former is what Private Browsing is about.\n',0.00,0,0,3435428,0,NULL,0),(248970,251051,'2008-01-12 03:41:18','This patch implements the changes suggested in comment 50.\n\nThe user experience is as follows:\n\nWhile the user is in the private browsing mode, the password manager continues to fill in the usernames and passwords already stored in the user\'s profile, but does not prompt the user to save new authentication information in any manner. After the user exits from the private browsing mode, the password manager will prompt her to store any new authentications as needed, just like before she entered the private browsing mode.',0.00,0,0,3435430,5,'296686',0),(248970,283305,'2008-01-12 08:58:54','>> Just dont keep any local tracks during this session?\n>> Or dont use my \"Identity\" (aka cookies) for the webpages during the session?\n>> Or Both?\n>\n>The former is what Private Browsing is about.\n\nThat\'s correct based on how we spec\'d this out on the wiki page, but are we sure that this is the right behavior? Here are two examples:\n\n-Alex is shopping for an engagement ring, so he enters into private browsing mode and loads amazon.com. Amazon recognizes Alex based on the cookies stored in his profile, and remembers that he spent the afternoon looking for engagement rings. The next day Alex\'s soon to be fiancee sits down at his computer and loads up amazon.com (while not in private browsing mode) and sees a homepage full of \"Other people who shopped for engagement rings looked at these rings as well! and Here is your recent shopping history!\"\n\n-Anna is trying to plan a surprise vacation for Alex. Not knowing the implementation details of cookies, data stored on a server, and the way Firefox treats private browsing mode, she turns on private browsing mode and begins to research exotic tropical locations. Using a cookie stored in her profile, Google Web History captures every search she does, not realizing that she is interested in privacy because she never logged out of her google account. Alex sits down at Anna\'s computer and her Web History widget on her iGoogle home page exposes every search that she has done.\n\nI can see users thinking that \"privacy means privacy\" and since they don\'t really get how all of this stuff works, situations like those two being rather common on shared computers. This leads me to think that we should probably block access to cookies when the user is in private browsing mode.',0.00,0,0,3435574,0,NULL,0),(248970,233280,'2008-01-12 09:08:18','What about the situation where a user wonders why they just got logged out of their Amazon account?',0.00,0,0,3435579,0,NULL,0),(248970,283305,'2008-01-12 09:12:12','>What about the situation where a user wonders why they just got logged out of\n>their Amazon account?\n\nYeah, this is why beltzner was in favor of maintaining access to cookies, because people won\'t get why nothing works when they are in private browsing mode.\n\nCould we block access to exiting cookies, but allow the creation of new cookies in memory? This would at least enable users to log back into amazon.com. If they have to do the action of logging in, then maybe they won\'t be so upset when information gets tracked?\n\nNeither solution is perfect, but I personally am leaning towards erring on the side of privacy.',0.00,0,0,3435588,0,NULL,0),(248970,251051,'2008-01-12 10:23:15','(In reply to comment #54)\n> I can see users thinking that \"privacy means privacy\" and since they don\'t\n> really get how all of this stuff works, situations like those two being rather\n> common on shared computers. This leads me to think that we should probably\n> block access to cookies when the user is in private browsing mode.\n\nHmm, interesting use cases. Let\'s do an item by item analysis based on such a viewpoint.\n\nWe have the following items that should be affected by private browsing (feel free to add to the list if I\'m missing anything):\n\n* Cache: we disable disk and offline caches, and continue using the memory cache. The memory cache may contain items specific to user\'s identity (for example, a page sent by a web application which is dynamically generated using user\'s cookie, and has stayed in the cache). Therefore, we may want to clear the memory cache before proceeding in the private browsing mode as well. The current implementation empties the memory cache before leaving the private browsing mode, so that no content from the private session lives in the memory after it.\n\n* History: we simply disable adding new history items in the private browsing mode. The previously existing history items are usable though. The URLs stored in the history may contain session IDs, etc. (think of sites which embed session IDs in URLs instead of cookies), but disabling history completely does not seem like a good option.\n\n* Form AutoComplete: we disable adding new form autocomplete items in private browsing mode, but using previously stored items is allowed. I can\'t think of why this may be a possible privacy concern...\n\n* Download Manager: we disable keeping downloaded items in the downloads history in the private browsing mode, but old items remain there, which looks innocent.\n\n* Cookies: we currently allow cookies to be saved in the private browsing mode, and delete them once we\'re leaving this mode. The entire collection of cookies is usable in private browsing mode. This implementation is not good (see the issues in comment 21), but I have not yet worked on this part at all (I\'m waiting on bug 411952...). The implementation you suggest in comment 56 actually seems good enough: access to the existing cookies should be blocked, but new cookies should be able to be saved to and restored from memory while in private browsing mode. Exiting this mode will delete the in-memory temporary cookies table, and will switch to the default set of cookies for use in normal browsing mode. The implementation of such behavior is more difficult than the existing plan, but it may be worth it (I\'m OK with the implementation challenge.)\n\n* Session Store: the session store in private browsing mode is prevented from writing anything to disk, but maintains its own memory data collections. Upon leaving this mode, the entire data collected throughout this mode is dumped, and the data is collected once again. Upon entering the private browsing mode, the previously collected session store data is available (for example, you can undo closed tabs), which is no bigger a privacy risk than the previously stored history items being accessible. (BTW, now that I think of it, Session Store should restore its exact data from the last snapshot before entering the private browsing mode, and then scan for newly added/changed tabs and windows. This way the recently closed tabs at the start of the private browsing session are available after exiting it. I\'ll implement this in a future version of the patch.)\n\n* Password Manager: the password manager should not prompt to save new login info in the private browsing mode, but should be able to autofill form elements with previously stored info. This is exactly like the Form History and I think it\'s OK.\n\n* Permissions Manager: the permissions manager should be prevented from storing new permissions in the private browsing mode (because storing new permissions could reveal sites visited in the private browsing mode.) Respecting previously stored permissions should be OK (like the case of Form History). BTW I\'m currently working on this, and I\'ll post a patch shortly.\n\n* Certificate Manager: the certificate exceptions should not be stored in the private browsing mode (like the case for Permissions Manager). Respecting previously stored exceptions should be OK (like the case of Permissions Manager).\n\n* Add-ons Install Whitelist: The same goes here like Permissions Manager and Certificate Manager. (BTW, wasn\'t add-ons install whitelist supposed to be eliminated in Firefox 3? What is the status of it? Should I invest time on working on it in this bug?)\n\n* Error Console: the error console should be prevented from accepting messages while in private browsing mode, because many messages contain site URLs. Viewing the previous messages from normal browsing modes should not be a privacy concern.\n\nComments/suggestions/criticisms are most welcome!',0.00,0,0,3435638,0,NULL,0),(248970,251051,'2008-01-12 13:13:43','This patch implements the backend changes in the nsPermissionManager, and also disabled the UI elements responsible for changing permissions in the browser code. With this patch, when the user enters the private browsing mode, she cannot set any permissions on that site (because otherwise the fact that she has visited that site gets exposed later), but can consume the existing permissions.\n\nThe UI elements handled include:\n* Firefox preferences window (the Exceptions buttons for images, cookies, and installs)\n* Firefox notification box menu on pages with a popup\n* Firefox permission editing controls in the Page Info dialog',0.00,0,0,3435737,5,'296738',0),(248970,233280,'2008-01-12 16:47:14','Here\'s an idea with cookies that I think might be ideal:\nCopy the existing cookie table to a new table, like moz_old_cookies (better name needed).\nContinue to use the existing cookie table, but once private browsing mode is exited, we copy the old table back into the new one and delete moz_old_cookies.\n\nThis means we get *all* of the cookies we had before when we enter, and then we go back to the exact state we were in before once we exit.\n\nIt might also be better to just copy the db file (probably faster).',0.00,0,0,3435878,0,NULL,0),(248970,75420,'2008-01-12 18:21:38','(In reply to comment #59)\n> Here\'s an idea with cookies that I think might be ideal:\n\nsdwilsh speaketh the truth. there are a few problems with your approach (patch 6):\n\n1) if you use nsCookie::LastAccessed(), you\'re going to end up deleting cookies that were accessed by (i.e., sent back to) a webserver, but never modified. so you\'ll be overeager in your deletion.\n\n2) if you use the cookie\'s creation time (approximately nsCookie::CreationID()), you\'ll catch cookies created since the private browsing epoch, but not cookies that were modified. creation times are not updated when a cookie\'s value is changed, which is important here. in addition, you\'ll allow last accessed times to be updated on sites that were visited, which (although pretty minor) would allow someone to tell what those sites were. (we don\'t currently expose that information on nsICookie{2}, but someone could sniff it from the db.)\n\n3) i\'m not sure i like the implementation of private browsing being pushed into the cookie/permission services, since these are part of the core netwerk module and are supposed to be as little app-specific as possible - but if it\'s well-written and minimal, i may be convinced.\n\na better approach would be to back up the original cookie and db files to a known location, do the private browsing, and then restore them. you\'ll have to figure out what to do in event of crash, though - we don\'t want that private data being left around, or orphaned.',0.00,0,0,3435933,0,NULL,0),(248970,27780,'2008-01-12 20:47:01','\n>+ var prefBranch = Cc[\"@mozilla.org/preferences-service;1\"].\n>+ getService(Ci.nsIPrefService).getBranch(\"privacy.\");\n>+ in_pb = prefBranch.getBoolPref(\"privatebrowsing\");\n\nHmm, I wonder if this might be better implemented as an observer+topic.\n\nSame net effect, just a conceptual difference.\n\n\n> promptAuth : function (aChannel, aLevel, aAuthInfo) {\n...\n>- var notifyBox = this._getNotifyBox();\n>- if (notifyBox)\n>- this._removeSaveLoginNotification(notifyBox);\n>+ var notifyBox = null;\n>+ if (!inPrivateBrowsing) {\n>+ var notifyBox = this._getNotifyBox();\n>+ if (notifyBox)\n>+ this._removeSaveLoginNotification(notifyBox);\n>+ }\n\nThis shouldn\'t change. If we\'re about to prompt for a login, any existing save-password notification bar should be removed to avoid confusion about what\'s being saved.\n\n\n> var canRememberLogin = this._pwmgr.getLoginSavingEnabled(hostname);\n>- \n>+\n> // if checkboxLabel is null, the checkbox won\'t be shown at all.\n>- if (canRememberLogin && !notifyBox)\n>+ if (canRememberLogin && !notifyBox && !inPrivateBrowsing)\n> checkboxLabel = this._getLocalizedString(\"rememberPassword\");\n\nI think the logic here would be simpler if canRememberLogin was forced to |false| is private browsing mode is enabled.',0.00,0,0,3435992,6,'296738',0),(248970,233280,'2008-01-12 22:27:18','>Index: toolkit/components/downloads/src/nsDownloadManager.cpp\n>+ // If the user is in private browsing mode, delete the download record when\n>+ // completed\n>+ PRBool privMode = PR_FALSE;\n>+ pref->GetBoolPref(PREF_PRIVATEBROWSING, &privMode);\n>+ if (privMode)\n>+ return 0;\n>+\nplease grab the result of GetBoolPref, and in the if statement, check if it was successful as well.',0.00,0,0,3436014,6,'296738',0),(248970,251051,'2008-01-13 00:26:41','(In reply to comment #59)\n> Here\'s an idea with cookies that I think might be ideal:\n> Copy the existing cookie table to a new table, like moz_old_cookies (better\n> name needed).\n> Continue to use the existing cookie table, but once private browsing mode is\n> exited, we copy the old table back into the new one and delete moz_old_cookies.\n> \n> This means we get *all* of the cookies we had before when we enter, and then we\n> go back to the exact state we were in before once we exit.\n> \n> It might also be better to just copy the db file (probably faster).\n\nSee comment 32:\n\n\"By choosing to write *some* data to disk (perhaps in an encrypted format) we\nhave broken a clear and easy to understand contract between Firefox and the\nuser. The user / security expert will not be sure that there is no security\nrisk.\"\n\nMconnor: what do you think?',0.00,0,0,3436045,0,NULL,0),(248970,251051,'2008-01-13 00:36:32','(In reply to comment #60)\n> (In reply to comment #59)\n> > Here\'s an idea with cookies that I think might be ideal:\n> \n> sdwilsh speaketh the truth. there are a few problems with your approach (patch\n> 6):\n\nHmm, I haven\'t actually touched the cookie code in any significant way from Michael\'s original patch yet...\n\n> 1) if you use nsCookie::LastAccessed(), you\'re going to end up deleting cookies\n> that were accessed by (i.e., sent back to) a webserver, but never modified. so\n> you\'ll be overeager in your deletion.\n\nYeah, and we don\'t want that.\n\n> 2) if you use the cookie\'s creation time (approximately\n> nsCookie::CreationID()), you\'ll catch cookies created since the private\n> browsing epoch, but not cookies that were modified. creation times are not\n> updated when a cookie\'s value is changed, which is important here. in addition,\n> you\'ll allow last accessed times to be updated on sites that were visited,\n> which (although pretty minor) would allow someone to tell what those sites\n> were. (we don\'t currently expose that information on nsICookie{2}, but someone\n> could sniff it from the db.)\n\nAgreed.\n\n> 3) i\'m not sure i like the implementation of private browsing being pushed into\n> the cookie/permission services, since these are part of the core netwerk module\n> and are supposed to be as little app-specific as possible - but if it\'s\n> well-written and minimal, i may be convinced.\n\nHmm, what do you think specifically about the implementation in the cache and permissions backends in patch 6 (attachment 296738)?\n\nBased on the service which needs behavior modifications, there may be things which can be done from the UI. For example, for the permissions service, my patch changes the nsPermissionManager slightly, and also disables any place in the UI which is used to add modify anything in nsPermissionManager. But I\'m not sure how a similar \"higher-level\" approach can be taken for cache and cookie services, since they are accessed by other modules in netwerk, and patching the UI won\'t work in those cases (at least, I can\'t see how it would work.)\n\n> a better approach would be to back up the original cookie and db files to a\n> known location, do the private browsing, and then restore them. you\'ll have to\n> figure out what to do in event of crash, though - we don\'t want that private\n> data being left around, or orphaned.\n\nHmm, IINM, as long as we write the cookies on disk (no matter in the original or in a new db file), we are risking the information to get leaked. There is not much we can do in case of a crash, and there is even less that can be done in case Firefox is \"end-tasked\" without a chance to do any cleanup. And by using sqlite as the backend, we ensure that the data is left in a usable state on the disk, so we can\'t even hope for it to get corrupted. :-)\n\nThis is why I think an approach such as comment 56 is better in this regard (I\'m talking about the having an in-memory DB part, not necessarily avoiding using the existing cookies.)',0.00,0,0,3436053,0,NULL,0),(248970,251051,'2008-01-13 00:39:23','(In reply to comment #62)\n> (From update of attachment 296738 [details])\n> >Index: toolkit/components/downloads/src/nsDownloadManager.cpp\n> >+ // If the user is in private browsing mode, delete the download record when\n> >+ // completed\n> >+ PRBool privMode = PR_FALSE;\n> >+ pref->GetBoolPref(PREF_PRIVATEBROWSING, &privMode);\n> >+ if (privMode)\n> >+ return 0;\n> >+\n> please grab the result of GetBoolPref, and in the if statement, check if it was\n> successful as well.\n\nThe idea here (and in other parts of the patch) is to assume that we are not in the safe browsing mode, and try to prove otherwise. That is, if the GetBoolPref fails for any reason, privMode would remain PR_FALSE... Is this assumption correct? If not, then I would have change this (and possibly other places in the patch as well).',0.00,0,0,3436054,0,NULL,0),(248970,251051,'2008-01-13 00:54:04','Thanks for the comments, Justin.\n\n(In reply to comment #61)\n> (From update of attachment 296738 [details])\n> \n> >+ var prefBranch = Cc[\"@mozilla.org/preferences-service;1\"].\n> >+ getService(Ci.nsIPrefService).getBranch(\"privacy.\");\n> >+ in_pb = prefBranch.getBoolPref(\"privatebrowsing\");\n> \n> Hmm, I wonder if this might be better implemented as an observer+topic.\n> \n> Same net effect, just a conceptual difference.\n\nSee the first part of my comments in comment 32. If I\'m missing something here, I\'d change the patch accordingly, but no one has commented on my reasoning yet...\n\n> > promptAuth : function (aChannel, aLevel, aAuthInfo) {\n> ...\n> >- var notifyBox = this._getNotifyBox();\n> >- if (notifyBox)\n> >- this._removeSaveLoginNotification(notifyBox);\n> >+ var notifyBox = null;\n> >+ if (!inPrivateBrowsing) {\n> >+ var notifyBox = this._getNotifyBox();\n> >+ if (notifyBox)\n> >+ this._removeSaveLoginNotification(notifyBox);\n> >+ }\n> \n> This shouldn\'t change. If we\'re about to prompt for a login, any existing\n> save-password notification bar should be removed to avoid confusion about\n> what\'s being saved.\n\nYou\'re right, sorry for the mistake.\n\n> > var canRememberLogin = this._pwmgr.getLoginSavingEnabled(hostname);\n> >- \n> >+\n> > // if checkboxLabel is null, the checkbox won\'t be shown at all.\n> >- if (canRememberLogin && !notifyBox)\n> >+ if (canRememberLogin && !notifyBox && !inPrivateBrowsing)\n> > checkboxLabel = this._getLocalizedString(\"rememberPassword\");\n> \n> I think the logic here would be simpler if canRememberLogin was forced to\n> |false| is private browsing mode is enabled.\n\nDone.\n\nThe new patch fixes the above two issues, and also adds browser/components/preferences/permissions.js which was accidentally dropped off from patch 6.',0.00,0,0,3436063,5,'296798',0),(248970,75420,'2008-01-13 00:54:57','(In reply to comment #63)\n> This is why I think an approach such as comment 56 is better in this regard\n> (I\'m talking about the having an in-memory DB part, not necessarily avoiding\n> using the existing cookies.)\n\nhmm. in fact - you can avoid that problem by closing the db connection in the cookieservice, making further operations occur in-memory. on exiting private browsing mode, just reload the cookie table from disk (i.e. call InitDB()).\n\nthat should be very simple to implement - and requires only a few lines of code in nsCookieService::Observe(). for permissionmanager, you could do something similar.\n',0.00,0,0,3436065,0,NULL,0),(248970,251051,'2008-01-13 01:04:54','(In reply to comment #67)\n> hmm. in fact - you can avoid that problem by closing the db connection in the\n> cookieservice, making further operations occur in-memory. on exiting private\n> browsing mode, just reload the cookie table from disk (i.e. call InitDB()).\n\nWow, I didn\'t know the cookie service works in this way. So, if the DB connection is unavailable, will all operations (adding cookies, updating cookies, etc.) happen successfully in memory? And will the full list of cookies read from the DB upon initialization remain intact (so that old cookies do not get lost when entering the private browsing mode)?\n\nIf the above is true, then it will indeed be very simple to implement.\n\n> that should be very simple to implement - and requires only a few lines of code\n> in nsCookieService::Observe(). for permissionmanager, you could do something\n> similar.\n\nDoes the above apply to the permission manager as well? Can I safely close the DB connection in the middle of its operation, and all ops from that point on get executed in memory, and later on when a new DB connection is opened, everything will revert back to just like it was before closing the connection?',0.00,0,0,3436068,0,NULL,0),(248970,75420,'2008-01-13 01:13:16','(In reply to comment #68)\n> Wow, I didn\'t know the cookie service works in this way. So, if the DB\n> connection is unavailable, will all operations (adding cookies, updating\n> cookies, etc.) happen successfully in memory? And will the full list of\n> cookies read from the DB upon initialization remain intact (so that old cookies\n> do not get lost when entering the private browsing mode)?\n\nindeed! the cookie service effectively has two data stores - on-disk and in-memory. on loading a profile, it reads data from the on-disk db into memory, and from that point on keeps them synced. (note that session cookies are held only in memory, and never see the platter - so the in-memory db is a superset of the on-disk one.)\n\nsimply closing that db connection at any point in time will cause it to run only from memory. it\'s designed that way - having a profile around to access is purely optional (think embeddors here).\n\n> Does the above apply to the permission manager as well? Can I safely close the\n> DB connection in the middle of its operation, and all ops from that point on\n> get executed in memory, and later on when a new DB connection is opened,\n> everything will revert back to just like it was before closing the connection?\n\npermission manager works identically. although by \"opening a new connection\" you\'re really clearing the existing in-memory table, and then calling InitDB() to reload the on-disk data.',0.00,0,0,3436078,0,NULL,0),(248970,251051,'2008-01-13 01:30:38','(In reply to comment #69)\n> indeed! the cookie service effectively has two data stores - on-disk and\n> in-memory. on loading a profile, it reads data from the on-disk db into memory,\n> and from that point on keeps them synced. (note that session cookies are held\n> only in memory, and never see the platter - so the in-memory db is a superset\n> of the on-disk one.)\n> \n> simply closing that db connection at any point in time will cause it to run\n> only from memory. it\'s designed that way - having a profile around to access is\n> purely optional (think embeddors here).\n\nOK, I\'m amused! :-) Thanks a lot for the pointer, Dan. So, I guess this removes the dependency on bug 411952...\n\nThe only thing which needs to be decided before I can come up with a patch is if we want to keep the previously stored cookies around, or start from scratch as Alex suggested in comment 56. Faaborg, Beltzner, Mconnor: any ideas?\n\n> permission manager works identically. although by \"opening a new connection\"\n> you\'re really clearing the existing in-memory table, and then calling InitDB()\n> to reload the on-disk data.\n\nYeah, that is what we would want. This makes the whole UI changes to disable setting new permissions introduced in patch 6 redundant as well: users *will* be able to set new permissions in the private browsing mode, only those new permissions would last until the end of their private browsing session, and would get vanished right after they exit the private browsing session.\n\nBTW, this makes me think that the private browsing should not last between browser session restarts. Think of what would happen to the cookies if the user closes the browser without exiting the private browsing mode... They would get lost (because they are stored in memory.) I think this gives me a clear idea why private browsing mode should not be retained after starting the browser. If we have an indicator in the primary UI (like Alex suggested in comment 41) then this won\'t be much of an issue, because the user will know immediately that she\'s no longer in the private browsing mode after she restarts the browser. And it makes the observer/notification implementation suggested by mconnor and Justin before viable. We\'ll probably want a component which runs as a service which could be queried for the state of the private browsing mode, and can be used to initiate the browsing mode. This component can be used for all higher level code (possibly excluding the netwerk/permission code, which can use raw observers.)\n\nThis sounds like quite a bit of work, but I\'ll try to come up with a new patch shortly.',0.00,0,0,3436086,0,NULL,0),(248970,251051,'2008-01-13 01:34:23','(In reply to comment #69)\n> indeed! the cookie service effectively has two data stores - on-disk and\n> in-memory. on loading a profile, it reads data from the on-disk db into memory,\n> and from that point on keeps them synced. (note that session cookies are held\n> only in memory, and never see the platter - so the in-memory db is a superset\n> of the on-disk one.)\n\nOne more question here. Would closing the connection automatically lead to the in-memory table to clear, or not? If not, is there an easy way to clear it if needed? This would be important when entering the private browsing mode.\n\nAlso, like what you mentioned about the permission manager, would re-opening the connection cause the in-memory table to be reloaded from the DB? This would be important when exiting the private browsing mode.',0.00,0,0,3436088,0,NULL,0),(248970,75420,'2008-01-13 02:04:47','(In reply to comment #70)\n> Yeah, that is what we would want. This makes the whole UI changes to disable\n> setting new permissions introduced in patch 6 redundant as well: users *will*\n> be able to set new permissions in the private browsing mode, only those new\n> permissions would last until the end of their private browsing session, and\n> would get vanished right after they exit the private browsing session.\n\ni like this approach much better!\n\n(In reply to comment #71)\n> One more question here. Would closing the connection automatically lead to the\n> in-memory table to clear, or not? If not, is there an easy way to clear it if\n> needed? This would be important when entering the private browsing mode.\n\nit won\'t - see {nsCookieService,nsPermissionManager}::RemoveAllFromMemory(). i\'d be in favor of not doing this, though the UX guys might think it\'s best so that users have the \"feel\" of things being reset/private.\n\nclosing the db connection is as simple as nulling out mDBConn.\n\n> Also, like what you mentioned about the permission manager, would re-opening\n> the connection cause the in-memory table to be reloaded from the DB? This\n> would be important when exiting the private browsing mode.\n\nit won\'t ;) you\'ll have to call {nsCookieService,nsPermissionManager}::InitDB().\n\none consideration here, specific to cookies: say the user starts the browser (loading the cookie db from disk), and then browses around for a while (accumulating session cookies in memory, that never get written to disk). they now have both persistent and session cookies in memory. then they enter PB mode, and accumulate more cookies. on exiting that mode, we throw away everything and reload persistent cookies from disk. those session cookies they acquired before entering PB mode are now lost. (also consider the case where the user has \'limit cookie lifetime to session\' enabled, so all their cookies are session-only.) do we care about these cases? phrased another way, is it acceptable for exiting PB mode to behave like a browser restart?',0.00,0,0,3436106,0,NULL,0),(248970,251051,'2008-01-13 02:17:18','(In reply to comment #72)\n> (In reply to comment #70)\n> > Yeah, that is what we would want. This makes the whole UI changes to disable\n> > setting new permissions introduced in patch 6 redundant as well: users *will*\n> > be able to set new permissions in the private browsing mode, only those new\n> > permissions would last until the end of their private browsing session, and\n> > would get vanished right after they exit the private browsing session.\n> \n> i like this approach much better!\n\nMe too. :-)\n\n> (In reply to comment #71)\n> > One more question here. Would closing the connection automatically lead to the\n> > in-memory table to clear, or not? If not, is there an easy way to clear it if\n> > needed? This would be important when entering the private browsing mode.\n> \n> it won\'t - see {nsCookieService,nsPermissionManager}::RemoveAllFromMemory().\n> i\'d be in favor of not doing this, though the UX guys might think it\'s best so\n> that users have the \"feel\" of things being reset/private.\n> \n> closing the db connection is as simple as nulling out mDBConn.\n\nThanks for the tips!\n\n> > Also, like what you mentioned about the permission manager, would re-opening\n> > the connection cause the in-memory table to be reloaded from the DB? This\n> > would be important when exiting the private browsing mode.\n> \n> it won\'t ;) you\'ll have to call\n> {nsCookieService,nsPermissionManager}::InitDB().\n\nHmm, nsCookieService::InitDB() calls nsCookieService::Read() which leads to items in the DB be read into the memory table, right?\n\n> one consideration here, specific to cookies: say the user starts the browser\n> (loading the cookie db from disk), and then browses around for a while\n> (accumulating session cookies in memory, that never get written to disk). they\n> now have both persistent and session cookies in memory. then they enter PB\n> mode, and accumulate more cookies. on exiting that mode, we throw away\n> everything and reload persistent cookies from disk. those session cookies they\n> acquired before entering PB mode are now lost. (also consider the case where\n> the user has \'limit cookie lifetime to session\' enabled, so all their cookies\n> are session-only.) do we care about these cases? phrased another way, is it\n> acceptable for exiting PB mode to behave like a browser restart?\n\nHmm, would it be possible to get a copy of the in-memory hash table of cookies, and restore it when exiting from the private browsing mode, instread of calling nsCookieService::RemoveAllFromMemory()? This way, everything would get restored to what it was exactly before initiating the private browsing session.',0.00,0,0,3436109,0,NULL,0),(248970,75420,'2008-01-13 04:20:21','(In reply to comment #73)\n> Hmm, nsCookieService::InitDB() calls nsCookieService::Read() which leads to\n> items in the DB be read into the memory table, right?\n\nright.\n\n> Hmm, would it be possible to get a copy of the in-memory hash table of cookies,\n> and restore it when exiting from the private browsing mode, instread of calling\n> nsCookieService::RemoveAllFromMemory()? This way, everything would get\n> restored to what it was exactly before initiating the private browsing session.\n\nyes, though that\'d be a little more complicated. we should probably decide how we want this to behave before embarking on that ;)',0.00,0,0,3436162,0,NULL,0),(248970,233280,'2008-01-13 07:17:18','(In reply to comment #65)\n> The idea here (and in other parts of the patch) is to assume that we are not in\n> the safe browsing mode, and try to prove otherwise. That is, if the\n> GetBoolPref fails for any reason, privMode would remain PR_FALSE... Is this\n> assumption correct? If not, then I would have change this (and possibly other\n> places in the patch as well).\nXPCOM rules say you should not trust an out parameter if the method did not return successfully.',0.00,0,0,3436238,0,NULL,0),(248970,251051,'2008-01-13 09:18:31','(In reply to comment #74)\n> (In reply to comment #73)\n> > Hmm, nsCookieService::InitDB() calls nsCookieService::Read() which leads to\n> > items in the DB be read into the memory table, right?\n> \n> right.\n> \n> > Hmm, would it be possible to get a copy of the in-memory hash table of cookies,\n> > and restore it when exiting from the private browsing mode, instread of calling\n> > nsCookieService::RemoveAllFromMemory()? This way, everything would get\n> > restored to what it was exactly before initiating the private browsing session.\n> \n> yes, though that\'d be a little more complicated. we should probably decide how\n> we want this to behave before embarking on that ;)\n\nOK, waiting for comments from UX guys...',0.00,0,0,3436317,0,NULL,0),(248970,251051,'2008-01-13 09:21:14','(In reply to comment #75)\n> XPCOM rules say you should not trust an out parameter if the method did not\n> return successfully.\n\nOh, thanks for mentioning this. I\'ll post an updated patch shortly.\n',0.00,0,0,3436318,0,NULL,0),(248970,283305,'2008-01-13 09:38:57','> > Hmm, would it be possible to get a copy of the in-memory hash table of cookies,\n> > and restore it when exiting\n\n>OK, waiting for comments from UX guys...\n\nTo make sure I fully understand the question, what are the interface implications of restoring the in-memory cookies from before entering private browsing mode. Would this enable use to let the user enter and exit without having to end their session?',0.00,0,0,3436332,0,NULL,0),(248970,283305,'2008-01-13 09:46:11','>The only thing which needs to be decided before I can come up with a patch is\n>if we want to keep the previously stored cookies around, or start from scratch\n>as Alex suggested in comment 56. Faaborg, Beltzner, Mconnor: any ideas?\n\nIt would be good if beltzner or mconnor weighed in as well, but after thinking about this some more, I believe users will be surprised if sites recognize them after entering private browsing mode. If you think of private browsing mode as putting on a mask, than the first thing that happens is Amazon.com says \"Hello Alex Faaborg!\" that implies the mask isn\'t very good.',0.00,0,0,3436337,0,NULL,0),(248970,251051,'2008-01-13 09:51:01','(In reply to comment #78)\n> >OK, waiting for comments from UX guys...\n> \n> To make sure I fully understand the question, what are the interface\n> implications of restoring the in-memory cookies from before entering private\n> browsing mode. Would this enable use to let the user enter and exit without\n> having to end their session?\n\nThere are two options to implement private browsing -- cookie-wise:\n\n1. Give the user a \"clean\" session by not using any previously used cookies whatsoever. This is just like the case where they create a new profile and use it to browse the web. The cookies can be stored during user\'s private browsing session. After the user exits, any cookies stored will be discarded. All cookies are stored only in memory, so no track of user\'s actions are saved to disk.\n\n2. Just like case 1, with the exception that the previously stored cookies are not discarded; they\'re used as before, but no update on the cookies will be stored on disk, and the exact snapshot of the in-memory cookie table before entering the private browsing mode would be available afterward, as if no private browsing has ever occurred.',0.00,0,0,3436339,0,NULL,0),(248970,251051,'2008-01-13 09:56:07','(In reply to comment #79)\n> It would be good if beltzner or mconnor weighed in as well, but after thinking\n> about this some more, I believe users will be surprised if sites recognize them\n> after entering private browsing mode. If you think of private browsing mode as\n> putting on a mask, than the first thing that happens is Amazon.com says \"Hello\n> Alex Faaborg!\" that implies the mask isn\'t very good.\n\nOr Amazon is too good! ;-)\n\nSeriously, the more I think about it, the more logical your approach seems to me...',0.00,0,0,3436344,0,NULL,0),(248970,251051,'2008-01-17 23:21:25','Here is a new version of the patch, that I\'ve rewritten from scratch. This version replaces the \"privacy.privatebrowsing\" pref with the \"browser:private-browsing\" notification. This notification gets sent by the gPrivateBrowsingMgr object defined in browser.js. The data value of this notification determines if we\'re entering the private browsing mode or leaving it. I have added a quick and dirty item to the Tools menu to toggle the private browsing mode to aid testing, and this will be removed in the final version of the patch, as the UI for private browsing mode would be implemented in bug 411929.\n\nThis patch implements the changes to the cache, history, form fill history and download manager components. The changes to the cookies, session store, login manager, permission manager, and error console components will be implemented shortly in a future WIP patch. For now, I\'m assuming that we want the cookie behavior that Alex suggested earlier, unless I hear otherwise from him or mconnor/beltzner.',0.00,0,0,3442709,5,'297698',0),(248970,251051,'2008-01-19 01:37:18','Sorry to CC you again, Simon.\n\nI was wondering if it\'s possible to restore the SessionStore service after the private browsing mode in a way that the SessionStore data for recently closed tabs is exactly like what it was right before entering the private browsing mode.\n\nHere\'s the use case:\n1) John is browsing the web. His recently closed tabs list includes [Google, Gmail, CNN].\n2) He enters private browsing mode, opens a new tab to browse Amazon, and he closes it later on. His recently closed tabs list at this point: [Google, Gmail, CNN, Amazon].\n3) He exits private browsing mode.\n\nWith the current implementation, after 3 the recently closed tabs list is []. I like to restore it to [Google, Gmail, CNN], but I\'m not sure how to go about it and not hurt other parts of the code...\n\nSuggestions welcome. Thanks!',0.00,0,0,3444221,0,NULL,0),(248970,251051,'2008-01-19 01:40:47','(In reply to comment #75)\n> (In reply to comment #65)\n> > The idea here (and in other parts of the patch) is to assume that we are not in\n> > the safe browsing mode, and try to prove otherwise. That is, if the\n> > GetBoolPref fails for any reason, privMode would remain PR_FALSE... Is this\n> > assumption correct? If not, then I would have change this (and possibly other\n> > places in the patch as well).\n> XPCOM rules say you should not trust an out parameter if the method did not\n> return successfully.\n\nBTW, since I\'m no longer using a pref, this should no longer be relevant.',0.00,0,0,3444223,0,NULL,0),(248970,160571,'2008-01-19 04:30:28','(In reply to comment #83)\n> in a way that the SessionStore data for recently closed tabs is exactly\n> like what it was right before entering the private browsing mode.\n\nWhen entering private browsing mode, iterate through all _windows and for each of them clone the _closedTabs array into _closedTabsBackup (where cloning is best achieved through |eval(closedTabs.toSource())|). Then you can just move that backup back when you exit private browsing mode and delete _closedTabsBackup (and make sure that _closedTabs is still no larger than what .max_tabs_undo dictates).',0.00,0,0,3444320,0,NULL,0),(248970,251051,'2008-01-19 11:05:42','This patch is a followup to attachment 297698.\n\nWhat\'s new:\n\n* Cookie service: the implementation follows Dan\'s hint in comment 67, and Alex\'s idea in comment 54. The in-memory DB would be restored when exiting the private browsing mode, which addresses an issue Dan raised in comment 72.\n\n* Permission manager: the implementation has been changed to follow Dan\'s hint in comment 67.\n\n* Login prompter: the implementation uses a separate object with greater lifetime than that of prompter objects, so that the true state of private browsing can be obtained at any time.\n\n* Content prefs: no prefs will be saved during the private browsing mode, which makes it impossible to track user actions in private browsing mode based on the content prefs DB.\n\n* Session store: added the implementation Simon mentioned in comment 85. Note: this does not work as intended (i.e., the Recently closed tabs menu item is grayed out after exiting the private browsing mode). Need to investigate this further.\n\n* Console service: added a simple mechanism to pause/resume recording of messages in the console service, and modified Private Browsing Manager in browser.js to use this facility to make sure nothing is logged to the console service during the private browsing session. I didn\'t modify the service itself to observe browser:private-browsing notifications because that could lead to circular calls made back to the service by the observer service.\n\n* Private Browsing manager: handled quit-application-granted, to make sure to exit private browsing mode just before application quit, so that services which need cleanup can get the proper exit notification.\n\nThe only other service which needs modification is the certificate exceptions list. I\'ll implement that in a next patch, and will ask for review on various parts of the patch then. If anyone can think of other services which need modification for private browsing mode, please let me know.',0.00,0,0,3444584,5,'297997',0),(248970,251051,'2008-01-19 11:32:00','Attachment 297997, updated to trunk.',0.00,0,0,3444602,5,'298002',0),(248970,160571,'2008-01-19 14:12:24','(In reply to comment #86)\n> * Session store: added the implementation Simon mentioned in comment 85.\n\nI\'ll review the changes when you\'re done. Just a note on your issue: it doesn\'t work because of the splicing in _restoreRecentlyClosedTabs. Instead you\'ll have to |.slice(0, maxTabsUndo)|...\n\n> * Console service: added a simple mechanism to pause/resume recording of\n> messages in the console service\n\nI\'d rather see an attribute \"paused\" (or \"logging\", \"enabled\" or something alike) than two methods \"pause\" and \"resume\" so that e.g. Firebug can easily determine whether it should inform the user that she shouldn\'t be expecting any errors in the console (without having to keep track of private browsing mode).\n\n> * Private Browsing manager: handled quit-application-granted, to make sure to\n> exit private browsing mode just before application quit\n\nThat code will have to move into an XPCOM component (e.g. nsBrowserGlue) or it\'ll fail to run when the last closed window isn\'t a browser one.',0.00,0,0,3444714,0,NULL,0),(248970,251051,'2008-01-20 12:07:07','(In reply to comment #88)\n> (In reply to comment #86)\n> > * Session store: added the implementation Simon mentioned in comment 85.\n> \n> I\'ll review the changes when you\'re done. Just a note on your issue: it doesn\'t\n> work because of the splicing in _restoreRecentlyClosedTabs. Instead you\'ll have\n> to |.slice(0, maxTabsUndo)|...\n\nI should be ashamed of not catching this myself. Of course you were absolutely right! Fixed.\n\n> > * Console service: added a simple mechanism to pause/resume recording of\n> > messages in the console service\n> \n> I\'d rather see an attribute \"paused\" (or \"logging\", \"enabled\" or something\n> alike) than two methods \"pause\" and \"resume\" so that e.g. Firebug can easily\n> determine whether it should inform the user that she shouldn\'t be expecting any\n> errors in the console (without having to keep track of private browsing mode).\n\nDone. The new patch uses the |paused| attribute on the console service.\n\n> > * Private Browsing manager: handled quit-application-granted, to make sure to\n> > exit private browsing mode just before application quit\n> \n> That code will have to move into an XPCOM component (e.g. nsBrowserGlue) or\n> it\'ll fail to run when the last closed window isn\'t a browser one.\n\nI moved the whole stuff in browser.js to its own XPCOM component in browser/components.',0.00,0,0,3445353,5,'298145',0),(248970,137548,'2008-01-22 12:25:15','Ehsan - there\'s a lot of great work in here. Any chance of you being able to put this all together in an XPI to get broader testing of the functionality?',0.00,0,0,3447745,0,NULL,0),(248970,251051,'2008-01-23 00:33:25','(In reply to comment #90)\n> Ehsan - there\'s a lot of great work in here. Any chance of you being able to\n> put this all together in an XPI to get broader testing of the functionality?\n\nI\'d love to, but I\'m not sure how to do it, since the code touches a lot of core components, such as cache, cookies, permissions, etc. Maybe it would be better to provide builds with this patch applied for users to test? I can provide Windows and Linux builds, but I need help in creating a Mac OS X build because I don\'t have access to any Mac computer...\n\nLet me know if providing build would serve this purpose.',0.00,0,0,3448756,0,NULL,0),(248970,75420,'2008-01-23 01:32:41','(In reply to comment #91)\n> but I need help in creating a Mac OS X build\n\n\"buildbot try\" can roll builds on all the major plats for you, and make them available for download - check out build.mozilla.org when you have your cvs account set up. in the meantime, if you attach a patch here, someone can probably do it for you ;)',0.00,0,0,3448830,0,NULL,0),(248970,251051,'2008-01-23 02:09:53','(In reply to comment #92)\n> \"buildbot try\" can roll builds on all the major plats for you, and make them\n> available for download - check out build.mozilla.org when you have your cvs\n> account set up. in the meantime, if you attach a patch here, someone can\n> probably do it for you ;)\n\nThanks for the tip. I guess I\'ll ask someone to make the builds on this bug as soon as I\'m finished with the patch here. I\'m currently stuck by some bug in the cert override service, which I\'m going to file shortly... :(',0.00,0,0,3448859,0,NULL,0),(248970,198492,'2008-01-23 02:23:12','Having unit tests would also help integration I guess. I was thinking of\nsomething like this:\nSetup a set of pages running on httpd.js for testing cookies, auto-completion,\nform entry and others. Then develop a browser chrome test\n(http://developer.mozilla.org/en/docs/Browser_chrome_tests) which will simulate\nnavigation and use features affecting the profile state (browse to pages\nsetting cookies, simulate a password entry, simulate downloading a file, ...).\n\nThis simulated session could be run a first time with no private browsing mode\nand check that all works well (cookies saved, auto-completion saved, ...). Then\nwe sanitize the profile, toggle private browsing mode and run the navigation\nsimulation again and the toggle private browsing mode off. After that, we check\nthat nothing is saved in the profile.\n\nI can imagine two ways of checking that nothing is saved in the profile while\nin private browsing mode:\n1) one high level check that would ensure that no files were written during\nprivate private browsing mode by checking file last write time (hoping this\nworks in a cross platform way). There could be a white list for things that are\nallowed to change and don\'t introduce a privacy risk (like\nurlclassifier3.sqlite I guess). The advantage of this kind of test is that it\ncould detect new features added without them managing the private browsing\nmode, preventing privacy leaks added in the future.\n2) Service specific checks (checking cookies, cache, form history, ...)\n\nI don\'t think something similar already exist for the sanitizer service (clear\nprivate data). Such a framework if developed could then test both the private\nbrowsing mode and the sanitizer. For testing the sanitizer, we launch the\nsimulated browsing, run the sanitizer and check that nothing is saved in test 2\nabove (test 1 would not be effective, as files are written during navigation).\n\nThat was some ideas I had for making private browsing mode more robust. Of\ncourse it\'s certainly more easy to write down than to implement ;-)\n\n\nMaybe another service that could participate in the private browsing mode is\nthe site specific preferences? If you navigate to a site and change the zoom\nlevel this information is saved in this store, thus revealing you visited that\nsite. This could use the same handling as the cookies: site specific\npreferences are used as normal while in private browsing mode, but the store is\nnot updated in this mode (this means your zoom settings are not reset in\nprivate browsing mode for instance).\n',0.00,0,0,3448866,0,NULL,0),(248970,251051,'2008-01-23 03:19:23','Thanks for your input, Sylvian.\n\n(In reply to comment #94)\n> Having unit tests would also help integration I guess. I was thinking of\n> something like this:\n> Setup a set of pages running on httpd.js for testing cookies, auto-completion,\n> form entry and others. Then develop a browser chrome test\n> (http://developer.mozilla.org/en/docs/Browser_chrome_tests) which will simulate\n> navigation and use features affecting the profile state (browse to pages\n> setting cookies, simulate a password entry, simulate downloading a file, ...).\n\nHmmm good idea. I\'m totally new in writing chrome tests, though. I\'m going through the docs on MDC right now, but if anyone wants to jump in and help on this, I\'d be more than happy to accept inputs/hints/written tests. :-)\n\n> I don\'t think something similar already exist for the sanitizer service (clear\n> private data). Such a framework if developed could then test both the private\n> browsing mode and the sanitizer. For testing the sanitizer, we launch the\n> simulated browsing, run the sanitizer and check that nothing is saved in test 2\n> above (test 1 would not be effective, as files are written during navigation).\n\nThat would be part of another bug, right? Maybe you could file one to keep it on-track?\n\n> Maybe another service that could participate in the private browsing mode is\n> the site specific preferences? If you navigate to a site and change the zoom\n> level this information is saved in this store, thus revealing you visited that\n> site.\n\nI added this component in the WIP Patch 9 (attachment 297997).\n\n> This could use the same handling as the cookies: site specific\n> preferences are used as normal while in private browsing mode, but the store is\n> not updated in this mode (this means your zoom settings are not reset in\n> private browsing mode for instance).\n\nThis implementation is actually quite complicated. It was easy in case of cookies and the permission manager because they already provided an in-memory DB which is a superset of the on-disk DB. The contentprefs service, however, does not even perform in-memory caching, and it reads and writes all the prefs directly from/to the DB. And we have made similar tradeoffs in other services. For example, the pages visited in the private browsing mode don\'t end up in your history even when you have not left the private browsing mode. I think a similar tradeoff here would be acceptable, wouldn\'t it?\n',0.00,0,0,3448910,0,NULL,0),(248970,198492,'2008-01-23 04:00:07','(In reply to comment #95)\n> \n> That would be part of another bug, right? Maybe you could file one to keep it\n> on-track?\n\nYes, I think so. I\'ll do some research if it is filed already and enter a new one if needed.\n\n> I added this component in the WIP Patch 9 (attachment 297997 [details]).\n\nSorry I didn\'t see it while skimming through the patch.\n\n> This implementation is actually quite complicated. It was easy in case of\n> cookies and the permission manager because they already provided an in-memory\n> DB which is a superset of the on-disk DB. The contentprefs service, however,\n> does not even perform in-memory caching, and it reads and writes all the prefs\n> directly from/to the DB. And we have made similar tradeoffs in other services.\n> For example, the pages visited in the private browsing mode don\'t end up in\n> your history even when you have not left the private browsing mode. I think a\n> similar tradeoff here would be acceptable, wouldn\'t it?\n\nSeems acceptable to me. If I understand the patch well, the content preferences can be read but not written in private browsing mode. This means a site where you raised the zoom level will still be zoomed in private browsing mode as expected.\n\n',0.00,0,0,3448929,0,NULL,0),(248970,251051,'2008-01-23 04:09:43','(In reply to comment #96)\n> (In reply to comment #95)\n> > \n> > That would be part of another bug, right? Maybe you could file one to keep it\n> > on-track?\n> \n> Yes, I think so. I\'ll do some research if it is filed already and enter a new\n> one if needed.\n\nThanks! Please CC me if you find an existing one (or file a new bug).\n\n> Seems acceptable to me. If I understand the patch well, the content preferences\n> can be read but not written in private browsing mode. This means a site where\n> you raised the zoom level will still be zoomed in private browsing mode as\n> expected.\n\nYes, exactly.',0.00,0,0,3448941,0,NULL,0),(248970,251051,'2008-01-23 04:29:47','This new patch makes nsCertOverrideService honor private browsing mode. The approach used is to store the overrides in memory while we are in private browsing mode, and clear them up after exiting this mode. Nothing will be written to disk, even if the override entry is set to permanent mode.\n\nNote that I have not been able to test this because of bug 413627. I\'ll wait for some time and try to figure out a solution. Then I\'ll ask for review on this patch. Please let me know if you know how to solve this problem. For more info, see bug 413627 comment 0.',0.00,0,0,3448953,5,'298699',0),(248970,251051,'2008-01-23 04:32:05','BTW, according to comment 92, if anyone can help build a test version for all the three platforms, that would be great. Please use the WIP 11 patch for this purpose.',0.00,0,0,3448958,0,NULL,0),(248970,251051,'2008-01-23 04:33:39','Oops, I forgot to mention that I missed browser/components/Makefile.in in my WIP 9 and 10 patches, which would cause the privatebrowsing XPCOM component not to get built. This is fixed in WIP 11 as well.',0.00,0,0,3448959,0,NULL,0),(248970,21544,'2008-01-23 05:25:59','I gave the WIP 11 patch to the try-server, so a private browsing-build for all three platforms should appear in about 1 hour and 30 minutes here: https://build.mozilla.org/tryserver-builds/',0.00,0,0,3449009,0,NULL,0),(248970,198492,'2008-01-23 07:00:14','(In reply to comment #97)\n> Thanks! Please CC me if you find an existing one (or file a new bug).\n\nI filed bug 413659 for this.\n\n',0.00,0,0,3449104,0,NULL,0),(248970,251051,'2008-01-23 09:22:20','(In reply to comment #101)\n> I gave the WIP 11 patch to the try-server, so a private browsing-build for all\n> three platforms should appear in about 1 hour and 30 minutes here:\n> https://build.mozilla.org/tryserver-builds/\n\nThanks! Windows builds are already available in .',0.00,0,0,3449290,0,NULL,0),(248970,21544,'2008-01-23 09:34:55','(In reply to comment #103)\n> (In reply to comment #101)\n> > I gave the WIP 11 patch to the try-server, so a private browsing-build for all\n> > three platforms should appear in about 1 hour and 30 minutes here:\n> > https://build.mozilla.org/tryserver-builds/\n> \n> Thanks! Windows builds are already available in\n> .\n\nBoth Linux and OS X had build failures. See http://tinderbox.mozilla.org/showbuilds.cgi?tree=MozillaTry\n\n',0.00,0,0,3449308,0,NULL,0),(248970,251051,'2008-01-23 09:44:20','(In reply to comment #104)\n> Both Linux and OS X had build failures. See\n> http://tinderbox.mozilla.org/showbuilds.cgi?tree=MozillaTry\n\nOops. This should fix the problem. Can you submit a new try server build?',0.00,0,0,3449317,5,'298729',0),(248970,251051,'2008-01-23 09:53:07','Oops, the previous patch accidentally contained some other code that I\'m working on... This one should really fix the problem :-)',0.00,0,0,3449326,5,'298732',0),(248970,233280,'2008-01-23 10:16:04','I submitted it - should show up in the same place when it\'s all set.',0.00,0,0,3449364,0,NULL,0),(248970,251051,'2008-01-23 11:16:30','(In reply to comment #107)\n> I submitted it - should show up in the same place when it\'s all set.\n\nThanks! Windows and Mac builds have finished: . Linux is still building. I\'ll monitor the tinderbox to see if it succeeds.\n\nAnd, I\'m preparing the final version of the patch which is ready for review. It should be ready in a few minutes. This version of the patch corrects the nsCertOverrideService implementation, and now it actually works! It would be great if someone could submit another try build once I submit that patch.',0.00,0,0,3449455,0,NULL,0),(248970,251051,'2008-01-23 12:03:23','OK, I think this is ready for review.\n\nChanges in this version: the nsCertOverrideService implementation has been corrected as follows:\n\n* I used NS_WITH_PROXIED_SERVICE() to proxy the calls to the nsIObserverService to the main thread, so that they won\'t fail, and notifications are received.\n\n* I implemented nsISupportsWeakReference so that calls to nsIObserverService::AddObserver() with the last param set to true succeed.\n\n(Note that this effectively fixes bug 413627 as well.)\n\n-----\n\nNote to reviewers:\n\n1. The changes to browser-menubar.inc should not be reviewed. Once this is ready to land, I\'ll remove the changes to that file. Those are only meant to ease your life in testing the patch.\n\n2. If you feel you won\'t be able to review this soon, please let me know to ask someone else for review.\n\n-----\n\nAsking Mike Connor to review the following parts:\ntoolkit/components/places/src/nsNavHistory.{h,cpp}\ntoolkit/components/contentprefs/src/nsContentPrefService.js\nbrowser/components/privatebrowsing\n\nAsking Benjamin Smedberg for sr on the following parts:\nnetwerk/{cache,cookie}/*\nextensions/cookie/*\nsecurity/manager/ssl/*\nxpcom/base/*\n\nAsking Mike Beltzner for ui-r based on the descriptions in the previous comments.',0.00,0,0,3449558,5,'298757',0),(248970,251051,'2008-01-23 12:07:34','CCing the relevant people from bug 413627...',0.00,0,0,3449568,0,NULL,0),(248970,251051,'2008-01-23 12:08:50','Asking Benjamin Smedberg for review on the following parts:\n\nxpcom/base/nsIConsoleService.idl\nxpcom/base/nsConsoleService.{h,cpp}',0.00,0,0,3449571,6,'298757',0),(248970,251051,'2008-01-23 12:10:08','Asking Simon Bünzli for review on the following parts:\n\nbrowser/components/sessionstore/src/nsSessionStore.js',0.00,0,0,3449575,6,'298757',0),(248970,251051,'2008-01-23 12:11:20','Asking Christian Biesinger for review on the following parts:\n\nnetwerk/cache/src/nsCacheService.{h,cpp}',0.00,0,0,3449579,6,'298757',0),(248970,251051,'2008-01-23 12:13:04','Asking Dan Witte for review on the following parts:\n\nnetwerk/cookie/src/nsCookieService.{h,cpp}\nextensions/cookie/nsPermissionManager.{h,cpp}',0.00,0,0,3449583,6,'298757',0),(248970,251051,'2008-01-23 12:14:25','Asking Bob Relyea for review on the following parts:\n\nsecurity/manager/ssl/src/nsCertOverrideService.{h,cpp}',0.00,0,0,3449586,6,'298757',0),(248970,251051,'2008-01-23 12:15:42','Asking Asaf Romano for review on the following parts:\n\ntoolkit/components/satchel/src/nsStorageFormHistory.{h,cpp}',0.00,0,0,3449588,6,'298757',0),(248970,251051,'2008-01-23 12:16:50','Asking Shawn Wilsher for review on the following parts:\n\ntoolkit/components/downloads/src/nsDownloadManager.{h,cpp}',0.00,0,0,3449591,6,'298757',0),(248970,251051,'2008-01-23 12:19:22','Asking Justin Dolske for review on the following parts:\n\ntoolkit/components/passwordmgr/src/nsLoginManagerPrompter.js\n\n(Oh, boy, I really wish Bugzilla could handle multiple review requests...)',0.00,0,0,3449593,6,'298757',0),(248970,251051,'2008-01-23 12:21:42','Targetting beta3...',0.00,0,0,3449599,0,NULL,0),(248970,159758,'2008-01-23 12:35:20','(In reply to comment #118)\n> (Oh, boy, I really wish Bugzilla could handle multiple review requests...)\n\nIt can. Just comma-separate the addresses. :)',0.00,0,0,3449623,0,NULL,0),(248970,251051,'2008-01-23 12:44:02','(In reply to comment #120)\n> It can. Just comma-separate the addresses. :)\n\nAnd if only I knew it 11 comments ago... ;-)\n\nThanks for the tip, Reed!\n',0.00,0,0,3449639,0,NULL,0),(248970,36541,'2008-01-23 13:27:59','I must say, the approach implemented in the patch concerns me. You are modifying code in a lot of modules and try to prevent it from saving.\n\nI think, using this approach, we will have to play \"catch up\" forever.\nWhenever someone implements storage for some new data, you will have to enhance that storage logic to consider the proposed new mode.\n\nI\'m also concerned that it complicates the code.\n\n\nI would like to bring up 2 alternative ideas.\n\na) Integrate your \"private surfing mode\" with profile manager. In other words, if the user chooses to surf privately, create a new profile. Mark that profile as such. During app shutdown, erase the profile. At worst the app crashes, so you could auto-cleanup the profile on next startup.\n\nBut a) does not work if you would like to prevent that data reaches the disk. In that case one could think of the following:\n\n\nb) Maybe we could use an in-memory-virtual-filesystem? Implement file I/O that simulates a profile directory and files that live in RAM? Start a profile with a directory stored on that filesystem. This mechanism would guarantee we will never forget to adjust code that potentially stores sensitive data on disk (and keeps the code simple).\n',0.00,0,0,3449715,0,NULL,0),(248970,251051,'2008-01-23 14:12:58','(In reply to comment #122)\n> I must say, the approach implemented in the patch concerns me. You are\n> modifying code in a lot of modules and try to prevent it from saving.\n> \n> I think, using this approach, we will have to play \"catch up\" forever.\n> Whenever someone implements storage for some new data, you will have to enhance\n> that storage logic to consider the proposed new mode.\n\nThat\'s correct, but things like bug 413659 could help remedy the problem (see comment 94).\n\n> I\'m also concerned that it complicates the code.\n> \n> \n> I would like to bring up 2 alternative ideas.\n> \n> a) Integrate your \"private surfing mode\" with profile manager. In other words,\n> if the user chooses to surf privately, create a new profile. Mark that profile\n> as such. During app shutdown, erase the profile. At worst the app crashes, so\n> you could auto-cleanup the profile on next startup.\n> \n> But a) does not work if you would like to prevent that data reaches the disk.\n> In that case one could think of the following:\n\nYes, (a) won\'t work for private browsing.\n\n> b) Maybe we could use an in-memory-virtual-filesystem? Implement file I/O that\n> simulates a profile directory and files that live in RAM? Start a profile with\n> a directory stored on that filesystem. This mechanism would guarantee we will\n> never forget to adjust code that potentially stores sensitive data on disk (and\n> keeps the code simple).\n\nThat\'s a good idea as well, but I\'m wondering how much could should be touched to implement that one. I\'m not quite familiar with Mozilla\'s I/O abstraction layers, but if this needs to be done at a level similar to nsILocalFile, then I\'m afraid that the same amount of changes need to be made to these modules, to switch to an alternative file implementation. Others may be able to comment on this more precisely.',0.00,0,0,3449792,0,NULL,0),(248970,11099,'2008-01-23 15:44:31','Switching review of security/manager/ssl/src/nsCertificateOverrideService.{h,cpp} since he\'s the original author of the code that is modified.\n\nKai feel free to kick it back to me if you can\'t get to the review.\n\nEhsan, You man also want to open NSS Read/Only. That will prevent manual changes and new Root cert imports (or even private key/user cert importing) from happenning in private sessions.\n\nbob',0.00,0,0,3449948,6,'298757',0),(248970,137548,'2008-01-23 20:18:53','(In reply to comment #119)\n> Targetting beta3...\n\nJust to set expectations properly, I don\'t think that we should count on this feature making it into Firefox 3. I say this because ..:\n\n - this bug isn\'t marked blocking- nor wanted-firefox3+\n - QA hasn\'t been planning on testing this mode\n - all of the reviewers will be focusing on blocking bugs first\n - some of Kai\'s comments make me think that there might be more thinking to be done here\n\nThis is great stuff, and I think a fantastic and huge step towards a much desired ability to do true private browsing. I\'m looking forward to playing with the tryserver builds, and am truly appreciative of all the work put into this, and by no means am suggesting we abandon things. Just that we make sure to not get disappointed if it misses.\n\n(That\'s why I was asking about the ability to get this done as an add-on, though I understand that might be difficult due to the nature of the changes - tryserver builds help!)',0.00,0,0,3450264,0,NULL,0),(248970,251051,'2008-01-23 20:28:45','(In reply to comment #124)\n> (From update of attachment 298757 [details])\n> Switching review of\n> security/manager/ssl/src/nsCertificateOverrideService.{h,cpp} since he\'s the\n> original author of the code that is modified.\n> \n> Kai feel free to kick it back to me if you can\'t get to the review.\n> \n> Ehsan, You man also want to open NSS Read/Only. That will prevent manual\n> changes and new Root cert imports (or even private key/user cert importing)\n> from happenning in private sessions.\n\nHmmm, I think private browsing is about not collecting data automatically about user\'s private session, but some things should be allowed anyways, such as bookmarking, saving a web page, etc. Therefore I doubt that we should go as far as opening NSS read-only...\n\n(In reply to comment #122)\n> b) Maybe we could use an in-memory-virtual-filesystem? Implement file I/O that\n> simulates a profile directory and files that live in RAM? Start a profile with\n> a directory stored on that filesystem. This mechanism would guarantee we will\n> never forget to adjust code that potentially stores sensitive data on disk (and\n> keeps the code simple).\n\nAnother thing which needs clarification here is that whether we want to give user a new profile, therefore depriving them of everything useful in their real profiles? I\'d expect users to want access to their bookmarks, or their custom search engines for example n private browsing mode, to get started browsing...',0.00,0,0,3450271,0,NULL,0),(248970,137548,'2008-01-23 20:31:55','I resubmitted the latest patch to the tryserver, and am playing with the current one for now ...',0.00,0,0,3450273,0,NULL,0),(248970,137548,'2008-01-23 20:47:32','(In reply to comment #126)\n> Hmmm, I think private browsing is about not collecting data automatically about\n> user\'s private session, but some things should be allowed anyways, such as\n> bookmarking, saving a web page, etc. Therefore I doubt that we should go as\n> far as opening NSS read-only...\n\nI think that\'s right. Saving web pages, adding bookmarks, and other explicit user actions asking to save data should be honoured. It\'s the automatic stuff we do to make the browser more usable: retaining history, saving form history, accepting/sending cookies ... that\'s the sort of stuff we want to restrict.\n\n> Another thing which needs clarification here is that whether we want to give\n> user a new profile, therefore depriving them of everything useful in their real\n> profiles? I\'d expect users to want access to their bookmarks, or their custom\n> search engines for example n private browsing mode, to get started browsing...\n\nThat\'s a really easy way to get a bare-bones private browsing mode installed, but it isn\'t very functional.\n\nI\'d rather see Kai\'s concerns addressed while maintaining this approach, fwiw.',0.00,0,0,3450283,0,NULL,0),(248970,160571,'2008-01-24 10:32:29','(In reply to comment #122)\n> I think, using this approach, we will have to play \"catch up\" forever.\n\nNot only us. What about an extension which saves urls to prefs (e.g. NoScript) or to their own data file (e.g. Adblock Plus and Tab Mix Plus)? Will somebody from MoCo go through AMO and make sure that that\'s taken care of for all extensions - or will private browsing only be really supported for extension-less profiles after all (just to be sure)?',0.00,0,0,3451014,0,NULL,0),(248970,251051,'2008-01-24 10:38:27','(In reply to comment #125)\n> (In reply to comment #119)\n> > Targetting beta3...\n\nThanks for the supportive comments, Mark!\n\n> Just to set expectations properly, I don\'t think that we should count on this\n> feature making it into Firefox 3. I say this because ..:\n> \n> - this bug isn\'t marked blocking- nor wanted-firefox3+\n> - QA hasn\'t been planning on testing this mode\n> - all of the reviewers will be focusing on blocking bugs first\n> - some of Kai\'s comments make me think that there might be more thinking to be\n> done here\n> \n> This is great stuff, and I think a fantastic and huge step towards a much\n> desired ability to do true private browsing. I\'m looking forward to playing\n> with the tryserver builds, and am truly appreciative of all the work put into\n> this, and by no means am suggesting we abandon things. Just that we make sure\n> to not get disappointed if it misses.\n\nSo, if I can get all of the reviews in time, would this be possible to land this for Firefox 3? (I\'m most worried about the \"QA hasn\'t been planning on testing this mode\" part.)\n\nAlso, I guess this won\'t be something which could be expected to land in a 3.0.x release, right? All this haste is because I know many users which would appreciate a lot if their browser provided private browsing mode capability. I personally use a script to launch Firefox with a new profile (and the -no-remote command line param) and delete it after the browser exits, but I\'m sick and tired of it! :-)\n\n> (That\'s why I was asking about the ability to get this done as an add-on,\n> though I understand that might be difficult due to the nature of the changes -\n> tryserver builds help!)\n\nIf there\'s some way of increasing the users testing the tryserver builds, please let me know. I\'m running one myself (of course!).\n\nAnyway, would it be OK to dance the Target Milestone field to match the next milestone until the Firefox 3 release and then move it to Future if it misses? ;-)',0.00,0,0,3451023,0,NULL,0),(248970,251051,'2008-01-24 10:40:44','(In reply to comment #127)\n> I resubmitted the latest patch to the tryserver, and am playing with the\n> current one for now ...\n\nShould it be available at ? (It\'s not currently.)',0.00,0,0,3451028,0,NULL,0),(248970,251051,'2008-01-24 10:50:38','(In reply to comment #129)\n> (In reply to comment #122)\n> > I think, using this approach, we will have to play \"catch up\" forever.\n> \n> Not only us. What about an extension which saves urls to prefs (e.g. NoScript)\n> or to their own data file (e.g. Adblock Plus and Tab Mix Plus)? Will somebody\n> from MoCo go through AMO and make sure that that\'s taken care of for all\n> extensions - or will private browsing only be really supported for\n> extension-less profiles after all (just to be sure)?\n\nNaive (and non-practical) answer: the extensions can be modified to use the browser:private-browsing notification.\n\nMore reasonable: warn the user about the privacy concerns of such extensions. Should this warning be in the UI, or in the docs, or both?\n\nImaginative answer: would it be possible to make some changes to the core Mozilla I/O code, so that when the private browsing mode is turned on, the I/O subsystem (part of it which handles in-profile data files) creates a new access path to the profile data: a copy-on-write (COW) scheme, which copies the modified data to memory, and reads such data from memory later on, until the private mode is switched off, which would cause the in-memory copies of data to be discarded, and the I/O handles restored to make further I/O happen on disk like usual?\n\nOpen questions:\n1) Is this possible at all, from an architectural point of view? (Are there any high-level docs available on the I/O architecture in Mozilla, designed for someone who\'s not a guru in that field, i.e., me?)\n2) What to do with APIs which can\'t make the above requirement? (What happens when a file grows in private browsing mode, and some code seeks into the newly appended portion, for example?)\n3) Would it be possible to implement this from a logical point of view? (How would code react to gets its storage \"swapped\" in and out from underneath it?)\n4) How much of the code which accesses the filesystem uses Mozilla\'s I/O facilities? (For example, would this cover code which stores data in sqlite)?',0.00,0,0,3451050,0,NULL,0),(248970,137548,'2008-01-24 12:53:42','(In reply to comment #131)\n> (In reply to comment #127)\n> > I resubmitted the latest patch to the tryserver, and am playing with the\n> > current one for now ...\n> \n> Should it be available at ? (It\'s\n> not currently.)\n\nDidn\'t compile due to a bad checkin from Places, trying again now, should appear with the bug number and \"Patch v1\" in the build name.',0.00,0,0,3451282,0,NULL,0),(248970,137548,'2008-01-24 20:06:54','Builds are here:\n\nhttp://people.mozilla.org/~beltzner/private-browsing-builds/',0.00,0,0,3451809,0,NULL,0),(248970,233280,'2008-01-25 10:47:14','>+ mInPrivateBrowsing = PR_FALSE;\nThat should be in the constructor (which you\'ll have to add).\n\nYou also don\'t need to remove the observer.',0.00,0,0,3452635,6,'298757',0),(248970,251051,'2008-02-03 00:59:28','Unbitrotted patch. Addressed the issues in comment 135. I also removed the RemoveObserver calls for places where observers were added using weak references.',0.00,0,0,3465441,5,'301098',0),(248970,160571,'2008-02-03 10:00:55','In case you really want to go through with the issue this way:\n\n>Index: browser/components/sessionstore/src/nsSessionStore.js\n>===================================================================\n>@@ -184,16 +189,18 @@ SessionStoreService.prototype = {\n>+\n>+ this._inPrivateBrowsing = false;\n\nThis isn\'t needed as _inPrivateBrowsing is already initialized to false and we only get through here once (and even _if_ we got through here again, we\'d surely not want to bail out of private browsing mode).\n\n>- if (this._sessionFile.exists()) {\n>+ if (this._sessionFile && this._sessionFile.exists()) {\n\nWhat\'s this change for? _sessionFile and _sessionFileBackup should always be initialized at this point.\n\n>+ var backup = [];\n\nYou\'re using this as a hash, not an array, so please make it a {}. (In fact, using |for (... in ...)| is highly discouraged for arrays while it\'s OK for iterating over the keys of a hash.)\n\n>+ for (ix in this._windows)\n>+ backup[ix] = eval(this._windows[ix]._closedTabs.toSource());\n\nNits: ix is never declared. And please add a comment as to why you\'re doing |eval(....toSource())|.\n\n>+ for (ix in this._closedTabsBackup) {\n>+ if (this._windows[ix]) {\n\nNits: ix isn\'t declared. And you can drop the braces for the if clause (as in one or two further places).\n\nr+=me for the SessionStore changes with these issues fixed.',0.00,0,0,3465793,6,'301098',0),(6810,5077,'2008-02-03 11:57:25','The patch for bug 193001 rendered this irrelevant. Gecko doesn\'t call lpr directly any more; it prints through a GTK API.',0.00,0,0,3465940,0,NULL,0),(248970,75420,'2008-02-03 20:12:51','i\'m in favor of having this be a notification rather than a pref, but some services are lazily inited (nsCookieService, nsPermissionManager, most likely others). for instance, |firefox about:blank| won\'t init the cookieservice, and if the user enters private browsing they\'ll miss that notification. any ideas? having the cookieservice call up |nsIPrivateBrowsingService::GetPrivateBrowsing()| on init kinda sucks :/',0.00,0,0,3466322,0,NULL,0),(248970,7044,'2008-02-08 06:40:18','Why does that suck? I don\'t think we\'re going to have any choice but have a global mode flag *somewhere* which indicates whether we are \"right now\" in private browsing mode. I\'m happy to hang that on nsIXULRuntime or a new interface, whichever is easier. Then we have global observer topics for when the private-browsing-mode changes.\n\nThis bug is huge, by the way. Could we document the current set of design decisions in the wiki page? Especially the invariants we\'re trying to preserve (no website data to disk during private-browsing), and how that actually affects cookie/cache/etc.',0.00,0,0,3473222,0,NULL,0),(248970,75420,'2008-02-08 11:15:22','(In reply to comment #139)\n> Why does that suck?\n\nit\'s another interface dependency added to all these services - not especially bad, given that we\'re adding all this PB code anyway, it just means nsIPB needs to live early in the build process. (i.e. before netwerk.) if not, something more intuitive than nsIXULRuntime might be nice, ...\n\nand agreed, some concrete documentation to refer back to here during discussion would be awesome.',0.00,0,0,3473604,0,NULL,0),(393845,55600,'2008-02-20 10:46:42','While trying to come up with useful stacktraces for bug 275783 (see bug, comment 113 and further), I got these stacktraces, which seems similar to this bug.',0.00,0,0,3491400,5,'304529',0),(393845,76551,'2008-02-20 14:06:25','Martijn, as far as I can see the frames are different from the ones given when filing this bug. I think this should be better handled in bug 275783?',0.00,0,0,3491778,0,NULL,0),(393845,76551,'2008-02-20 14:14:24','The crash with the mentioned testcase in comment still happens on latest nightly builds under Windows XP. Here an updated crasher id: bp-78cfaf3a-e000-11dc-a569-001a4bd43e5c\n\n',0.00,0,0,3491795,0,NULL,0),(393845,55600,'2008-02-20 14:52:06','(In reply to comment #24)\n> Martijn, as far as I can see the frames are different from the ones given when\n> filing this bug. I think this should be better handled in bug 275783?\n\nI\'m not sure, I\'m probably just making a mess of thing here and in the other bug :(',0.00,0,0,3491880,0,NULL,0),(393845,76551,'2008-02-20 15:33:11','Biesi, do you have time to work on this bug? Otherwise we should search for a new assignee. Thanks.',0.00,0,0,3491976,0,NULL,0),(393845,12352,'2008-02-28 22:08:17','Things might very well have improved here with bug 410946 fixed. Could someone test with a nightly from tomorrow or later?',0.00,0,0,3505180,0,NULL,0),(393845,76551,'2008-02-29 07:53:53','Martijn, the attached testcase doesn\'t work anymore. The referenced video has been deleted. Do we have another one?',0.00,0,0,3505731,0,NULL,0),(393845,55600,'2008-02-29 09:38:41','Henrik, for me the video is still there:\nhttp://martijn.martijn.googlepages.com/testmovie.wmv\nAnd I still crash with the attached testcase (at least with WMP 10):\nhttp://crash-stats.mozilla.com/report/index/de9055e6-e6ec-11dc-aba0-001a4bd43ef6',0.00,0,0,3505880,0,NULL,0),(393845,76551,'2008-02-29 10:31:49','Martijn, your build id is still an old one. But I also crashed with Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b4pre) Gecko/2008022906 Minefield/3.0b4pre.\n\nThe stack looks totally different now. It looks like that I had a recursion:\nbp-871c50f8-e6f3-11dc-bb47-001a4bd43ed6.',0.00,0,0,3505941,0,NULL,0),(393845,12352,'2008-03-06 09:10:31','Martijn, this should fix the crash you referenced in your last comment. Any chance you could give this a try (let me know if you need help getting a build with this patch)? Not sure what\'s up with the stack overflow that Henrik was seeing, but let\'s try this patch first and see if it helps.',0.00,0,0,3514814,5,'307730',0),(393845,76551,'2008-03-06 09:38:23','Johnny, I started a TryServer build so we could run a test in about 2 hours. I\'m not able to build my own debug build under Windows right now. I\'ll post the download link when the build is ready.',0.00,0,0,3514868,0,NULL,0),(393845,76551,'2008-03-06 09:43:43','Sorry, this wont work. Johnny handed out a gid patch. Any change to get a cvs diff?',0.00,0,0,3514875,0,NULL,0),(393845,12352,'2008-03-06 09:49:45','Henrik, just set \"patch level\" (I think that\'s what it\'s called) to 1 instead of 0 when you upload the patch to the try server, that should make it apply. Thanks for spinning builds!',0.00,0,0,3514881,0,NULL,0),(393845,55600,'2008-03-06 09:51:54','Well, I\'m getting build errors with the patch, so I can\'t test it:\nhttp://martijn.martijn.googlepages.com/builderrors.txt',0.00,0,0,3514885,0,NULL,0),(393845,12352,'2008-03-06 09:56:36','Duh. How about this?',0.00,0,0,3514894,5,'307741',0),(393845,55600,'2008-03-06 10:18:13','Yeah, thanks, that one compiles fine and seems to fix the crash (at least on windowsXP with Media Player 10).',0.00,0,0,3514933,0,NULL,0),(393845,12352,'2008-03-06 11:02:23','Awesome, thanks for testing. bz, what do you think of this?',0.00,0,0,3515010,6,'307741',0),(393845,76551,'2008-03-06 11:31:09','TryServer builds are also ready:\nhttps://build.mozilla.org/tryserver-builds/2008-03-06_10:09-mozilla@hskupin.info-bug393845-crasher/\n\nI\'ll run on my testbox to see if my issue gets also fixed by your patch.',0.00,0,0,3515067,0,NULL,0),(393845,76551,'2008-03-06 11:38:50','Johnny, it also fixes my issue. No crash anymore.',0.00,0,0,3515084,0,NULL,0),(393845,12352,'2008-03-06 11:42:25','Awesome, thanks for testing, both of you!',0.00,0,0,3515088,0,NULL,0),(393845,20209,'2008-03-06 14:45:54','Makes sense. Maybe add some comments here that the order is very important?',0.00,0,0,3515424,6,'307741',0),(393845,12352,'2008-03-07 13:33:17','',0.00,0,0,3517112,5,'308018',0),(393845,12352,'2008-03-07 13:33:34','Fixed.',0.00,0,0,3517113,0,NULL,0),(393845,29582,'2008-03-07 16:30:19','>diff --git a/layout/generic/nsObjectFrame.cpp b/layout/generic/nsObjectFrame.cpp\n\n>+ // Grab the view while we still know it\'s safe to do so.\n>+\n>+ nsIView *view = GetView();\n> \n> #ifdef XP_WIN\n> if (aDelayedStop) {\n> // If we\'re asked to do a delayed stop it means we\'re stopping the\n> // plugin because we\'re destroying the frame. In that case, tell\n> // the view to disown the widget (i.e. leave it up to us to\n> // destroy it).\n>+\n> nsIView *view = GetView();\n> if (view) {\n> view->DisownWidget();\n> }\n>+ }\n>+#endif\n\nI\'m probably missing something, but why are you grabbing the view outside the XP_WIN ifdef? Or, why are you grabbing it again inside it?',0.00,0,0,3517517,0,NULL,0),(393845,12352,'2008-03-08 11:05:43','Um, yeah, that was dumb. I just checked in a fix, no need to get the view outside that if check at all now. Thanks jag, good catch!',0.00,0,0,3518362,0,NULL,0),(11040,42159,'2008-03-08 12:35:38','',0.00,0,0,3518442,2,'385772',0),(393845,55600,'2008-03-08 14:54:27','Verified fixed.\nThe first testcase doesn\'t crash anymore with current trunk build on windows XP with Windows Media Player 10.\nThe second testcase doesn\'t crash anymore with current trunk build on windos Vista with Windows Media Player 11 (while it crashed with yesterday\'s trunk build).\n\nThank you for fixing this!',0.00,0,0,3518543,0,NULL,0),(393845,55600,'2008-03-09 17:20:55','In comment 23, I mentioned a crash in combination with the latest Java plugin, which I thought that might have something to do with this bug.\nIt turns out the fix for this crash hasn\'t fixed that, so I filed bug 421833 for it.',0.00,0,0,3519412,0,NULL,0),(248970,14419,'2008-03-29 09:15:19','Maybe this should be a separate bug/enhancement request, but it would be nice to be able to clear a particular item from one\'s \"saved form\" data without having to clear the entire history, for example when one inadvertently types a password into the login-name field.',0.00,0,0,3552407,0,NULL,0),(248970,14419,'2008-03-30 05:46:20','Ah, thanks. I had been trying BACKSPACE and nothing happened.',0.00,0,0,3553308,0,NULL,0),(248970,14419,'2008-03-30 05:48:13','instead of using DELETE, that is.',0.00,0,0,3553309,0,NULL,0),(248970,7044,'2008-06-05 11:12:56','r- because this doesn\'t have tests and doesn\'t have a design doc',0.00,0,0,3649323,6,'301098',0),(248970,26983,'2008-06-13 14:01:18','Should this be blocked by Bug 290456 ?',0.00,0,0,3660914,0,NULL,0),(248970,251051,'2008-06-13 14:28:42','(In reply to comment #145)\n> Should this be blocked by Bug 290456 ?\n\nI think it would be desirable to incorporate any solution developed for bug 290456 in Private Browsing, but I don\'t think it should block Private Browsing, especially because we don\'t currently handle clearing that sort of data right now...',0.00,0,0,3660959,0,NULL,0),(11040,254728,'2008-06-19 11:33:12','Since I\'ve been looking at this, I\'ll put my name on the assigned.',0.00,0,0,3669319,0,NULL,0),(11040,254728,'2008-07-01 23:40:29','Here is a rough outline of some issues associated with this bug, and my proposed approach.\n\nThe existing message flag MSG_FLAG_NEW conveys that a new message has been received since the last time the folder was viewed (but only as long as the application remains open - the flag is kept in memory and destroyed when exiting the application). MSG_FLAG_NEW is indirectly tied to BIFF notification and clearing.\n\nSo what happens when we restrict the class of messages that do BIFF notification? Do we continue to tie this to MSG_FLAG_NEW? That would mean that the NEW flag would only occur on messages that have been filtered to perform BIFF notification. But I believe that the existing NEW flag on messages and folders is useful, and should be preserved even when BIFF notification is modified by a filter.\n\nSo the approach that I propose is to introduce a new message flag MSG_FLAG_BIFF that would be used for BIFF control, and be the subject of this current bug. The existing MSG_FLAG_NEW flag will continue to operate in roughly the same way that it does currently (though I will probably propose in another bug that MSG_FLAG_NEW be preserved across mail sessions.)\n\nIf this path is followed, then there may be a need to identify which folders and messages are the one that caused the BIFF notification. I propose that the existing folder and message decoration associated with MSG_FLAG_NEW and BIFF state be modified to show a subtle difference between NEW and BIFF messages. That might be a larger or bolder decoration for the BIFF messages. That change in folder and message decoration will not be part of this current bug however.\n\nCurrently, message and folder BIFF state is spread between four variables: an array kept in the database, an array kept in the folder, a hasNewMessages boolean, and a count of new messages. The responsibility to maintain hasNewMessages and the new message count is separate from the flag, so each message editor has to set those independently. Prior to completing this bug, I want to simplify and consolidate that process somewhat, at the same time preparing for a possible MSG_FLAG_BIFF. That groundwork is being laid in bug 441932.',0.00,0,0,3688401,0,NULL,0),(11040,135518,'2008-07-02 08:19:05','',0.00,0,0,3688836,2,'443110',0),(11040,4410,'2008-07-02 08:39:48','NEW and BIFF are strongly tied together, I would say, and I\'m not convinced that we should separate them. If we leave them tied together, all the filter action would have to do is clear the NEW flag on the message. I believe when the user says they don\'t want to be notified about a new message, they don\'t want it to appear as a new message. If you introduce this new concept of BIFF, does the new message appear in the tooltip for the folder? Presumably not, since I think that should match the new mail alert...and the new message alert will only show messages that have the biff flag set, not the new flag. The folder containing the message will appear to have new messages, with the green flag, but hovering over it will potentially not show any messages...\n\nI\'m also not convinced that new should persist across mail sessions. The reason we didn\'t persist it is that folders that you don\'t often check could potentially have the new flag set for a long time, which reduces the usefulness of that indicator.\n\nSo I think this boils down to a UI/UE question, so I\'m cc\'ing Bryan. If we agree that we should change the way new and biff work, that\'s fine, but I\'d like to have some sort of agreement that the change is an improvement.',0.00,0,0,3688864,0,NULL,0),(11040,254728,'2008-07-02 08:55:55','(In reply to comment #55)\n> I believe when\n> the user says they don\'t want to be notified about a new message, they don\'t\n> want it to appear as a new message.\n\nThat is the critical question. \"Appear as a new message\" in this context means \"have the NEW decoration for the message appear in the message list, decorate the folder in the folder pane with the NEW decoration, and show the message summary in the folder tooltip\"\n\n> If you introduce this new concept of BIFF,\n> does the new message appear in the tooltip for the folder? Presumably not ...\n\nI would say presumably yes. The folder tooltip should directly match the messages flagged NEW in the folder.\n\n> I\'m also not convinced that new should persist across mail sessions. The reason\n> we didn\'t persist it is that folders that you don\'t often check could\n> potentially have the new flag set for a long time, which reduces the usefulness\n> of that indicator.\n> \n\nWell I would say that it increases the usefulness of the indicator. Whenever you open a folder, even days later, you will see all messages flagged that are new since the last time that you opened the folder. But as I said, this would be the subject of a different bug.\n\n> So I think this boils down to a UI/UE question, so I\'m cc\'ing Bryan. If we\n> agree that we should change the way new and biff work, that\'s fine, but I\'d\n> like to have some sort of agreement that the change is an improvement.\n> \n\nI would encourage opinions from anyone else listening to this bug as well.',0.00,0,0,3688876,0,NULL,0),(11040,293331,'2008-07-02 09:23:27','> I believe when\n> the user says they don\'t want to be notified about a new message, they don\'t\n> want it to appear as a new message.\n\nWhen I said that *I* didn\'t want to be notified about a new message, I meant that I want it to appear as an unread message (e.g. bold subject etc) when I open the mail client or restore it from the tasktray but just don\'t want the tasktray symbol to appear or sound to play.',0.00,0,0,3688897,0,NULL,0),(11040,4410,'2008-07-02 09:25:41','no one\'s suggesting not showing it as unread; the question is whether it would show as \"new\".',0.00,0,0,3688903,0,NULL,0),(11040,293331,'2008-07-02 09:30:12','> no one\'s suggesting not showing it as unread; the question is whether it would\n> show as \"new\".\n\nI should probably just keep out of it then. :)',0.00,0,0,3688909,0,NULL,0),(11040,212848,'2008-07-02 09:34:42','I think it should still be marked new. New would indicate that the message is \"unread and you\'ve never even opened the folder to know what you haven\'t read\"\n\nonce you see the subject in the list, the message is not \'new\'. \njust as once you see the body, it is not \'unread\'. \n\nif a folder contains \'new\' messages, it too is \'new\', just as it \"reverse inherits\" it\'s \'unread\' status too\n\nbut Sean\'s comment was on money. If I may summarize it: \"I want it to appear as an unread message .. but just don\'t want the\ntasktray symbol to appear or sound to play\"\n',0.00,0,0,3688920,0,NULL,0),(11040,4410,'2008-07-02 09:35:32','(In reply to comment #59)\n> \n> I should probably just keep out of it then. :)\n> \n:-) Well, that does bring up the point that many if not most users don\'t really know what \"new\" is, and how it\'s different from unread, which gives us some flexibility to change it (though users who know what it is find it very valuable, I think)\n',0.00,0,0,3688923,0,NULL,0),(11040,57902,'2008-07-05 13:01:49','I know the difference, and I find the difference valuable, and I think persisting New across sessions would be beneficial. The new-this-session messages should be known about from the tray indicator and tooltip.\n\nHowever, several longstanding bugs -- the tray icon and account-New flag persisting when shouldn\'t (all new messages moved to a different account and read there), or clearing when shouldn\'t (explicit Get New Messages, or in the suite, opening a new mail window), and those several about erroneous New count display in the alert and the tooltip -- all make the distinction less useful than it could be.',0.00,0,0,3692818,0,NULL,0),(11040,254728,'2008-07-05 13:54:13','(In reply to comment #62)\n> I know the difference, and I find the difference valuable, and I think\n> persisting New across sessions would be beneficial. The new-this-session\n> messages should be known about from the tray indicator and tooltip.\n> \n\nThe preceding comment dealt with new versus unread, so I assume that is the \"difference\" that you know. I would appreciate though any comments you have on the more immediate issue, at least for this bug, of separating \"New\" from \"Biff\", allowing more direct control of Biff through filters (this bug) and possibly as a folder property (not this bug), while keeping New as the indicator of \"You haven\'t seen this message yet in the message pane\". The tray indicator would match BIFF. The tooltip per folder would match NEW. At the moment for this bug, NEW would not persist over sessions - though it would be more valuable if it did, and that\'s where I\'m headed. It\'s particularly useful for large volume email lists, RSS feeds, and newsgroups where I want to see what\'s happened since the last time that I opened the message pane.\n\n> However, several longstanding bugs -- the tray icon and account-New flag\n> persisting when shouldn\'t (all new messages moved to a different account and\n> read there), or clearing when shouldn\'t (explicit Get New Messages, or in the\n> suite, opening a new mail window), and those several about erroneous New count\n> display in the alert and the tooltip -- all make the distinction less useful\n> than it could be.\n> \n\nMy work-in-process patch for bug 441932 solves some of the issues involving NEW that I am aware of involving folder-level counts and flags. It does not address the server-level issues, that affect the tray icon and notifications. But those are coming. I\'d really like to get to the point where we have precise control of when BIFF goes off - and have a virtual search folder that shows exactly what messages triggered the current notification. Which will bring up another point - when do you clear the BIFF flag? The existing code is inconsistent, which is why for example \"explicit Get New Messages\" clears NEW in some cases. That should always clear BIFF, but never clear NEW IMHO. Things get trickier with multiple servers all checking mail.\n',0.00,0,0,3692846,0,NULL,0),(11040,277774,'2008-07-05 14:06:21','Some practical example. Hope this will help understanding the problem here.\n\nI have the \"Inbox\" and a \"Junk\" folder. It\'s a IMAP server and the server automatically sorts junk into the \"Junk\" folder. So new messages arrive in the Junk and in the Inbox folder in parallel (more in Junk than in Inbox). \n\nI would like to get notified only about the messages which are coming in the \"Inbox\" folder. So I just unchecked the option \"Check for new messages\" in the \"Junk\" folder. \n\nBut every time if a message in the \"Inbox\" folder arrives, I not only see the Message from the \"Inbox\", I also see the latest \"Junk\" messages. Because they are flagged \"New\" as well. \n\nSometimes the junk messages are newer (future dated) as the messages in the Inbox. So I just see four header lines of junk messages, but the message from the Inbox which triggered the notification isn\'t visible at all. \n\nSo it\'s not just a matter of taste introducing a new \"Biff\" flag, it\'s just a must if you would like to allow exclude some messages from the notification.\n\nI would like to see which messages are \"new\" as well, but I don\'t want get a notification about it. And the \"biff\" flag can get cleared automatically as soon the notification was shown.\n\n',0.00,0,0,3692851,0,NULL,0),(248970,285685,'2008-07-31 10:56:52','Hello, I\'m the developer of the Torbutton Firefox extension (https://www.torproject.org/torbutton), and I\'ve put a great deal of work and research (about 16 months now) into developing a \'private mode\' via extensionland for Tor users. I approached the problem from the point of view that any amount of data that the browser leaks on to the disk or the network that is either uniquely identifying, can be used to build a random identifier, or indicative of their history is a vulnerability (See https://www.torproject.org/torbutton/design/#adversary and https://www.torproject.org/torbutton/design/#requirements).\n\nWhile this was a different approach that seems to have been taken from this bug (which seems to have been attacked primarily from a usability perspective), it seems to have led us to similar conclusions.\n\nI\'ve documented everything I have learned and implemented in the Torbutton design document here: https://www.torproject.org/torbutton/design/\n\nA couple of comments I can give from experience that weren\'t covered in your above discussion, or that I\'d just like to re-emphasize:\n\n0. Pages loaded in non-private mode can do all sorts of automatic network activity, set timers, attempt to re-authenticate, send unique identifiers stored in \'DOM Storage\', etc etc during private mode.\n\n1. Content window Javascript can access session history to navigate back and forward for the user to cause the local network (in our case the exit node) to learn a bit about their most recently accessed private or non-private session history.\n\n2. Formfill and password saving can write private data to disk, and read it back where content window Javascript can inspect the values.\n\n3. Livemarks refreshes currently cannot be disabled, and will still happen in the background during private mode (Bug 436250), exposing potentially private data to the local network (such as wikipedia pages you are an editor of, etc)\n\n4. Plugins have their own cookies that can still be transmitted in private mode (see http://epic.org/privacy/cookies/flash.html).\n\n5. Users hate it when a private mode does anything to permanently alter any of their non-private data. The only way to do this and have it ever be used is to isolate the non-private data so that it can\'t be touched during private mode, but is restored upon entrance back into non-private mode.\n\n6. Custom SSL certificates are still available and can be probed for.\n\n7. (Already covered briefly, would like to re-emphasize): History disclosure is a big big problem (see http://gemal.dk/browserspy/css.html and http://ha.ckers.org/weird/CSS-history.cgi http://www.mikeonads.com/2008/07/13/using-your-browser-url-history-estimate-gender/), \nbut it must not be solved by damaging the user\'s current stored history, or even \nmaking it inaccessible.\n\n8. Private mode should also be a pref in addition to an observer event, so that components and windows loaded after the transition can still determine the current mode.\n\n\nI\'ve also cataloged a list of Firefox bugs that make much of the above difficult under the current version of Firefox: https://www.torproject.org/torbutton/design/#FirefoxBugs\n\n',0.00,0,0,3724785,0,NULL,0),(248970,251051,'2008-08-12 11:52:56','A while back Beltzner told me that the drivers feel that the risk in the approach I\'ve took in my patches on this bug is too high and that they\'re more willing to take a Places-based solution. Are there any updates on this? Or should I just pick up my slack here and work on it more?',0.00,0,0,3737392,0,NULL,0),(248970,283305,'2008-08-14 03:43:26','>Are there any updates\n\nI\'ll try to get an answer to you soon about this',0.00,0,0,3739569,0,NULL,0),(11040,1537,'2008-08-18 11:46:38','\"Biff\" versus \"New\" semantics do seem to have somewhat subtle interactions. I\'d be particularly interested in hearing clarkbw\'s comments on the UX implications of all this, as well thoughts from Beckley on what the Eudora experience has been on this front...',0.00,0,0,3744781,0,NULL,0),(11040,29811,'2008-08-19 03:50:55','any implications for calendar?',0.00,0,0,3745756,0,NULL,0),(248970,251051,'2008-08-19 14:29:47','Ping?',0.00,0,0,3746730,0,NULL,0),(248970,251051,'2008-08-19 14:46:32','According to , this seems to have been dropped from 3.1. Anyway, it would be nice to know what the plans here are for this to get into the next release.',0.00,0,0,3746758,0,NULL,0),(248970,51797,'2008-08-20 06:15:15','Too bad- the only new feature I was really looking for :(',0.00,0,0,3747585,0,NULL,0),(248970,14419,'2008-08-21 09:07:48','A Slashdot article today says Microsoft is applying for some patents on private browsing.',0.00,0,0,3749208,0,NULL,0),(248970,36541,'2008-08-21 09:46:37','(In reply to comment #153)\n> A Slashdot article today says Microsoft is applying for some patents on private\n> browsing.\n\nSeems like there was some confusion, it appears it\'s only about a trademark for product names.\n',0.00,0,0,3749238,0,NULL,0),(248970,36541,'2008-08-21 09:47:37','Adding Wan-Teh to cc list, as a functionality that uses a memory-only filesystem would probably involve new functionality at the NSPR level.\n',0.00,0,0,3749240,0,NULL,0),(11040,101158,'2008-08-21 10:52:32','Keeping on the wanted‑thunderbird3+ list, target ms beta2.\nrkent tells me it (basically) it should be doable, if only bug 441932 lands.',0.00,0,0,3749360,0,NULL,0),(11040,260035,'2008-08-21 23:25:19','Classic Eudora\'s approach on notifying users of new messages is different from Thunderbird\'s. Eudora doesn\'t have a separate message status of new. Instead it bolds mailbox names that have unread mail that are newer than 5 days (solves the old mail problem that bienvenu mentions above, and also persists across sessions), opens up mailboxes that get new mail put in them, and it automatically selects the first unread message at the end of a mailbox when its opened up. I\'ve got these last two items mostly working in Penelope already. One common usage model is that new messages get filtered in to mailboxes, which are then automatically opened up. You then close the mailboxes when you are done dealing with the messages in them. So the open mailbox windows themselves act as the new mail notification system.\n\nEudora also has a filter action to control whether the user gets notified about messages that match the filter criteria, similar to what this bug is suggesting. In addition to opening up mailboxes that get new messages that I mention above, you can also have it play a sound and/or put up a generic dialog saying that you have new mail. You can set the default to do these notifications (or not to) on all messages, and then the filters can override that on a per-message basis. As a filter action you can even open up messages in to their own separate windows so as to really highlight them. On Windows Eudora there is a system tray icon that will tell you how many new messages you have, but not any specific message info like TB\'s biff. In addition Eudora automatically does not notify the user (in any fashion: sound, new mail dialog, or opening mailboxes) on any messages that are marked as junk, or get transferred to the Trash mailbox by a filter.\n',0.00,0,0,3750165,0,NULL,0),(248970,283305,'2008-09-04 01:39:51','>Ping?\n\nSorry about the lag, I thought mconnor had been in touch with you. Recent development with Chrome will likely make finally getting private browsing mode shipped a priority for 3.1, but I think we are now targeting a more lightweight implementation.\n\nWhat we need to figure out is if you should continue your implementation for use in a later release.\n\nHere are some details mconnor sent me in email a few days ago about a possible strategy for 3.1:\n\n>Main goals:\n>\n>Ensure that users can\'t be tracked when doing \"private\" things. There\n>should be a clear line drawn between your \"public\" and \"private\"\n>browsing sessions. It is acceptable to let things touch magnetic\n>storage, as long as the cleanup mechanism is robust enough to clean\n>up.\n>\n>It is also acceptable to retain data that users explicitly save\n>(per-site permissions via prefs, bookmarks, etc)\n>\n>Non-goal for 3.1: Separate process sharing (some) data. When we get\n>process-per-tab we can make it more IE-like, but doing this also means\n>that we have to have something like their \"hey, you\'re in private\n>browsing mode\" banner on the URL bar for all the world to see. Which,\n>to me, is fail.\n>\n>\n>Cookies:\n>\n>On entry:\n>\n>Write cookies to disk, drop the in-memory hashtable.\n>\n>During:\n>\n>All cookies are treated as session cookies.\n>\n>Exit:\n>\n>Drop the hashtable, reload from disk.\n>\n>\n>History:\n>\n>On entry:\n>\n>Record timestamp of the last visit recorded.\n>\n>During:\n>\n>IsVisited always returns false (no link coloring spying)\n>AddVisit silently fails.\n>\n>Exit:\n>\n>Ensure any visits recorded after the timestamp are purged (shouldn\'t\n>be needed, but might be useful as a sanity check).\n>\n>\n>Site Permissions:\n>\n>Page Info tab is disabled.\n>Will not prevent users from explicitly adding exceptions via prefs.\n>\n>Passwords:\n>\n>Do not prompt to save passwords.\n>Passwords will not autofill, but will be available for autocomplete.\n>\n>Other:\n>\n>Autocomplete will be available, but will not remember data entered.\n>DOMStorage will not allow reading or writing of data (need JST/Enn\n>feeedback on how to do this cleanly)\n>All authenticated sessions will be logged out entering and leaving\n>private mode.\n>Downloads will be removed from dlmgr on completion.\n>\n>\n>Optional: Save session and close all browser windows, and restore after\n>exiting private mode? Seems reasonable enough, especially if we can\n>add the session store override to save SSL form data as a one-off...',0.00,0,0,3766005,0,NULL,0),(248970,136925,'2008-09-04 05:43:48','I like the direction this is headed, especially if any of it shows up in 3.1 but I would like to suggest that IsVisited always returning false be rethought.\n\nI find link coloring to be quite useful, particularly when going one by one through a list of links (e.g., on Google or a shopping site).\n\nIf it a matter of trying to figure out how to keep this off the disk and would require major re-work of that code, I can understand pushing it out until a later version but, to me, this is a major disadvantage of private mode: it\'s my biggest complaint about Stealther.',0.00,0,0,3766222,0,NULL,0),(248970,26983,'2008-09-04 07:50:32','How about a second set of files for private browsing that automatically get scrubbed. Alternatively, an indicator (or column) in the sqllite DB that marks something as from the private session.',0.00,0,0,3766392,0,NULL,0),(248970,284285,'2008-09-04 07:53:49','(In reply to comment #158)\n> Alternatively, an indicator (or column) in the sqllite DB that marks\n> something as from the private session.\n\nThis sounds me like session history, just like session cookies.',0.00,0,0,3766395,0,NULL,0),(248970,205478,'2008-09-05 13:42:59','I think Distrust has the best implementation of private browsing. It has an icon at the bottom which you click to enter a session. Then when you have finished, you unclick it and your previous tabs are restored and no history is saved.\n\nFor cookies, they are treated as session cookies and deleted at shutdown.\n\nhttps://addons.mozilla.org/en-US/firefox/addon/1559\n\nContact site for the maker\n\nhttp://www.gness.com/distrust/',0.00,0,0,3768529,0,NULL,0),(248970,251051,'2008-09-07 13:08:36','This patch implements the Private Browsing mode as described in comment 156. All parts of the requirements are met here, except the DOM storage, which I\'d be happy to have a feedback from JST or Enn on how best to tackle this in that module as neatly as possible.\n\nSome parts of the code have not changed from the previous WIP patches, some other parts have been removed now that our requirements are a bit lighter, and some rewriting has also been performed. It would be great if mconnor and other could test this both functionality and code-wise. Also, I\'d like to have beltzner\'s input on this as well, both on how the private browsing mode with the approach in comment 156 feels, and also on our chances to have this for 3.1.\n\nIt would also be great if someone with appropriate access could submit this patch to the try server for the users to try out actual builds.\n\nLast, but not least, like with the previous patches, the current menu item is a mortal and mere hack which will be removed from the final version of this patch. The UI should be decided and implemented in bug 411929.',0.00,0,0,3770235,5,'337327',0),(248970,6102,'2008-09-07 14:50:18','(In reply to comment #161)\n> Created an attachment (id=337327) [details]\n> Patch (v2.0)\n> \n> This patch implements the Private Browsing mode as described in comment 156. \n> All parts of the requirements are met here, except the DOM storage, which I\'d\n> be happy to have a feedback from JST or Enn on how best to tackle this in that\n> module as neatly as possible.\n\nIt already supports session storage via permissions like cookies do. You should be able to either set that or modify nsDOMStorage::CanUseStorage as needed.\n\nDave Camp is the current owner of the code.',0.00,0,0,3770342,0,NULL,0),(248970,251051,'2008-09-07 15:00:11','(In reply to comment #162)\n> It already supports session storage via permissions like cookies do. You should\n> be able to either set that or modify nsDOMStorage::CanUseStorage as needed.\n> \n> Dave Camp is the current owner of the code.\n\nA quick look at CanUseStorage() and it seems to be only used in one place in nsDOMStorage implementation. Is this enough to make this function return false during the private browsing session so that websites can\'t access or store data in this mode?',0.00,0,0,3770348,0,NULL,0),(248970,243208,'2008-09-07 18:56:30','Was cache handling dropped from the design? It seems like another thing we should look after in priv browsing.',0.00,0,0,3770502,0,NULL,0),(248970,251051,'2008-09-07 22:18:10','(In reply to comment #164)\n> Was cache handling dropped from the design? It seems like another thing we\n> should look after in priv browsing.\n\nYes, I think so too. I had an implementation of cache handling in the previous patch which I deleted out. I\'m not sure about the rationale for dropping cache handling from the design though. Mconnor, can you elaborate please?',0.00,0,0,3770607,0,NULL,0),(248970,251051,'2008-09-08 02:53:33','I prepared builds for Windows and Linux with the latest patch:\n\n\n\nPlease take some time to test and evaluate it. Also, if anyone owns a Mac and is willing to create a Mac build as well, that would be great!',0.00,0,0,3770764,0,NULL,0),(248970,210757,'2008-09-08 06:24:48','(In reply to comment #161)\n> Created an attachment (id=337327) [details]\n> Patch (v2.0)\n...\n> It would also be great if someone with appropriate access could submit this\n> patch to the try server for the users to try out actual builds.\n\nJust submitted to try server. Assuming it builds cleanly, it should show up here in an hour or two:\n\nhttps://build.mozilla.org/tryserver-builds/?C=M;O=D',0.00,0,0,3770983,0,NULL,0),(248970,251051,'2008-09-08 11:16:38','(In reply to comment #167)\n> Just submitted to try server. Assuming it builds cleanly, it should show up\n> here in an hour or two:\n> \n> https://build.mozilla.org/tryserver-builds/?C=M;O=D\n\n\n\nSeems like a wrong -p option to patch. patch should be invoked with -p1, I guess. Identical results on Win32 and Mac. Can you please re-submit the patch to try server?',0.00,0,0,3771403,0,NULL,0),(248970,219124,'2008-09-08 11:19:48','I re-submitted the patch.',0.00,0,0,3771404,0,NULL,0),(248970,96908,'2008-09-08 13:02:55','FWIW, spec I wrote is https://wiki.mozilla.org/User:Mconnor/PrivateBrowsing\n\nIf this patch is working to implement this spec, fantastic! I\'ll take a look through tonight. We can and will get this into 3.1 one way or another.',0.00,0,0,3771543,0,NULL,0),(248970,251051,'2008-09-08 13:41:16','(In reply to comment #170)\n> FWIW, spec I wrote is https://wiki.mozilla.org/User:Mconnor/PrivateBrowsing\n\nThanks for the link. For reference of those who want to test this patch without building it themselves, here is the link to the try server builds:\n\n\n\n> If this patch is working to implement this spec, fantastic! I\'ll take a look\n> through tonight.\n\nYes, it does. Originally I based my work on comment 156, but this spec is somewhat different to that (IINM only with regard to the Permissions section). I can easily remove the pageinfo-specific parts from this patch, which should bring this patch close to the spec you wrote. The only remaining part is DOM Storage handling. Enn provided some feedback on it (comment 162), and I\'m waiting for more feedback from Dave Camp (comment 163).\n\nAlso, I think we should add cache handling to the spec, because sensitive data about user\'s private session could be stored on disk as part of the cache, and accessing that data isn\'t that hard (doesn\'t even require manual traversal of cache data files, about:cache comes to rescue!).\n\nPlease let me know what you think!\n\n> We can and will get this into 3.1 one way or another.\n\nThat\'s very good to hear. I\'m ready to work on this full-speed, because I guess it requires a good amount of time for QA after landing.',0.00,0,0,3771605,0,NULL,0),(248970,265995,'2008-09-08 13:53:11','(In reply to comment #163)\n> (In reply to comment #162)\n> A quick look at CanUseStorage() and it seems to be only used in one place in\n> nsDOMStorage implementation. Is this enough to make this function return false\n> during the private browsing session so that websites can\'t access or store data\n> in this mode?\n\nYeah, that should work fine. Most entry points call CaheStoragePermissions(), which calls (and doesn\'t actually cache, apparently) CanUseStorage().',0.00,0,0,3771618,0,NULL,0),(248970,251051,'2008-09-09 13:58:13','Changes in this patch:\n\n * The page info stuff was removed, as per the spec.\n * The passwordmgr code was changed because my previous patch made it dependent on the browser code which is not acceptable. I also removed the PrivateBrowsingListener.jsm code entirely (which was a stupid idea of mine to begin with -- it can all be done using the Private Browsing service itself!).\n * The DOM Storage related code is now implemented.\n\nOne thing that I\'m not sure and I need Dave\'s feedback on is whether the DOM Storage manager gets initialized at app startup or is it possible to be initialized lazily? If the latter is the case, I need to add some code to detect at initialization time whether the private browsing mode is on or off, which may cause me to revive a trick I made in one of the previous WIPs (for supporting nsISupportsPRBool by the Private Browsing service, because dom code can\'t be made dependent on browser in which the nsIPrivateBrowsingService interface is defined). It would be trivial, so I\'m ready to provide a new patch if Dave confirms that it\'s possible for the DOM Storage manager to be initialized *after* the user has already entered the private browsing mode.\n\nLike before, feedback and try server builds are welcome! :-)\n\nOne final note: I still think that we need cache handling here...',0.00,0,0,3773039,5,'337732',0),(248970,251051,'2008-09-09 14:22:37','It is important for extensions to be able to interact with the private browsing mode and capture its notifications. I wrote a wiki page explaining the APIs for extensions and provided a number of code samples. This can later be moved on to MDC. You can see the page here: \n\nObviously it\'s just a draft at this stage, and I\'ll keep on updating it as the API changes in this bug.',0.00,0,0,3773081,0,NULL,0),(248970,27780,'2008-09-09 14:31:09','(In reply to comment #173)\n\n> * The passwordmgr code\n\nA few comments:\n\n* Didn\'t an earlier version of this feature fire a notification when private browsing mode was entered or left? Making the pwmgr poll the service during pageload is kind of sucky.\n\n* It would be cleaner to have the pwmgr not try to prompt for saving/changing a login in the first place, instead of having the code in nsLoginMangerPrompter.js silently bail out when it\'s attempted.\n\n* The spec says form logins should have the autocomplete attached, but not autofilled. For HTTP auth, should the popup dialog be prefilled? Otherwise such saved logins are inaccessible. The user can click cancel to not authenticate with the site, although I can see an argument for that being too easy to accidentally forget. :)',0.00,0,0,3773091,0,NULL,0),(248970,265995,'2008-09-09 14:44:15','(In reply to comment #173)\n> One thing that I\'m not sure and I need Dave\'s feedback on is whether the DOM\n> Storage manager gets initialized at app startup or is it possible to be\n> initialized lazily? If the latter is the case, I need to add some code to\n> detect at initialization time whether the private browsing mode is on or off,\n> which may cause me to revive a trick I made in one of the previous WIPs (for\n> supporting nsISupportsPRBool by the Private Browsing service, because dom code\n> can\'t be made dependent on browser in which the nsIPrivateBrowsingService\n> interface is defined). It would be trivial, so I\'m ready to provide a new\n> patch if Dave confirms that it\'s possible for the DOM Storage manager to be\n> initialized *after* the user has already entered the private browsing mode.\n\nThe storage manager is initialized at startup.\n\nBut if pieces below the browser are using this feature, wouldn\'t it make sense to put nsIPrivateBrowsingService.idl somewhere lower in the stack? It doesn\'t seem like it\'s any cleaner to have everything built before browser/ either be initialized at startup or use a different interface to access the service as anything after browser/.',0.00,0,0,3773105,0,NULL,0),(248970,233280,'2008-09-09 14:49:42','So, the download manager may or may not be initialized at startup, so you can\'t depend on receiving the notification.\n\nSecondly, this really needs some tests. Toolkit has a requirement for any new feature to land with tests, and I think browser may be the same way.\n\nYou won\'t get my review for the download manager bits without a test to show that it works as expected.',0.00,0,0,3773117,6,'337732',0),(248970,210757,'2008-09-09 14:54:33','(In reply to comment #177)\n> You won\'t get my review for the download manager bits without a test to show\n> that it works as expected.\n\n... but we really hope you will supply those tests, because the work so far is great, Ehsan. Really - thank you for continuing to plug away at this.',0.00,0,0,3773123,0,NULL,0),(248970,27780,'2008-09-09 15:00:55','(In reply to comment #177)\n> So, the download manager may or may not be initialized at startup, so you can\'t\n> depend on receiving the notification.\n\nThe typical pattern would be for a component to get the current state when it starts up, at the same time it registers an observer.',0.00,0,0,3773136,0,NULL,0),(248970,251051,'2008-09-10 08:11:12','(In reply to comment #175)\n> (In reply to comment #173)\n> \n> > * The passwordmgr code\n> \n> A few comments:\n\nThanks for the notes! :-)\n\n> * Didn\'t an earlier version of this feature fire a notification when private\n> browsing mode was entered or left? Making the pwmgr poll the service during\n> pageload is kind of sucky.\n\nYeah, it still does. I\'ll change this in the next revision of the patch.\n\n> * It would be cleaner to have the pwmgr not try to prompt for saving/changing a\n> login in the first place, instead of having the code in\n> nsLoginMangerPrompter.js silently bail out when it\'s attempted.\n\nAgreed. I\'ll try to move as much of the code as possible to nsLoginManager in\nthe next revision.\n\n> * The spec says form logins should have the autocomplete attached, but not\n> autofilled. For HTTP auth, should the popup dialog be prefilled? Otherwise such\n> saved logins are inaccessible. The user can click cancel to not authenticate\n> with the site, although I can see an argument for that being too easy to\n> accidentally forget. :)\n\nWell, that\'s really something for the spec to address. Currently the patch\ndoesn\'t autofill form fields, and leaves HTTP auth dialogs blank. I can easily\nchange this so that they get filled, provided that mconnor is in favor of this\nchange.',0.00,0,0,3773994,0,NULL,0),(248970,251051,'2008-09-10 08:20:11','(In reply to comment #176)\n> But if pieces below the browser are using this feature, wouldn\'t it make sense\n> to put nsIPrivateBrowsingService.idl somewhere lower in the stack? It doesn\'t\n> seem like it\'s any cleaner to have everything built before browser/ either be\n> initialized at startup or use a different interface to access the service as\n> anything after browser/.\n\nI also think browser/ is not a good place to put nsIPrivateBrowsingService.idl, but I\'m not sure where to put it. Can you suggest some place? Ideally we need some place where we can make all of the modules dependent on it, so that they can all access nsIPrivateBrowsingService, but I\'m not sure if such a place exists in the tree...',0.00,0,0,3774002,0,NULL,0),(248970,251051,'2008-09-10 08:47:13','(In reply to comment #177)\n> So, the download manager may or may not be initialized at startup, so you can\'t\n> depend on receiving the notification.\n\nGood point to mention. Based on comment 179, I think I\'m going to change the logic for each module to get the current status on startup (no matter if it\'s initialized at startup or not), and I\'ll make sure to handle download manager this way as well.\n\n> Secondly, this really needs some tests. Toolkit has a requirement for any new\n> feature to land with tests, and I think browser may be the same way.\n> \n> You won\'t get my review for the download manager bits without a test to show\n> that it works as expected.\n\nSure. The next thing I\'ll be looking into is getting started to write some tests for this code. I\'ll try to make this in-litmus- and in-testsuite+. :-)\n\n(In reply to comment #178)\n> ... but we really hope you will supply those tests, because the work so far is\n> great, Ehsan. Really - thank you for continuing to plug away at this.\n\nThanks! :-)\n\n(In reply to comment #179)\n> The typical pattern would be for a component to get the current state when it\n> starts up, at the same time it registers an observer.\n\nI see. I think before jumping at this, I\'ll need to find some place else to put nsIPrivateBrowsingService.idl in, so that all the modules can query the service on startup. I need help finding the appropriate place, though.\n\nIf such a place cannot be found, I\'m thinking of defining another notification, named something like \"private-browsing-query\" which passes a nsISupportsPRBool as the subject (like \"quit-application-requested\"), and make the private browsing service respond to this notification by passing the current status in aSubject.\n\nAny hints on whether I\'m barking at the right tree or not?',0.00,0,0,3774046,0,NULL,0),(248970,96908,'2008-09-10 10:32:34','Ehsan, if it\'d help I can write up a test plan for what we need to test. If you want to work together on this, just find me on IRC.\n\n(In reply to comment #157)\n> I like the direction this is headed, especially if any of it shows up in 3.1\n> but I would like to suggest that IsVisited always returning false be rethought.\n> \n> I find link coloring to be quite useful, particularly when going one by one\n> through a list of links (e.g., on Google or a shopping site).\n\nGiven that this can be (ab)used by sites, it doesn\'t make sense to expose your non-private history to them, and since we\'re not recording visits in private mode, there\'s nothing reasonable we can return.',0.00,0,0,3774208,0,NULL,0),(248970,198492,'2008-09-10 11:45:42','I gave a try with the build linked in comment 171. I enabled private browsing, visited a given website, disabled it and grepped the profile for occurrences of that website URL. I could find references in the files:\nprofile/Cache/\nprofile/cookies.sqlite\nprofile/places.sqlite\n\n(and in session_restore.js before I quit the browser). The cache and session restore are not handled yet, but shouldn\'t cookies and places not contain traces?',0.00,0,0,3774336,0,NULL,0),(248970,251051,'2008-09-10 11:52:54','(In reply to comment #184)\n> The cache and session\n> restore are not handled yet, but shouldn\'t cookies and places not contain\n> traces?\n\nThanks for testing this, Sylvian. Yes, you\'re right, cookies and places are supposed not to leave a trace. Can you open the sqlite DBs and check in which table(s) the mentioned URL appears please?',0.00,0,0,3774352,0,NULL,0),(248970,198492,'2008-09-10 12:24:28','sure, I accessed slashdot with private browsing mode enabled:\n\nsqlite3 cookies.sqlite .dump|grep slashdot\nINSERT INTO \"moz_cookies\" VALUES(1221074391930408,\'__utma\',\'9273847.3921509624962351000.1221074392.1221074392.1221074392.1\',\'.slashdot.org\',\'/\',1284146393,1221074393924407,0,0);\nINSERT INTO \"moz_cookies\" VALUES(1221074391930799,\'__utmb\',\'9273847.1.10.1221074392\',\'.slashdot.org\',\'/\',1221076193,1221074393926321,0,0);\nINSERT INTO \"moz_cookies\" VALUES(1221074391932333,\'__utmz\',\'9273847.1221074392.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)\',\'.slashdot.org\',\'/\',1236842391,1221074391932333,0,0);\nINSERT INTO \"moz_cookies\" VALUES(1221074392683439,\'__qca\',\'1221074392-53816111-35021676\',\'.slashdot.org\',\'/\',2147385600,1221074392683439,0,0);\n\n\nsqlite3 places.sqlite .dump|grep slashdot\nINSERT INTO \"moz_favicons\" VALUES(8,\'http://slashdot.org/favicon.ico\',X\'000001000100101010000000000028010000160000002800000010000000200000000100040000000000C0000000000000000000000000000000000000000000000080800000FFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111000001110000011100001111100000111000111110000011100011111000000111000111000000011100000000000000111000000000000011100000000000000111000000000000011100000000000000111000000000000011100000000000000000000000000000000000000FFFF0000E7E70000C3C30000C3810000E1810000E1830000F0C70000F0FF0000F87F0000F87F0000FC3F0000FC3F0000FE1F0000FE3F0000FFFF0000FFFF0000\',\'image/x-icon\',1221160794701793);\nINSERT INTO \"moz_places\" VALUES(45,\'http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=slashdot\',\'search\',\'moc.elgoog.www.\',1,0,0,NULL,100);\nINSERT INTO \"moz_places\" VALUES(46,\'http://slashdot.org/\',\'Slashdot: News for nerds, stuff that matters\',\'gro.todhsals.\',1,0,0,8,100);',0.00,0,0,3774424,0,NULL,0),(248970,251051,'2008-09-10 12:57:47','Thanks for the update, Sylvian. The places part is half about the favicon service (which I didn\'t handle before, and should do so in the next revision). The other half might be because of what I\'m doing in AddVisit only makes sure nothing is recorded in moz_historyvisits, and moz_places would still be exposed to private data without further checks.\n\nBut I don\'t understand the cookies part at all. Would you mind checking out to see if it\'s reproducible, both with the same profile and a new one, and post here a detailed STR here? And also make sure you delete all this data before testing this again with the same profile (sorry for stating the obvious)?\n\nThanks!',0.00,0,0,3774497,0,NULL,0),(248970,75420,'2008-09-10 13:05:24','(In reply to comment #187)\n> But I don\'t understand the cookies part at all.\n\nat first glance, the problem is you set an observer in the cookieservice, but it\'s inited lazily - not until first pageload. if Sylvain enabled PB before loading a page, cookieservice won\'t catch that notification. you\'ll need to do what dolske suggested in comment 179: check PB mode in Init() and also register an observer.',0.00,0,0,3774515,0,NULL,0),(248970,251051,'2008-09-10 13:13:08','(In reply to comment #188)\n> at first glance, the problem is you set an observer in the cookieservice, but\n> it\'s inited lazily - not until first pageload. if Sylvain enabled PB before\n> loading a page, cookieservice won\'t catch that notification. you\'ll need to do\n> what dolske suggested in comment 179: check PB mode in Init() and also register\n> an observer.\n\nThanks for the pointer, Dan! Of course, you\'re right. I\'m going to work on this tomorrow. If by that time someone doesn\'t come up with a solution to comment 181 (where to put nsIPrivateBrowsingService.idl), I\'m going to take the \"private-browsing-query\" notification approach (comment 182)...',0.00,0,0,3774541,0,NULL,0),(248970,198492,'2008-09-10 13:19:24','Here\'s the detailed steps:\n\nDownload and Extract the Firefox build somewhere\nCreate a new profile directory:\nrm -rf /tmp/profile; mkdir /tmp/profile\nStart it (adapt this for your OS)\n./Minefield.app/Contents/MacOS/firefox -no-remote -profile /tmp/profile\nCheck Tools > Private Browsing\nOpen www.slashdot.org\nGo back to Minefield Home page\nUncheck Tools > Private Browsing\nQuit Firefox\nGrep the profile:\ngrep -rli slashdot /tmp/profile\nExpected: nothing\nActual: see comment 184\n\n\nMinefield homepage (http://www.mozilla.org/projects/minefield/) does not set cookies, so Dan explanations apply in this situation.',0.00,0,0,3774561,0,NULL,0),(248970,75420,'2008-09-10 14:38:20','(In reply to comment #190)\n> ./Minefield.app/Contents/MacOS/firefox -no-remote -profile /tmp/profile\n\n> Minefield homepage (http://www.mozilla.org/projects/minefield/) does not set\n> cookies, so Dan explanations apply in this situation.\n\nif that command loads the homepage on startup, that\'ll pull in the cookieservice (regardless of whether it sets anything... it needs to check if there are cookies to send, too). my explanation only applies if it loads about:blank.\n\nsomething else may be amiss, throw in some debug statements and fiddle around?\n\n(In reply to comment #189)\n> comment 181 (where to put nsIPrivateBrowsingService.idl), I\'m going to take \n\nit\'ll need to be somewhere above the netwerk tier, so toolkit\'s out, no?',0.00,0,0,3774736,0,NULL,0),(248970,210757,'2008-09-10 15:07:33','I notice that neither the functional spec, the bug comments thus far, or the current patch seem to account for safebrowsing (anti-phishing/malware).\n\nPresumably we still want to protect people in this mode from those attacks (indeed, they may be more likely to visit disreputable or compromised sites). On the other hand, the pingback behaviour in the safebrowsing protocol means that when a reported malware/phishing site is hit, FF will go double-check, which means a hash request to google. That is probably not behaviour that our users would expect, when in PB mode.\n\nOne reasonably straightforward technical solution there is to keep checking sites against the local DB, but not perform the pingbacks, while in PB mode. Dave Camp (already cc\'d) can comment on the technical feasibility there, but there is also a concern with that approach, namely that sites which have been removed from the list after the user enters PB mode will still be marked as dangerous. We don\'t like to mark sites as dangerous that aren\'t actually. Still, I\'m not sure either of the other obvious solutions (disable malware/phishing protection entirely, or leave it entirely operational) are desirable.\n\nI don\'t want to scope creep the bug - if we want to file a followup for this, we can, but I think we need an answer to it. People using this mode are precisely the people who would be sensitive to automatic pingbacks. (To be clear, these only occur for reported bad sites, not for every visit - a user might go their whole life without encountering a single one. But then again, they may not. )',0.00,0,0,3774786,0,NULL,0),(248970,265995,'2008-09-10 15:20:42','Blocking without a pingback would be feasible, but you\'d end up with false positives in addition to stale blocks (not particularly often, but it could happen).\n\nWhat might work is a separate error page for blocks that are unconfirmed due to private browsing mode. It should be possible to add a \"confirm this match\" link that does the pingback manually.',0.00,0,0,3774815,0,NULL,0),(248970,135453,'2008-09-10 21:08:09','Is there any hope to block content-prefs.sqlite from \"leaking\" pages visited in private browsing mode? Simply changing zoom level pushes the page to this database and I remember there were some difficulties removing it, even with \"clear private data\".',0.00,0,0,3775211,0,NULL,0),(248970,251051,'2008-09-10 23:34:54','(In reply to comment #191)\n> if that command loads the homepage on startup, that\'ll pull in the\n> cookieservice (regardless of whether it sets anything... it needs to check if\n> there are cookies to send, too). my explanation only applies if it loads\n> about:blank.\n> \n> something else may be amiss, throw in some debug statements and fiddle around?\n\nI\'ll investigate this further.\n\n> (In reply to comment #189)\n> it\'ll need to be somewhere above the netwerk tier, so toolkit\'s out, no?\n\nYes.',0.00,0,0,3775293,0,NULL,0),(248970,251051,'2008-09-10 23:52:57','(In reply to comment #192)\n> People using this mode are\n> precisely the people who would be sensitive to automatic pingbacks.\n\nHmmm, I was under the impression that safebrowsing only sent a hash digest of a URL to the provider when its (shorter) hash matches one of those downloaded from the provider periodically, right? So there should not be anything revealing the URL that the user has visited in this process, right?\n\n(In reply to comment #193)\n> What might work is a separate error page for blocks that are unconfirmed due to\n> private browsing mode. It should be possible to add a \"confirm this match\"\n> link that does the pingback manually.\n\nIf there are privacy concerns here, I think we can go with this solution, but I fail to see the privacy concerns anyway... Anyway ultimately it\'s the call of someone more familiar with the code.',0.00,0,0,3775308,0,NULL,0),(248970,251051,'2008-09-11 00:00:38','(In reply to comment #194)\n> Is there any hope to block content-prefs.sqlite from \"leaking\" pages visited in\n> private browsing mode? Simply changing zoom level pushes the page to this\n> database and I remember there were some difficulties removing it, even with\n> \"clear private data\".\n\nAn earlier revision of my patch handled content prefs as well. Mconnor: was omitting the content prefs from the functional specs deliberate?\n\nBTW, based on IRC talk with mconnor earlier, cache handling will be added to the patch, and a session store related change is also along the way. The current plans are closing all of the windows/tabs when entering the private mode, and restoring them all after exiting the private mode, so that there is a clear separation between the private and non-private windows/tabs as far as the users are concerned.',0.00,0,0,3775316,0,NULL,0),(248970,210757,'2008-09-11 06:29:07','(In reply to comment #196)\n> (In reply to comment #192)\n> > People using this mode are\n> > precisely the people who would be sensitive to automatic pingbacks.\n> \n> Hmmm, I was under the impression that safebrowsing only sent a hash digest of a\n> URL to the provider when its (shorter) hash matches one of those downloaded\n> from the provider periodically, right? So there should not be anything\n> revealing the URL that the user has visited in this process, right?\n\nYour description of the double-check is correct:\n\n - User attempts to load a page whose (32-bit) hash matches one in the DB\n - We ask for the full length hash for that entry, to eliminate the possibility of collisions\n - At no point is the raw URL transmitted.\n\nThe concern arises because the list provider has all the \"real\" urls, so the usual difficulties of reversing a hash don\'t really apply. If my client sends a double-check request, an unscrupulous list provider could figure out which of the entries in their list it corresponded to at which point they would know either that I had visited that site, or that I had visited a site which hash-collides with it.\n\nThat is a pretty minor leakage, particularly given the strength of the privacy policy google has in place around its collection of data, but it is non-negligible. Dave\'s idea is probably a good one to consider as well, but yes, I think I will file a bug dependent on this one to track it, rather than risk derailing the progress here.',0.00,0,0,3775611,0,NULL,0),(248970,210757,'2008-09-11 06:50:41','Bug 454792 opened to track the safebrowsing discussion.',0.00,0,0,3775639,0,NULL,0),(248970,251051,'2008-09-11 12:49:41','What\'s new in this patch:\n\n * Added the \"private-browsing-query\" notification support to nsPrivateBrowsingService, and added correct initialization code to all the existing modules. Order of initialization for modules is insignificant here: if a module initializes before the private browsing service, and sends the query notification, it will not be handled, so the module assumes that we\'re not in private browsing mode (correct assumption). For all modules initialized after the private browsing service, the private browsing service will correctly respond to the query notification and the modules in question get initialized with the correct current private browsing status.\n * Handled Justin\'s first and second issues in comment 175.\n\nTodo stuff for the next revision: add the cache (and content prefs service) handling, and improve the places handling of the private browsing mode (see comment 188). Also unit tests are forthcoming, perhaps not in the next revision though (which I hope to get ready by tomorrow).',0.00,0,0,3776144,5,'338165',0),(248970,251051,'2008-09-12 05:10:20','What\'s new in this version of the patch:\n\n * Handled the cache service with this logic: on entering the private mode, disable the disk and offline caches. During the private mode, only the memory cache remains active. When leaving the private mode, clear the memory cache, and enable the disk and offline caches, if they should be enabled based on their respective prefs.\n * Handled the content prefs service, so that things such as changing the zoom level on a site doesn\'t cause trails of the visit be left in the profile.\n * Made the favicon service aware of the private mode, and disable saving of favicons (and potentially addition of moz_places entries as Sylvian had observed in comment 186).\n * Made sure that the test laid out in comment 190 passes successfully.\n\nThis patch is worth having a try server build for, so if someone can submit it, that would be great!\n\nI\'ll get started with some unit tests in the next revision.',0.00,0,0,3777184,5,'338299',0),(248970,219124,'2008-09-12 07:51:36','(In reply to comment #201)\n> Created an attachment (id=338299) [details]\n> Patch (v2.3)\n\n> This patch is worth having a try server build for, so if someone can submit it,\n> that would be great!\n\nhttps://build.mozilla.org/tryserver-builds/2008-09-12_06:19-dgottwald@mozilla.com-priv-20080912/\n\nNote that Linux talos didn\'t like that build:\nFAIL: Busted: tp\nFAIL: browser frozen',0.00,0,0,3777393,0,NULL,0),(248970,26983,'2008-09-12 09:05:01','I just want to confirm: This is not tab-independent, correct? It applies to the whole browser.',0.00,0,0,3777480,0,NULL,0),(248970,324628,'2008-09-12 09:28:20','While you are working on this project, I had an idea for an improvement or addition to it.\n\nAdd a feature that will allow users to clear all items instantly for the sessions they had browsed during the session of mozilla. I doubt you keep up a history of each cookie and history of what that individual process/tab has done during the whole time it has been open (would be a memory hog). Sometimes a user is browsing and might have forgotten to set mozilla for private browsing instead allowing users to clear the sessions, even if it only pertains to what is currently open and associated cookies/history.\n\nany feedback against this is welcome, just wanted to get it out in the open. may not be the right forum either.',0.00,0,0,3777512,0,NULL,0),(248970,301919,'2008-09-12 20:12:09','I just took a quick look over it and it looks awesome. Great work!\n\nOne concern: From my quick look it didn\'t seem to be touching nsSessionStore.js. Are closed tabs remembered using your current code? (Again, quick look and I haven\'t tried it) I ask because I\'m implementing \"undo closed window\" which is analogous to the \"undo closed tabs\" feature, and I\'m trying to get a feel for how this might effect the time line for that, and vice versa.',0.00,0,0,3778245,0,NULL,0),(248970,251051,'2008-09-12 23:04:19','(In reply to comment #202)\n> https://build.mozilla.org/tryserver-builds/2008-09-12_06:19-dgottwald@mozilla.com-priv-20080912/\n\nThanks!\n\n> Note that Linux talos didn\'t like that build:\n> FAIL: Busted: tp\n> FAIL: browser frozen\n\nHmmm, that\'s weird, I can build and run the Linux version without any problems here. Are there more detailed logs available?\n\n(In reply to comment #203)\n> I just want to confirm: This is not tab-independent, correct? It applies to\n> the whole browser.\n\nYes, that\'s correct. The Private Browsing implementation is global to all of the Firefox windows. According to the latest changes in the spec, the currently open windows and tabs will be closed when entering the private mode, so this may be a little less confusing.\n\n(In reply to comment #204)\n> Add a feature that will allow users to clear all items instantly for the\n> sessions they had browsed during the session of mozilla. I doubt you keep up a\n> history of each cookie and history of what that individual process/tab has done\n> during the whole time it has been open (would be a memory hog). Sometimes a\n> user is browsing and might have forgotten to set mozilla for private browsing\n> instead allowing users to clear the sessions, even if it only pertains to what\n> is currently open and associated cookies/history.\n\nThis is a good idea. Currently the sanitizer (accessible from Tools > Clear Private Data) is able to clear the whole data, not the session specific data. This is actually a sanitizer thing, and I\'m not sure if it\'s not already filed as a bug. Please search bugzilla and if it\'s not already filed, go ahead and file it, since this will need a separate bug report in order to work on.\n\n(In reply to comment #205)\n> I just took a quick look over it and it looks awesome. Great work!\n\nThanks! :-)\n\n> One concern: From my quick look it didn\'t seem to be touching\n> nsSessionStore.js. Are closed tabs remembered using your current code? (Again,\n> quick look and I haven\'t tried it) I ask because I\'m implementing \"undo closed\n> window\" which is analogous to the \"undo closed tabs\" feature, and I\'m trying to\n> get a feel for how this might effect the time line for that, and vice versa.\n\nAccording to the latest changes in the spec , session store will be handled in this way: when entering the private mode, all open windows and tabs will be closed, and only a single window will be left open. The undo close tabs (and windows) list will be left untouched in private mode (i.e., the tabs and windows closed in private mode will not be added to them). When leaving the private mode, all of the windows and tabs that the user had open before entering the private mode will be restored, and undo close tabs/windows list will get updated once again.\n\nBTW, what\'s the bug# tracking the undo close windows work? I\'m personally interested in it.',0.00,0,0,3778313,0,NULL,0),(248970,251051,'2008-09-13 04:21:33','This patch makes a small correction in the cache module handling to clear the memory cache when entering the private browsing mode (as per the spec). Furthermore, it implements the session store handling as laid out in the spec.\n\nFor session store handling, nsSessionStore turns off writing the session data to disk while in private mode, and backs up the restore windows data when entering the private mode, and restores it after leaving it. Also, it prompts the user if they want to close their current session and open a private session. If the user says yes, then the current windows and tabs will be closed, and after leaving the private mode, they all will be restored. If the user says no, their tabs and windows remain open and no restore takes place when leaving the private mode (the behavior of versions prior to 2.4).\n\nThis prompting is implemented in nsBrowserGlue, and can be overrided with the new browser.privatebrowsing.keep_current_session pref. A mechanism is in place for extensions to override this UI (by handling the \"private-browsing-start\" notification, as I\'ll document in ), and the nsBrowserGlue behavior only kicks in when no extension handles this notification. In case an extension provides its own UI here, the browser.privatebrowsing.keep_current_session will be ignored, and saving user\'s choice (if desired) will be the responsibility of the extension itself.\n\nAt this revision, the patch should be fully compatible with the spec. Dao: can you submit this to the try server as well? Thanks!\n\nBy the way, I\'ve tested this on both Windows and Linux. Let\'s see if this time Talos can run this successfully...',0.00,0,0,3778414,5,'338439',0),(248970,160571,'2008-09-13 08:00:54','Drive-by comments related to Session Restore:\n* If you temporarily enter private browsing and have Firefox close your windows, what happens when you crash during private browsing? Will your original windows be restored? (AFAICT this should work already)\n* When you quit while still in private browsing mode, what will be restored at the next startup with Session Restore switched on? (looks like this could be sensitive content, at least if you\'ve decided not to close all non-private windows first)\n* Instead of saving/restoring the list of closed tabs for all windows, I\'d rather tag all tabs closed during private browsing mode and then just purge these when private browsing is over.',0.00,0,0,3778494,0,NULL,0),(248970,219124,'2008-09-13 08:22:14','(In reply to comment #207)\n> Created an attachment (id=338439) [details]\n> Patch (v2.4)\n\nhttps://build.mozilla.org/tryserver-builds/2008-09-13_07:23-dgottwald@mozilla.com-priv-20080913/',0.00,0,0,3778509,0,NULL,0),(248970,251051,'2008-09-13 11:23:14','(In reply to comment #208)\n> Drive-by comments related to Session Restore:\n> * If you temporarily enter private browsing and have Firefox close your\n> windows, what happens when you crash during private browsing? Will your\n> original windows be restored? (AFAICT this should work already)\n\nYes, the original windows will be restored.\n\n> * When you quit while still in private browsing mode, what will be restored at\n> the next startup with Session Restore switched on? (looks like this could be\n> sensitive content, at least if you\'ve decided not to close all non-private\n> windows first)\n\nAgain, the original windows will be restored, even if you choose not to close all non-private windows when entering the private browsing mode. Basically, no data about the session will be saved to the disk while in private browsing mode so the contents of sessionstore.js will not change while in private mode.\n\n> * Instead of saving/restoring the list of closed tabs for all windows, I\'d\n> rather tag all tabs closed during private browsing mode and then just purge\n> these when private browsing is over.\n\nWhat about the case where the windows/tabs are closed when entering the private mode? Will this work in that case as well?',0.00,0,0,3778620,0,NULL,0),(248970,160571,'2008-09-13 12:19:38','(In reply to comment #210)\n> no data about the session will be saved to the disk while in private browsing\n> mode so the contents of sessionstore.js will not change while in private mode.\n\nYou will however have to write to sessionstore.js during shutdown, otherwise Firefox will think it crashed at the next startup (unless you correctly safe the file before entering PB mode, which you currently don\'t). However AFAICT from skimming the code, you exit PB mode on quit-application-granted which will cause sessionstore.js to be written again with the state from when entering PB mode but (at least) updated cookies...\n\n> What about the case where the windows/tabs are closed when entering the\n> private mode? Will this work in that case as well?\n\nIt does: You\'ll get the list(s) of recently closed tabs included in the browser state through getBrowserState and restore it through setBrowserState...',0.00,0,0,3778645,0,NULL,0),(248970,251051,'2008-09-13 12:49:29','(In reply to comment #211)\n> You will however have to write to sessionstore.js during shutdown, otherwise\n> Firefox will think it crashed at the next startup (unless you correctly safe\n> the file before entering PB mode, which you currently don\'t). However AFAICT\n> from skimming the code, you exit PB mode on quit-application-granted which will\n> cause sessionstore.js to be written again with the state from when entering PB\n> mode but (at least) updated cookies...\n\nSo, would that be enough for Firefox to detect that it was shut down cleanly?\n\n> It does: You\'ll get the list(s) of recently closed tabs included in the browser\n> state through getBrowserState and restore it through setBrowserState...\n\nI see. Thanks for clarification. I\'ll try to get around to implement your suggestion soon.',0.00,0,0,3778663,0,NULL,0),(248970,76551,'2008-09-14 08:08:12','Ehsan, shouldn\'t the menu item be checked when you have entered the \"Private Browsing\" mode? At least on OS X it cannot be seen and it makes hard to see in which state you are.',0.00,0,0,3779132,0,NULL,0),(248970,251051,'2008-09-14 08:24:30','(In reply to comment #213)\n> Ehsan, shouldn\'t the menu item be checked when you have entered the \"Private\n> Browsing\" mode? At least on OS X it cannot be seen and it makes hard to see in\n> which state you are.\n\nYes, it should... The thing is, I\'ve been deferring all the UI work to bug 411929, but I guess we\'d want this menu item at any rate (and if not, we can remove it in that bug) so I\'ll make a robust menu item which actually gets updated in response to changes in the private browsing mode in the next revision. Thanks for bringing this into my attention, and sorry for the confusion it has caused in the QA work.',0.00,0,0,3779140,0,NULL,0),(248970,251051,'2008-09-14 13:55:22','Just a small fix to the passwordmgr module, and improved the menu item in the Tools menu to fix the problem Henrik mentioned in comment 213.',0.00,0,0,3779386,5,'338552',0),(248970,76551,'2008-09-14 14:49:11','Try server builds for the latest patch v2.5 are available here:\nhttps://build.mozilla.org/tryserver-builds/2008-09-14_14:01-mozilla@hskupin.info-priv/',0.00,0,0,3779428,0,NULL,0),(248970,297995,'2008-09-14 18:16:02','Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1 ID:2008070208\n\nPatch doesn\'t work for me on a fresh profile on Vista (at least the patched tryserver), I get these errors (and some others):\n\nWarning: reference to undefined property Cc[\'@mozilla.org/browser/privatebrowsing;1\']\nSource File: chrome://browser/content/browser.js\nLine: 8136\n\nError: Cc[\'@mozilla.org/browser/privatebrowsing;1\'] is undefined\nSource File: chrome://browser/content/browser.js\nLine: 8136\n\nError: this._privateBrowsingService is null\nSource File: chrome://browser/content/browser.js\nLine: 8141\n\nError: uncaught exception: [Exception... \"Component returned failure code: 0x80570016 (NS_ERROR_XPC_GS_RETURNED_FAILURE) [nsIJSCID.getService]\" nsresult: \"0x80570016 (NS_ERROR_XPC_GS_RETURNED_FAILURE)\" location: \"JS frame :: chrome://browser/content/browser.js :: anonymous :: line 987\" data: no]',0.00,0,0,3779511,0,NULL,0),(248970,251051,'2008-09-14 23:06:01','The latest try server build ID should be \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b1pre) Gecko/20080914141735 Minefield/3.1b1pre\", but you\'re right that it doesn\'t work. I inspected this a bit, and it seems like that the nsPrivateBrowsingService.js file does not exist in the components directory at all. I took a look at the build log , and the following statements seem to suggest that the component is correctly being copied to the components directory, but in fact, it\'s not.\n\nfor i in /e/builds/sendchange-slave/sendchange-win32-hg/mozilla/browser/components/privatebrowsing/src/nsPrivateBrowsingService.js; do \\\n dest=../../../../dist/bin/components/`basename $i`; \\\n rm -f -f $dest; \\\n /d/mozilla-build/python25/python /e/builds/sendchange-slave/sendchange-win32-hg/mozilla/config/Preprocessor.py -DOSTYPE=\\\"WINNT5.2\\\" -DOSARCH=WINNT -D_CRT_SECURE_NO_DEPRECATE=1 -D_CRT_NONSTDC_NO_DEPRECATE=1 -DWINVER=0x500 -D_WIN32_WINNT=0x500 -D_WIN32_IE=0x0500 -DX_DISPLAY_MISSING=1 -DMOZILLA_VERSION=\\\"1.9.1b1pre\\\" -DMOZILLA_VERSION_U=1.9.1b1pre -DHAVE_SNPRINTF=1 -D_WINDOWS=1 -D_WIN32=1 -DWIN32=1 -DXP_WIN=1 -DXP_WIN32=1 -DHW_THREADS=1 -DSTDC_HEADERS=1 -DWIN32_LEAN_AND_MEAN=1 -DNO_X11=1 -DHAVE_MMINTRIN_H=1 -DHAVE_OLEACC_IDL=1 -DHAVE_ATLBASE_H=1 -DHAVE_WPCAPI_H=1 -D_X86_=1 -DD_INO=d_ino -DMOZ_EMBEDDING_LEVEL_DEFAULT=1 -DMOZ_EMBEDDING_LEVEL_BASIC=1 -DMOZ_EMBEDDING_LEVEL_MINIMAL=1 -DMOZ_PHOENIX=1 -DMOZ_BUILD_APP=browser -DMOZ_XUL_APP=1 -DMOZ_DEFAULT_TOOLKIT=\\\"cairo-windows\\\" -DMOZ_DISTRIBUTION_ID=\\\"org.mozilla\\\" -DOJI=1 -DIBMBIDI=1 -DMOZ_VIEW_SOURCE=1 -DACCESSIBILITY=1 -DMOZ_XPINSTALL=1 -DMOZ_JSLOADER=1 -DNS_PRINTING=1 -DNS_PRINT_PREVIEW=1 -DMOZ_NO_XPCOM_OBSOLETE=1 -DMOZ_OGG=1 -DMOZ_MEDIA=1 -DMOZ_XTF=1 -DMOZ_CRASHREPORTER=1 -DMOZ_CRASHREPORTER_ENABLE_PERCENT=100 -DMOZ_MATHML=1 -DMOZ_ENABLE_CANVAS=1 -DMOZ_SVG=1 -DMOZ_UPDATE_CHANNEL=default -DMOZ_PLACES=1 -DMOZ_FEEDS=1 -DMOZ_STORAGE=1 -DMOZ_SAFE_BROWSING=1 -DMOZ_URL_CLASSIFIER=1 -DMOZ_LOGGING=1 -DMOZ_USER_DIR=\\\"Mozilla\\\" -DMOZ_ENABLE_LIBXUL=1 -DMOZ_TREE_CAIRO=1 -DHAVE_UINT64_T=1 -DMOZ_XUL=1 -DMOZ_PROFILELOCKING=1 -DMOZ_RDF=1 -DMOZ_MORKREADER=1 -DMOZ_DLL_SUFFIX=\\\".dll\\\" -DJS_THREADSAFE=1 -DNDEBUG -DTRIMMED $i > $dest; \\\ndone\n\n\nThe build works correctly locally on at least Windows and Linux, and I\'m not sure what I\'m doing wrong which causes the try server builds not to include this component. Can anyone see what is going wrong here?',0.00,0,0,3779609,0,NULL,0),(248970,200920,'2008-09-15 00:39:55','A suggestion from another bug where patches were only working locally:\n\"are you creating new interfaces? If so, did you add the .xpt files to\nthe packaging manifests? If not, then that could be why things fail on packaged\nbuilds but not your local builds.\"',0.00,0,0,3779651,0,NULL,0),(248970,76551,'2008-09-15 00:49:19','The only error I can see on OS X while toggling between the states is following entry:\n\nError: key is null\nSource File: file:///Volumes/Minefield/Minefield.app/Contents/MacOS/components/nsUrlClassifierLib.js\nLine: 1173\n\nWhich is:\n\nPROT_UrlCryptoKeyManager.prototype.unUrlSafe = function(key)\n{\n--> return key.replace(\"-\", \"+\").replace(\"_\", \"/\");\n}\n\n\nOn Windows XP I also cannot see the given errors and don\'t have Vista by hand for further tests until Thursday. But what I\'ve recognized is that there is no dialog when entering the private browsing mode. I don\'t think that it is expected.\n\nFurther one more question: Why the private browsing mode is not sticky? After a restart it\'s still unset again. I believe in environments where this mode will be used at any time (e.g. internet cafe\'s) it will be a hassle to have to manually switch into this mode again and again.',0.00,0,0,3779653,0,NULL,0),(248970,251051,'2008-09-15 01:31:17','(In reply to comment #219)\n> A suggestion from another bug where patches were only working locally:\n> \"are you creating new interfaces? If so, did you add the .xpt files to\n> the packaging manifests? If not, then that could be why things fail on packaged\n> builds but not your local builds.\"\n\nHmm, I am adding a new interface, and I think this might be the culprit. Thanks for your suggestion. I\'ll post an updated patch shortly.',0.00,0,0,3779673,0,NULL,0),(248970,251051,'2008-09-15 01:45:11','(In reply to comment #220)\n> The only error I can see on OS X while toggling between the states is following\n> entry:\n> \n> Error: key is null\n> Source File:\n> file:///Volumes/Minefield/Minefield.app/Contents/MacOS/components/nsUrlClassifierLib.js\n> Line: 1173\n> \n> Which is:\n> \n> PROT_UrlCryptoKeyManager.prototype.unUrlSafe = function(key)\n> {\n> --> return key.replace(\"-\", \"+\").replace(\"_\", \"/\");\n> }\n\nI get this as well, and I haven\'t looked into it. Looks like somehow this component responds to the notifications it should ignore. Anyway this doesn\'t prevent the patch from functioning.\n\n> On Windows XP I also cannot see the given errors and don\'t have Vista by hand\n> for further tests until Thursday. But what I\'ve recognized is that there is no\n> dialog when entering the private browsing mode. I don\'t think that it is\n> expected.\n\nYes, on XP no error is logged to the console, but the component and the interface are not registered (which can be verified by examining Components.classes/Components.interfaces in the error console).\n\n> Further one more question: Why the private browsing mode is not sticky? After a\n> restart it\'s still unset again. I believe in environments where this mode will\n> be used at any time (e.g. internet cafe\'s) it will be a hassle to have to\n> manually switch into this mode again and again.\n\nI\'m not sure if we want to preserve this across sessions (it makes it easy for someone to know if you\'ve been in private mode last time you closed Firefox or not) but I think we can add a pref to initiate the private mode each time Firefox starts automatically.',0.00,0,0,3779680,0,NULL,0),(248970,251051,'2008-09-15 01:47:59','This is the same as 2.5, only with the xpt file being added to the installer packaging manifests. I\'m not sure if this causes nsPrivateBrowsingService.js to appear in the components folder in try server builds, though. Can someone please submit this to try server?',0.00,0,0,3779683,5,'338599',0),(248970,251051,'2008-09-15 01:51:10','Oops, please ignore the previous patch; I forgot to \"hg add\" the new files... This one should be correct.',0.00,0,0,3779685,5,'338601',0),(248970,152642,'2008-09-15 02:34:50','Is there any plans to handle Flash shared objects at this point or will it be\nimplemented afterwards? Does\nhttps://bugzilla.mozilla.org/show_bug.cgi?id=290456 cover this or should a\nseparate bug be filled for private browsing mode case?\n\nIn any case, I see two possible solutions: \n1) Clear shared objects afterwards when user leaves the private browsing mode\n2) Change Flash Player security settings to temporarily block shared objects. I\nthink these can be adjusted by setting variables in Flash\nPlayer\\macromedia.com\\support\\flashplayer\\sys\\settings.sol\nOption 2 would honor the \"Don\'t write to disk\" principle.',0.00,0,0,3779718,0,NULL,0),(248970,76551,'2008-09-15 04:39:37','Ehsan, the try server build failed. Looks like your patch is bitrotted:\nhttp://tinderbox.mozilla.org/showlog.cgi?log=MozillaTry/1221476657.1221476875.32211.gz',0.00,0,0,3779819,0,NULL,0),(248970,251051,'2008-09-15 05:28:57','(In reply to comment #225)\n> Is there any plans to handle Flash shared objects at this point or will it be\n> implemented afterwards? Does\n> https://bugzilla.mozilla.org/show_bug.cgi?id=290456 cover this or should a\n> separate bug be filled for private browsing mode case?\n\nI think it would be better to file a new bug, since that bug covers the sanitizer module.\n\n> In any case, I see two possible solutions: \n> 1) Clear shared objects afterwards when user leaves the private browsing mode\n> 2) Change Flash Player security settings to temporarily block shared objects. I\n> think these can be adjusted by setting variables in Flash\n> Player\\macromedia.com\\support\\flashplayer\\sys\\settings.sol\n> Option 2 would honor the \"Don\'t write to disk\" principle.\n\nAre there documents from Adobe available that show how to do the second option in a cross-platform manner?',0.00,0,0,3779855,0,NULL,0),(248970,251051,'2008-09-15 05:30:55','(In reply to comment #226)\n> Ehsan, the try server build failed. Looks like your patch is bitrotted:\n> http://tinderbox.mozilla.org/showlog.cgi?log=MozillaTry/1221476657.1221476875.32211.gz\n\nHere\'s the unbitrotted patch diffed against the latest pulled hg trunk. Can you submit it again? Thanks! :-)',0.00,0,0,3779856,5,'338622',0),(248970,103593,'2008-09-15 06:42:12','The latest patch doesn\'t contain the packages-static changes. You\'ll need to add nsPrivateBrowsingService.js to packages-static as well (see other JS components listed in that file).',0.00,0,0,3779935,0,NULL,0),(248970,251051,'2008-09-15 06:51:41','(In reply to comment #229)\n> The latest patch doesn\'t contain the packages-static changes. You\'ll need to\n> add nsPrivateBrowsingService.js to packages-static as well (see other JS\n> components listed in that file).\n\nYou\'re right. New patch forthcoming. Hope I get it right this time... :-/',0.00,0,0,3779944,6,'338622',0),(248970,251051,'2008-09-15 07:02:20','OK, this should be the right patch... ;-)',0.00,0,0,3779957,5,'338639',0),(248970,297995,'2008-09-15 14:16:15','Till this gets to the tryserver... I took the liberty of uploading my own builds with this patch applied (builds are available for Windows only, sorry no cross-compiler;):\n\nfirefox.zip: https://www.yousendit.com/download/bVlCcHBLUEM1R05MWEE9PQ\n.exe: http://www.yousendit.com/download/bVlCcHBFNXZUME9Ga1E9PQ\n\nOnly 100 downloads though so get to it! Great new feature, big fan of the work being done here, thanks alot.',0.00,0,0,3780641,0,NULL,0),(248970,240353,'2008-09-15 14:45:49','i think that this could get better advantages of the changes we are experimenting in Places for fsync stuff, we will already have a memory table to hold places and history, and you could move using them.\n\nYour patch has probably some issue on Places as it is, i did not read it all but if i read it correctly you don\'t allow adding places into moz_places returning always false to canAddURI. but then you save visits in a new table (that should be a TEMP one i think), but those visits will be orphans without a place. Also you\'re not ensuring to not add datas to annotations and inputhistory tables.\nSo you\'re practically removing places during private browsing, and that could make awesomebar/bookmarks and so on unusable while using it (usable only on old entries). Instead they should be correct until you\'re in private browsing, then clear all private data on exiting private mode.\nAlso what happens if a user wants to add a bookmark in private mode? probably we should still hold it since he explicitely asked to remember that site.\n\nI have some ideas about this, so feel free to nag me on IRC if you want, sorry if i did not catch everything about your changes',0.00,0,0,3780683,0,NULL,0),(248970,297995,'2008-09-15 16:55:45','Some notes:\nWith private browsing enabled I get the following error: Error: key is null\nSource File: file:///C:/Users/Natch/Documents/mozilla_trunk/mozilla-central__release/dist/bin/components/nsUrlClassifierLib.js\nLine: 1173\nAlso right-click bookmark a link is broken in private mode, the panel shows up on the left. I\'ve seen other errors related to places stuff, though I haven\'t repro\'d them reliably yet...',0.00,0,0,3780881,0,NULL,0),(248970,251051,'2008-09-15 23:17:39','(In reply to comment #234)\n> Some notes:\n> With private browsing enabled I get the following error: Error: key is null\n> Source File:\n> file:///C:/Users/Natch/Documents/mozilla_trunk/mozilla-central__release/dist/bin/components/nsUrlClassifierLib.js\n> Line: 1173\n\nI filed this as bug 455454, and attached a patch there to solve that problem.\n\n> Also right-click bookmark a link is broken in private mode, the panel shows up\n> on the left. I\'ve seen other errors related to places stuff, though I haven\'t\n> repro\'d them reliably yet...\n\nIs the placement of the panel the problem you\'re mentioning? If so, that\'s where it appears normally, I think. I guess Marco\'s comments (comment 233) might explain a bit of the problems you might have been experiencing in the private mode with Places.\n\nI\'ll ping him on IRC for more info; in-memory tables look really interesting!',0.00,0,0,3781180,0,NULL,0),(248970,76551,'2008-09-15 23:29:13','(In reply to comment #231)\n> Created an attachment (id=338639) [details]\n> Patch (v2.6)\n> \n> OK, this should be the right patch... ;-)\n\nAnd here the appropriate try server builds:\nhttps://build.mozilla.org/tryserver-builds/2008-09-15_15:23-mozilla@hskupin.info-bug248970/',0.00,0,0,3781185,0,NULL,0),(248970,46449,'2008-09-16 01:14:41','For Content Preferences this doesn\'t follow the Wiki as it won\'t update an existing pref.\n\n> Site Specific Prefs\n>\n> * Nothing special for enter/exit\n> * During, we will not remember new entries, but will update existing ones. In current known usage (only used for zoom in Firefox) this is not a data leak. It is possible for extension uses to leak some data here, but there\'s a lot of things extension authors can do wrong.\n> o This effectively means that setPref() will fail if hasPref() is false. This will likely be a silent failure so as to not throw for existing callers. \n\nPresumably changing to something like\n\n> setPref: function ContentPrefService_setPref(aURI, aName, aValue) {\n> // If the pref is already set to the value, there\'s nothing more to do.\n> + // If we are in private browsing mode, refuse to set the pref\n> var currentValue = this.getPref(aURI, aName);\n> - if (typeof currentValue != \"undefined\" && currentValue == aValue)\n> + if (typeof currentValue != \"undefined\" ? currentValue == aValue : this._inPrivateBrowsing)\n> return;\n\n[possibly something more readable though!]',0.00,0,0,3781251,0,NULL,0),(248970,251051,'2008-09-16 02:48:13','(In reply to comment #237)\n> For Content Preferences this doesn\'t follow the Wiki as it won\'t update an\n> existing pref.\n\nThis was changed after I implemented the content prefs part. This new patch corrects the implementation in a way similar to what you suggested.',0.00,0,0,3781347,5,'338836',0),(248970,161650,'2008-09-16 06:23:47','Probably not related but thought I\'d report with the latest build from the tryserver I am getting browser crashes when I visit www.neowin.net with the tracemonkey JIT content \'enabled\'. \n\nThe official nightly does not crash. Sorry, breakpad did not kick in either. (but that\'s a known, ongoing issue with flash player)',0.00,0,0,3781503,0,NULL,0),(248970,251051,'2008-09-16 06:32:30','(In reply to comment #239)\n> Probably not related but thought I\'d report with the latest build from the\n> tryserver I am getting browser crashes when I visit www.neowin.net with the\n> tracemonkey JIT content \'enabled\'. \n> \n> The official nightly does not crash. Sorry, breakpad did not kick in either.\n> (but that\'s a known, ongoing issue with flash player)\n\nWhat platform are you on? Maybe it\'s something changed after the latest nightly was built, can you check an hourly? I\'m not sure what may cause the crash here, and I can\'t reproduce it here. Can others try this as well?',0.00,0,0,3781512,0,NULL,0),(248970,161650,'2008-09-16 06:50:39','I\'m on Win32 Vista HP SP1 using today\'s official nightly:\n\nMozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre) Gecko/20080916043910 Minefield/3.1b1pre Firefox/3.0 ID:20080916043910\n\nAre there nightly\'s on the tryserver ? \nI was using this build when I was crashing:\nhttps://build.mozilla.org/tryserver-builds/2008-09-15_15:23-mozilla@hskupin.info-bug248970/',0.00,0,0,3781524,0,NULL,0),(248970,251051,'2008-09-16 07:00:25','(In reply to comment #241)\n> I\'m on Win32 Vista HP SP1 using today\'s official nightly:\n> \n> Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre)\n> Gecko/20080916043910 Minefield/3.1b1pre Firefox/3.0 ID:20080916043910\n> \n> Are there nightly\'s on the tryserver ? \n> I was using this build when I was crashing:\n> https://build.mozilla.org/tryserver-builds/2008-09-15_15:23-mozilla@hskupin.info-bug248970/\n\nI don\'t get a crash (or anything unusual) when visiting neowin\'s home page neither in private mode or usual mode on XP SP2. I have flashplayer 9.0.124.0. Can you try an hourly? What about the previous try server builds on this bug?',0.00,0,0,3781537,0,NULL,0),(248970,161650,'2008-09-16 07:05:51','I can try an hourly build when the next one comes out, about 20-30 mins. \n\nThe build I noted above, was the first build I saw on the tryserver where Private mode actually worked, previous builds did not seem to enter Private-mode. \n\nI was crashing on NeoWin whether I was in Private mode or Normal mode. \n\nI was just wondering if part of the JIT/Tracemonkey stuff was maybe not in the build on the tryserver test builds ? \n\nIf there are hourly builds for this bug could you point me to one? I thought they were all hand-made...',0.00,0,0,3781542,0,NULL,0),(248970,161650,'2008-09-16 07:24:13','No crash on NeoWin with latest \'official hourly\' from here:\nhttp://ftp.mozilla.org/pub/mozilla.org/firefox/tinderbox-builds/mozilla-central-win32/1221568388/\n\nThis build or course does not have the InPriv patch -',0.00,0,0,3781578,0,NULL,0),(248970,161650,'2008-09-16 08:00:29','Using test build of InPriv:\nMozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre) Gecko/20080915154629 Minefield/3.1b1pre Firefox/3.0 ID:20080915154629\n\nBookmarking a page while in Private mode saves the bookmark. I can see the bookmark I added after \'exit\' from Private mode.',0.00,0,0,3781643,0,NULL,0),(248970,251051,'2008-09-16 08:27:45','(In reply to comment #245)\n> Bookmarking a page while in Private mode saves the bookmark. I can see the\n> bookmark I added after \'exit\' from Private mode.\n\nThis is the expected behavior: the bookmark should be saved, but no visit to the bookmarked site should be recorded. See for more info.',0.00,0,0,3781699,0,NULL,0),(248970,251051,'2008-09-16 08:39:29','(In reply to comment #243)\n> I can try an hourly build when the next one comes out, about 20-30 mins. \n> \n> The build I noted above, was the first build I saw on the tryserver where\n> Private mode actually worked, previous builds did not seem to enter\n> Private-mode. \n\nAnyway, since you mention you got crashes both in private and normal mode, it makes sense to look into previous builds, I think. If the crashes stop at a particular build, we can assume it\'s something I did between those revisions of the patch, and tracking it would be far simpler.\n\nFWIW, I tested this both using Henrik\'s build, and my local build on Vista, neither crashed NeoWin...\n\n> I was just wondering if part of the JIT/Tracemonkey stuff was maybe not in the\n> build on the tryserver test builds ? \n\nI don\'t think so. And there\'s nothing I do in the patch which touches any Tracemonkey stuff either.\n\n> If there are hourly builds for this bug could you point me to one? I thought\n> they were all hand-made...\n\nNo, I meant the trunk hourly builds. Sorry for the confusion.',0.00,0,0,3781721,0,NULL,0),(248970,240353,'2008-09-16 08:43:58','(In reply to comment #246)\n> This is the expected behavior: the bookmark should be saved, but no visit to\n> the bookmarked site should be recorded.\n\ninteresting, you don\'t have a place and canAddURI return false (so you should not be able to add one), but using insertBookmark canAddURI is not checked, and a new place is added. I guess if this was done by design or we miss a check in getUrlIdFor.',0.00,0,0,3781729,0,NULL,0),(248970,161650,'2008-09-16 08:54:10','I don\'t know what else to do, I don\'t crash with the \'official\' builds. I guess we will see what happens when it finally makes it into the M-C official builds.',0.00,0,0,3781745,0,NULL,0),(248970,161650,'2008-09-16 08:58:03','When entering Private Mode the cursor is not focused in the LocationBar. I would think this would be nice, as in normal op\'s when opening a \'blank\' window the cursor is focued there.',0.00,0,0,3781754,0,NULL,0),(248970,251051,'2008-09-16 09:00:43','(In reply to comment #248)\n> interesting, you don\'t have a place and canAddURI return false (so you should\n> not be able to add one), but using insertBookmark canAddURI is not checked, and\n> a new place is added. I guess if this was done by design or we miss a check in\n> getUrlIdFor.\n\nI carefully made sure that getUrlIdFor is not affected by the private browsing mode. As far as I know, there are three places where getUrlIdFor is called with auto create mode turned on:\n\n * when creating bookmarks (which we should allow in private mode)\n * when creating favicons (which we shouldn\'t allow in private mode, and my patch handles it now)\n * when creating annotations.\n\nI\'m not really sure about what Places annotations mean, and where (in the UI) they are used, so I was not sure whether I need to turn off creating them in the private mode. Any hints on that would be greatly appreciated.',0.00,0,0,3781763,0,NULL,0),(248970,251051,'2008-09-16 09:09:45','(In reply to comment #249)\n> I don\'t know what else to do, I don\'t crash with the \'official\' builds. I\n> guess we will see what happens when it finally makes it into the M-C official\n> builds.\n\nAre you using a new profile or an already existing one? If the latter, can you try with a clean profile?\n\nAlso, can you disable your plugins one by one and see if the crashes happen with all of them disabled?\n\n(In reply to comment #250)\n> When entering Private Mode the cursor is not focused in the LocationBar. I\n> would think this would be nice, as in normal op\'s when opening a \'blank\' window\n> the cursor is focued there.\n\nHmmm, I think this should be handled by browser.js automatically when a new window is opened, but I may be wrong. I\'ll need to check this, but at least I can confirm this problem here as well. :-)',0.00,0,0,3781769,0,NULL,0),(248970,161650,'2008-09-16 09:23:08','I\'ve been testing with an existing profile. Just created a new one, no addons, no bookmarks. Still crashes, and continues to crash when loading www.neowin.net even with all the plugins \'disabled\'. \n\nJIT content is not enabled by \'default\' yet.. are you sure you have it set to \'true\' ? \n\nabout:config\njavascript.options.jit.content Value=true\n\nI won\'t have time for anymore testing today..will catch up tomorrow.',0.00,0,0,3781791,0,NULL,0),(248970,251051,'2008-09-16 09:37:27','(In reply to comment #253)\n> I\'ve been testing with an existing profile. Just created a new one, no addons,\n> no bookmarks. Still crashes, and continues to crash when loading\n> www.neowin.net even with all the plugins \'disabled\'. \n> \n> JIT content is not enabled by \'default\' yet.. are you sure you have it set to\n> \'true\' ? \n\nYes.\n\nI\'m CCing some TraceMonkey gurus to see if they can help (read comment 239 onwards).',0.00,0,0,3781816,0,NULL,0),(248970,154309,'2008-09-16 09:55:42','I get the same crash on www.neowin.net (Windows XP).',0.00,0,0,3781851,0,NULL,0),(248970,76551,'2008-09-16 13:58:58','Jim and Ria, could one of you try to get the stack trace with Windbg?\n\nhttp://developer.mozilla.org/en/How_to_get_a_stacktrace_with_WinDbg',0.00,0,0,3782278,0,NULL,0),(248970,251051,'2008-09-16 14:24:15','This test fixes a problem with half-renaming a pref, and adds a unit test for cookies, according to .\n\nOne thing I ran into problems with was running the nsICookieManager2.cookieExists method through the test. cookieExists causes xpcshell to crash. I\'m not sure, but I think the crash may be because of the fact that the C++ implementation of cookieExists actually expects an nsCookie parameter, but since this method is not marked as noscript, I suspected that there may be something I\'m missing. Anyone can shed some light into this?\n\nI had to disable the is_cookie_available2 checks for now because of the crash.',0.00,0,0,3782340,5,'338946',0),(248970,233280,'2008-09-16 14:37:05','(In reply to comment #257)\n> One thing I ran into problems with was running the\n> nsICookieManager2.cookieExists method through the test. cookieExists causes\n> xpcshell to crash. I\'m not sure, but I think the crash may be because of the\n> fact that the C++ implementation of cookieExists actually expects an nsCookie\n> parameter, but since this method is not marked as noscript, I suspected that\n> there may be something I\'m missing. Anyone can shed some light into this?\nThat would indeed crash. Can you file a bug on that please - the cookie service shouldn\'t assume it\'s an nsCookie.',0.00,0,0,3782370,0,NULL,0),(248970,251051,'2008-09-16 15:17:23','(In reply to comment #258)\n> That would indeed crash. Can you file a bug on that please - the cookie\n> service shouldn\'t assume it\'s an nsCookie.\n\nDone: bug 455598. I attached a patch on that bug to fix this issue. With that patch applied, the is_cookie_available2 checks in my test can be enabled, and the test correctly passes.',0.00,0,0,3782428,0,NULL,0),(248970,161650,'2008-09-17 03:42:44','(In reply to comment #256)\n> Jim and Ria, could one of you try to get the stack trace with Windbg?\n> \n> http://developer.mozilla.org/en/How_to_get_a_stacktrace_with_WinDbg\n\nWouldn\'t you know it, its not crashing today...if it comes up again, I\'ll try and get a trace with WinDbg.',0.00,0,0,3782946,0,NULL,0),(248970,251051,'2008-09-17 13:10:01','What\'s new:\n\n * Now that the fix for bug 455598 landed, I enabled the nsICookieManager2.cookieExists tests in the cookies unit test. Now, the cookie test follows the test plan exactly.\n * The previous patch had an oversight in the cookies unit test which caused it not to test the private browsing mode at all (duh!); fixed in this patch.\n * Added the unit test for content prefs, according to the test plan.\n * Added the browser UI test for passwordmgr, according to the test plan.\n * I tried to address the latest changes regarding passwordmgr in the functional spec as well (to enable filling of the HTTP auth dialog) and I noticed a strange problem:\n\nIf, while initiating the private browsing mode, I choose to keep the current session open, everything\'s cool. If, however, I choose to save and close the session, the auth dialog turns up empty. After enabling signon.debug, I noticed a couple of these messages which indicated that the username and password pair could not be decrypted:\n\nPwMgr mozStorage: Failed to decrypt string: MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECKifd14qd4yXBAhGB3/m2HDvtA== (NS_ERROR_FAILURE)\n\nI tried running the below code in the error console, and it also failed with NS_ERROR_FAILURE:\n\nComponents.classes[\"@mozilla.org/security/sdr;1\"].\ngetService(Components.interfaces.nsISecretDecoderRing).\ndecryptString(\"MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECKifd14qd4yXBAhGB3/m2HDvtA==\")\n\nI also tried opening the password manager, and it was empty as well. I\'m not sure how saving and closing the session could affect the SecretDecoderRing service. Does anyone have any ideas?',0.00,0,0,3783606,5,'339117',0),(248970,27780,'2008-09-17 13:52:43','You\'re most likely running into bug 437904. I\'ll try to investigate what\'s going on there; shouldn\'t be related to anything you\'re doing.',0.00,0,0,3783681,0,NULL,0),(248970,251051,'2008-09-17 14:34:11','(In reply to comment #262)\n> You\'re most likely running into bug 437904. I\'ll try to investigate what\'s\n> going on there; shouldn\'t be related to anything you\'re doing.\n\nLooks related (I\'m clearing the authenticated sessions upon entering the private browsing mode) but in this case, whether or not the user decides to save and close her current session affects the results...\n\nI\'d appreciate if you can take a deeper look and see if you can find something which my eyes have missed.',0.00,0,0,3783767,0,NULL,0),(248970,76551,'2008-09-17 14:49:22','(In reply to comment #262)\n> You\'re most likely running into bug 437904. I\'ll try to investigate what\'s\n> going on there; shouldn\'t be related to anything you\'re doing.\n\nThat\'s true. Even without the patch running the above command in the Error Console throws this exception.\n\nEhsan, I\'ve started a new try server build. Please have a look at the tinderbox site when it will be finished. I\'m offline now.\n\nhttp://tinderbox.mozilla.org/showbuilds.cgi?tree=MozillaTry',0.00,0,0,3783785,0,NULL,0),(248970,251051,'2008-09-17 15:01:11','(In reply to comment #264)\n> That\'s true. Even without the patch running the above command in the Error\n> Console throws this exception.\n\nNo, that doesn\'t happen here. I guess the exception you\'re observing is caused by the fact that the encrypted string can\'t be decrypted with the key on your machine. You can obtain an encrypted string for use in that code by looking into the passwords sqlite db, I guess (or reproducing the failure I observed with signon.debug turned on).\n\n> Ehsan, I\'ve started a new try server build. Please have a look at the tinderbox\n> site when it will be finished. I\'m offline now.\n> \n> http://tinderbox.mozilla.org/showbuilds.cgi?tree=MozillaTry\n\nThanks, I\'ll try to keep an eye on it if I\'m awake by the time it finishes (it\'s 2:30AM here), or check it tomorrow morning. :-)',0.00,0,0,3783796,0,NULL,0),(248970,76551,'2008-09-17 21:52:54','New try server build is available here:\nhttps://build.mozilla.org/tryserver-builds/2008-09-17_14:48-mozilla@hskupin.info-bug248970v2.8/',0.00,0,0,3784119,0,NULL,0),(248970,251051,'2008-09-17 23:18:42','Linux build was unsuccessful, but I doubt it had anything to do with the patch . Windows talos was orange with the error \"previous cycle still running\", and I\'m not sure what that means (seems like many other patches caused an orange win32 talos with the same error message) .',0.00,0,0,3784156,0,NULL,0),(248970,240353,'2008-09-18 02:06:43','(In reply to comment #251)\n> I\'m not really sure about what Places annotations mean, and where (in the UI)\n> they are used, so I was not sure whether I need to turn off creating them in\n> the private mode. Any hints on that would be greatly appreciated.\n\nAnnotations are notes that can be added by us or an extension developer to urls or bookmarks, so it can contain any data, personal or uri related data too (it depends on how the implementer uses it).\nThe main problem here is with page annotations, mainly because if an extension adds a page annotation during private browsing and the place_id does not exist we would probably try to add anno for place_id = -1 since you don\'t have a place.\nYou should probably early return in nsAnnotationService::SetPageAnnotation while in private browsing mode for now, or check for place id validity later (better handling could be done though).\n\nabout moz_inputhistory you should early return in nsNavHistory::AutoCompleteFeedback se we will not save what urls user has choosen in the awesomebar after searching for a certain text.',0.00,0,0,3784265,0,NULL,0),(248970,297995,'2008-09-18 15:48:22','A few notes:\nDownload Manager is broken in private browsing mode, although files to get downloaded the DM cannot (and perhaps should not, but it should be notified of PB) tell you the progress of the download, also I stumbled across these errors:\nError: [Exception... \"Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsITransfer.onProgressChange64]\" nsresult: \"0x8000ffff (NS_ERROR_UNEXPECTED)\" location: \"JS frame :: chrome://global/content/contentAreaUtils.js :: anonymous :: line 138\" data: no]\nSource File: chrome://global/content/contentAreaUtils.js\nLine: 138\nWhen completing the download:\nError: download is null\nSource File: chrome://mozapps/content/downloads/DownloadProgressListener.js\nLine: 78\nWhen hitting the [x] on the download:\nError: uncaught exception: [Exception... \"Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsIDownloadManager.cancelDownload]\" nsresult: \"0x8000ffff (NS_ERROR_UNEXPECTED)\" location: \"JS frame :: chrome://mozapps/content/downloads/downloads.js :: cancelDownload :: line 181\" data: no]\n\nI was using private browsing in \"keep my current session\" mode, if that helps at all.',0.00,0,0,3785294,0,NULL,0),(248970,297995,'2008-09-18 16:16:27','(In reply to comment #269)\nCorrection: Either I\'ll get that or the DM works fine, but on exit the DM retains the download data, from the wiki it seems the downloads should be reloaded from pre-PB mode. Also not the downloads aren\'t recorded in history (correctly).',0.00,0,0,3785329,0,NULL,0),(248970,299942,'2008-09-18 16:57:48','Hi,\n\nI am a student looking into writing and or collaborating on unit tests for the patches you guys are submitting for private browsing mode.\n\nCan someone direct me to or simply list the aspect(s) of Private Browsing mode that need testing (unit tests).\n\nFor example, Ehsan, I see you have listed some cases & testing areas - here \nhttps://wiki.mozilla.org/User:Ehsan/PrivateBrowsingTests#Unit_Tests\n\nAre they in order of priority?\n\nI\'d appreciate any feedback, \nThanks.\n\n- AaronMT',0.00,0,0,3785379,0,NULL,0),(248970,251051,'2008-09-19 01:09:04','(In reply to comment #270)\n> (In reply to comment #269)\n> Correction: Either I\'ll get that or the DM works fine, but on exit the DM\n> retains the download data, from the wiki it seems the downloads should be\n> reloaded from pre-PB mode. Also not the downloads aren\'t recorded in history\n> (correctly).\n\nCan you reproduce this in a clean profile? I can\'t reproduce it here. What happens is that while the file is being downloaded, its progress should appear in the download manager, and when it\'s finished, it should be removed from the download manager. I don\'t get errors on the console either... Anyway, the functional spec has laid out new requirements for the download manager, so its implementation will change in the future revisions of my patch.',0.00,0,0,3785661,0,NULL,0),(248970,251051,'2008-09-19 01:21:19','(In reply to comment #271)\nAaron: thanks for your interest in helping out! :-)\n\nThe current test plan is being written by mconnor . From the tests listed there, there are two which are not completed yet (I\'ve marked the completed ones with a star next to their title). I\'ve a half-baked test for the unit tests section of the password manager, so that leaves out the history unit tests, which you can pick up to work on.\n\nAnother thing which needs testing is the private browsing service itself. There is also an API for extensions which needs unit tests . It would be great if you can add a test plan for testing the APIs to , and start working on them as well.\n\nPlease let me know if you need any help (preferably via email, since this bug is already too huge).\n\nThanks!',0.00,0,0,3785664,0,NULL,0),(248970,251051,'2008-09-19 04:41:38','(In reply to comment #268)\n> Annotations are notes that can be added by us or an extension developer to urls\n> or bookmarks, so it can contain any data, personal or uri related data too (it\n> depends on how the implementer uses it).\n\nThanks for the explanation.\n\n> The main problem here is with page annotations, mainly because if an extension\n> adds a page annotation during private browsing and the place_id does not exist\n> we would probably try to add anno for place_id = -1 since you don\'t have a\n> place.\n> You should probably early return in nsAnnotationService::SetPageAnnotation\n> while in private browsing mode for now, or check for place id validity later\n> (better handling could be done though).\n\nWhat about the typed versions of SetPageAnnotation? They can be called through the nsIAnnotationService interface. I guess a good solution here would be to change nsAnnotationService::GetPlaceIdForURI to ignore the auto create parameter if we\'re in the private browsing mode, and handle that case gracefully in all of its callers with auto create mode set. Do you agree?\n\n> about moz_inputhistory you should early return in\n> nsNavHistory::AutoCompleteFeedback se we will not save what urls user has\n> choosen in the awesomebar after searching for a certain text.\n\nThanks for mentioning this. The next revision of the patch will include this change.',0.00,0,0,3785784,0,NULL,0),(248970,251051,'2008-09-19 05:17:18','(In reply to comment #208)\n> * Instead of saving/restoring the list of closed tabs for all windows, I\'d\n> rather tag all tabs closed during private browsing mode and then just purge\n> these when private browsing is over.\n\nSimon: I tried to give this approach a shot, but it won\'t work, since we trim the _closedTabs array by max_tabs_undo all the time, so it\'s possible for some items in that array to get lost while in private mode, so after leaving this mode, the entire list as it was prior to entering this mode cannot be restored.',0.00,0,0,3785812,0,NULL,0),(248970,160571,'2008-09-19 06:07:11','(In reply to comment #275)\n> it\'s possible for some items in that array to get lost while in private mode,\n\nActually, I wouldn\'t expect all the closed tabs to be still around after having used PB mode in a pre-existing window, in the same way as you don\'t expect the very same tabs to be around when you exit PB mode (you don\'t restore those to their original content, if the user didn\'t choose to close the original windows, do you?). So reducing or even completely clearing the list of recently closed tabs seems alright to me - otherwise you could reopen a tab in PB mode and reopen that same tab again after exiting PB mode, which strikes me as kind of odd.',0.00,0,0,3785873,0,NULL,0),(248970,251051,'2008-09-19 07:08:11','(In reply to comment #276)\n> Actually, I wouldn\'t expect all the closed tabs to be still around after having\n> used PB mode in a pre-existing window, in the same way as you don\'t expect the\n> very same tabs to be around when you exit PB mode (you don\'t restore those to\n> their original content, if the user didn\'t choose to close the original\n> windows, do you?).\n\nNo, we don\'t, but come to think of it, maybe we should? Mconnor: what do you think?\n\n> So reducing or even completely clearing the list of recently\n> closed tabs seems alright to me - otherwise you could reopen a tab in PB mode\n> and reopen that same tab again after exiting PB mode, which strikes me as kind\n> of odd.\n\nWhat about the case where user chooses to open a new window to for the private browsing mode, and save and close her current session?',0.00,0,0,3785946,0,NULL,0),(248970,240353,'2008-09-19 07:23:04','(In reply to comment #274)\n> What about the typed versions of SetPageAnnotation? They can be called through\n> the nsIAnnotationService interface. I guess a good solution here would be to\n> change nsAnnotationService::GetPlaceIdForURI to ignore the auto create\n> parameter if we\'re in the private browsing mode, and handle that case\n> gracefully in all of its callers with auto create mode set. Do you agree?\n\nWell i could agree, notice that Shawn is trying to land the fsync stuff in these days (he will probably retry today), means that if things appear good (no build boxes failures and timings) you could move posting your visits/places into the temp tables, in that case the auto create change would not be useful because you could have a place already (hwv if i read code correctly we are not using the autoCreate actually).\nBut i suppose that GetPlaceIdForURI is still a good place to start hacking, in future you could change it to return -1 if the page is \"private\" and handle that case in type specific methods, and for now you can do the same, return -1 if in private mode and handle that.',0.00,0,0,3785972,0,NULL,0),(248970,160571,'2008-09-19 08:49:57','(In reply to comment #277)\n> What about the case where user chooses to open a new window to for the private\n> browsing mode, and save and close her current session?\n\nNot closing any tabs in a pre-existing window won\'t modify the list of recently closed tabs, so you\'ll get the expected behavior. And closing/restoring all windows before entering/after exiting PB mode will restore the list of recently closed tabs with the windows, again as expected.',0.00,0,0,3786054,0,NULL,0),(248970,251051,'2008-09-20 04:33:38','(In reply to comment #278)\n> Well i could agree, notice that Shawn is trying to land the fsync stuff in\n> these days (he will probably retry today), means that if things appear good (no\n> build boxes failures and timings) you could move posting your visits/places\n> into the temp tables, in that case the auto create change would not be useful\n\nI guess in that case, we could in fact not turns off anything in nsNavHistory, and just have everything use the temp tables, instead of the on-disk ones, right?\n\nBy the way, I\'m not sure what APIs can be used to work with temp in-memory tables. Is it something along the lines of doing a \"PRAGMA temp_store=MEMORY;\", creating temporary counterpart tables for each of the places tables, duplicating the data in on-disk tables on these new tables and having all the code use the new tables?\n\n> because you could have a place already (hwv if i read code correctly we are not\n> using the autoCreate actually).\n\nautoCreate is set to true by default, so the function calls which don\'t specify it explicitly get the true default value.\n\n> But i suppose that GetPlaceIdForURI is still a good place to start hacking, in\n> future you could change it to return -1 if the page is \"private\" and handle\n> that case in type specific methods, and for now you can do the same, return -1\n> if in private mode and handle that.\n\nI didn\'t get the difference between the \"now\" and \"future\" cases as you explained above, but that\'s what I\'m going to do. :-)',0.00,0,0,3786887,0,NULL,0),(248970,240353,'2008-09-20 04:55:18','(In reply to comment #280)\n> (In reply to comment #278)\n> I guess in that case, we could in fact not turns off anything in nsNavHistory,\n> and just have everything use the temp tables, instead of the on-disk ones,\n> right?\n\nby default we will add to the temp tables, and then sync on a timer or on bookmark-insert or on browser-exit to the disk, so 2 possibilities:\n- don\'t sync to disk when we are in private browsing mode, clear temp tables on exit. Cons: this is complex to handle if we are allowing the user to create bookmarks while in private browsing mode since we would need to sync them down to disk.\n- in private browsing mode mark places and visits with a \"private\" column in the temp table, on sync skip marked places/visits (this can be done easily modifying our triggers). Cons: needs temp table change and manage tables with different columns (disk table does not need a \"private\" column).\n\n> By the way, I\'m not sure what APIs can be used to work with temp in-memory\n> tables. Is it something along the lines of doing a \"PRAGMA\n> temp_store=MEMORY;\", creating temporary counterpart tables for each of the\n> places tables, duplicating the data in on-disk tables on these new tables and\n> having all the code use the new tables?\n\nusing a temp table is simply done creating it like CREATE TEMP TABLE table_name, temp_store is not really useful (hwv we are already using it).\nfsync stuff hwv inserts and updates in temp tables by default (yes we are partitioning places and visits table between disk and memory).\n\n> I didn\'t get the difference between the \"now\" and \"future\" cases as you\n> explained above, but that\'s what I\'m going to do. :-)\n\n\"now\" is before fsync stuff, when you can\'t have a place. \"future\" is when you could have a place saved in a temp table. However imho you should start having \"placeholders changes\" in every place where you\'ll need to manager private browsing mode (that\'s what you\'re doing), impl can change later based on where we are moving to.',0.00,0,0,3786892,0,NULL,0),(248970,251051,'2008-09-20 05:03:48','What\'s new in this revision:\n\n * Handled nsAnnotationService in private browsing mode, to make sure it doesn\'t store any annotations.\n * Handled nsNavHistory::AutoCompleteFeedback in private browsing mode, to make sure that user\'s choice in awesomebar does not get stored.\n * Corrected the behavior of the session store component on exit/restart. Previously, if the user chose to restart the browser (for example, by installing an add-on) in private browsing mode, or closed the browser (provided that browser.startup.page is set to 3) without leaving the private mode, the private session was stored on disk, and would later be restored. With this revision, this shouldn\'t happen any more, and the user\'s non-private session should be restored, as expected.',0.00,0,0,3786894,5,'339569',0),(248970,251051,'2008-09-20 11:40:18','(In reply to comment #281)\n> - in private browsing mode mark places and visits with a \"private\" column in\n> the temp table, on sync skip marked places/visits (this can be done easily\n> modifying our triggers). Cons: needs temp table change and manage tables with\n> different columns (disk table does not need a \"private\" column).\n\nI think the second option can be used even without a new column, by using a new temp table and joining it against moz_places.\n\n> using a temp table is simply done creating it like CREATE TEMP TABLE\n> table_name, temp_store is not really useful (hwv we are already using it).\n> fsync stuff hwv inserts and updates in temp tables by default (yes we are\n> partitioning places and visits table between disk and memory).\n\nHmm, this page seems to suggest that temp tables are written to the disk while the DB connection is open . Ideally we wouldn\'t want to do that. According to the docs, temp_store might be able to save us there...',0.00,0,0,3787077,0,NULL,0),(248970,240353,'2008-09-21 02:03:37','(In reply to comment #283)\n> (In reply to comment #281)\n> I think the second option can be used even without a new column, by using a new\n> temp table and joining it against moz_places.\n\nwe can\'t, it\'s already quite difficult having one temp table, having two would be a pain. that\'s because sqlite does not support indices on unions or views, so we have to use very specialized queries to read from both (disk and memory).\n\n> Hmm, this page seems to suggest that temp tables are written to the disk while\n> the DB connection is open . Ideally we\n> wouldn\'t want to do that. According to the docs, temp_store might be able to\n> save us there...\n\ntemp_store is memory in Places',0.00,0,0,3787353,0,NULL,0),(248970,161650,'2008-09-22 10:37:20','After playing with a couple of builds I went back to official nightly builds. Today I discovered that new URL\'s were not being shown when entered into the Location bar. \n\nExamination with History->Show all history, did show the URL but the visit count was zero. I got to looking at other history of my normal visited sites and found that none were being \'counted as visited\' anymore. \n\nI renamed Places.sqlite to places.sqlite.old and restarted the browser to find that my bookmarks were still there ? My history was indeed gone, and is now being \'counted as visisted and incrementing\' as it should. \n\nBug or ? Almost seems that I was stuck in PB mode. Honestly I cannot recall if I properly exited PB mode before going back to official nightly\'s.',0.00,0,0,3788592,0,NULL,0),(248970,251051,'2008-09-22 10:54:09','Jim: have you tried to reproduce this? Your comment was a bit vague, and I need some STR in order to try to debug this.',0.00,0,0,3788618,0,NULL,0),(248970,161650,'2008-09-22 12:33:49','No, I just discovered this at the time of my comment #286 above. I had to leave for work, so will be tomorrow, or wednesday before I have time to install the PB tryserver build and see if things break again. \n\nCan you explain what seems to vague? \n\nThe issue seems to be that none of the sites I visit are being shown in the Library with a \'visit count\'. The URL is there but the visit count is zero. As long as the count stays at zero of course it won\'t show in the Location bar when doing a search.',0.00,0,0,3788788,0,NULL,0),(248970,8519,'2008-09-22 13:02:49','I tried to reproduce what Jim is seeing in Comment 285 and was not able to do so, but I was testing with a fresh profile. Here is what I did:\n\n1. Downloaded the latest private browsing tryserver build\n2. Created a fresh profile.\n3. Surfed 4-5 sites than invoked PB mode. I left the other browsing session open by selecting that preference.\n4. Browsed 4-5 sites in PB mode.\n5. Exited the browser and started up the latest trunk nightly using the same profile.\n6. Browsed to the sites that in regular mode and revisited. The visit count incremented correctly and the sites showed up in the location bar.\n\nWhat I did not do is use an existing profile that had already been run on the trunk to see what happens, I can do that next, since that is probably closer to what Jim was doing.',0.00,0,0,3788825,0,NULL,0),(248970,161650,'2008-09-22 13:20:20','Yes I was using a months old profile that I normally keep history for 90 days. \n\nThanks for testing Marcia. While your at it, could you also try:\n\nOpen the browser, enter PB mode, then close and re-install a current official nightly build? I\'m really suspecting that something was left \'locked\' in my places.sqlite file, thus leaving the browser \'thinking\' it was still in PB Mode.\n\nI have SQLite browser, but I\'m not sure what to look for, and will be tomorrow before I can even do that.',0.00,0,0,3788846,0,NULL,0),(248970,76551,'2008-09-22 15:33:25','Initiated a new try server build with patch v2.9. Should be available in an hour or so.',0.00,0,0,3789034,0,NULL,0),(248970,8519,'2008-09-22 15:50:53','I tested the scenario that Jim outlined in Comment 289 using a Windows Vista VM. Again, here are the steps I followed:\n\n1. Downloaded and installed the latest tryserver build.\n2. Entered PB mode and surfed a few sites. Exited FF still in PB mode.\n3. Ran the uninstaller and uninstalled the tryserver build.\n4. Installed the latest trunk nightly (Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre) Gecko/20080922032349 Minefield/3.1b1pre) and ran with the same profile.\n\nResult: Everything seemed okay as far as being able to access sites and the visit counts registered appropriately. The sites that I visited in PB mode **did** show up in history when I relaunched using the trunk, which I am not certain is expected or not - will this present an issue for individuals going back and forth between builds once the feature is launched?',0.00,0,0,3789056,0,NULL,0),(248970,76551,'2008-09-22 16:30:27','Latest try server builds come in here:\nhttps://build.mozilla.org/tryserver-builds/2008-09-22_15:31-mozilla@hskupin.info-bug248970v2.9/',0.00,0,0,3789105,0,NULL,0),(248970,251051,'2008-09-22 23:04:09','(In reply to comment #291)\n> Result: Everything seemed okay as far as being able to access sites and the\n> visit counts registered appropriately. The sites that I visited in PB mode\n> **did** show up in history when I relaunched using the trunk, which I am not\n> certain is expected or not - will this present an issue for individuals going\n> back and forth between builds once the feature is launched?\n\nThis is not expected, and it may be fixed in the 2.9 version of the patch. Could you please re-run the test steps with the builds Henrik provided in comment 292? It would be nice if you can make a backup copy of your places.sqlite before entering the private browsing mode, and after leaving it, so that if this problem persists, I can use them in order to debug this.\n\nAlso, before step 4, can you check and make sure that the visited sites do not show up in the PB-enabled build itself? They should appear there as well if they\'d appear in the latest nightly build.\n\nThanks!',0.00,0,0,3789395,0,NULL,0),(248970,161650,'2008-09-23 08:57:35','Just a couple notes. This build is still not playing nice with TM JIT.Content enabled. Also its \'crashy\' at times, with no breakpad being fired. Neowin.net continues to crash with JIT.Content enabled as well. \n\nIt does appear from bouncing back and forth from this build, to an \'official\' nightly build is OK, I don\'t see anything I browse in PB Mode appearing back in the trunk nightly build. \n\nIt also appears that early testing with PB builds did corrupt/break my places.sqlite file as it continues to log sites/url\'s visited with a visit count of zero. A new places.sqlite file does appear to function normally, even bouncing back and forth from PB builds to \'official\' nightly builds. \n\nI will try and get a debug trace tomorrow when I have some time for the crash a neowin.net',0.00,0,0,3789617,0,NULL,0),(248970,161650,'2008-09-23 09:11:57','Here is the debug trace.\n1. PB build is running \'normal\' - not in private mode\n2. visit: neowin.net\n3. after the site is just about done loading \'crash\' \n4. JIT.content is \'enabled\' - note this does not crash on official nightly\'s\n\n===============================================================================\n*** wait with pending attach\nSymbol search path is: C:\\websymbols;C:\\localsymbols\nExecutable search path is: \nModLoad: 00870000 00887000 C:\\Program Files\\Minefield\\firefox.exe\nModLoad: 77bd0000 77cf7000 C:\\Windows\\system32\\ntdll.dll\nModLoad: 77a60000 77b3b000 C:\\Windows\\system32\\kernel32.dll\nModLoad: 64de0000 656d3000 C:\\Program Files\\Minefield\\xul.dll\nModLoad: 69580000 695e3000 C:\\Program Files\\Minefield\\sqlite3.dll\nModLoad: 73520000 735bb000 C:\\Windows\\WinSxS\\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.1434_none_d08b6002442c891f\\MSVCR80.dll\nModLoad: 779b0000 77a5a000 C:\\Windows\\system32\\msvcrt.dll\nModLoad: 684a0000 68554000 C:\\Program Files\\Minefield\\js3250.dll\nModLoad: 10000000 10029000 C:\\Program Files\\Minefield\\nspr4.dll\nModLoad: 76510000 765d6000 C:\\Windows\\system32\\ADVAPI32.dll\nModLoad: 77640000 77702000 C:\\Windows\\system32\\RPCRT4.dll\nModLoad: 73ad0000 73ad7000 C:\\Windows\\system32\\WSOCK32.dll\nModLoad: 77370000 7739d000 C:\\Windows\\system32\\WS2_32.dll\nModLoad: 764d0000 764d6000 C:\\Windows\\system32\\NSI.dll\nModLoad: 74c10000 74c42000 C:\\Windows\\system32\\WINMM.dll\nModLoad: 767c0000 7685d000 C:\\Windows\\system32\\USER32.dll\nModLoad: 77d00000 77d4b000 C:\\Windows\\system32\\GDI32.dll\nModLoad: 765e0000 76724000 C:\\Windows\\system32\\ole32.dll\nModLoad: 77b40000 77bcd000 C:\\Windows\\system32\\OLEAUT32.dll\nModLoad: 75e20000 75e59000 C:\\Windows\\system32\\OLEACC.dll\nModLoad: 00080000 00098000 C:\\Program Files\\Minefield\\smime3.dll\nModLoad: 00630000 006da000 C:\\Program Files\\Minefield\\nss3.dll\nModLoad: 00110000 00124000 C:\\Program Files\\Minefield\\nssutil3.dll\nModLoad: 00130000 00137000 C:\\Program Files\\Minefield\\plc4.dll\nModLoad: 00150000 00157000 C:\\Program Files\\Minefield\\plds4.dll\nModLoad: 00170000 00190000 C:\\Program Files\\Minefield\\ssl3.dll\nModLoad: 76860000 7736f000 C:\\Windows\\system32\\SHELL32.dll\nModLoad: 77710000 77768000 C:\\Windows\\system32\\SHLWAPI.dll\nModLoad: 75de0000 75de8000 C:\\Windows\\system32\\VERSION.dll\nModLoad: 74640000 74682000 C:\\Windows\\system32\\WINSPOOL.DRV\nModLoad: 76450000 764c3000 C:\\Windows\\system32\\COMDLG32.dll\nModLoad: 75890000 75a2e000 C:\\Windows\\WinSxS\\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6001.18000_none_5cdbaa5a083979cc\\COMCTL32.dll\nModLoad: 764e0000 764fe000 C:\\Windows\\system32\\IMM32.dll\nModLoad: 77520000 775e8000 C:\\Windows\\system32\\MSCTF.dll\nModLoad: 75740000 75745000 C:\\Windows\\system32\\MSIMG32.dll\nModLoad: 77930000 779ad000 C:\\Windows\\system32\\USP10.dll\nModLoad: 735c0000 73647000 C:\\Windows\\WinSxS\\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.1434_none_d08b6002442c891f\\MSVCP80.dll\nModLoad: 74320000 74327000 C:\\Program Files\\Minefield\\xpcom.dll\nModLoad: 77d50000 77d59000 C:\\Windows\\system32\\LPK.DLL\nModLoad: 74fb0000 74fef000 C:\\Windows\\system32\\uxtheme.dll\nModLoad: 74c00000 74c0c000 C:\\Windows\\system32\\dwmapi.dll\nModLoad: 777a0000 7792a000 C:\\Windows\\system32\\SETUPAPI.dll\nModLoad: 76300000 7631e000 C:\\Windows\\system32\\USERENV.dll\nModLoad: 762e0000 762f4000 C:\\Windows\\system32\\Secur32.dll\nModLoad: 74af0000 74bab000 C:\\Windows\\system32\\PROPSYS.dll\nModLoad: 76730000 767b4000 C:\\Windows\\system32\\CLBCatQ.DLL\nModLoad: 72260000 72274000 C:\\Program Files\\Minefield\\components\\browserdirprovider.dll\nModLoad: 756d0000 7570b000 C:\\Windows\\system32\\mswsock.dll\nModLoad: 75370000 75375000 C:\\Windows\\System32\\wshtcpip.dll\nModLoad: 75ab0000 75ac9000 C:\\Windows\\system32\\iphlpapi.dll\nModLoad: 75a70000 75aa5000 C:\\Windows\\system32\\dhcpcsvc.DLL\nModLoad: 75bd0000 75bfc000 C:\\Windows\\system32\\DNSAPI.dll\nModLoad: 75a60000 75a67000 C:\\Windows\\system32\\WINNSI.DLL\nModLoad: 75a30000 75a51000 C:\\Windows\\system32\\dhcpcsvc6.DLL\nModLoad: 74bf0000 74bff000 C:\\Windows\\system32\\NLAapi.dll\nModLoad: 73a00000 73a0f000 C:\\Windows\\system32\\napinsp.dll\nModLoad: 73030000 73042000 C:\\Windows\\system32\\pnrpnsp.dll\nModLoad: 73430000 73438000 C:\\Windows\\System32\\winrnr.dll\nModLoad: 773a0000 773ea000 C:\\Windows\\system32\\WLDAP32.dll\nModLoad: 76440000 76447000 C:\\Windows\\system32\\PSAPI.DLL\nModLoad: 75730000 75735000 C:\\Windows\\System32\\wship6.dll\nModLoad: 75780000 757a1000 C:\\Windows\\system32\\NTMARTA.DLL\nModLoad: 75bb0000 75bc1000 C:\\Windows\\system32\\SAMLIB.dll\nModLoad: 73ab0000 73ab6000 C:\\Windows\\system32\\rasadhlp.dll\nModLoad: 74690000 74743000 C:\\Windows\\system32\\WindowsCodecs.dll\nModLoad: 75450000 7548b000 C:\\Windows\\system32\\rsaenh.dll\nModLoad: 02810000 02835000 C:\\Program Files\\Minefield\\softokn3.dll\nModLoad: 02840000 02858000 C:\\Program Files\\Minefield\\nssdbm3.dll\nModLoad: 02b20000 02b59000 C:\\Program Files\\Minefield\\freebl3.dll\nModLoad: 02b60000 02ba9000 C:\\Program Files\\Minefield\\nssckbi.dll\nModLoad: 6e860000 6e8a0000 C:\\Program Files\\Minefield\\components\\brwsrcmp.dll\nModLoad: 6dce0000 6dd42000 C:\\Windows\\system32\\mscms.dll\nModLoad: 71220000 71327000 C:\\Windows\\system32\\shdocvw.dll\nModLoad: 64500000 64965000 C:\\Windows\\system32\\Macromed\\Flash\\NPSWF32.dll\nModLoad: 77d60000 77e30000 C:\\Windows\\system32\\WININET.dll\nModLoad: 76500000 76503000 C:\\Windows\\system32\\Normaliz.dll\nModLoad: 775f0000 77635000 C:\\Windows\\system32\\iertutil.dll\nModLoad: 75fe0000 760d1000 C:\\Windows\\system32\\CRYPT32.dll\nModLoad: 75fa0000 75fb2000 C:\\Windows\\system32\\MSASN1.dll\nModLoad: 773f0000 77519000 C:\\Windows\\system32\\urlmon.dll\nModLoad: 71530000 71560000 C:\\Windows\\system32\\mlang.dll\nModLoad: 747a0000 747cf000 C:\\Windows\\system32\\wdmaud.drv\nModLoad: 748e0000 748e4000 C:\\Windows\\system32\\ksuser.dll\nModLoad: 74ac0000 74ae7000 C:\\Windows\\system32\\MMDevAPI.DLL\nModLoad: 74e00000 74e07000 C:\\Windows\\system32\\AVRT.dll\nModLoad: 752a0000 752cd000 C:\\Windows\\system32\\WINTRUST.dll\nModLoad: 77770000 77799000 C:\\Windows\\system32\\imagehlp.dll\nModLoad: 74610000 74631000 C:\\Windows\\system32\\AUDIOSES.DLL\nModLoad: 744b0000 74516000 C:\\Windows\\system32\\audioeng.dll\nModLoad: 74600000 74609000 C:\\Windows\\system32\\msacm32.drv\nModLoad: 742c0000 742d4000 C:\\Windows\\system32\\MSACM32.dll\nModLoad: 74490000 74497000 C:\\Windows\\system32\\midimap.dll\nModLoad: 75860000 75867000 C:\\Windows\\system32\\credssp.dll\nModLoad: 754c0000 75504000 C:\\Windows\\system32\\schannel.dll\nModLoad: 76120000 76195000 C:\\Windows\\system32\\NETAPI32.dll\n(c0.ab0): Break instruction exception - code 80000003 (first chance)\neax=7ffab000 ebx=00000000 ecx=00000000 edx=77c5d094 esi=00000000 edi=00000000\neip=77c17dfe esp=0c5dfac0 ebp=0c5dfaec iopl=0 nv up ei pl zr na pe nc\ncs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246\n*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\\Windows\\system32\\ntdll.dll - \nntdll!DbgBreakPoint:\n77c17dfe cc int 3\n0:016> g\n(c0.26c): Illegal instruction - code c000001d (first chance)\n(c0.26c): Illegal instruction - code c000001d (!!! second chance !!!)\neax=00005d61 ebx=ffffffff ecx=00000000 edx=80000000 esi=00000901 edi=6854cb04\neip=6853c035 esp=002aabd8 ebp=002aabe0 iopl=0 nv up ei pl nz na pe nc\ncs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010206\n*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\\Program Files\\Minefield\\js3250.dll - \njs3250!JS_XDRFindClassById+0x29c65:\n6853c035 f20f2c0424 cvttsd2si eax,mmword ptr [esp] ss:0023:002aabd8=fff8000000000000\n\n===============================================================================\nVista HP SP1 \nMozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre) Gecko/20080922155248 Minefield/3.1b1pre Firefox/3.0 ID:20080922155248',0.00,0,0,3789634,0,NULL,0),(248970,161650,'2008-09-23 09:50:22','This build seems to only enter PB Mode one time, then I cannot enter PB mode again without closing/restarting the browser.',0.00,0,0,3789688,0,NULL,0),(248970,161650,'2008-09-23 10:06:33','Sorry for the spam.\nTurning \'off\' JIT.Content allows entry/exit to PB mode multiple times.\nNow, I\'ve discovered if one of the tabs is a link/tab to say this bug, on exit from PB Mode the tab opens/restores as \'untitled\'. Using the location bar trying to open the link does nothing but open another \'untitled\' tab. i.e., the link cannot be visited unless you close/restart the browser. \n\nAfter several attempts of trying to discover the issue the browser got to the point it would not start up at all without crashing.\n\nReloaded the official nightly, and clicking \'restore from last session\', all tabs loaded as expected without crashing. \n\nSomething is really not playing nice somewhere, but its beyond me at this point. \n\nI really feel this needs more eyes/testers at this point as its very unstable at the moment. I assume when the try-server builds are made, its from a current pull form hg ?? i.e., all the latest/greatest patches etc...',0.00,0,0,3789715,0,NULL,0),(248970,251051,'2008-09-23 10:29:54','Thanks for your help in testing this patch, Jim!\n\n(In reply to comment #294)\n> Just a couple notes. This build is still not playing nice with TM JIT.Content\n> enabled. Also its \'crashy\' at times, with no breakpad being fired. Neowin.net\n> continues to crash with JIT.Content enabled as well. \n\nHmmm, I still can\'t reproduce this. Marcia: I really need some help here with testing this. Can you spend some time testing this on Vista, please?\n\n> It does appear from bouncing back and forth from this build, to an \'official\'\n> nightly build is OK, I don\'t see anything I browse in PB Mode appearing back in\n> the trunk nightly build. \n\nI assume it\'s because of the latest work on moz_inputhistory and the annotations service. Glad to hear it\'s fixed.\n\n> It also appears that early testing with PB builds did corrupt/break my\n> places.sqlite file as it continues to log sites/url\'s visited with a visit\n> count of zero. A new places.sqlite file does appear to function normally, even\n> bouncing back and forth from PB builds to \'official\' nightly builds. \n\nSorry to hear about the corrupted places.sqlite. If it doesn\'t contain any personal data, I\'d be happy to take a look at it if possible.\n\n(In reply to comment #295)\n> Here is the debug trace.\n> 1. PB build is running \'normal\' - not in private mode\n> 2. visit: neowin.net\n> 3. after the site is just about done loading \'crash\' \n> 4. JIT.content is \'enabled\' - note this does not crash on official nightly\'s\n\nIt would be great if you can set up WinDbg to use Microsoft and Mozilla\'s symbol servers: . Try server builds symbols are available at .\n\n(In reply to comment #297)\n> Sorry for the spam.\n> Turning \'off\' JIT.Content allows entry/exit to PB mode multiple times.\n> Now, I\'ve discovered if one of the tabs is a link/tab to say this bug, on exit\n> from PB Mode the tab opens/restores as \'untitled\'. Using the location bar\n> trying to open the link does nothing but open another \'untitled\' tab. i.e.,\n> the link cannot be visited unless you close/restart the browser. \n\nSomething\'s really wrong with how the PB patch interacts with tracemonkey, I guess. Maybe using the symbols for this build, we can start investigating this issue. By the way, do you see these problems in a fresh profile as well? What about other platforms (if you have tested)?\n\n> I really feel this needs more eyes/testers at this point as its very unstable\n> at the moment. I assume when the try-server builds are made, its from a\n> current pull form hg ?? i.e., all the latest/greatest patches etc...\n\nYes, they are. Marcia: can you help with testing this as well?',0.00,0,0,3789749,0,NULL,0),(248970,76551,'2008-09-23 10:53:13','(In reply to comment #298)\n> . Try server\n> builds symbols are available at .\n\nFor the try server symbols I get a 403 (forbidden). But as Ted told me it could be that this folder is not browsable. But if anyone have issues accessing the symbols please give a note.',0.00,0,0,3789786,0,NULL,0),(248970,8519,'2008-09-23 13:24:53','I retested my steps from Comment 291 with the tryserver build that Henrik generated in Comment 292 using my Win Vista VM:\n\n1. Downloaded and installed the latest tryserver build.\n2. Entered PB mode and surfed a few sites. Exited FF still in PB mode.\n3. Ran the uninstaller and uninstalled the tryserver build.\n4. Installed the latest trunk nightly (Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre) Gecko/20080923111052 Minefield/3.1b1pre) and ran with the\nsame profile.\n\nResult: When I launched the trunk build I could not see the sites that I launched in PB mode, so everything works as expected in this regard.\n\nI also enabled JIT right from the getgo and visited the site that Jim is crashing on but I was not able to reproduce that crash.\n\nI also wondered if Jim was running with a FF profile that was possibly migrated from FF2?',0.00,0,0,3789972,0,NULL,0),(248970,161650,'2008-09-23 13:36:47','I did not migrate any profiles from FF2, in fact I\'ve never used FF2 as I\'m a nightly \'junkie\', and enjoy testing/breaking the new builds.\n\nI crash at neowin.net using a new profile as well. What\'s totally baffling me, is why it does not crash using 3.1b1pre trunk nightly\'s. \n\nMarcia, did you try going into and out of PB Mode several times with JIT.content enabled? Seems I could only get it to do one cycle of in/out of PB mode. \n\nI will try to download the try-server symbols tomorrow and run debug. I\'m not real versed in using WinDbg but will see what I can do. \n\nMy earlier post did have both Firefox sysmbols and windows sysmbols loaded with my trace.. I didn\'t know there was different symbol set for the try-server.',0.00,0,0,3789979,0,NULL,0),(248970,161650,'2008-09-24 05:00:56','I cannot get neowin.net to fail this morning to get a trace in windbg. There must be some doggy ad or something coming around once in ahwile, but that still does not fully explain why it works OK with official nightly\'s.\n\nThere is still something up when you have an https page open during normal browsisng and then enter PB mode choosing to \'save and close\' then on exit of PBmode the https site will show as \'untitled\'. I found that by being persistant enough on clicking the \'go\' arrow it will eventually load. Must be something funky in the way its saving or not saving https sites on entry to PB Mode.\n\nI\'ll be waiting for the next iteration and try some more testing.',0.00,0,0,3790838,0,NULL,0),(248970,251051,'2008-09-24 08:07:40','(In reply to comment #302)\n> There is still something up when you have an https page open during normal\n> browsisng and then enter PB mode choosing to \'save and close\' then on exit of\n> PBmode the https site will show as \'untitled\'. I found that by being\n> persistant enough on clicking the \'go\' arrow it will eventually load. Must be\n> something funky in the way its saving or not saving https sites on entry to PB\n> Mode.\n\nSimon, Dietrich: Could this be because of the check being performed in nsSessionStore._checkPrivacyLevel? Maybe the SSL page status does not get saved as part of the usual session store data. If that is the case, is there anything to be done without compromising users\' privacy to solve this?',0.00,0,0,3791015,0,NULL,0),(248970,160571,'2008-09-24 09:20:22','(In reply to comment #303)\nThe very same code path works fine when PB mode isn\'t involved. AFAICT what silently(!) fails is the call to |browser.webNavigation.gotoIndex| at . The tab\'s history seems to be correctly restored, though, which you can verify by navigating in the tab before entering PB mode and by right-clicking the Back button after exiting it.\n\nCould your code changes subtly interact with a browser\'s webNavigation to that end? Or could you try to restore the browsing state while PB mode isn\'t completely over and we\'re in an inconsistent state overall?',0.00,0,0,3791129,0,NULL,0),(248970,160571,'2008-09-24 09:41:49','BTW: For the latest try-server build, sessionStorage seems to be broken. At least my patch for bug 339445 suddenly throws a NS_ERROR_DOM_SECURITY_ERR for nsIDOMStorage::GetLength (which it doesn\'t in the latest nightly build). Could this be due to your patch?',0.00,0,0,3791178,0,NULL,0),(248970,8519,'2008-09-24 12:39:41','(In reply to comment #301)\n[snip]\n\nI just retested the build on Win Vista and navigated in and out of PB mode several times with JIT enabled. When I then launched a fresh trunk build everything worked as expected - all the sites I browsed while in PB mode did not show and it cycled back and forth fine during my testing.\n> \n> Marcia, did you try going into and out of PB Mode several times with\n> JIT.content enabled? Seems I could only get it to do one cycle of in/out of PB\n> mode. \n>',0.00,0,0,3791505,0,NULL,0),(248970,251051,'2008-09-24 16:26:43','(In reply to comment #304)\n> (In reply to comment #303)\n> The very same code path works fine when PB mode isn\'t involved. AFAICT what\n> silently(!) fails is the call to |browser.webNavigation.gotoIndex| at\n> .\n\nHmmm, we\'re eating the exception there, right? Looks like an exception is expected there. Would you please explain why it\'s been implemented like that, and what kinds of exceptions have been expected?\n\n> The tab\'s history seems to be correctly restored, though, which you can verify\n> by navigating in the tab before entering PB mode and by right-clicking the Back\n> button after exiting it.\n\nYes, this seems to be the case.\n\n> Could your code changes subtly interact with a browser\'s webNavigation to that\n> end?\n\nNot in any way that I know, but I could be wrong...\n\nCould it be a problem with the way I\'m closing all current windows, and opening a new one? I\'ve noticed that session store would use that first opened window it it\'s still open while exiting the private mode, so maybe there\'s something wrong with that window? Here\'s the relevant code from the patch:\n\n+ _closeAllWindows: function PBS__closeAllWindows() {\n+ let windowMediator = Cc[\"@mozilla.org/appshell/window-mediator;1\"].\n+ getService(Ci.nsIWindowMediator);\n+ let windowsEnum = windowMediator.getEnumerator(\"navigator:browser\");\n+ \n+ this._closeAllWindowsInternal(windowsEnum);\n+ },\n+\n+ _closeAllWindowsInternal: function PBS__closeAllWindowsInternal(windowsEnum) {\n+ if (windowsEnum.hasMoreElements()) {\n+ let window = windowsEnum.getNext();\n+ this._closeAllWindowsInternal(windowsEnum);\n+ window.close();\n+ }\n+ },\n+\n+ _openSingleWindow: function PBS__openSingleWindow() {\n+ let windowWatcher = Cc[\"@mozilla.org/embedcomp/window-watcher;1\"].\n+ getService(Ci.nsIWindowWatcher);\n+ windowWatcher.openWindow(null, \"chrome://browser/content/browser.xul\",\n+ null, \"chrome,all,resizable=yes,dialog=no\", null);\n+ },\n\n\n\n> Or could you try to restore the browsing state while PB mode isn\'t\n> completely over and we\'re in an inconsistent state overall?\n\nWell, in the private browsing service, I first notify the observers about the exit event, and then call nsSessionStore.setBrowserState to restore the session, so the private browsing mode should be well finished by that time.\n\n(In reply to comment #305)\n> BTW: For the latest try-server build, sessionStorage seems to be broken. At\n> least my patch for bug 339445 suddenly throws a NS_ERROR_DOM_SECURITY_ERR for\n> nsIDOMStorage::GetLength (which it doesn\'t in the latest nightly build). Could\n> this be due to your patch?\n\nYes. nsDOMStorage::GetLength calls nsDOMStorage::CacheStoragePermissions which itself calls nsDOMStorage::CanUseStorage which returns false in private browsing mode, and hence the NS_ERROR_DOM_SECURITY_ERR exception. Basically, you can\'t use the dom storage service in the private browsing mode. This was suggested by Dave Camp in comment 172.\n\nI\'m not sure what can we do instead of handling the code in bug 339445 after it gets landed in private mode as well. So, I\'m adding it as a dependency here.',0.00,0,0,3791927,0,NULL,0),(248970,160571,'2008-09-24 17:10:51','(In reply to comment #307)\n> Hmmm, we\'re eating the exception there, right?\n\nNo, there\'s no exception at all - the call just (silently) fails. The only exceptions we are expecting come from passing an invalid index to gotoIndex which actually shouldn\'t be happening anymore, at all. Could you step into gotoIndex with a debugger and see what\'s actually happening in there?\n\n> Could it be a problem with the way I\'m closing all current windows, and\n> opening a new one?\n\nNo, as when restoring the saved session is all handled by SessionStore itself. (BTW: Why don\'t you just loop over the iterator in _closeAllWindows instead of recursively calling _closeAllWindowsInternal? |while| to the rescue?)\n\n> (In reply to comment #305)\n> Yes. nsDOMStorage::GetLength calls nsDOMStorage::CacheStoragePermissions which\n> itself calls nsDOMStorage::CanUseStorage which returns false in private\n> browsing mode, and hence the NS_ERROR_DOM_SECURITY_ERR exception.\n\nProblem is: I got the same error right after startup (i.e. before even touching PB mode at all). Bug?\n\n> I\'m not sure what can we do instead of handling the code in bug 339445 after it\n> gets landed in private mode as well.\n\nWhat about throwing or returning |null| from getSessionStorageForURI while in PB mode instead so that sessionStorage consumers can bail out sooner rather than later?',0.00,0,0,3792015,0,NULL,0),(248970,251051,'2008-09-25 00:44:11','(In reply to comment #308)\n> (In reply to comment #307)\n> > Hmmm, we\'re eating the exception there, right?\n> \n> No, there\'s no exception at all - the call just (silently) fails. The only\n> exceptions we are expecting come from passing an invalid index to gotoIndex\n> which actually shouldn\'t be happening anymore, at all. Could you step into\n> gotoIndex with a debugger and see what\'s actually happening in there?\n\nSure, I\'ll do that.\n\n> > Could it be a problem with the way I\'m closing all current windows, and\n> > opening a new one?\n> \n> No, as when restoring the saved session is all handled by SessionStore itself.\n> (BTW: Why don\'t you just loop over the iterator in _closeAllWindows instead of\n> recursively calling _closeAllWindowsInternal? |while| to the rescue?)\n\nNi special reason, I just thought it would look better visually to close the windows in reverse order, and nsISimpleEnumerator doesn\'t support reverse iterations...\n\n> Problem is: I got the same error right after startup (i.e. before even touching\n> PB mode at all). Bug?\n\nOh, in that case, yes it\'s probably a bug. I need to investigate it.\n\n> What about throwing or returning |null| from getSessionStorageForURI while in\n> PB mode instead so that sessionStorage consumers can bail out sooner rather\n> than later?\n\nThat won\'t cover consumers which call getSessionStorageForURI prior to entering the private mode, would it?',0.00,0,0,3792376,0,NULL,0),(248970,160571,'2008-09-25 03:37:15','(In reply to comment #309)\n> Sure, I\'ll do that.\n\nThanks!\n\n> nsISimpleEnumerator doesn\'t support reverse iterations...\n\nIn that case, please at least add a comment to that end.\n\n> That won\'t cover consumers which call getSessionStorageForURI prior to entering\n> the private mode, would it?\n\nSure, so s/instead/additionally/.\n\nBTW: Please don\'t forget to add unit tests for the SessionStore changes as well.',0.00,0,0,3792472,0,NULL,0),(248970,251051,'2008-09-25 08:19:14','(In reply to comment #310)\n> (In reply to comment #309)\n> > Sure, I\'ll do that.\n> \n> Thanks!\n\nOK, I couldn\'t reproduce this bug on my machine. I opened AMO and navigated to a few places on AMO, an then entered the private mode, loaded some sites and switched back to normal mode, and the AMO page was restored correctly.\n\nSimon, do you have a STR which I can use here?\n\nI took a look inside nsDocShell::GotoIndex anyway, and I noticed that the reason of the silent failure (which is intentional BTW) is . Now, nsDocShell::IsNavigationAllowed should return false if we\'re printing (or in print preview mode), or if mFiredUnloadEvent is true (which logically should be the case here). Is there any docshell guru I can ping who may be able to help me understand why this is failing?\n\n> In that case, please at least add a comment to that end.\n\nSure.\n\n> Sure, so s/instead/additionally/.\n\nDave: can I safely modify nsDocShell::GetSessionStorageForUI to call nsDOMStorage::CanUseStorage to determine if session storage is available or not, and return an error if it isn\'t?\n\n> BTW: Please don\'t forget to add unit tests for the SessionStore changes as\n> well.\n\nMconnor has written a test plan which includes SessionStore. You can check it at . I will eventually implement all these tests before submitting the patch for review.',0.00,0,0,3792761,0,NULL,0),(248970,251051,'2008-09-25 08:24:53','(In reply to comment #311)\n> OK, I couldn\'t reproduce this bug on my machine. I opened AMO and navigated to\n> a few places on AMO, an then entered the private mode, loaded some sites and\n> switched back to normal mode, and the AMO page was restored correctly.\n\nPlease ignore this, I made a mistake, but I was able to reproduce this easily paying more attention; just forgot to update my comment before submitting it.',0.00,0,0,3792771,0,NULL,0),(248970,251051,'2008-09-25 11:14:49','This patch completes the password manager tests (I\'ve added a few things to the test plan mconnor wrote: ), and adds the test for authenticated sessions. The history tests are being done by Aaron Train (a Seneca college student) and I\'m working on the session store tests right now.',0.00,0,0,3793086,5,'340369',0),(248970,76551,'2008-09-26 13:43:51','New try server builds for patch v2.10 are available here:\nhttps://build.mozilla.org/tryserver-builds/2008-09-26_12:22-mozilla@hskupin.info-bug248970v2.10/',0.00,0,0,3795145,0,NULL,0),(457765,326486,'2008-09-29 14:57:42','User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3\nBuild Identifier: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3\n\nWhen creating an anchor-element which wraps an list item, firefox closes the anchor tag before the li-element starts. It also creates an additional anchor-element inside the list item.\nExample:\n
  • Lorem ipsum
  • \nbecomes \n
  • Lorem ipsum
  • \n\nReproducible: Always\n\nSteps to Reproduce:\n1.Create an HTML-document which contains an anchor element wrapping a list item.\n2.Open it in firefox, select the text and click \"View selection source\"',0.00,0,0,3798531,0,NULL,0),(248970,251051,'2008-10-02 01:44:12','The cookies module patch with a unit test, ready for review.',0.00,0,0,3801993,5,'341413',0),(248970,251051,'2008-10-02 01:51:41','The contentprefs module patch with a unit test, ready for review.',0.00,0,0,3801995,5,'341414',0),(248970,251051,'2008-10-02 01:53:59','The passwordmgr module patch with a unit test, ready for review.',0.00,0,0,3801998,5,'341415',0),(248970,251051,'2008-10-02 02:23:37','The httpauth module unit test, ready for review. The code responsible for clearing the HTTP authenticated sessions when entering and exiting the private browsing mode lives in , inside the _onPrivateBrowsingModeChanged function.',0.00,0,0,3802020,5,'341418',0),(248970,20209,'2008-10-02 07:12:01','I don\'t really know the auth stuff well enough to tell whether this test is testing the right things.',0.00,0,0,3802221,6,'341418',0),(248970,20209,'2008-10-02 07:20:08','>+ if (!nsCRT::strcmp(aData, NS_LITERAL_STRING(\"enter\").get())) {\n\nif (NS_LITERAL_STRING(\"enter\").Equals(aData)) ?\n\nSimilar for exit.\n\n>+ // backup the existing in-memory DB\n\nI would tend to just make both tables pointers instead of direct members, and then all that needs to happen on enter is:\n\n mBackupHostTable = mHostTable;\n mHostTable = new ...;\n mHostTable->Init();\n\nand on exit:\n\n mHostTable = mBackupHostTable;\n mBackupHostTable = nsnull;\n\nYou\'d have to change various other code, of course.\n\nCheck with dwitte as to which he prefers here; for now I haven\'t looked in detail at the copying functions.',0.00,0,0,3802232,6,'341413',0),(248970,251051,'2008-10-02 12:04:32','(In reply to comment #320)\n>>+ if (!nsCRT::strcmp(aData, NS_LITERAL_STRING(\"enter\").get())) {\n>\n> if (NS_LITERAL_STRING(\"enter\").Equals(aData)) ?\n>\n> Similar for exit.\n\nDone.\n\n>>+ // backup the existing in-memory DB\n>\n> I would tend to just make both tables pointers instead of direct members, and\n> then all that needs to happen on enter is:\n>\n> mBackupHostTable = mHostTable;\n> mHostTable = new ...;\n> mHostTable->Init();\n>\n> and on exit:\n>\n> mHostTable = mBackupHostTable;\n> mBackupHostTable = nsnull;\n>\n> You\'d have to change various other code, of course.\n>\n> Check with dwitte as to which he prefers here; for now I haven\'t looked in\n> detail at the copying functions.\n\nHmmm, actually it seems a lot cleaner than the current copying I\'m doing... Daniel, what do you think?',0.00,0,0,3802548,5,'341481',0),(248970,251051,'2008-10-02 15:12:12','I just realized that the previous version of the patch had a typo which prevented it from getting compiled (duh!). This one should be fine.',0.00,0,0,3802811,5,'341517',0),(458397,277293,'2008-10-03 09:33:59','Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3pre) Gecko/2008092317\nMinefield/3.0.3pre\n\nFound during the automated Global-500 Topsite Test on http://www.grono.net\n\n0 TOTAL 15 2046359 15894236 82932 ( 3544.85 +/- 4885.93) 45854105 42575 ( 1267.17 +/- 3004.70)\n\nnsStringStats\n => mAllocCount: 2030862\n => mReallocCount: 33447\n => mFreeCount: 2026857 -- LEAKED 4005 !!!\n => mShareCount: 222061\n => mAdoptCount: 84390\n => mAdoptFreeCount: 84376 -- LEAKED 14 !!!',0.00,0,0,3803550,5,'341626',0),(248970,75420,'2008-10-03 16:09:50','>+ if (NS_SUCCEEDED(mObserverService->NotifyObservers(inPrivateBrowsing,\n>+ \"private-browsing-query\",\n>+ nsnull))) {\n\nsplit this into two lines, |rv = ...| and |if (NS_SUCCEEDED(rv))| please.\n\ni also think the private-browsing-query thing is a terribly roundabout way of doing things, and i\'d much prefer a service somewhere we can directly call...\n\n>+ } else if (!strcmp(aTopic, \"browser:private-browsing\")) {\n>+ if (NS_LITERAL_STRING(\"enter\").Equals(aData)) {\n\naData.Equals(...) please (and below).\n\n>+ // backup the existing in-memory DB\n\nagreed with bz - go with member pointers here, and just twiddle them around to \"back up\" your db and reinitialize and so on. then you won\'t need to change the hashtable code in nsCookieService.h, either. r- pending that, since i\'d like to look at that code once you\'ve written it...',0.00,0,0,3804046,6,'341517',0),(248970,27780,'2008-10-04 15:27:23','General nit: patches are easier to review with more context in the diffs... See http://developer.mozilla.org/en/Mercurial_FAQ#Configuration (specifically, the \"-U 8\" part).\n\n>--- a/toolkit/components/passwordmgr/src/nsLoginManager.js\n...\n>+ var inPrivateBrowsing = Cc[\"@mozilla.org/supports-PRBool;1\"].\n>+ createInstance(Ci.nsISupportsPRBool);\n>+ this._observerService.notifyObservers(inPrivateBrowsing,\n>+ \"private-browsing-query\", null);\n>+ this._inPrivateBrowsing = inPrivateBrowsing.data;\n\nThis seems wrong to me. I hope we\'re not using this pattern in other places.\n\nLike dwitte said, this really seems like it should ask a service for the initial state. Something like:\n\n var PBS = Cc[\"mumble\"].getService(Ci.mumble);\n this._inPrivateBrowsing = PBS.inPrivateBrowsing;\n\n>+ } else if (topic == \"browser:private-browsing\") {\n>+ if (data == \"enter\")\n>+ this._pwmgr._inPrivateBrowsing = true;\n>+ else if (data == \"exit\")\n>+ this._pwmgr._inPrivateBrowsing = false;\n\nWould be nice to add a debug line here...\n\n this._pwmgr.log(\"Private browsing mode: \" + data);\n\n>- var autofillForm = this._prefBranch.getBoolPref(\"autofillForms\");\n>+ var autofillForm = !this._inPrivateBrowsing &&\n>+ this._prefBranch.getBoolPref(\"autofillForms\");\n\nNit: second line should be indented to align with \"!\".\n\n>--- a/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js\n>-function LoginManagerPrompter() {}\n>+function LoginManagerPrompter() {\n>+ this.init();\n>+}\n\nThere\'s already an init() method in this object, so I\'m surprised this works (or at least doesn\'t break something else).\n\nBut I don\'t think there\'s a need for an observer here.. A new prompter is created every time the authentication prompt is shown (ie, it\'s short lived), so the observer isn\'t likely to be triggered anyway. A simple helper function / getter, called when needed, is sufficient, and eliminated the need for an observer and more init() code...\n\n get _inPrivateBrowsing : function () {\n var PBS = Cc[xxx].getService(Ci.xxx);\n return PBS.inPrivateBrowsing;\n }\n\n>- if (!ok || !checkBox.value || !hostname)\n>+ if (!ok || !checkBox.value || !hostname || this._inPrivateBrowsing)\n\nI think this extra check isn\'t needed (ditto for the other places like this). The checkbox should end up hidden by the previous code, so checkbox.value should always be false.\n\n>--- a/toolkit/components/passwordmgr/test/Makefile.in\n...\n>+ test_bug_248970.html \\\n\nHmm, let\'s call this test_privbrowsing.html so it\'s more obvious what it does (ditto for subtests).\n\n>+++ b/toolkit/components/passwordmgr/test/subtst_bug_248970_1.html\n...\n>+

    Subtest 1

    \n\nAdd a brief comment in here saying what the test is trying to do (eg, trigger a save/change pw prompt).\n\n>+++ b/toolkit/components/passwordmgr/test/subtst_bug_248970_3.html\n...\n>+function submitForm() {\n>+ setTimeout(function(){ form.submit(); }, 100);\n>+}\n\nWhy the setTimeout()?\n\n\n>+++ b/toolkit/components/passwordmgr/test/subtst_bug_248970_4.html\n...\n>+function submitForm() {\n...\n>+ var result = pwmgr.autoCompleteSearch(\"\", null, userField);\n>+ if (result instanceof Ci.nsIAutoCompleteResult &&\n>+ result.matchCount == 1) {\n>+ userField.focus();\n>+ userField.value = result.getValueAt(0);\n>+ userField.blur();\n>+ }\n>+\n>+ setTimeout(function(){ form.submit(); }, 100);\n>+}\n\nSeems like this code should be the top test (test_privbrowsing.html), not in the subtest. Why call pwmgr.autoCompleteSearch? That\'s kind of a hacky API, and I\'d like to remove it eventually... Look at test_basic_form_autocomplete.html for how to drive the autocomplete dropdown without this.\n\n\n>+++ b/toolkit/components/passwordmgr/test/test_bug_248970.html\n\nI\'m ambivalent about having this as a separate test, verses rolling these tests into existing tests (test_notifications.html and test_basic_form_autocomplete.html). It kinda makes sense to test this as an independent feature, but also kinda sucks to duplicate the code/infrastructure of those tests. Maybe we should look at spinning out some of the existing stuff into common files (eg the existing pwmgr_common.js, or a new file like notification_common.js). This could be done today in a separate bug...\n\n>+var prefix = \"http://test2.example.com/tests/toolkit/components/passwordmgr/test/\";\n\nSee the tests in bug 403420 to avoid hardcoding this path.\n\n>+function get_PBSvc() {\n...\n>+ if (PBS_CID in Components.classes &&\n>+ \"nsIPrivateBrowsingService\" in Components.interfaces) {\n>+ try {\n>+ _PBSvc = Components.classes[PBS_CID].\n>+ getService(Components.interfaces.nsIPrivateBrowsingService);\n>+ if (_PBSvc) {\n>+ var observer = {\n...\n\nI\'m not sure what this is all for. You shouldn\'t need to check if the service Cc/Ci exists (just let it throw+fail if it doesn\'t), and the observer doesn\'t seem to do anything useful?',0.00,0,0,3804648,6,'341415',0),(248970,251051,'2008-10-05 00:55:08','(In reply to comment #323)\n> (From update of attachment 341517 [details])\n> >+ if (NS_SUCCEEDED(mObserverService->NotifyObservers(inPrivateBrowsing,\n> >+ \"private-browsing-query\",\n> >+ nsnull))) {\n> \n> split this into two lines, |rv = ...| and |if (NS_SUCCEEDED(rv))| please.\n\nDone.\n\n> i also think the private-browsing-query thing is a terribly roundabout way of\n> doing things, and i\'d much prefer a service somewhere we can directly call...\n\nI agree, but that means we should put nsIPrivateBrowsingService.idl somewhere in the build stack before netwerk, and I\'m not sure if there\'s an appropriate place for this (and if yes, where). In fact, this is a hacky workaround against exactly this point.\n\n> >+ } else if (!strcmp(aTopic, \"browser:private-browsing\")) {\n> >+ if (NS_LITERAL_STRING(\"enter\").Equals(aData)) {\n>\n> aData.Equals(...) please (and below).\n\nHmmm, aData is a const PRUnichar*, so I\'m not sure what you mean here.\n\n> >+ // backup the existing in-memory DB\n>\n> agreed with bz - go with member pointers here, and just twiddle them around to\n> \"back up\" your db and reinitialize and so on. then you won\'t need to change the\n> hashtable code in nsCookieService.h, either. r- pending that, since i\'d like to\n> look at that code once you\'ve written it...\n\nOK, here\'s the new code. The backup and restore functions are gone now, and the changes to the hash key have been reverted as well.',0.00,0,0,3804882,5,'341795',0),(248970,251051,'2008-10-05 01:44:06','New patch with more context, and using nsIPrivateBrowsingService to get the initial status of the private browsing mode.',0.00,0,0,3804889,5,'341797',0),(248970,20209,'2008-10-05 12:07:09','Why couldn\'t nsIPrivateBrowsingService.idl just live in netwerk?',0.00,0,0,3805205,0,NULL,0),(248970,251051,'2008-10-06 08:27:57','(In reply to comment #327)\n> Why couldn\'t nsIPrivateBrowsingService.idl just live in netwerk?\n\nThis is a good idea. All the modules edited in this patch depend on netwerk, so it won\'t cause any dependency problems. I\'ll move nsIPrivateBrowsingService.idl to netwerk/base/public and will update various modules to query the private browsing service directly. The \"private-browsing-query\" notification can also be discarded with this change.',0.00,0,0,3805940,0,NULL,0),(248970,15661,'2008-10-06 10:19:53','Yeah, netwerk/base/public is a dumping ground for all kinds of random stuff anyway...',0.00,0,0,3806097,0,NULL,0),(248970,75420,'2008-10-09 00:41:47','punting review, pending a new patch with nsIPBS.',0.00,0,0,3809605,6,'341795',0),(248970,15661,'2008-10-09 03:05:32','all the private browsing code lives outside of necko, right? then so should the test.',0.00,0,0,3809669,6,'341418',0),(248970,14419,'2008-10-09 03:43:17','Where does/will the documentation for the private browsing feature reside? Is it worth mentioning there that our private browsing mode has no effect on the operation of ISP or firewall that might be caching our browsing activities?',0.00,0,0,3809694,0,NULL,0),(248970,299942,'2008-10-09 11:47:13','The documentation I have come across are here:\n\nhttps://wiki.mozilla.org/PrivateBrowsing\nhttps://wiki.mozilla.org/User:Mconnor/PrivateBrowsing\nhttps://wiki.mozilla.org/Firefox3.1/PrivateBrowsing/TestPlan\nhttps://wiki.mozilla.org/QA/Firefox3.1/Private_Browsing_Test_Plan',0.00,0,0,3810188,0,NULL,0),(248970,251051,'2008-10-09 14:07:44','(In reply to comment #332)\n> Where does/will the documentation for the private browsing feature reside? Is\n> it worth mentioning there that our private browsing mode has no effect on the\n> operation of ISP or firewall that might be caching our browsing activities?\n\nYes, that should definitely be mentioned. I\'m not sure if there\'s a plan to include a specific page for it on mozilla.com, or is it just the support article, but I\'m CCing David Tenser to make sure this will happen for the SUMO article at least.',0.00,0,0,3810377,0,NULL,0),(248970,299942,'2008-10-10 14:13:15','',0.00,0,0,3811765,5,'342643',0),(248970,297995,'2008-10-10 14:27:02','(In reply to comment #335)\nI imagine this has to be uploaded as a patch (hg diff -u8)... see http://developer.mozilla.org/En/Creating_a_patch',0.00,0,0,3811793,0,NULL,0),(248970,251051,'2008-10-10 14:54:45','Thanks Aaron for the unit test. I\'ve included this in my mq, and it\'ll be in the next revision of the patch which I\'m attaching to the bug right now...',0.00,0,0,3811845,6,'342643',0),(248970,251051,'2008-10-10 14:56:29','This makes all of the splitted patches I\'d posted so far obsolete. I\'ll attach new versions of those patches shortly.',0.00,0,0,3811851,5,'342650',0),(248970,251051,'2008-10-10 15:11:14','(In reply to comment #338)\n> Created an attachment (id=342650) [details]\n> Patch (v2.11)\n\nThis patch should be applied on top of my latest patches for bug 458954 and bug 457110.\n\nHere is the list of changes in this patch:\n\n1. nsIPrivateBrowsingService.idl was moved to netwerk/base/public.\n2. All of the modules now call the private browsing service directly to get the current status upon startup.\n3. The private-browsing-query notification, which was merely added for the purpose of not having to depend on nsIPrivateBrowsingService, was removed.\n4. The private-browsing-requested was added. This notification is sent before entering or leaving the private mode. Extensions and modules have a chance to cancel this mode if they desire (download manager handles this notification).\n5. The bug which caused session store to save the private session to disk when restarting from within the private mode is fixed.\n6. The bug which caused session store to think the browser has crashed if the user tired to close the browser while still in private mode is fixed.\n7. Latest fixes as per review comments for the cookies and password manager modules are included in this patch. (The changes requested to passwordmgr unit tests are not included yet).\n8. Aaron\'s unit test for places is now included, making the places module ready for review.\n9. The cookies and httpauth module tests are now splitted.\n10. The latest functional spec for the downloads manager has been implemented in both the back-end and the front-end UI.',0.00,0,0,3811875,0,NULL,0),(248970,251051,'2008-10-10 15:51:02','Latest version of the contentprefs module patch.',0.00,0,0,3811924,5,'342661',0),(248970,251051,'2008-10-10 15:51:27','Latest version of the cookie patch, with the changes requested in comment 330, and the rest of the review comments.',0.00,0,0,3811926,5,'342662',0),(248970,251051,'2008-10-10 15:55:08','The places module patch with a unit test, ready for review.',0.00,0,0,3811930,5,'342664',0),(248970,240353,'2008-10-10 16:56:01','(In reply to comment #342)\n> Created an attachment (id=342664) [details]\n> [for review] places v1\n\nwell this is not a review, but some comment on a couple doubts i have, hope it could be useful...\n\n {\n PRInt64 placeId;\n nsresult rv = GetPlaceIdForURI(aURI, &placeId);\n NS_ENSURE_SUCCESS(rv, rv);\n \n+ if (placeId == -1) // we\'re in private browsing mode\n+ return NS_OK;\n+\n\ni\'m not really sure about this, placeId == -1 imho should throw and not be considered as valid, i fear this could hide other possible bugs or db corruptions. Maybe you should directly check if we are in privatebrowsing mode through an internal helper method.\n\n-#define PLACES_SCHEMA_VERSION 7\n+#define PLACES_SCHEMA_VERSION 8\n\nyou should not upgrade schema version if you\'re not providing a migrateV8Up function with the table changes from v7\n\n+ NS_ENSURE_SUCCESS(rv, rv);\n+ }\n+\n+ // moz_privatebrowsinghistory\n+ rv = mDBConn->TableExists(NS_LITERAL_CSTRING(\"moz_privatebrowsinghistory\"), &tableExists);\n+ NS_ENSURE_SUCCESS(rv, rv);\n+ if (!tableExists) {\n+ rv = mDBConn->ExecuteSimpleSQL(CREATE_MOZ_PRIVATEBROWSINGHISTORY);\n NS_ENSURE_SUCCESS(rv, rv);\n }\n\nwhy do you need to create a table to hold only 1 value that is inserted and removed sometimes, and you don\'t need to do searches or manipulation of this data? would not be better a pref or another kind of persistent storage (since i suppose a user could close the browser in private mode and we should rememeber that value to restart in private browsing mode?)?\n\n+ rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(\n+ \"SELECT last_entered FROM moz_privatebrowsinghistory \"\n+ \"ORDER BY last_entered DESC\"),\n+ getter_AddRefs(mDBGetLastPBEnterDate));\n+ NS_ENSURE_SUCCESS(rv, rv);\n+\n+ rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(\n+ \"INSERT INTO moz_privatebrowsinghistory \"\n+ \"(last_entered) \"\n+ \"VALUES(?1)\"),\n+ getter_AddRefs(mDBSetLastPBEnterDate));\n+ NS_ENSURE_SUCCESS(rv, rv);\n+\n+ rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(\n+ \"DELETE FROM moz_privatebrowsinghistory\"),\n+ getter_AddRefs(mDBRemoveLastPBEnterDate));\n NS_ENSURE_SUCCESS(rv, rv);\n\ncaching statements at startup is good for statements executed often, these are executed a few times, or never in a session, if you\'re going to hold the table you should probably not cache these since it would regress startup time and not provide enough perf gain. And you could directly use executeSimpleSQL for the delete.',0.00,0,0,3811975,0,NULL,0),(248970,75420,'2008-10-10 18:04:27','>+ } else if (!strcmp(aTopic, \"browser:private-browsing\")) {\n>+ if (NS_LITERAL_STRING(\"enter\").Equals(aData)) {\n>+ // backup the existing in-memory DB\n>+ PRBool ok = PR_TRUE;\n>+ if (!mPrivateHostTable.IsInitialized())\n>+ ok = mPrivateHostTable.Init();\n+ if (ok) {\n+ mHostTable = &mPrivateHostTable;\n+ mCookieCount = mHostTable->Count();\n+ NotifyChanged(nsnull, NS_LITERAL_STRING(\"cleared\").get());\n+ }\n\njust write this as |if (mPrivateHostTable.IsInitialized() || mPrivateHostTable.Init())| and skip the |ok| bit.\n\n>+ } else if (NS_LITERAL_STRING(\"exit\").Equals(aData)) {\n>+ // open the connection to the on-disk DB\n>+ InitDB();\n>+ // restore the in-memory DB as it was prior to private browsing\n>+ if (mPrivateHostTable.IsInitialized())\n>+ mPrivateHostTable.Clear();\n>+ mHostTable = &mDefaultHostTable;\n>+ mCookieCount = mHostTable->Count();\n>+ // continue to use both on-disk and in-memory DB\n\nhmm. you fire a \"cleared cookie list\" notification when entering PB, but nothing on exit - so the cookiemanager and such will still show PB cookies, no? but we can\'t just fire a clear here either, since it needs to be repopulated. seems like we either need to teach CM about PB notifications so it can do its own thing, or we could have PBS fire a profile-related notification (\"profile-do-change\" perhaps?) to force reloads? not sure what other effects that might have...\n\nalso, missing indentation space on the last line there.\n\nr=me on the cookieservice bits, but we still need a solution for cookiemanager.',0.00,0,0,3812032,6,'342662',0),(248970,251051,'2008-10-10 22:57:11','Try server builds for v2.11 available at: ',0.00,0,0,3812157,0,NULL,0),(248970,251051,'2008-10-10 23:38:50','(In reply to comment #344)\n> hmm. you fire a \"cleared cookie list\" notification when entering PB, but\n> nothing on exit - so the cookiemanager and such will still show PB cookies, no?\n> but we can\'t just fire a clear here either, since it needs to be repopulated.\n> seems like we either need to teach CM about PB notifications so it can do its\n> own thing, or we could have PBS fire a profile-related notification\n> (\"profile-do-change\" perhaps?) to force reloads? not sure what other effects\n> that might have...\n\nI think a better solution would be to add a new cookie-changed notification type, called \"reload\", which forces clients to reload their cookie list, and fire it when exiting the private mode.\n\nI have implemented this, and wrote a test for it as well. I\'ve also changed the cookies dialog, and I\'m requesting a review from Gavin on those parts.\n\nOther comments and nits are also fixed.',0.00,0,0,3812170,5,'342686',0),(248970,251051,'2008-10-11 01:17:20','(In reply to comment #343)\n> well this is not a review, but some comment on a couple doubts i have, hope it\n> could be useful...\n\nAll comments on the patches and drive-by reviews are always welcome! :-)\n\n> + if (placeId == -1) // we\'re in private browsing mode\n> + return NS_OK;\n> +\n> \n> i\'m not really sure about this, placeId == -1 imho should throw and not be\n> considered as valid, i fear this could hide other possible bugs or db\n> corruptions. Maybe you should directly check if we are in privatebrowsing mode\n> through an internal helper method.\n\nYou\'re right. Done.\n\n> why do you need to create a table to hold only 1 value that is inserted and\n> removed sometimes, and you don\'t need to do searches or manipulation of this\n> data? would not be better a pref or another kind of persistent storage (since i\n> suppose a user could close the browser in private mode and we should rememeber\n> that value to restart in private browsing mode?)?\n\nOK. A pref would be convenient, but semantically wrong (since the timestamp is not a preference, and that would be abusing the prefs module!), so I decided to go with a temporary file in the profile, to hold a single 64-bit value representing the timestamp.\n\n> caching statements at startup is good for statements executed often, these are\n> executed a few times, or never in a session, if you\'re going to hold the table\n> you should probably not cache these since it would regress startup time and not\n> provide enough perf gain. And you could directly use executeSimpleSQL for the\n> delete.\n\nThis is now moot, because I\'m no longer storing the timestamp in the DB.',0.00,0,0,3812215,5,'342690',0),(248970,251051,'2008-10-11 01:23:55','The latest version of the monolithic patch, including the fixes to the individual \"for review\" patches posted since publishing v2.11.\n\nI\'ve submitted a try server build of this patch which should show up in about 1-2 hours from now. I\'ll post a link to the builds page later on.',0.00,0,0,3812218,5,'342691',0),(248970,240353,'2008-10-11 03:06:14','(In reply to comment #347)\n> > why do you need to create a table to hold only 1 value that is inserted and\n> > removed sometimes, and you don\'t need to do searches or manipulation of this\n> > data? would not be better a pref or another kind of persistent storage > \n> OK. A pref would be convenient, but semantically wrong (since the timestamp is\n> not a preference, and that would be abusing the prefs module!), so I decided to\n> go with a temporary file in the profile, to hold a single 64-bit value\n> representing the timestamp.\n\nactually there could be other possibilities rather than creating something new, dietrich could provide better ideas, however i am thinking you could create a \"privateBrowsing/lastEntered\" itemAnnotation on the places root (nsNavBookmarks->GetPlacesRoot(&placesRoot)) that is a node always valid.',0.00,0,0,3812246,0,NULL,0),(248970,75420,'2008-10-11 03:14:07','looks good - r=me on the cookieservice bits.',0.00,0,0,3812255,6,'342686',0),(248970,316560,'2008-10-11 03:50:28','Will it be possible for someone to tell that I have even entered private browsing by looking at the error log or something else? Of course this is of secondary importance...\n\nAnd this may be needless work because people use private browsing for different ends... but would it be possible to add a hidden preference in about:config \"allow only secure connections in private browsing mode\".',0.00,0,0,3812274,0,NULL,0),(248970,251051,'2008-10-11 04:45:39','(In reply to comment #349)\n> actually there could be other possibilities rather than creating something new,\n> dietrich could provide better ideas, however i am thinking you could create a\n> \"privateBrowsing/lastEntered\" itemAnnotation on the places root\n> (nsNavBookmarks->GetPlacesRoot(&placesRoot)) that is a node always valid.\n\nOK, I\'ll wait for input from Dietrich (or try to ping him on IRC) to see if there are better/easier possibilities. I\'m willing to change the implementation accordingly.',0.00,0,0,3812293,0,NULL,0),(248970,251051,'2008-10-11 04:52:59','(In reply to comment #351)\n> Will it be possible for someone to tell that I have even entered private\n> browsing by looking at the error log or something else? Of course this is of\n> secondary importance...\n\nThe current implementation of the places module does create some data on disk which can directly be associated with the time of entering the private browsing mode, so the answer to your question is yes.\n\n> And this may be needless work because people use private browsing for different\n> ends... but would it be possible to add a hidden preference in about:config\n> \"allow only secure connections in private browsing mode\".\n\nThat should be better off left to a follow-up bug, because it\'s covering a very specific set of functionality, which might not be appropriate for everyone. Please file a new bug on this (CC me on it as well) and we can continue the discussion there.',0.00,0,0,3812299,0,NULL,0),(248970,251051,'2008-10-11 04:55:03','Try server builds for v2.12 available at: ',0.00,0,0,3812301,0,NULL,0),(248970,213632,'2008-10-13 22:39:41','\n>+static const char* gPrivateBrowsingNotification = \"browser:private-browsing\";\n>+NS_NAMED_LITERAL_STRING(gPBEnter, \"enter\");\n>+NS_NAMED_LITERAL_STRING(gPBLeave, \"exit\");\n\nnit: would prefer expansion of PB\n\nalso, is there a reason these notifications are strings instead of constants defined in the interface? seems like it\'d be cleaner if instead of defining these strings all over the codebase, pb-aware code could check against nsIPrivateBrowsing.NOTIFY_ENTER, or some such.\n\n>+ nsCOMPtr pbs =\n>+ do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n>+ if (pbs)\n>+ pbs->GetPrivateBrowsing(&mInPrivateBrowsing);\n\ninstead of initializing this value in the startup path and checking the property directly, please lazily do this via a smart getter. see bug 342991 for an example.\n\n>+already_AddRefed\n>+nsNavHistory::GetPBEnterDateFile()\n>+{\n>+ nsCOMPtr file;\n>+ nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,\n>+ getter_AddRefs(file));\n>+ NS_ENSURE_SUCCESS(rv, nsnull);\n>+ rv = file->Append(PB_ENTER_FILENAME);\n>+ NS_ENSURE_SUCCESS(rv, nsnull);\n>+ PRBool exists;\n>+ rv = file->Exists(&exists);\n>+ NS_ENSURE_SUCCESS(rv, nsnull);\n>+ if (exists) {\n>+ rv = file->Remove(PR_FALSE);\n>+ NS_ENSURE_SUCCESS(rv, nsnull);\n>+ }\n>+\n>+ return file.forget();\n>+}\n\nUsing a separate file for this is overkill. File i/o can be painfully slow, especially on some Windows systems, USB drives, and mobile devices. Using annotations, as Marco suggested, would incur even more painful file i/o by forcing SQLite to fsync. It may be semantically incorrect, but using a pref here seems to be the most expedient and performant approach. A quick scan of about:config shows that there\'s a pattern and practice of storing timestamps in preferences.',0.00,0,0,3814772,6,'342690',0),(248970,251051,'2008-10-14 12:56:26','This patch updates the passwordmgr and places modules as per the review comments, and updates the download manager module to use the latest patch in bug 457110.',0.00,0,0,3815610,5,'343102',0),(248970,8020,'2008-10-14 13:04:25','So many patches: Could we have a screenshot ... please?',0.00,0,0,3815619,0,NULL,0),(248970,251051,'2008-10-14 13:06:54','(In reply to comment #324)\n> (From update of attachment 341415 [details])\n> General nit: patches are easier to review with more context in the diffs... See\n> http://developer.mozilla.org/en/Mercurial_FAQ#Configuration (specifically, the\n> \"-U 8\" part).\n\nYou\'re right, sorry about that.\n\n> Like dwitte said, this really seems like it should ask a service for the\n> initial state. Something like:\n> \n> var PBS = Cc[\"mumble\"].getService(Ci.mumble);\n> this._inPrivateBrowsing = PBS.inPrivateBrowsing;\n\nDone.\n\n> >+++ b/toolkit/components/passwordmgr/test/subtst_bug_248970_3.html\n> ...\n> >+function submitForm() {\n> >+ setTimeout(function(){ form.submit(); }, 100);\n> >+}\n> \n> Why the setTimeout()?\n\nThat was a left-over from a problem I was haunting in the test and I thought it was related to the timing issues. I removed it.\n\n> >+++ b/toolkit/components/passwordmgr/test/subtst_bug_248970_4.html\n> ...\n> >+function submitForm() {\n> ...\n> >+ var result = pwmgr.autoCompleteSearch(\"\", null, userField);\n> >+ if (result instanceof Ci.nsIAutoCompleteResult &&\n> >+ result.matchCount == 1) {\n> >+ userField.focus();\n> >+ userField.value = result.getValueAt(0);\n> >+ userField.blur();\n> >+ }\n> >+\n> >+ setTimeout(function(){ form.submit(); }, 100);\n> >+}\n> \n> Seems like this code should be the top test (test_privbrowsing.html), not in\n> the subtest.\n\nActually I\'m not sure if this can be called from the top test without major changes to its logic. The top test handles the load event on the iframe for subtests by ignore odd loads and handling even loads; and each subtest submits itself, so effectively only the submitted pages are handled by the top test. The new code in this patch is however cleaner.\n\n> Why call pwmgr.autoCompleteSearch? That\'s kind of a hacky API, and\n> I\'d like to remove it eventually... Look at test_basic_form_autocomplete.html\n> for how to drive the autocomplete dropdown without this.\n\nOK, done. I moved doKey to pwmgr_common.js to avoid duplicating it in test_privbrowsing.html.\n\n> >+function get_PBSvc() {\n> ...\n> >+ if (PBS_CID in Components.classes &&\n> >+ \"nsIPrivateBrowsingService\" in Components.interfaces) {\n> >+ try {\n> >+ _PBSvc = Components.classes[PBS_CID].\n> >+ getService(Components.interfaces.nsIPrivateBrowsingService);\n> >+ if (_PBSvc) {\n> >+ var observer = {\n> ...\n> \n> I\'m not sure what this is all for. You shouldn\'t need to check if the service\n> Cc/Ci exists (just let it throw+fail if it doesn\'t),\n\nYou\'re right, done.\n\n> and the observer doesn\'t seem to do anything useful?\n\nNo actually it prevents a dialog from poping up asking you whether to save and close your current session or not.',0.00,0,0,3815626,5,'343105',0),(248970,251051,'2008-10-14 13:13:24','(In reply to comment #355)\n> >+static const char* gPrivateBrowsingNotification = \"browser:private-browsing\";\n> >+NS_NAMED_LITERAL_STRING(gPBEnter, \"enter\");\n> >+NS_NAMED_LITERAL_STRING(gPBLeave, \"exit\");\n> \n> nit: would prefer expansion of PB\n\nFixed.\n\n> also, is there a reason these notifications are strings instead of constants\n> defined in the interface? seems like it\'d be cleaner if instead of defining\n> these strings all over the codebase, pb-aware code could check against\n> nsIPrivateBrowsing.NOTIFY_ENTER, or some such.\n\nThey\'re strings, so I can\'t define them as const in the IDL, but I went ahead and put preprocessor macros in the IDL and used it in C++ callers. This should make the code cleaner a bit.\n\n> >+ nsCOMPtr pbs =\n> >+ do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n> >+ if (pbs)\n> >+ pbs->GetPrivateBrowsing(&mInPrivateBrowsing);\n> \n> instead of initializing this value in the startup path and checking the\n> property directly, please lazily do this via a smart getter. see bug 342991 for\n> an example.\n\nI think the bug # you cited is incorrect, but I did something which is hopefully what you had in mind in this patch.\n\n> Using a separate file for this is overkill. File i/o can be painfully slow,\n> especially on some Windows systems, USB drives, and mobile devices. Using\n> annotations, as Marco suggested, would incur even more painful file i/o by\n> forcing SQLite to fsync. It may be semantically incorrect, but using a pref\n> here seems to be the most expedient and performant approach. A quick scan of\n> about:config shows that there\'s a pattern and practice of storing timestamps in\n> preferences.\n\nRemoved the whole timestamp-based checks based on our IRC conversation.',0.00,0,0,3815632,5,'343106',0),(248970,251051,'2008-10-14 13:44:00','(In reply to comment #357)\n> So many patches: Could we have a screenshot ... please?\n\nThis is not exactly a bug where a screenshot is helpful, I guess. But you can download the experimental builds for the latest version of the patch here: ',0.00,0,0,3815685,0,NULL,0),(248970,213632,'2008-10-14 14:55:27','> > also, is there a reason these notifications are strings instead of constants\n> > defined in the interface? seems like it\'d be cleaner if instead of defining\n> > these strings all over the codebase, pb-aware code could check against\n> > nsIPrivateBrowsing.NOTIFY_ENTER, or some such.\n> \n> They\'re strings, so I can\'t define them as const in the IDL, but I went ahead\n> and put preprocessor macros in the IDL and used it in C++ callers. This should\n> make the code cleaner a bit.\n\nit\'s still not clear why these are strings, as opposed to integers. while your change helps C++ callers, it doesn\'t help JS callers at all.\n\n> > >+ nsCOMPtr pbs =\n> > >+ do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n> > >+ if (pbs)\n> > >+ pbs->GetPrivateBrowsing(&mInPrivateBrowsing);\n> > \n> > instead of initializing this value in the startup path and checking the\n> > property directly, please lazily do this via a smart getter. see bug 342991 for\n> > an example.\n> \n> I think the bug # you cited is incorrect, but I did something which is\n> hopefully what you had in mind in this patch.\n\nyes, wrong bug, sorry.\n\nthis solution seems over-complicated, shouldn\'t need 2 properties and 2 methods for it. you should be able to have a private member which holds the value, and a getter which first populates the value if needed, and returns it, right?',0.00,0,0,3815788,6,'343106',0),(248970,251051,'2008-10-14 15:23:38','(In reply to comment #361)\n> it\'s still not clear why these are strings, as opposed to integers. while your\n> change helps C++ callers, it doesn\'t help JS callers at all.\n\nBecause the data parameter to nsIObserver::Observe is a string, and you can\'t really pass integers to observers this way. It\'s true that these changes don\'t help JS callers, but that\'s what other interfaces do for their notifications as well (for example, see the offline notifications in the IO service).\n\n> yes, wrong bug, sorry.\n> \n> this solution seems over-complicated, shouldn\'t need 2 properties and 2 methods\n> for it. you should be able to have a private member which holds the value, and\n> a getter which first populates the value if needed, and returns it, right?\n\nThe problem is how to detect if this is the first time we\'re trying to get the value, so that we can initialize it via the service call. The only other solution which I could think of besides adding a separate value for tracking this was to store a magical value in mInPrivateBrowsing, which might not be considered good practice as well.\n\nThat being said, I don\'t think that the initialization code is too slow to be called in Init. It\'s merely retrieving a value through XPCOM, and it should be acceptably fast. We\'re doing something similar for the rest of the modules as well.',0.00,0,0,3815810,0,NULL,0),(248970,283305,'2008-10-14 17:43:47','>>(In reply to comment #357)\n>> So many patches: Could we have a screenshot ... please?\n>\n>This is not exactly a bug where a screenshot is helpful, I guess.\n\nI\'ll be posting details about the user interface for private browsing mode to my blog and to bug 411929 hopefully rather soon.',0.00,0,0,3815935,0,NULL,0),(11040,22599,'2008-10-16 08:43:11','',0.00,0,0,3818116,2,'460279',0),(11040,22599,'2008-10-16 08:46:10','',0.00,0,0,3818118,2,'373182',0),(11040,22599,'2008-10-16 08:47:41','Compare bug 272125: Ignore Junk mail in biff.',0.00,0,0,3818120,0,NULL,0),(248970,251051,'2008-10-16 15:33:32','The cache module patch with a unit test, ready for review. Darin: please let me know if you\'re not the right person to ask for review here... Thanks!',0.00,0,0,3818823,5,'343468',0),(248970,251051,'2008-10-16 15:56:53','Switching review to biesi based on IRC conversation with darin. biesi, please let me know if you\'re the right person to ask for a review here.',0.00,0,0,3818856,6,'343468',0),(248970,251051,'2008-10-17 12:42:54','The satchel module patch with a unit test, ready for review.',0.00,0,0,3820017,5,'343593',0),(248970,213632,'2008-10-17 13:44:59','\n>@@ -303,16 +306,18 @@ const PRInt32 nsNavHistory::kAutoComplet\n> const PRInt32 nsNavHistory::kAutoCompleteIndex_ParentId = 3;\n> const PRInt32 nsNavHistory::kAutoCompleteIndex_BookmarkTitle = 4;\n> const PRInt32 nsNavHistory::kAutoCompleteIndex_Tags = 5;\n> const PRInt32 nsNavHistory::kAutoCompleteIndex_VisitCount = 6;\n> \n> static const char* gQuitApplicationMessage = \"quit-application\";\n> static const char* gXpcomShutdown = \"xpcom-shutdown\";\n> static const char* gAutoCompleteFeedback = \"autocomplete-will-enter-text\";\n>+NS_NAMED_LITERAL_STRING(gPrivateBrowsingEnter, NS_PRIVATE_BROWSING_ENTER);\n>+NS_NAMED_LITERAL_STRING(gPrivateBrowsingLeave, NS_PRIVATE_BROWSING_LEAVE);\n\nnot necessary to create these globals, just use the constants inline.\n\n(In reply to comment #362)\n> > this solution seems over-complicated, shouldn\'t need 2 properties and 2 methods\n> > for it. you should be able to have a private member which holds the value, and\n> > a getter which first populates the value if needed, and returns it, right?\n> \n> The problem is how to detect if this is the first time we\'re trying to get the\n> value, so that we can initialize it via the service call. The only other\n> solution which I could think of besides adding a separate value for tracking\n> this was to store a magical value in mInPrivateBrowsing, which might not be\n> considered good practice as well.\n\ni\'m ok with initializing mInPrivateBrowsing to a magical value. this would be functional, easily readable, and halves the number of properties and getters used.\n\n> That being said, I don\'t think that the initialization code is too slow to be\n> called in Init. It\'s merely retrieving a value through XPCOM, and it should be\n> acceptably fast. We\'re doing something similar for the rest of the modules as\n> well.\n\ni\'m reviewing this while in the middle of an epic battle for Ts wins in Places. every nanosecond counts. everything that can reasonably be lazy, should be.',0.00,0,0,3820091,6,'343106',0),(248970,20209,'2008-10-17 14:06:46','>+++ b/browser/components/preferences/cookies.js\n>@@ -54,40 +54,51 @@ var gCookiesWindow = >+ _populateList: function (aInitiallyLoaded)\n\nNix the space before \'(\' unless that\'s file style?\n\nAlso s/aInitiallyLoaded/aInitialLoad/ might be better.\n\nsr=bzbarsky',0.00,0,0,3820127,6,'342686',0),(248970,251051,'2008-10-17 14:16:47','The nsIPrivateBrowsingService interface, ready for review.',0.00,0,0,3820151,5,'343620',0),(248970,251051,'2008-10-17 14:25:30','(In reply to comment #367)\n> not necessary to create these globals, just use the constants inline.\n\nDone.\n\n> i\'m ok with initializing mInPrivateBrowsing to a magical value. this would be\n> functional, easily readable, and halves the number of properties and getters\n> used.\n\nOK, I did that. I used 0xffffffff as the magical value.\n\n> i\'m reviewing this while in the middle of an epic battle for Ts wins in Places.\n> every nanosecond counts. everything that can reasonably be lazy, should be.\n\nOK, you definitely know better than me there, so here\'s the lazy init code :-)',0.00,0,0,3820172,5,'343623',0),(248970,251051,'2008-10-17 14:42:28','bz\'s nit in comment 368 fixed. Carrying over dwitte\'s r+ and bz\'s sr+.',0.00,0,0,3820213,5,'343632',0),(248970,251051,'2008-10-17 15:30:31','Addressed bz\'s IRC review comments.',0.00,0,0,3820315,5,'343644',0),(248970,251051,'2008-10-17 15:47:25','Changed the implementation of the contentprefs module to not cache the current private browsing status, as per IRC review from mconnor.',0.00,0,0,3820341,5,'343647',0),(248970,96908,'2008-10-17 16:14:28','>+ } else {\n>+ if (document.getElementById(\"filter\").value != \"\")\n\nnit:\n\n}\nelse {\n\notherwise r=me on the /browser bits, I assume dwitte and bz got the cookie bits done.',0.00,0,0,3820387,6,'343632',0),(248970,213632,'2008-10-17 16:33:57','\n>+\n>+PRBool\n>+nsNavHistory::GetPrivateBrowsingModeInitialState()\n>+{\n>+ nsCOMPtr pbs =\n>+ do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n>+ if (pbs) {\n>+ pbs->GetPrivateBrowsing(&mInPrivateBrowsing);\n>+ }\n>+\n>+ return mInPrivateBrowsing;\n>+}\n\nsince this is only ever called once and by only one caller, please just move this code into InPrivateBrowsingMode(), and remove this function altogether.\n\nr=me with this fixed.',0.00,0,0,3820409,6,'343623',0),(248970,96908,'2008-10-17 16:38:18','\n> // If the pref is already set to the value, there\'s nothing more to do.\n> var currentValue = this.getPref(aURI, aName);\n>- if (typeof currentValue != \"undefined\" && currentValue == aValue)\n>- return;\n>+ if (typeof currentValue != \"undefined\") {\n>+ if (currentValue == aValue)\n>+ return;\n>+ } else {\n\nnit (again):\n\n}\nelse {\n\nonly comment is that it might make sense to make the values used in the test consts, so someone doesn\'t change one and break the test. Not really important for unit tests though.\n\nlooks good, r=mconnor',0.00,0,0,3820418,6,'343647',0),(248970,20209,'2008-10-17 16:51:36','>+++ b/netwerk/base/public/nsIPrivateBrowsingService.idl\n>+ // Setting this value while handling one of the notifications generated\n>+ // by the private browsing service causes a NS_ERROR_FAILURE exception\n>+ // being thrown.\n\n ... service throws NS_ERROR_FAILURE.\n\n>+ * set to true to prevent the switch to the private browsing mode.\n\nIs there a good reason for that? I would have thought that setting to false to mean \"no\" would make more sense. Same for leaving.\n\nWith those nits, looks great. I\'d be happy to review the corresponding changes to the service impl if that would be helpful.',0.00,0,0,3820435,6,'343644',0),(248970,96908,'2008-10-17 17:45:02','Hmm, why is the attribute not simply something more descriptive like \"enabled\" ?\n\nreading consumer code then means you get:\n\nnsIPrivateBrowsingService.enabled instead of nsIPrivateBrowsingService.privateBrowsing\n\nnot sure of reasoning, but thought I\'d ask',0.00,0,0,3820510,6,'343644',0),(248970,20209,'2008-10-17 17:49:38','I\'d be fine with privateBrowsingEnabled.... The problem with too-generic attributes (or methods) is that if your object implements more than one interface you better hope all identically-named ones are defined to behave the same if it\'s going to work from JS. We don\'t really want to constrain implementation too much by choice of names in interface if we can avoid it.',0.00,0,0,3820514,0,NULL,0),(248970,96908,'2008-10-17 18:04:41','first off, as discussed, we\'ll kill all of the observer/cached copy stuff and just hit the API directly. We don\'t hit this code often enough to justify the overhead.\n\neverything else looks good, so it\'ll be a quick review when you remove that stuff.',0.00,0,0,3820529,6,'343593',0),(248970,27780,'2008-10-17 23:13:45','Marking r+ (w00t!), although I\'d like to take a look at the updated patch that removes the observers/caching.\n\n>- var canRememberLogin = this._pwmgr.getLoginSavingEnabled(hostname);\n>+ var canRememberLogin = this._inPrivateBrowsing ? false :\n>+ this._pwmgr.getLoginSavingEnabled(hostname);\n\nNit: That seems a litle awkward. Better would be the form used elsewhere |foo = !IPB && bar()|. I\'d also take appending |if (IPD) CRL = false|.\n\n>+var pb = get_PBSvc();\n>+if (!pb) { // Private Browsing might not be available\n>+ ok(true, \"Private browsing service is not available\");\n>+ SimpleTest.finish();\n\nI assume other tests (in /browser?) explicitly require the presence of PBS? If some terrible bug should break/disable PBS in Firefox builds, we wouldn\'t want all the tests passing because they allow for a product to not include it. :)',0.00,0,0,3820630,6,'343105',0),(248970,251051,'2008-10-18 01:55:08','(In reply to comment #377)\n> >+ * set to true to prevent the switch to the private browsing mode.\n> \n> Is there a good reason for that? I would have thought that setting to false to\n> mean \"no\" would make more sense. Same for leaving.\n\nUsually such notifications interpret the subject param as the \"cancel\" param, so if any observers want to bail out, they\'d just cancel the request by setting the cancel parameter to true. I\'d be fine either way, but I think we should keep it this way for the sake of consistency.\n\n> With those nits, looks great. I\'d be happy to review the corresponding changes\n> to the service impl if that would be helpful.\n\nI\'m keeping the service implementation open for changes right now, and I\'ll need to write a few unit tests for it, but I will post a monolithic patch today, and you\'re welcome to take a look at the service bits and let me know if you spot anything wrong. :-)',0.00,0,0,3820696,0,NULL,0),(248970,251051,'2008-10-18 01:59:11','(In reply to comment #378)\n> (From update of attachment 343644 [details])\n> Hmm, why is the attribute not simply something more descriptive like \"enabled\"\n> ?\n> \n> reading consumer code then means you get:\n> \n> nsIPrivateBrowsingService.enabled instead of\n> nsIPrivateBrowsingService.privateBrowsing\n> \n> not sure of reasoning, but thought I\'d ask\n\nNo particular reason, but I wanted to avoid names such as \"enabled\" for the same reason as Boris mentioned in comment 379. I think bz\'s suggestion of privateBrowsingEnabled makes more sense here, so I\'ll incorporate it in the next iteration (I assume I won\'t need to ask for another review on the code parts that already have r+ because of only this change in the name of course, right?).',0.00,0,0,3820697,0,NULL,0),(248970,251051,'2008-10-18 02:13:35','(In reply to comment #375)\n> (From update of attachment 343623 [details])\n> since this is only ever called once and by only one caller, please just move\n> this code into InPrivateBrowsingMode(), and remove this function altogether.\n> \n> r=me with this fixed.\n\nI came up with this code:\n\n PRBool InPrivateBrowsingMode()\n {\n if (mInPrivateBrowsing == PRIVATEBROWSING_NOTINITED) {\n mInPrivateBrowsing = PR_FALSE;\n nsCOMPtr pbs =\n do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n if (pbs) {\n pbs->GetPrivateBrowsing(&mInPrivateBrowsing);\n }\n }\n\n return mInPrivateBrowsing;\n }\n\nThe only difference here is that before trying to get the service, I explicitly set mInPrivateBrowsing to false so that if the service is not available (for example, when places is being used from SeaMonkey or other clients which do not include the private browsing service, the return value becomes correctly false.\n\nPlease let me know if you think this change requires another review round, and I\'ll prepare an updated version of the patch for review.',0.00,0,0,3820700,0,NULL,0),(248970,251051,'2008-10-18 02:18:03','(In reply to comment #376)\n> only comment is that it might make sense to make the values used in the test\n> consts, so someone doesn\'t change one and break the test. Not really important\n> for unit tests though.\n\nSure, that makes a valid point. Done.',0.00,0,0,3820706,0,NULL,0),(248970,251051,'2008-10-18 03:51:48','(In reply to comment #380)\n> (From update of attachment 343593 [details])\n> first off, as discussed, we\'ll kill all of the observer/cached copy stuff and\n> just hit the API directly. We don\'t hit this code often enough to justify the\n> overhead.\n> \n> everything else looks good, so it\'ll be a quick review when you remove that\n> stuff.\n\nOK, done. Here\'s the new patch up for review.',0.00,0,0,3820751,5,'343697',0),(248970,251051,'2008-10-18 05:23:37','(In reply to comment #381)\n> (From update of attachment 343105 [details])\n> Marking r+ (w00t!), although I\'d like to take a look at the updated patch that\n> removes the observers/caching.\n\nSure, here you are! :-)\n\nI moved the _inPrivateBrowsing getter to nsLoginManager, and just had nsLoginManagerPrompter access it through the _pwmgr member. Also I made a small fix to the test to make the iframe always visible, because the previous approach of making it visible only for the duration of the 9th test might fail in rare cases (since the auto-complete popup requires the iframe to be visible).\n\n> Nit: That seems a litle awkward. Better would be the form used elsewhere |foo =\n> !IPB && bar()|. I\'d also take appending |if (IPD) CRL = false|.\n\nI went ahead with the latter form.\n\n> I assume other tests (in /browser?) explicitly require the presence of PBS? If\n> some terrible bug should break/disable PBS in Firefox builds, we wouldn\'t want\n> all the tests passing because they allow for a product to not include it. :)\n\nYes, they will! However, I didn\'t require presence of the private browsing service in non-browser/ tests keeping other consumers in mind (and also in the hopes of landing this patch piece by piece instead of a single check-in). But thanks for confirming this!',0.00,0,0,3820783,5,'343705',0),(248970,251051,'2008-10-18 05:32:25','The latest and greatest version of the patch based on the recent review comments. I\'ve also submitted a try server build, and I\'ll post an update when it\'s available.',0.00,0,0,3820792,5,'343706',0),(248970,20209,'2008-10-18 07:45:39','> Usually such notifications interpret the subject param as the \"cancel\" param,\n\nThat\'s fine with me, but the topic could use a name that makes that a little clearer, then...',0.00,0,0,3820872,0,NULL,0),(248970,213632,'2008-10-18 09:38:05','(In reply to comment #384)\n> \n> Please let me know if you think this change requires another review round, and\n> I\'ll prepare an updated version of the patch for review.\n\nlooks fine, r=me',0.00,0,0,3820940,0,NULL,0),(248970,251051,'2008-10-18 10:17:43','Try server builds for v2.14 available at .',0.00,0,0,3820974,0,NULL,0),(248970,251051,'2008-10-18 10:27:39','(In reply to comment #389)\n> That\'s fine with me, but the topic could use a name that makes that a little\n> clearer, then...\n\nCan you think of a better name? I followed the pattern of quite-application-requested, offline-requested, and offline-app-requested...',0.00,0,0,3820982,0,NULL,0),(248970,96908,'2008-10-18 10:35:18','sweet, looks good! r=mconnor',0.00,0,0,3820988,6,'343697',0),(248970,76551,'2008-10-18 10:51:32','Ehsan, I\'ve tested your latest try server build and noticed that temporary files which are downloaded to be used with an external application are not deleted when leaving the private browsing mode. They still exist on disk until the browser is closed. But what is more interesting the download manager doesn\'t store these files in the in-memory database. Instead they end up in the downloads.sqlite.\n\nShould I file a new bug on that? I would prefer this when seeing a comment count of nearly 400 on this bug.',0.00,0,0,3821009,0,NULL,0),(248970,251051,'2008-10-18 11:04:55','(In reply to comment #394)\n> Ehsan, I\'ve tested your latest try server build and noticed that temporary\n> files which are downloaded to be used with an external application are not\n> deleted when leaving the private browsing mode. They still exist on disk until\n> the browser is closed. But what is more interesting the download manager\n> doesn\'t store these files in the in-memory database. Instead they end up in the\n> downloads.sqlite.\n\nOh, that\'s definitely a bug. It\'d be great if you can file a bug and CC me there.',0.00,0,0,3821021,0,NULL,0),(248970,76551,'2008-10-18 14:10:16','(In reply to comment #395)\n> Oh, that\'s definitely a bug. It\'d be great if you can file a bug and CC me\n> there.\n\nI\'ve filed bug 460608 and bug 460609 for both issues.',0.00,0,0,3821116,0,NULL,0),(248970,27780,'2008-10-19 01:33:02','Should private browsing mode disable geolocation requests? Seems like it should, although I suppose we could just let the user deny the requests (when we prompt them).\n\nAlso, I added a line item regarding private browsing to the security review template (https://wiki.mozilla.org/Firefox3/Security_Review_Template), to help make sure that future browser features consider their impact to private browsing.',0.00,0,0,3821373,0,NULL,0),(248970,251051,'2008-10-19 06:35:37','(In reply to comment #397)\n> Should private browsing mode disable geolocation requests? Seems like it\n> should, although I suppose we could just let the user deny the requests (when\n> we prompt them).\n\nWe don\'t block explicit actions from the user (such as bookmarking), so I\'m thinking we shouldn\'t block geolocation automatically, and should let the user decide instead. Also, the private browsing mode is really about keeping your browsing history private from other people who use the same computer, more than anything else...\n\n> Also, I added a line item regarding private browsing to the security review\n> template (https://wiki.mozilla.org/Firefox3/Security_Review_Template), to help\n> make sure that future browser features consider their impact to private\n> browsing.\n\nLooks good, thanks!',0.00,0,0,3821493,0,NULL,0),(248970,20209,'2008-10-19 07:47:38','> Can you think of a better name? I followed the pattern of\n> quite-application-requested, offline-requested, and offline-app-requested\n\nGah. And they all use this backwards pattern? :( And in our usual charming way, completely undocumented. Quite lovely. I hate this undocumented use of the observer service as a backdoor. :(\n\nLet\'s try to do better here. If \"true\" means cancel, then perhaps the topic should be named \"private-browsing-cancellation-opportunity\" something? Might be worth running this by mconnor too, though. To be honest, I\'m having a hard time encoding the \"set true to cancel\" thing in the name, since that\'s so backwards to how most things work. :(',0.00,0,0,3821540,0,NULL,0),(248970,251051,'2008-10-19 08:00:36','(In reply to comment #399)\n> Gah. And they all use this backwards pattern? :( And in our usual charming\n> way, completely undocumented. Quite lovely. I hate this undocumented use of\n> the observer service as a backdoor. :(\n\nYes. I\'m wondering if they\'ve passed sr when they were first added to the tree though.\n\n> Let\'s try to do better here. If \"true\" means cancel, then perhaps the topic\n> should be named \"private-browsing-cancellation-opportunity\" something? Might\n> be worth running this by mconnor too, though. To be honest, I\'m having a hard\n> time encoding the \"set true to cancel\" thing in the name, since that\'s so\n> backwards to how most things work. :(\n\nI\'ll try to catch mconnor on IRC on this, but I can thought of at least one, less verbose, alternative here: \"private-browsing-cancel-vote\" (think of the metaphor where an observer \"votes\" to cancel the private browsing mode change by setting the cancel vote nsISupportsPRBool to true).',0.00,0,0,3821544,0,NULL,0),(248970,20209,'2008-10-19 09:58:57','> I\'m wondering if they\'ve passed sr\n\nMost of them are in modules that don\'t require sr, as far as I can tell.\n\n\"private-browsing-cancel-vote\" might work, yeah.',0.00,0,0,3821621,0,NULL,0),(248970,251051,'2008-10-19 14:20:22','http://hg.mozilla.org/mozilla-central/rev/ab63f0d13ea8',0.00,0,0,3821802,6,'343644',0),(248970,251051,'2008-10-19 14:21:39','http://hg.mozilla.org/mozilla-central/rev/53b78b1b3910',0.00,0,0,3821804,6,'343632',0),(248970,251051,'2008-10-19 14:22:27','http://hg.mozilla.org/mozilla-central/rev/e9b859357547',0.00,0,0,3821805,6,'343623',0),(248970,251051,'2008-10-19 14:24:47','http://hg.mozilla.org/mozilla-central/rev/81e6937843a7',0.00,0,0,3821808,6,'343647',0),(248970,251051,'2008-10-19 14:25:32','http://hg.mozilla.org/mozilla-central/rev/ee936d0fd358',0.00,0,0,3821809,6,'343697',0),(248970,251051,'2008-10-19 15:04:18','New patch updated to tip after landing the previous five patches.',0.00,0,0,3821826,5,'343848',0),(248970,27780,'2008-10-19 17:59:14','>+ // Whether we are in private browsing mode\n>+ get _inPrivateBrowsing() {\n>+ // The Private Browsing service might not be available.\n>+ try {\n>+ var pbs = Cc[\"@mozilla.org/privatebrowsing;1\"].\n>+ getService(Ci.nsIPrivateBrowsingService);\n>+ return pbs.privateBrowsingEnabled;\n>+ } catch (e) {\n>+ return false;\n>+ }\n> },\n\nI think it would be better to use a smart getter for the service (with a tweak for when it\'s not available), so that we don\'t fetch it repeatedly. EG:\n\n __privateBrowsingSvc : undefined,\n // If the service isn\'t available, null will be returned.\n get _privateBrowsingSvc() {\n if (this.__privateBrowsingSvc == undefined) {\n if (\"@mozilla.org/privatebrowsing;1\" in Cc)\n this.__privateBrowsingSvc = Cc[...].getService(...);\n else\n this.__privateBrowsingSvc = null;\n }\n return this.__privateBrowsingSvc;\n }\n\nand then\n\n get _inPrivateBrowsing() {\n var svc = this._privateBrowsingService;\n if (svc)\n return svc.privateBrowsingEnabled;\n else\n return false;\n }\n\n+++ b/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js\n...\n>- if (hostname) {\n>+ if (hostname && !this._pwmgr._inPrivateBrowsing) {\n\nErr, does this even work?\n\nnsLoginManagerPrompter just obtains _pwmgr as with any other service, so it shouldn\'t be seeing _inPrivateBrowsing without a corresponding XPCOM interface.\n\nRegardless, because the prompter is a separate component, it shouldn\'t be using internal pwmgr APIs anyway. Just implement _inPrivateBrowsing locally -- cut\'n\'paste the original code this patch was putting in nsLoginManger.js (no need to cache the service here, so my last comment doesn\'t apply).',0.00,0,0,3821915,6,'343705',0),(248970,251051,'2008-10-19 21:46:00','Latest try server builds available at: ',0.00,0,0,3822020,0,NULL,0),(248970,251051,'2008-10-20 13:50:42','(In reply to comment #408)\n> I think it would be better to use a smart getter for the service (with a tweak\n> for when it\'s not available), so that we don\'t fetch it repeatedly. EG:\n\nDone.\n\n> +++ b/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js\n> ...\n> >- if (hostname) {\n> >+ if (hostname && !this._pwmgr._inPrivateBrowsing) {\n> \n> Err, does this even work?\n> \n> nsLoginManagerPrompter just obtains _pwmgr as with any other service, so it\n> shouldn\'t be seeing _inPrivateBrowsing without a corresponding XPCOM interface.\n\nOops, I hadn\'t noticed that _pwmgr is referring to an XMPCOM component... I guess the fact that this works is showing some XPCOM wrappers magic, but I agree that it is bad practice. My bad for not spotting this myself.\n\n> Regardless, because the prompter is a separate component, it shouldn\'t be using\n> internal pwmgr APIs anyway. Just implement _inPrivateBrowsing locally --\n> cut\'n\'paste the original code this patch was putting in nsLoginManger.js (no\n> need to cache the service here, so my last comment doesn\'t apply).\n\nDone.',0.00,0,0,3822966,5,'343965',0),(248970,27780,'2008-10-20 14:05:43','>+ get _privateBrowsingService() {\n>+ if (this.__privateBrowsingService == undefined)\n>+ try {\n>+ this.__privateBrowsingService = Cc[\"@mozilla.org/privatebrowsing;1\"].\n>+ getService(Ci.nsIPrivateBrowsingService);\n>+ } catch (e) {\n>+ this.__privateBrowsingService = null;\n>+ }\n>+ return this.__privateBrowsingService;\n>+ },\n\nOne reason to consider using |if (\"@mozilla.org/privatebrowsing;1\" in Cc)| here (instead of try/catch) is if PBS *is* present but fails to initialize... It\'s not terribly likely (right now, with the simple init in PBS), but the risk is masking the failure and ignoring private browsing mode for the rest of the session.',0.00,0,0,3822994,6,'343965',0),(248970,251051,'2008-10-20 14:32:50','(In reply to comment #411)\n> One reason to consider using |if (\"@mozilla.org/privatebrowsing;1\" in Cc)| here\n> (instead of try/catch) is if PBS *is* present but fails to initialize... It\'s\n> not terribly likely (right now, with the simple init in PBS), but the risk is\n> masking the failure and ignoring private browsing mode for the rest of the\n> session.\n\nSure, I\'ll do this before landing this piece.',0.00,0,0,3823033,0,NULL,0),(248970,251051,'2008-10-20 14:43:36','This patch is a small fix to the cookie service code, in order to make it send \"reload\" notifications on both entering and leaving the private browsing mode. Previously, it sent a \"cleared\" notification on entering the private browsing mode, which is semantically wrong (because the cookies weren\'t actually cleared) and was only needed for the cookie manager window\'s list to be emptied. This can be done with \"reload\".\n\nMisusing the \"cleared\" notification this way had created a problem with the DOM storage module which uses the \"cleared\" notification to clear its data, and would potentially hurt add-ons which use this notification as well.',0.00,0,0,3823053,5,'343974',0),(248970,251051,'2008-10-20 14:49:03','The DOM storage part with a unit test, ready for review.',0.00,0,0,3823065,5,'343975',0),(248970,75420,'2008-10-20 14:50:17','looks good! r=me',0.00,0,0,3823069,6,'343974',0),(248970,251051,'2008-10-20 15:31:58','http://hg.mozilla.org/mozilla-central/rev/79ac062d72c2415',0.00,0,0,3823147,6,'343965',0),(248970,251051,'2008-10-20 15:32:56','http://hg.mozilla.org/mozilla-central/rev/65da9468c88b',0.00,0,0,3823149,6,'343974',0),(248970,76551,'2008-10-20 15:50:17','(In reply to comment #409)\n> Latest try server builds available at:\n> \n\nWith this try server build it takes about 15 seconds to enter the private browsing mode on OS X. Reverting to normal only takes less a second.',0.00,0,0,3823180,0,NULL,0),(248970,251051,'2008-10-20 16:07:13','(In reply to comment #418)\n> With this try server build it takes about 15 seconds to enter the private\n> browsing mode on OS X. Reverting to normal only takes less a second.\n\nDoes the same thing happen with ?\n\nI don\'t have a Mac, so I can\'t test it myself, but can someone else please run the above two versions and report the results?',0.00,0,0,3823195,0,NULL,0),(248970,9186,'2008-10-21 03:18:03','So do we really completely want to block storage? Or allow reading but not writing?\n\nWhat do we do for cookies? Do we allow them to be sent but not written to?',0.00,0,0,3823682,6,'343975',0),(248970,243208,'2008-10-21 05:05:18','(In reply to comment #420)\n> (From update of attachment 343975 [details])\n> So do we really completely want to block storage? Or allow reading but not\n> writing?\n> \n> What do we do for cookies? Do we allow them to be sent but not written to?\n\nThe latter sounds like a better idea, but either way, you probably shouldn\'t do it in CanUseStorage otherwise a DOM_SECURITY_ERR will be returned. If this propagates to javascript, this will break any sites using DOMStorage while in private browsing.',0.00,0,0,3823773,0,NULL,0),(248970,243208,'2008-10-21 05:08:50','Returning NS_OK in all the functions with nsDOMStorage::Set* and nsDOMStorageItem::Set* should do the trick, right?\n\nAlso, is the code hit often enough that observers are necessary?',0.00,0,0,3823780,0,NULL,0),(248970,9186,'2008-10-21 05:49:30','I got the impression that that was what other browsers do. Has anybody tested?\n\nAlso, what do we do?',0.00,0,0,3823817,0,NULL,0),(248970,243208,'2008-10-21 05:54:04','Please correct me if I\'m wrong.\n\nLooking at the latest cookie patch, we create a new table in memory to store the cookies, so that when private browsing mode is exited we destroy that list and recover the original cookie table as it was before entering private browsing.',0.00,0,0,3823821,0,NULL,0),(248970,251051,'2008-10-21 06:25:07','(In reply to comment #420)\n> (From update of attachment 343975 [details])\n> So do we really completely want to block storage? Or allow reading but not\n> writing?\n\nAccording to the functional spec , storage should be blocked entirely. Of course I\'m not sure why mconnor specified it in this way.\n\n> What do we do for cookies? Do we allow them to be sent but not written to?\n\nFor cookies, we close the disk DB connection (because the cookie back-end supports using any of the two kinds of storage engines, memory and disk, simultaneously or individually) and use an empty in-memory hash table to store the cookies during the private mode. When leaving the private mode, that hash table is discarded, and the previous one (as it was when entering the private mode) is restored, and the disk DB connection is re-opened.',0.00,0,0,3823851,0,NULL,0),(248970,251051,'2008-10-21 06:33:17','(In reply to comment #421)\n> The latter sounds like a better idea, but either way, you probably shouldn\'t do\n> it in CanUseStorage otherwise a DOM_SECURITY_ERR will be returned. If this\n> propagates to javascript, this will break any sites using DOMStorage while in\n> private browsing.\n\nModifying CanUseStorage was what dcamp suggested in comment 172. Anyway, site javascript code should be ready to handle this exception because it may be thrown for other reasons as well (for example, if a user has turned off DOM storage via prefs. Of course whether it\'s a good idea to throw this exception in this case is another question.\n\n(In reply to comment #422)\n> Returning NS_OK in all the functions with nsDOMStorage::Set* and\n> nsDOMStorageItem::Set* should do the trick, right?\n\nThat\'s kind of like what we do in other places, such as the contentprefs service, for example. dcamp: how about changing the implementation according to this plan?\n\n> Also, is the code hit often enough that observers are necessary?\n\nIt\'s not called enough, but I\'m ready to turn off caching the preference value if the reviewers request it (we\'ve done this in a number of other modules recently).',0.00,0,0,3823858,0,NULL,0),(248970,265995,'2008-10-21 09:49:00','(In reply to comment #421)\n> The latter sounds like a better idea, but either way, you probably shouldn\'t do\n> it in CanUseStorage otherwise a DOM_SECURITY_ERR will be returned. If this\n> propagates to javascript, this will break any sites using DOMStorage while in\n> private browsing.\n\nI\'m not sure it\'s better to silently fail to do what they asked. A well-written site needs to be ready for storage exceptions anyway (they can be thrown for quota reasons, for example).',0.00,0,0,3824134,0,NULL,0),(248970,9186,'2008-10-21 13:38:05','So from a users point of view all cookies will \'disappear\' while in private browsing mode? And then come back when private browsing ends? (disregarding what appears in the prefs UI)',0.00,0,0,3824522,0,NULL,0),(248970,75420,'2008-10-21 13:50:16','(In reply to comment #428)\n> So from a users point of view all cookies will \'disappear\' while in private\n> browsing mode? And then come back when private browsing ends? (disregarding\n> what appears in the prefs UI)\n\nyes.',0.00,0,0,3824537,0,NULL,0),(248970,251051,'2008-10-21 13:52:29','(In reply to comment #428)\n> So from a users point of view all cookies will \'disappear\' while in private\n> browsing mode? And then come back when private browsing ends? (disregarding\n> what appears in the prefs UI)\n\nThe prefs UI will remain updated as well, so if someone leaves the cookies manager dialog open, she will see this happening.',0.00,0,0,3824541,0,NULL,0),(248970,15661,'2008-10-21 14:04:33','+++ b/netwerk/cache/src/nsCacheService.cpp\n\nin Observe():\n\n- nsCacheService::SetDiskCacheEnabled(DiskCacheEnabled());\n+ if (mInPrivateBrowsing)\n+ mDiskCacheEnabled = PR_FALSE;\n\nHm... why set mDiskCacheEnabled to false here? It should be false already when mInPrivateBrowsing is true, right?\n\n- nsCacheService::SetOfflineCacheEnabled(OfflineCacheEnabled());\n+ if (mInPrivateBrowsing)\n+ mOfflineCacheEnabled = PR_FALSE;\n\nsame here.\n\n+ } else if (!strcmp(NS_PRIVATE_BROWSING_SWITCH_TOPIC, topic)) {\n+\n+ nsCOMPtr branch = do_GetService(NS_PREFSERVICE_CONTRACTID);\n\nplease remove the empty line\n\nalso, you only need the prefbranch in the else-branch of the if, right? Can you move it there?\n\n+ rv = branch->GetBoolPref(DISK_CACHE_ENABLE_PREF,\n+ &mDiskCacheEnabled);\n+ if (NS_FAILED(rv)) return rv;\n+ nsCacheService::SetDiskCacheEnabled(DiskCacheEnabled());\n\nYou shouldn\'t treat this as a fatal failure. Like ReadPrefs(), you should instead default to true if getting the pref fails.\n\nSame for the offline cache pref.\n\nIn ReadPrefs():\n+ if (mInPrivateBrowsing)\n+ mDiskCacheEnabled = PR_FALSE;\n\nagain, this explicit setting shouldn\'t be needed.\n\n+nsCacheService::OnEnterExitPrivateBrowsing()\n\nWhy do you clear the memory cache and doom the active entries when entering the private browsing mode?\n\nI guess that may be an answer for the spec author instead...\n\n+++ b/netwerk/test/unit/test_bug248970_cache.js\n+ cache_prefs[pref] = prefs.getBoolPref(pref);\n\nthere\'s not really a need for that. they all default to true.\n\n+function get_CacheService() {\n\nwhy the strange naming? Why not get_cache_service(), consistent with all the other functions? similar for get_PBSvc.\n\n+ return dirSvc.get(\"CurProcD\", Ci.nsILocalFile);\n\nThat doesn\'t seem like the best possible choice, why not use something below TmpD?\n\n+ var visitor = {\n+ QueryInterface: function (iid) {\n\nno point in writing this QueryInterface function, xpconnect will synthesize it for you. (also in the other places where you have a visitor)\n\n+ // see if any of the required devices was missing\n+ for (var i = 0; i < devices.length; ++ i) {\n\nWouldn\'t it be much simpler to check devices.sort().toString() != found_devices.sort().toString()?\n\n+function make_input_stream_scriptable(input)\n+{\n+ var wrapper = Cc[\"@mozilla.org/scriptableinputstream;1\"].\n\nuse consistent formatting. the other functions put the { on the same line as the function declaration and use two-space indentation.\n\n+ var cs = get_CacheService();\n+ do_check_neq(cs, null);\n\nthat function will never return null. it will either throw or return a valid service.\n\n+ store_in_cache(\"cache-A\", \"test content\", \"memory\");\n\nInstead of repeating the \"memory\", \"disk\", \"offline\" strings all over the place, can you define constants for them?\n\nalso, can you define a constant for \"test content\" instead of repeating it for the writing and reading functions?',0.00,0,0,3824568,6,'343468',0),(248970,76551,'2008-10-21 14:22:50','(In reply to comment #419)\n> > With this try server build it takes about 15 seconds to enter the private\n> > browsing mode on OS X. Reverting to normal only takes less a second.\n> \n> I don\'t have a Mac, so I can\'t test it myself, but can someone else please run\n> the above two versions and report the results?\n\nYes, it also occurs when using that build. But at least its a profile issue. I\'ll figure out what happens and file a new bug.',0.00,0,0,3824602,0,NULL,0),(248970,8519,'2008-10-22 05:44:59','I was not able to reproduce what Henrik reports in Comment 419, using an existing profile, but as he notes in Comment 432 it seems to be a profile issue.',0.00,0,0,3825388,0,NULL,0),(248970,251051,'2008-10-22 12:26:15','(In reply to comment #431)\n> +nsCacheService::OnEnterExitPrivateBrowsing()\n> \n> Why do you clear the memory cache and doom the active entries when entering the\n> private browsing mode?\n> \n> I guess that may be an answer for the spec author instead...\n\nYes, I just followed the functional spec . The reasoning behind that decision is not very clear to me, because what we\'re trying to do is prevent anything from leaking *from* the private mode to the non-private mode, not vice versa, but anyway if mconnor has a different idea in this regard, I\'m all for it.\n\nAll other comments were fixed in the new version of the patch.',0.00,0,0,3825927,5,'344340',0),(248970,422,'2008-10-22 12:41:44','I think the functional spec there is mistaken; this bug and this initial work is and should be about eliminating _local_ traces. Preventing sites from tracking you seems out of scope, especially without a clearer description of the adversary (remote site? ISP? safebrowsing provider?).\n\nI\'ve worked on pseudonymity and profile-splitting software before, it\'s really hard to get right, especially in light of various (deployed) deep packet inspection tools. We would do well to not do a half job of it, and mis-set user expectation; rather we should implement a solid version of \"leave no local trace\",',0.00,0,0,3825949,0,NULL,0),(248970,15661,'2008-10-22 12:54:10','Dave: Do you know the cache service well enough to tell whether the ClearDoomList() call in OnEnterExitPrivateBrowsing() is necessary/a good thing?\n\nEhsan:\n do_throw(\"Expected to find the \\\"\" + devices[i] + \"\\\" cache device, \" +\n\nnow that you have no for loop anymore, you don\'t have \"i\" anymore :-)',0.00,0,0,3825960,6,'344340',0),(248970,265995,'2008-10-22 13:18:52','(In reply to comment #436)\n> (From update of attachment 344340 [details])\n> Dave: Do you know the cache service well enough to tell whether the\n> ClearDoomList() call in OnEnterExitPrivateBrowsing() is necessary/a good thing?\n\nAs I understand it, ClearDoomList() will deactivate all cache entries currently in flight. That\'ll cause problems with channels loading into/from those cache entries.\n\nIt should be fine to just doom everything. As loads finish, the doom list will be cleaned up.',0.00,0,0,3825993,0,NULL,0),(248970,251051,'2008-10-22 17:04:19','Asking mconnor for a primitive review on the browser/ bits and pieces.',0.00,0,0,3826437,6,'343848',0),(248970,251051,'2008-10-22 23:44:53','Here\'s the revised patch, without calling ClearDoomsList, and with the problem mentioned in comment 436 fixed.',0.00,0,0,3826686,5,'344444',0),(248970,9186,'2008-10-23 03:49:53','(In reply to comment #435)\n> I think the functional spec there is mistaken; this bug and this initial work\n> is and should be about eliminating _local_ traces. Preventing sites from\n> tracking you seems out of scope, especially without a clearer description of\n> the adversary (remote site? ISP? safebrowsing provider?).\n> \n> I\'ve worked on pseudonymity and profile-splitting software before, it\'s really\n> hard to get right, especially in light of various (deployed) deep packet\n> inspection tools. We would do well to not do a half job of it, and mis-set\n> user expectation; rather we should implement a solid version of \"leave no\n> local trace\",\n\nSo if we\'re just trying to prevent local traces then we should *not* do things like remove all currently set cookies, right? As well as not deny access to *reading* localStorage.\n\nMy understanding is that this is what other UAs do. I.e. they leave all existing cookies and history, and just don\'t permanently add any additional ones.\n\nIf this is what we want to do too then I think the spec needs to be changed quite a bit.',0.00,0,0,3826817,0,NULL,0),(248970,198492,'2008-10-23 06:53:07','(In reply to comment #440)\n> My understanding is that this is what other UAs do. I.e. they leave all\n> existing cookies and history, and just don\'t permanently add any additional\n> ones.\n\nI don\'t think that\'s what Chrome is doing. If you enter private mode and open google.com, you won\'t be logged in with your google account (meaning the existing cookies are not sent I guess).',0.00,0,0,3826990,0,NULL,0),(248970,251051,'2008-10-23 07:18:08','(In reply to comment #440)\n> So if we\'re just trying to prevent local traces then we should *not* do things\n> like remove all currently set cookies, right? As well as not deny access to\n> *reading* localStorage.\n\nBased on our IRC discussions with mconnor last night, he would like to prevent some types of attacks which enable a website to associate your non-private and private browsing sessions together. We won\'t of course make any promises in this regard to users, because we\'re not covering every possible ground here. The reason that the spec says that reading DOM storage should be blocked as well is to prevent this association.\n\n> My understanding is that this is what other UAs do. I.e. they leave all\n> existing cookies and history, and just don\'t permanently add any additional\n> ones.\n\nWell, I tested Chrome, and like Sylvian mentioned in comment 441, it indeed doesn\'t send non-private cookies in private mode. It seems that Chrome doesn\'t support DOM storage though, but I suppose if it did, it would\'ve made the same choice as for the cookies. Both my patch and Chrome\'s implementation keep history in place. The only difference in our handling of history is that we turn off visited link coloring in private mode to prevent attacks like .\n\n> If this is what we want to do too then I think the spec needs to be changed\n> quite a bit.\n\nIt seems that for the time being, we\'re going to maintain the current spec, and we need to make sure that the implementation follows the spec exactly.',0.00,0,0,3827010,0,NULL,0),(248970,251051,'2008-10-23 09:28:46','The session store module changes with tests, ready for review.',0.00,0,0,3827164,5,'344483',0),(248970,160571,'2008-10-23 10:09:23','>+ // The Private Browsing service might not be available.\n>+ try {\n>+ var pbs = Cc[\"@mozilla.org/privatebrowsing;1\"].\n>+ getService(Ci.nsIPrivateBrowsingService);\n>+ this._inPrivateBrowsing = pbs.privateBrowsingEnabled;\n>+ } catch (e) {}\n\nIsn\'t the PB service part of /browser as is SessionStore? If so, please drop the try-catch clause.\n\n>+ * @param aBackupState\n>+ * Bool backup the current state\n\nWhy can\'t you just do\n\n> this._stateBackup = this._safeEval(this._getCurrentState(true).toSource());\n\nwhile you handle PB\'s \"enter\" notification? IMO saveState shouldn\'t mean saveStateOrMaybeJustBackupWithoutSaving. You don\'t have to worry about the state\'s session object at this point (and later on, only session.state is needed).\n\n>+ this._stateBackup = eval(oState.toSource());\n\nOur toSource implementation still has several quirks (which I suspect cause some of the dependencies of bug 429414). Please use _safeEval instead.\n\n>+ _saveBackedUpState: function sss_saveBackedUpState() {\n>+ // if crash recovery is disabled, only save session resuming information\n>+ if (!this._resume_from_crash && this._loadState == STATE_RUNNING)\n>+ return;\n>+ if (!(\"_stateBackup\" in this))\n>+ return;\n\nDo we ever hit this method under these circumstances? If not, I\'d rather just move the remaining three lines to where they\'re actually needed.\n\n>+ _backupRecentlyClosedTabs: function sss_backupRecentlyClosedTabs() {\n\nI\'m still opposed to this. ;-)\n\n>+ backup[ix] = eval(this._windows[ix]._closedTabs.toSource());\n\n_safeEval!\n\nAs for the tests, I\'ve unfortunately found some nits as well (many apply to both tests):\n\n>+var _PBSvc = null;\n>+function get_PBSvc() {\n>+ if (_PBSvc)\n>+ return _PBSvc;\n\nSmart getter, please.\n\n>+ if (_PBSvc) {\n\nThis should always happen - unless Firefox can be built without PB service (in which case I must\'ve missed a lot of ifdefs). Otherwise you can quite simplify these bits.\n\n>+ QueryInterface: function (iid) {\n\nThis isn\'t needed for JS components which don\'t implement nsISupportsWeakReference.\n\n>+function test() { \n>+ /** Test (A) for Bug 248970 **/\n>+\n>+ function test(aLambda) {\n>+ try {\n>+ return aLambda() || true;\n>+ }\n>+ catch(ex){ }\n>+ return false;\n>+ }\n\nWhile this is just a test, I\'d still prefer trying to stick to our coding standards: no whitespace at the ends of lines; proper identation; spaces after catch and (ex).\n\n>+ let tabbrowser = getBrowser();\n\nJust use gBrowser to start with, getBrowser has been deprecated.\n\n>+ ok(pb, \"reference the private browsing service\");\n\nThis should be in a PB specific test - here it should just work!\n\n>+ ok(ssComponent, \"reference the sessionstore component\");\n>+ ok(ss, \"reference the sessionstore service\");\n\nWe already test for this - here it should just work as well!\n\n>+ ok(file,\"reference the profile directory\");\n\nI\'d prefer you only testing relevant functionality - makes the test\'s output easier to skim.\n\n>+ let ss_lmt_pre_pb = file.lastModifiedTime;\n\nWhat about prePBModeTime or something slightly more readable?\n\n>+ finish();\n>+ }, 3000);\n>+ }, 3000);\n\nIndentation?\n\n>+ let tab_A_restored = test(function() ss.undoCloseTab(window, 0));\n>+ ok(tab_A_restored, \"a tab is in undo list\");\n\nss.undoCloseTab will throw when the tab isn\'t in the undo list!\n\nThe tests look good, though. Thanks for your efforts!',0.00,0,0,3827216,6,'344483',0),(248970,251051,'2008-10-23 16:27:20','(In reply to comment #444)\n> (From update of attachment 344483 [details])\n> >+ // The Private Browsing service might not be available.\n> >+ try {\n> >+ var pbs = Cc[\"@mozilla.org/privatebrowsing;1\"].\n> >+ getService(Ci.nsIPrivateBrowsingService);\n> >+ this._inPrivateBrowsing = pbs.privateBrowsingEnabled;\n> >+ } catch (e) {}\n> \n> Isn\'t the PB service part of /browser as is SessionStore? If so, please drop\n> the try-catch clause.\n\nYes, fixed.\n\n> >+ * @param aBackupState\n> >+ * Bool backup the current state\n> \n> Why can\'t you just do\n> \n> > this._stateBackup = this._safeEval(this._getCurrentState(true).toSource());\n> \n> while you handle PB\'s \"enter\" notification? IMO saveState shouldn\'t mean\n> saveStateOrMaybeJustBackupWithoutSaving.\n\nYou\'re right, I don\'t know what I was thinking! :-) Done.\n\n> You don\'t have to worry about the\n> state\'s session object at this point (and later on, only session.state is\n> needed).\n\nI\'m not sure what you mean here. I don\'t touch the session object here...\n\n> >+ this._stateBackup = eval(oState.toSource());\n> \n> Our toSource implementation still has several quirks (which I suspect cause\n> some of the dependencies of bug 429414). Please use _safeEval instead.\n\nDone.\n\n> >+ _saveBackedUpState: function sss_saveBackedUpState() {\n> >+ // if crash recovery is disabled, only save session resuming information\n> >+ if (!this._resume_from_crash && this._loadState == STATE_RUNNING)\n> >+ return;\n> >+ if (!(\"_stateBackup\" in this))\n> >+ return;\n> \n> Do we ever hit this method under these circumstances? If not, I\'d rather just\n> move the remaining three lines to where they\'re actually needed.\n\nI don\'t think the first condition matters, now that I think about it. There is a potential for the second condition. For example, the implementation of bug 460346 might cause situations where the enter notification is not received before exit. Therefore I prefer to keep it, at least as a sanity check, as the case may be.\n\n> >+ _backupRecentlyClosedTabs: function sss_backupRecentlyClosedTabs() {\n> \n> I\'m still opposed to this. ;-)\n\nOK, I\'ve given this extensive thought. With this implementation, if the user doesn\'t choose to save and close her current session, after leaving the private mode, her browser is exactly at the same state as when entering the private mode. The same thing happens if she chooses to save and close her session (even without this code). So, this provides a level of consistency between the two options.\n\nAnother point here is that I\'ve gone to great lengths to make it impossible for a someone to tell whether the private mode has even been entered by inspecting two states of the browser (which might be before and after the private session). Without this code, this will break.\n\nThirdly, since in the final implementation that we will ship, the option to save and close the current session might be the only available option facing the users, this might not be that debatable.\n\nSo, unless there are technical reasons that we should remove this code, or I\'m doing something wrong in it, I prefer to keep it.\n\n> >+ backup[ix] = eval(this._windows[ix]._closedTabs.toSource());\n> \n> _safeEval!\n\nDone.\n\n> As for the tests, I\'ve unfortunately found some nits as well (many apply to\n> both tests):\n> \n> >+var _PBSvc = null;\n> >+function get_PBSvc() {\n> >+ if (_PBSvc)\n> >+ return _PBSvc;\n> \n> Smart getter, please.\n\nHum? Are getters possible at global scope?\n\n> >+ if (_PBSvc) {\n> \n> This should always happen - unless Firefox can be built without PB service (in\n> which case I must\'ve missed a lot of ifdefs). Otherwise you can quite simplify\n> these bits.\n\nNo you didn\'t miss them. My bad for directly pasting this code from unit tests outside of browser/! :-)\n\n> >+ QueryInterface: function (iid) {\n> \n> This isn\'t needed for JS components which don\'t implement\n> nsISupportsWeakReference.\n\nOh, cool, I didn\'t know that!\n\n> >+function test() { \n> >+ /** Test (A) for Bug 248970 **/\n> >+\n> >+ function test(aLambda) {\n> >+ try {\n> >+ return aLambda() || true;\n> >+ }\n> >+ catch(ex){ }\n> >+ return false;\n> >+ }\n> \n> While this is just a test, I\'d still prefer trying to stick to our coding\n> standards: no whitespace at the ends of lines; proper identation; spaces after\n> catch and (ex).\n\nDone.\n\n> >+ let tabbrowser = getBrowser();\n> \n> Just use gBrowser to start with, getBrowser has been deprecated.\n\nSure.\n\n> >+ ok(pb, \"reference the private browsing service\");\n> \n> This should be in a PB specific test - here it should just work!\n\nAgreed.\n\n> >+ ok(ssComponent, \"reference the sessionstore component\");\n> >+ ok(ss, \"reference the sessionstore service\");\n> \n> We already test for this - here it should just work as well!\n\nDone.\n\n> >+ ok(file,\"reference the profile directory\");\n> \n> I\'d prefer you only testing relevant functionality - makes the test\'s output\n> easier to skim.\n\nDefinitely.\n\n> >+ let ss_lmt_pre_pb = file.lastModifiedTime;\n> \n> What about prePBModeTime or something slightly more readable?\n\nprePBModeTimeStamp (slightly more readable)! :-)\n\n> >+ finish();\n> >+ }, 3000);\n> >+ }, 3000);\n> \n> Indentation?\n\nWhat about it? ;-)\n\n> >+ let tab_A_restored = test(function() ss.undoCloseTab(window, 0));\n> >+ ok(tab_A_restored, \"a tab is in undo list\");\n> \n> ss.undoCloseTab will throw when the tab isn\'t in the undo list!\n\nIn this case, |test| should return false, right?\n\n> The tests look good, though. Thanks for your efforts!\n\nI can\'t take credit for them (but I *am* tempted to)! The tests are Aaron Train\'s great work.\n\nI hope you don\'t mind me shamelessly switching the review flag to you...',0.00,0,0,3827739,5,'344558',0),(248970,299942,'2008-10-23 16:37:56','Thank you, Ehsan and Simon. With that testing area complete, what now remains?',0.00,0,0,3827748,0,NULL,0),(248970,251051,'2008-10-23 16:56:14','(In reply to comment #446)\n> Thank you, Ehsan and Simon. With that testing area complete, what now remains?\n\nGood question. Here\'s a status update. The only tests remaining are those of the download manager (which I need to write a test plan for) and the private browsing service itself. I expect to complete them in the next couple of days (at most). One we have the reviews on the remaining work, it will be ready to land!',0.00,0,0,3827780,0,NULL,0),(248970,160571,'2008-10-24 01:50:48','r+=me with the following changes:\n\n>+ oState.session.state = STATE_STOPPED_STR;\n\nThis doesn\'t work, as the session object is only set in saveState right before writing to a file. Instead do\n\n>> oState.session = { state: STATE_STOPPED_STR };\n\n>+ this._inPrivateBrowsing = false;\n\nPlease also delete this._stateBackup at this point (or better just always delete it at the end of the \"exit\" block).\n\n>+function get_PBSvc() {\n\nOn second thought: Just inline this in the main test body. There\'s no need for caching if you only ever need the service once. See the browser_448741.js test.\n\n>+ let ssComponent = test(function() Cc[\"@mozilla.org/browser/sessionstore;1\"]);\n>+ let ss = test(function() ssComponent.getService(Ci.nsISessionStore));\n>+ if (pb) { // private browsing might not be available\n\nYou can just get the service in one swoop. And |pb| will always be the PB service, so you can just drop the |if|.\n\n(In reply to comment #445)\n> Another point here is that I\'ve gone to great lengths to make it impossible for\n> a someone to tell whether the private mode has even been entered by inspecting\n> two states of the browser (which might be before and after the private\n> session). Without this code, this will break.\n\nGood point! No further objections.\n\n> Hum? Are getters possible at global scope?\n\nThey are (see e.g. Dão\'s clean-up in browser.js). Doesn\'t matter with the above changes, though.\n\n> In this case, |test| should return false, right?\n\nOf course - I completely missed the |test|.\n\n> The tests are Aaron Train\'s great work.\n\nIn that case thanks to Aaron as well!',0.00,0,0,3828107,6,'344558',0),(248970,160571,'2008-10-24 06:43:18','One additional detail about the first test: That one might actually pass even though sessionstore.js would have been overwritten. You\'ll want to set browser.sessionstore.interval to 1000 at the start of the test (and reset the value at the end) to make sure that the file would indeed have been updated during the course of the test...',0.00,0,0,3828225,6,'344558',0),(248970,9186,'2008-10-25 00:25:06','So microsoft does not drop any existing cookies when going in to \"InPrivate mode\". They were simply trying to address the problem of local traces.\n\nApparently apple do the same thing in safari.\n\nI don\'t really have a strong opinion on what is the best thing to do, though I\'m wondering what problem we\'re trying to address by dropping cookies are.',0.00,0,0,3829063,0,NULL,0),(248970,251051,'2008-10-25 01:45:05','(In reply to comment #448)\n> (From update of attachment 344558 [details])\n> r+=me with the following changes:\n> \n> >+ oState.session.state = STATE_STOPPED_STR;\n> \n> This doesn\'t work, as the session object is only set in saveState right before\n> writing to a file. Instead do\n> \n> >> oState.session = { state: STATE_STOPPED_STR };\n\nI did this, but I see a potential problem with this approach (not having saveState save the backup state object): In this case, the session object excludes the lastUpdate, recentCrashes, and any other attributes saved by saveState later on. Wouldn\'t this be a problem? I think this was the original reason why I was doing the state backup saving in saveState initially.\n\nBesides what I was doing before, another (better) solution might be to factor out the code preparing the state object for being written to disk into a function, such as _prepareState and then call it both from saveState and the private-browsing observer.\n\n> >+ this._inPrivateBrowsing = false;\n> \n> Please also delete this._stateBackup at this point (or better just always\n> delete it at the end of the \"exit\" block).\n\nDone.\n\n> >+function get_PBSvc() {\n> \n> On second thought: Just inline this in the main test body. There\'s no need for\n> caching if you only ever need the service once. See the browser_448741.js test.\n\nDone.\n\n> >+ let ssComponent = test(function() Cc[\"@mozilla.org/browser/sessionstore;1\"]);\n> >+ let ss = test(function() ssComponent.getService(Ci.nsISessionStore));\n> >+ if (pb) { // private browsing might not be available\n> \n> You can just get the service in one swoop. And |pb| will always be the PB\n> service, so you can just drop the |if|.\n\nYou\'re right, didn\'t catch this before.\n\n(In reply to comment #449)\n> (From update of attachment 344558 [details])\n> One additional detail about the first test: That one might actually pass even\n> though sessionstore.js would have been overwritten. You\'ll want to set\n> browser.sessionstore.interval to 1000 at the start of the test (and reset the\n> value at the end) to make sure that the file would indeed have been updated\n> during the course of the test...\n\nGood point, done.\n\nCarrying forward your r+, however, another iteration might be necessary because of the session object point I mentioned above.',0.00,0,0,3829097,5,'344729',0),(248970,251051,'2008-10-25 02:26:20','(In reply to comment #450)\n> I don\'t really have a strong opinion on what is the best thing to do, though\n> I\'m wondering what problem we\'re trying to address by dropping cookies are.\n\nWell, the reasoning behind this is that one of the applications of cookies is\ntracking the visitors of a website. For example, if a site sets a cookie with\na unique ID the first time you visit it (like Google does) and your browser\nsends that cookie for each request, the website effectively has a log of all\nyour activities associated together.\n\nNow, if your browser send that cookie inside the private mode, the site would\nbe able to associate your public and private activities. An example of how\nthis manifests to a user is that the Google searches done in private mode show\nup in her search history. This might be a problem for shared computers, and\nit\'s what we\'re trying to avoid by not sending any of the existing cookies\ninside the private mode.',0.00,0,0,3829127,0,NULL,0),(248970,160571,'2008-10-25 02:37:56','(In reply to comment #451)\n> In this case, the session object excludes the lastUpdate, recentCrashes,\n> and any other attributes saved by saveState later on. Wouldn\'t this be a\n> problem?\n\nlastUpdate and recentCrashes are both not needed after a clean shut-down. We can revisit this once we add further information to .session which will always have to be available (in which case we might as well add the .session object in _getCurrentState already).\n\nOne further thing that missed during my review: You\'ll have to remove the observers during a test\'s clean-up so that they don\'t have unintended side-effects on later tests. Sorry for that.',0.00,0,0,3829130,0,NULL,0),(248970,251051,'2008-10-25 02:59:52','(In reply to comment #453)\n> lastUpdate and recentCrashes are both not needed after a clean shut-down. We\n> can revisit this once we add further information to .session which will always\n> have to be available (in which case we might as well add the .session object in\n> _getCurrentState already).\n\nOK.\n\n> One further thing that missed during my review: You\'ll have to remove the\n> observers during a test\'s clean-up so that they don\'t have unintended\n> side-effects on later tests. Sorry for that.\n\nOh, the mistake was on my part. Actually I think we need to do this for the passwordmgr test as well. I\'ve filed bug 461629 on that.',0.00,0,0,3829138,5,'344732',0),(248970,251051,'2008-10-25 03:33:04','http://hg.mozilla.org/mozilla-central/rev/6a8accf38e93',0.00,0,0,3829150,6,'344444',0),(248970,160571,'2008-10-25 04:10:00','Thanks. BTW: Are you aware that your patches aren\'t UTF-8 encoded and use DOS line endings? The former prevents it from cleanly applying - at least when using \"patch\" (and the latter leads to console noise). This shouldn\'t be a problem if you push the patches yourself, though.',0.00,0,0,3829158,6,'344732',0),(248970,251051,'2008-10-25 04:15:35','(In reply to comment #456)\n> (From update of attachment 344732 [details])\n> Thanks. BTW: Are you aware that your patches aren\'t UTF-8 encoded and use DOS\n> line endings? The former prevents it from cleanly applying - at least when\n> using \"patch\" (and the latter leads to console noise). This shouldn\'t be a\n> problem if you push the patches yourself, though.\n\nThanks for pointing this out. I manage my patches using mq, but I generate the splitted patches manually using Notepad++, and that was an oversight on my part. Sorry for the inconvenience.',0.00,0,0,3829160,0,NULL,0),(248970,251051,'2008-10-26 09:04:41','This patch includes both the Private Browsing service, and its temporary UI (that is, until bug 411929 is planned and fixed.\n\nI have written some extensive unit tests to check nearly every aspect of the private browsing service. I have also written a browser chrome test to test the private browsing UI pieces.\n\nThis is ready for review now.',0.00,0,0,3829747,5,'344819',0),(248970,251051,'2008-10-26 13:58:45','Latest try server build available at: \n\nThis build includes the patches to bug 461625 and bug 461627 as well (well, but 461710 too, but that one\'s just a unit test, without any user-facing features).',0.00,0,0,3829875,0,NULL,0),(248970,251051,'2008-10-26 23:48:27','Latest try server build available at: \n\nThis build includes the patch to bug 460346 as well (adds the browser.privatebrowsing.autostart pref).',0.00,0,0,3830062,0,NULL,0),(248970,27780,'2008-10-27 13:14:42','Another random thought: should private browsing mode clear the clipboard when\nexiting, if the contents were copied while in private mode? EG, user enters PB,\ncopies a link on cheap-engagement-rings.com, then exits PB mode. That link\nremains in the clipboard, where someone might discover it if they paste it into\nsomething later on.',0.00,0,0,3830719,0,NULL,0),(248970,251051,'2008-10-27 13:23:02','(In reply to comment #461)\n> Another random thought: should private browsing mode clear the clipboard when\n> exiting, if the contents were copied while in private mode? EG, user enters PB,\n> copies a link on cheap-engagement-rings.com, then exits PB mode. That link\n> remains in the clipboard, where someone might discover it if they paste it into\n> something later on.\n\nYeah, I think that would also be a nice thing to handle. Can you please file a bug on that, and CC me/assign it to me? We can have a discussion there.',0.00,0,0,3830732,0,NULL,0),(248970,215498,'2008-10-28 11:22:30','I\'d prefer to not land temporary UI in locales/en-US, that\'s just distracting our localization community. I\'d recommend to land the localizable files in content and move them over once the UI finalizes.\n\nStyle comment, please add localization notes for replaced variables like message in privatebrowsing.properties, https://developer.mozilla.org/En/Localization_notes on the impl.',0.00,0,0,3832025,0,NULL,0),(248970,251051,'2008-10-28 11:32:52','(In reply to comment #463)\n> I\'d prefer to not land temporary UI in locales/en-US, that\'s just distracting\n> our localization community. I\'d recommend to land the localizable files in\n> content and move them over once the UI finalizes.\n> \n> Style comment, please add localization notes for replaced variables like\n> message in privatebrowsing.properties,\n> https://developer.mozilla.org/En/Localization_notes on the impl.\n\nI think the browser/ strings and the parts of the UI code which use them can land in the UI bug with the final strings. The current stuff is merely a test UI to make the process of testing the builds by the community easier.\n\nThere are strings for the download manager as well, but I\'m not sure if we need to move them to the UI bug as well. Alex?',0.00,0,0,3832053,0,NULL,0),(248970,317549,'2008-10-28 23:33:31','(In reply to comment #461)\n> Another random thought: should private browsing mode clear the clipboard when\n> exiting, if the contents were copied while in private mode? EG, user enters PB,\n> copies a link on cheap-engagement-rings.com, then exits PB mode. That link\n> remains in the clipboard, where someone might discover it if they paste it into\n> something later on.\n\nI must dissagree. I think copying something to the clipboard is \"user data\" ie. something the user explicitly did and we shouldn\'t be touching it.\n\nAn option.. sure. But completely clearing the clipboard is a really irritating thing that\'s hard to track down.',0.00,0,0,3833066,0,NULL,0),(248970,27780,'2008-10-28 23:58:48','Presumably clipboard clearing would happen *only* when (1) a cut/copy was performed in PB mode and (2) when exiting PB the clipboard is still that value. A clipboard value that either predates entering PB mode or comes from another app while in PB mode shouldn\'t be cleared. That would indeed be annoying.',0.00,0,0,3833078,0,NULL,0),(248970,251051,'2008-10-29 00:26:03','Bug 462106 filed for discussing what to do with the clipboard data.',0.00,0,0,3833097,0,NULL,0),(248970,96908,'2008-10-29 02:13:31','>diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js\n\n>+ init: function PBUI_init() {\n>+ let Cc = Components.classes; // XXXehsan: why can\'t we use the global Cc here???\n\nas discussed on IRC, this is because Cc isn\'t defined when you call this. We really need to clean up Cc, its this weird sorta-const that isn\'t the same as Ci and Cu.\n\n>+ } else if (aTopic == \"quit-application\") {\n\ndon\'t you have enough nits on this yet?\n\n>+gPrivateBrowsingUI.init();\n\nwhy is this called this early? there\'s no need to call it there...\n\n>diff --git a/browser/components/nsBrowserGlue.js b/browser/components/nsBrowserGlue.js\n\n>+ decidePrivateBrowsingSession: function()\n>+ {\n\n>+ return result;\n>+ },\n\nwe don\'t want this anymore. Its a whole bunch of code that enables a hidden pref. have the pref for unit tests, kill the UI/prompt.\n\n\n>+ // Whether the private browsing mode is currently active or not.\n>+ _inPrivateBrowsing: false,\n>+\n>+ // Saved browser state before entering the private mode.\n>+ _savedBrowserState: null,\n>+\n>+ // Whether we\'re in the process of shutting down\n>+ _quitting: false,\n>+\n>+ // How to treat the non-private session\n>+ _sessionDecision: -1,\n>+\n>+ // Make sure we don\'t allow re-enterant changing of the private mode\n>+ _alreadyChangingMode: false,\n>+\n>+ // XPCOM registration\n>+ classDescription: \"PrivateBrowsing Service\",\n>+ contractID: \"@mozilla.org/privatebrowsing;1\",\n>+ classID: Components.ID(\"{c31f4883-839b-45f6-82ad-a6a9bc5ad599}\"),\n>+ _xpcom_categories: [\n>+ { category: \"app-startup\", service: true }\n>+ ],\n>+\n>+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIPrivateBrowsingService, \n>+ Ci.nsIObserver]),\n>+\n>+ _unload: function PBS__destroy() {\n>+ // Force an exit from the private browsing mode on shutdown\n>+ this._quitting = true;\n>+ if (this._inPrivateBrowsing)\n>+ this.privateBrowsingEnabled = false;\n>+\n>+ this._obs.removeObserver(this, \"quit-application-granted\");\n>+ },\n>+\n>+ _onPrivateBrowsingModeChanged: function PBS__onPrivateBrowsingModeChanged() {\n>+ // clear all auth tokens\n>+ let sdr = Cc[\"@mozilla.org/security/sdr;1\"].\n>+ getService(Ci.nsISecretDecoderRing);\n>+ sdr.logoutAndTeardown();\n>+\n>+ // clear plain HTTP auth sessions\n>+ let authMgr = Cc[\'@mozilla.org/network/http-auth-manager;1\'].\n>+ getService(Ci.nsIHttpAuthManager);\n>+ authMgr.clearAll();\n>+\n>+ let ss = Cc[\"@mozilla.org/browser/sessionstore;1\"].\n>+ getService(Ci.nsISessionStore);\n>+ if (this.privateBrowsingEnabled) {\n>+ // first, give extensions a chance to provide their own UI here\n>+ let decision = Cc[\"@mozilla.org/supports-PRUint32;1\"].\n>+ createInstance(Ci.nsISupportsPRUint32);\n>+ decision.data = Ci.nsIBrowserGlue.PRIVATEBROWSING_NODECISION;\n>+ this._obs.notifyObservers(decision, \"private-browsing-enter\", null);\n>+ switch (decision.data) {\n>+ case Ci.nsIBrowserGlue.PRIVATEBROWSING_KEEPSESSION:\n>+ case Ci.nsIBrowserGlue.PRIVATEBROWSING_CLOSESESSION:\n>+ this._sessionDecision = decision.data;\n>+ break;\n>+ default:\n>+ // if no extension handles the decision, let the browser glue component decide\n>+ let browserGlue = Cc[\"@mozilla.org/browser/browserglue;1\"].\n>+ getService(Ci.nsIBrowserGlue);\n>+ this._sessionDecision = (browserGlue.decidePrivateBrowsingSession() ==\n>+ Ci.nsIBrowserGlue.PRIVATEBROWSING_KEEPSESSION) ?\n>+ Ci.nsIBrowserGlue.PRIVATEBROWSING_KEEPSESSION :\n>+ Ci.nsIBrowserGlue.PRIVATEBROWSING_CLOSESESSION;\n>+ break;\n>+ }\n\nas noted, simplify the hell out of this, we don\'t want this UI, but we need the pref to work around unit test weakness.\n\n>+ // save the whole browser state in order to restore all windows/tabs later\n>+ if (this._sessionDecision == Ci.nsIBrowserGlue.PRIVATEBROWSING_CLOSESESSION &&\n>+ this._savedBrowserState == null) {\n>+ this._savedBrowserState = ss.getBrowserState();\n\nwe should just restore from disk, instead of keeping all of this stashed in memory. you\'re being paranoid. :)\n\n\n>+ _closeAllWindows: function PBS__closeAllWindows() {\n>+ let windowMediator = Cc[\"@mozilla.org/appshell/window-mediator;1\"].\n>+ getService(Ci.nsIWindowMediator);\n>+ let windowsEnum = windowMediator.getEnumerator(\"navigator:browser\");\n>+\n>+ // We want to close all windows in reverse order, but since\n>+ // nsISimpleEnumerator can\'t do backwards iterations, a little\n>+ // recursive helper function is used.\n>+ this._closeAllWindowsInternal(windowsEnum);\n>+ },\n\nI think we want back to front.\n\nyou want windowMediator.getZOrderDOMWindowEnumerator(\"navigator:browser\", false) on Windows, other platforms are busted. :(\n\n>+ _closeAllWindowsInternal: function PBS__closeAllWindowsInternal(windowsEnum) {\n>+ if (windowsEnum.hasMoreElements()) {\n>+ let window = windowsEnum.getNext();\n>+ this._closeAllWindowsInternal(windowsEnum);\n>+ window.close();\n>+ }\n>+ },\n\nuse win instead of window, window has special meaning in JS, and we should avoid using it as a generic var.\n\n>+ try {\n\n>+ } finally {\n>+ this._alreadyChangingMode = false;\n>+ }\n>+ }\n>+};\n\nprobably worth a reportError call in a catch block if there\'s an exception thrown in the try block.\n\nI didn\'t look at the tests yet, but please roll those into the unit test changes needed because we\'re changing the notifications they\'ll need\n\nI\'ll look at this again when you\'ve done these changes.',0.00,0,0,3833183,6,'344819',0),(248970,265995,'2008-10-29 11:23:54','I\'m fine with the storage patch, assuming the behavior (security exception on access) is the desired behavior.',0.00,0,0,3833725,6,'343975',0),(248970,251051,'2008-10-29 14:30:29','(In reply to comment #468)\n> as discussed on IRC, this is because Cc isn\'t defined when you call this. We\n> really need to clean up Cc, its this weird sorta-const that isn\'t the same as\n> Ci and Cu.\n\nMoving the init code to delayedStartup did fix this problem...\n\n> >+ } else if (aTopic == \"quit-application\") {\n> \n> don\'t you have enough nits on this yet?\n\nNah, can\'t get enough of them! ;-)\n\n> >+gPrivateBrowsingUI.init();\n> \n> why is this called this early? there\'s no need to call it there...\n\nI moved it to delayedStartup, and merged init and initUI as well.\n\n> >+ decidePrivateBrowsingSession: function()\n> >+ {\n> \n> >+ return result;\n> >+ },\n> \n> we don\'t want this anymore. Its a whole bunch of code that enables a hidden\n> pref. have the pref for unit tests, kill the UI/prompt.\n\nKilled.\n\n> as noted, simplify the hell out of this, we don\'t want this UI, but we need the\n> pref to work around unit test weakness.\n\nDone.\n\n> >+ // save the whole browser state in order to restore all windows/tabs later\n> >+ if (this._sessionDecision == Ci.nsIBrowserGlue.PRIVATEBROWSING_CLOSESESSION &&\n> >+ this._savedBrowserState == null) {\n> >+ this._savedBrowserState = ss.getBrowserState();\n> \n> we should just restore from disk, instead of keeping all of this stashed in\n> memory. you\'re being paranoid. :)\n\nAs discussed on IRC, I\'m moving this into a followup: bug 462218.\n\n> I think we want back to front.\n> \n> you want windowMediator.getZOrderDOMWindowEnumerator(\"navigator:browser\",\n> false) on Windows, other platforms are busted. :(\n\nDone, but I\'m not really sure if I\'ve managed to do what\'s desired here...\n\n> use win instead of window, window has special meaning in JS, and we should\n> avoid using it as a generic var.\n\nOops, that was way embarrassing to slip my attention!\n\n> probably worth a reportError call in a catch block if there\'s an exception\n> thrown in the try block.\n\nDone.\n\n> I didn\'t look at the tests yet, but please roll those into the unit test\n> changes needed because we\'re changing the notifications they\'ll need\n\nI will do this in another patch which I\'ll attach shortly.\n\n> I\'ll look at this again when you\'ve done these changes.\n\nI also removed all of the UI pieces for this patch to reduce the amount of rework done on the UI code.',0.00,0,0,3834142,5,'345361',0),(248970,251051,'2008-10-29 15:37:05','This patch handles the API change for all of the unit tests: drop the usage of private-browsing-enter, and use the browser.privatebrowsing.keep_current_session prefs instead.\n\nNothing major here, the only thing that I noted was that the notification change in attachment 343974 wasn\'t reflected in the unit test, so I went ahead and corrected it as well.',0.00,0,0,3834236,5,'345377',0),(248970,96908,'2008-10-30 16:59:21','looks good, r=mconnor',0.00,0,0,3835964,6,'345377',0),(248970,96908,'2008-10-30 23:17:51','So, again, to complain:\n\n} else \n\nshould be\n\n}\nelse\n\n>diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js\n\nthese bits are all part of the UI bits, so don\'t need to be in this patch at all.\n\n\n>+#ifndef XP_WIN\n>+#define BROKEN_WM_Z_ORDER\n>+#endif\n>+\n>+ _closeAllWindows: function PBS__closeAllWindows() {\n>+ let windowMediator = Cc[\"@mozilla.org/appshell/window-mediator;1\"].\n>+ getService(Ci.nsIWindowMediator);\n>+#ifdef BROKEN_WM_Z_ORDER\n>+ let windowsEnum = windowMediator.getEnumerator(\"navigator:browser\");\n>+#else\n>+ let windowsEnum = windowMediator.getZOrderDOMWindowEnumerator(\"navigator:browser\", false);\n>+#endif\n\nwhy not just #ifdef XP_WIN with a comment here? The extra define isn\'t helpful, if its Windows only...\n\n>+ /**\n>+ * Enter or leave private browsing mode.\n>+ */\n>+ set privateBrowsingEnabled PBS_set_privateBrowsingEnabled(val) {\n>+ if (this._alreadyChangingMode)\n>+ throw Cr.NS_ERROR_FAILURE;\n\ncomments as to how this happens/why its necessary would be good\n\nwe\'re getting there! r=mconnor',0.00,0,0,3836258,6,'345361',0),(248970,243208,'2008-10-31 03:02:08','(In reply to comment #473)\n\n> >+#ifndef XP_WIN\n> >+#define BROKEN_WM_Z_ORDER\n> >+#endif\n> >+\n> >+ _closeAllWindows: function PBS__closeAllWindows() {\n> >+ let windowMediator = Cc[\"@mozilla.org/appshell/window-mediator;1\"].\n> >+ getService(Ci.nsIWindowMediator);\n> >+#ifdef BROKEN_WM_Z_ORDER\n> >+ let windowsEnum = windowMediator.getEnumerator(\"navigator:browser\");\n> >+#else\n> >+ let windowsEnum = windowMediator.getZOrderDOMWindowEnumerator(\"navigator:browser\", false);\n> >+#endif\n> \n> why not just #ifdef XP_WIN with a comment here? The extra define isn\'t\n> helpful, if its Windows only...\n\nActually it is because it is the standard define name for this kind of hack around other places in the codebase. If you leave it as XP_WIN then:\n\na) its not clear why the hack is needed\nb) it makes it harder to remove this hack by looking for it in MXR if other platforms get this implemented in the future.',0.00,0,0,3836356,0,NULL,0),(248970,251051,'2008-10-31 06:33:34','(In reply to comment #474)\n> Actually it is because it is the standard define name for this kind of hack\n> around other places in the codebase. If you leave it as XP_WIN then:\n> \n> a) its not clear why the hack is needed\n> b) it makes it harder to remove this hack by looking for it in MXR if other\n> platforms get this implemented in the future.\n\nI tend to agree with Michael Ventnor here. mconnor: do we really want to get rid of this define?\n\n(In reply to comment #473)\n> >diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js\n> \n> these bits are all part of the UI bits, so don\'t need to be in this patch at\n> all.\n\nHave you reviewed these changes or should I add them to the UI patch for review?',0.00,0,0,3836514,0,NULL,0),(248970,96908,'2008-10-31 15:00:58','bah, just leave the define for now. We need to fix that API.\n\nI\'ve reviewed it all, you are clear for takeoff.',0.00,0,0,3837099,0,NULL,0),(248970,251051,'2008-10-31 15:20:18','(In reply to comment #476)\n> bah, just leave the define for now. We need to fix that API.\n\nOK.\n\n> I\'ve reviewed it all, you are clear for takeoff.\n\nActually I think it would be better to wait up a bit for the remaining parts so that we can land it all together.\n\nThe remaining parts:\n\n1. A decision needs to be made how we want to handle the errors for the DOM storage module. Here is my suggestion: we take this as it is right now (throwing a security error when inside the private mode) for Beta 2, and I\'ll file a followup to work on changing it to use a memory backed DB instead of the usual disk DB, just like what we do for cookies now. I\'ll provide a patch for that bug in time to make it into the final 3.1 release.\n\n2. The download manager tests have been delayed for so long. I\'ll try to work on it and get something ready by tomorrow. Shawn: if you can help with the test plan, it\'d be great. Otherwise I\'ll give it a shot myself.\n\n3. I\'ve just observed that the places unit test has started to fail. I need to investigate this further, but I suspect it has something to do with moving stuff to background threads in the fsync work recently landed. I think the culprit is that the bookmarks are inserted lazily, which happens too late for the places unit test to catch. Any guidance in this regard is highly appreciated.\n\n\nWe\'re so close now! :-)',0.00,0,0,3837122,0,NULL,0),(248970,251051,'2008-10-31 16:17:41','Simon: this patch only changes the (a) unit test to use nsITimer instead of setTimeout based on mconnor\'s suggestion. I was not sure whether this change requires another review, but I thought I\'d ask in order to be safe.',0.00,0,0,3837206,5,'345808',0),(248970,160571,'2008-10-31 17:01:15','Isn\'t the \"private-browsing-enter\" notification supposed to be replaced by a simple pref? Furthermore: Have you talked to sdwilsh about why setTimeout isn\'t good enough for what we need (all my other tests use it - and they work just fine)?',0.00,0,0,3837266,6,'345808',0),(248970,251051,'2008-11-01 04:05:35','(In reply to comment #479)\n> (From update of attachment 345808 [details])\n> Isn\'t the \"private-browsing-enter\" notification supposed to be replaced by a\n> simple pref?\n\nYes, it is. I fixed all of the unit tests in a single go as attachment 345377 which got reviewed. This patch is applied on top of the session store patch in my queue so the sessionstore part will also use that pref when I land this.\n\n> Furthermore: Have you talked to sdwilsh about why setTimeout isn\'t\n> good enough for what we need (all my other tests use it - and they work just\n> fine)?\n\nNot yet. Just tried to find him on IRC to no avail. But is there anything which would prevent us from using nsITimer over setTimeout? Either way it\'s not a big deal to me, unless I hear from sdwilsh that something\'s awfully wrong with setTimeout...',0.00,0,0,3837504,0,NULL,0),(248970,160571,'2008-11-01 07:25:22','If Shawn doesn\'t object, I\'d prefer the setTimeout patch - otherwise this one is fine by me as well, if you just directly pass the function to initWithCallback (and prefix the function attributes\' names with an a):\n\n> timer.initWithCallback(function(aTimer) {\n> // ...\n> }, 3000, Ci.nsITimer.TYPE_ONE_SHOT);',0.00,0,0,3837562,6,'345808',0),(248970,27780,'2008-11-01 11:39:47','Drive-by: Isn\'t there away to do this *without* a timer?\n\nTimers are generally frowned up because they\'re failure prone when a test box is running slowly or someone\'s debugging under valgrind. And our tests already take too long to run, so adding unneeded delays (6 seconds, in this test) makes things worse.',0.00,0,0,3837777,0,NULL,0),(248970,251051,'2008-11-01 11:48:09','That would require getting the sessionstore component to record its data on command, instead of at an interval. Simon: if that\'s possible, then I\'m all for it.',0.00,0,0,3837782,0,NULL,0),(248970,160571,'2008-11-01 16:06:27','So, I\'ve had a look at a simplified version of your patch and don\'t get the test to fail even without invoking private browsing... You\'ll need to get a new file reference for an updated lastModifiedTime so that it could be different at all.\n\nThen, the first of the two timers isn\'t really needed at all, and the second one can be replaced by\n\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", 0);\n\nwhich triggers an immediate save operation. Then please make sure that without enabling PB mode the test indeed fails and only passes with PB mode enabled first.\n\nIn fact, I\'d prefer such a test to happen right before entering PB mode so that you can be sure that the test actually means something. Just don\'t forget to reset the .interval pref before entering PB mode so that repeatedly setting it to 0 also repeatedly sends a pref-change notification.',0.00,0,0,3837880,6,'345808',0),(248970,251051,'2008-11-01 17:32:44','Download manager patch with a unit test, ready for review.\n\nAsking sdwilsh to review the download manager service parts, and mconnor to review the rest of the toolkit changes.',0.00,0,0,3837911,5,'345902',0),(248970,251051,'2008-11-01 18:48:41','(In reply to comment #484)\n\nSimon: I tried to address all of your comments. Also I ran both tests without entering/leaving the private mode to make sure they fail in that case (and indeed they do). Please let me know if there are more issues to work out.',0.00,0,0,3837933,5,'345907',0),(248970,251051,'2008-11-02 01:39:50','The latest fsync work in Places broke the unit test for Places which is already checked in. Here\'s a fix for the unit test to make it wait for sync notifications, and also fix an issue where the places query object returned both history and bookmark items (I\'m not sure why), but anyway the current behavior is correct (we make two queries, one for history, the other for bookmarks).',0.00,0,0,3838067,5,'345927',0),(248970,160571,'2008-11-02 01:52:15','>+ let ss_interval = gPrefService.getIntPref(\"browser.sessionstore.interval\");\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", 0);\n\nPlease verify that sessionstore.js\'s lastModifiedTime differs before and after this point.\n\n>+ // enter private browsing mode\n>+ pb.privateBrowsingEnabled = true;\n\nIt should differ once again after this point.\n\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", 0);\n\nThis is a no-op if the pref is already set to 0 (which it is). Just drop the line.\n\n>+ // record the timestamp of private browsing session - sessionstore.js\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", 0);\n\nStill a no-op. Reset the pref before this line for it to have any effect.\n\n>+ flag = (x.title==y.title && x.url==y.url); // comparing titles\n\nWhile I\'m at it... nit: No spaces around operators.',0.00,0,0,3838072,6,'345907',0),(248970,251051,'2008-11-02 09:41:09','(In reply to comment #488)\n> (From update of attachment 345907 [details])\n\nAll comments addressed.',0.00,0,0,3838254,5,'345953',0),(248970,251051,'2008-11-02 10:18:55','Oh, I guess I\'m too used to ask mconnor for reviews! :-) Meant Simon, of course...',0.00,0,0,3838285,6,'345953',0),(248970,160571,'2008-11-02 11:19:55','>+ _backupRecentlyClosedTabs: function sss_backupRecentlyClosedTabs() {\n\nBTW: Can we just drop these now that users won\'t have the option of keeping their current windows open?\n\n>+ function test(aLambda) {\n\nAs you\'ll need another revision round, anyway, could you please just drop this function. You no longer use it as intended... ;-)\n\n>+ if (file.exists())\n\nOut of curiosity: Can the file be missing at all?\n\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", ss_interval);\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", 0);\n>+ let startPBModeTimeStamp = getSessionstorejsModificationTime();\n\nYou\'ll get the very same timestamp without changing the pref.\n\n>+ function serializeClosedTabData(array) {\n>+ array.sort(function (a, b) {\n>+ return a.pos - b.pos;\n>+ });\n\nWhat\'s the need for sorting? Wouldn\'t this rather lead to two different closed tab lists being considered equal?\n\n>+ return aPrevious + aCurrent.url + \"#\" + aCurrent.title + \"#\";\n\nWhat was wrong with the comparison you had in revision 6 of this patch? If you want to stick to this one, please use a separator that isn\'t as likely to be contained in either title or URL (such as \"\\n\" or even better \"\\0\").',0.00,0,0,3838324,6,'345953',0),(248970,213632,'2008-11-02 11:25:50','looks ok, though for readability i\'d prefer that you separate out and name the observers, instead of having them nested and anonymous. r=me w/ that change.',0.00,0,0,3838327,6,'345927',0),(248970,251051,'2008-11-02 16:13:06','(In reply to comment #491)\n> (From update of attachment 345953 [details])\n> >+ _backupRecentlyClosedTabs: function sss_backupRecentlyClosedTabs() {\n> \n> BTW: Can we just drop these now that users won\'t have the option of keeping\n> their current windows open?\n\nOK, I won\'t resist it this time! ;-)\n\nDone.\n\n> >+ function test(aLambda) {\n> \n> As you\'ll need another revision round, anyway, could you please just drop this\n> function. You no longer use it as intended... ;-)\n\nDone.\n\n> >+ if (file.exists())\n> \n> Out of curiosity: Can the file be missing at all?\n\nYes, if you choose to run only the tests in browser/components/sessionstore, this test is run as the first test, before the SS component has kicked in to write sessionstore.js for the first time.\n\nBTW, there is an annoying bug in one of the sessionstore tests which prevents one from running only tests in that directory. It causes the whole window to be closed along the way. Are you aware of this or should I file a bug?\n\n> You\'ll get the very same timestamp without changing the pref.\n\nDone.\n\n> What\'s the need for sorting? Wouldn\'t this rather lead to two different closed\n> tab lists being considered equal?\n\nHmmm, yes I think you\'re right, but it won\'t matter anyway now, since we killed the code which was supposed to make this work!\n\n> What was wrong with the comparison you had in revision 6 of this patch? If you\n> want to stick to this one, please use a separator that isn\'t as likely to be\n> contained in either title or URL (such as \"\\n\" or even better \"\\0\").\n\nThe previous one had flaws, such as failing when both arrays were empty, but like I said it doesn\'t matter now, because all the tests regarding recently closed tabs have been removed now.',0.00,0,0,3838513,5,'345990',0),(248970,160571,'2008-11-02 16:34:19','(In reply to comment #493)\n> this test is run as the first test, before the SS component has\n> kicked in to write sessionstore.js for the first time.\n\nSo, you\'re still using a build without the fix for bug 395488? ;-)\n\n> BTW, there is an annoying bug in one of the sessionstore tests which\n> prevents one from running only tests in that directory.\n\nDoesn\'t happen on my machine. Please file a bug, indicating the offender.\n\nThanks again for your patience on this. r+=me',0.00,0,0,3838527,6,'345990',0),(248970,299942,'2008-11-02 16:39:12','Will the next bits be landing shortly?',0.00,0,0,3838532,0,NULL,0),(248970,251051,'2008-11-02 17:02:45','(In reply to comment #494)\n> > BTW, there is an annoying bug in one of the sessionstore tests which\n> > prevents one from running only tests in that directory.\n> \n> Doesn\'t happen on my machine. Please file a bug, indicating the offender.\n\nDone: bug 462794.\n\n> Thanks again for your patience on this. r+=me\n\nThank you for taking the time to review this over and over again!\n\n(In reply to comment #495)\n> Will the next bits be landing shortly?\n\nYeah, as soon as I get a review on the download manager changes, the whole thing (minus the DOM storage part) will land.',0.00,0,0,3838547,0,NULL,0),(248970,96908,'2008-11-03 01:23:46','>diff --git a/toolkit/components/downloads/src/nsDownloadManager.cpp b/toolkit/components/downloads/src/nsDownloadManager.cpp\n\n>- // The following three AddObserver calls must be the last lines in this function,\n>+ // The following nine AddObserver calls must be the last lines in this function,\n\nthis made me laugh, then cringe a little.\n\nlooks good to me, but really want to get sdwilsh\'s stamp on this ASAP.',0.00,0,0,3838748,6,'345902',0),(248970,233280,'2008-11-03 10:00:17','>diff --git a/toolkit/components/downloads/src/nsDownloadManager.cpp b/toolkit/components/downloads/src/nsDownloadManager.cpp\n>+ nsCOMPtr pbs =\n>+ do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n>+ if (pbs) {\n>+ pbs->GetPrivateBrowsingEnabled(&mInPrivateBrowsing);\nThis function returns something, but you do not check that value. If you do not care about the return value, please cast to void (you do it elsewhere, but I\'m not going to comment on it anymore).\n\n\n>+ if (mInPrivateBrowsing)\n>+ Observe(nsnull, NS_PRIVATE_BROWSING_SWITCH_TOPIC,\n>+ NS_LITERAL_STRING(NS_PRIVATE_BROWSING_ENTER).get());\nI don\'t like using the Observe method like this (we aren\'t observing anything). Please break out the code that does the work for that and just call that method.\n\n>- // The following three AddObserver calls must be the last lines in this function,\n>+ // The following nine AddObserver calls must be the last lines in this function,\nnit: just remove three. people clearly do not update this number, and it\'s not useful anyway.\n\n>@@ -2027,16 +2039,54 @@ nsDownloadManager::Observe(nsISupports *\n> (void)pref->GetIntPref(PREF_BDM_RESUMEONWAKEDELAY, &resumeOnWakeDelay);\n> \n> // Wait a little bit before trying to resume to avoid resuming when network\n> // connections haven\'t restarted yet\n> mResumeOnWakeTimer = do_CreateInstance(\"@mozilla.org/timer;1\");\n> if (resumeOnWakeDelay >= 0 && mResumeOnWakeTimer) {\n> (void)mResumeOnWakeTimer->InitWithFuncCallback(ResumeOnWakeCallback,\n> this, resumeOnWakeDelay, nsITimer::TYPE_ONE_SHOT);\n>+ }\n>+ } else if (strcmp(aTopic, NS_PRIVATE_BROWSING_REQUEST_TOPIC) == 0 && currDownloadCount) {\nnit: line wrapping at 80 columns please\nnit: I know this method is not consistent, but please have the else if on a new line after the brace.\n\n>+ } else if (NS_LITERAL_STRING(NS_PRIVATE_BROWSING_LEAVE).Equals(aData)) {\nditto\n\n>+ } else if (strcmp(aTopic, NS_PRIVATE_BROWSING_SWITCH_TOPIC) == 0) {\nditto\n\n>+ } else if (NS_LITERAL_STRING(NS_PRIVATE_BROWSING_LEAVE).Equals(aData)) {\nditto\n\n>diff --git a/toolkit/components/downloads/test/unit/test_privatebrowsing.js b/toolkit/components/downloads/test/unit/test_privatebrowsing.js\n>+function get_PBSvc() {\n>+ try {\n>+ _PBSvc = Components.classes[\"@mozilla.org/privatebrowsing;1\"].\n>+ getService(Components.interfaces.nsIPrivateBrowsingService);\n>+ return _PBSvc;\n>+ } catch (e) {}\n>+ return null;\n>+}\n>+\n>+let _DMSvc = null;\n>+function get_DownloadManager() {\n>+ if (_DMSvc)\n>+ return _DMSvc;\n>+\n>+ return _DMSvc = Components.classes[\"@mozilla.org/download-manager;1\"].\n>+ getService(Components.interfaces.nsIDownloadManager);\n>+}\nThis doesn\'t follow convention of the rest of the download manager test files. We use Cc, Ci, etc. Also, if you want to use a lazy getter, please just use a smart getter:\nthis.__defineGetter__(\"dm\", function() {\n delete this.dm;\n return this.dm = Cc[\"@mozilla.org/download-manager;1\"].\n getService(Ci.nsIDownloadManager);\n});\n\n>+function is_download_available1(id, src, dst, name) {\njavadoc style comments, and please prefix pArameters with a.\n\n>+function is_download_available2(id, src, dst, name) {\nditto\n\n>+function run_test() {\n>+ let pb = get_PBSvc();\n>+ if (pb) { // Private Browsing might not be available\nIt makes the code a lot cleaner if you just return here instead of having everything inside an if block.\n\nGeneral comments for the rest of the test:\nYou use a few things like variable_nameNumber just because you have more than one. You can make the code easier to follow by using a let block:\nlet (timer = ...) {\n // use the variable\n}\n\nIn at least one place you wrap a bunch of code in a try block, and in the catch, you just report a test failure. This is unnecessary since the test will fail when an exception is thrown anyway. Please remove it.\n\nIt looks like you copied the code for addDownload in head_download_manager.js with some minor modifications. Any reason why you didn\'t modify that function and make it more flexible instead of copying and pasting code?\n\nYou have a long switch statement inside a long switch statement. Please pull out the second one into a method so it\'s easier to see what is going on.\n\nIt would also be really nice to have a comment at the top of the file explaining what, exactly, this test is doing because the code is hard to follow (it\'s very very long).\n\nI know it seems like I\'m being picky on the test, but if it ever starts to fail, I want people to be able to understand why instead so they have a chance to fix things.\n\n>diff --git a/toolkit/mozapps/downloads/content/downloads.js b/toolkit/mozapps/downloads/content/downloads.js\n> ////////////////////////////////////////////////////////////////////////////////\n> //// Utility Functions\nThere are, sadly, two places where we have utility functions in this file. Please add them to the bottom of the file, not the one at the top.\n\n>+function initStmt()\ninitStatement please, and include a javadoc comment (and include why we have it in a method)\n\n>+{\n>+ if (gStmt) {\n>+ gStmt.reset();\n>+ gStmt.finalize();\njust call finalize.\n\n>@@ -504,16 +517,24 @@ let gDownloadObserver = {\n>+ case \"private-browsing\":\n>+ if (aData == \"enter\" || aData == \"exit\") {\n>+ setTimeout(function() {\n>+ initStmt();\n>+ buildDownloadList(true);\n>+ }, 0);\n>+ }\nWhy are we doing this in a setTimeout? If there is a good reason, we should have a comment explaining why.',0.00,0,0,3839146,6,'345902',0),(248970,251051,'2008-11-03 12:46:30','(In reply to comment #498)\n> >+ if (mInPrivateBrowsing)\n> >+ Observe(nsnull, NS_PRIVATE_BROWSING_SWITCH_TOPIC,\n> >+ NS_LITERAL_STRING(NS_PRIVATE_BROWSING_ENTER).get());\n> I don\'t like using the Observe method like this (we aren\'t observing anything).\n> Please break out the code that does the work for that and just call that\n> method.\n\nDone. I added both OnEnterPrivateBrowsingMode and OnLeavePrivateBrowsingMode for parity.\n\n> General comments for the rest of the test:\n> You use a few things like variable_nameNumber just because you have more than\n> one. You can make the code easier to follow by using a let block:\n> let (timer = ...) {\n> // use the variable\n> }\n\nAs discussed on IRC, this wasn\'t necessary because I only had one timer! ;-)\n\n> In at least one place you wrap a bunch of code in a try block, and in the\n> catch, you just report a test failure. This is unnecessary since the test will\n> fail when an exception is thrown anyway. Please remove it.\n\nDone. For future reference, those were the places which we were running from a timer, where an exception is not caught by the unit test framework in the usual way. Without them, the test will time out if something throws there.\n\n> It looks like you copied the code for addDownload in head_download_manager.js\n> with some minor modifications. Any reason why you didn\'t modify that function\n> and make it more flexible instead of copying and pasting code?\n\nDone using the object-as-parameter approach Shawn suggested on IRC. One caller which did use the old-style parameter was patched as well.\n\n> I know it seems like I\'m being picky on the test, but if it ever starts to\n> fail, I want people to be able to understand why instead so they have a chance\n> to fix things.\n\nNo, not at all! I really appreciate all time time and energy you put into this. The new iteration is way better than the previous one in terms of readability and maintainability.\n\n> >@@ -504,16 +517,24 @@ let gDownloadObserver = {\n> >+ case \"private-browsing\":\n> >+ if (aData == \"enter\" || aData == \"exit\") {\n> >+ setTimeout(function() {\n> >+ initStmt();\n> >+ buildDownloadList(true);\n> >+ }, 0);\n> >+ }\n> Why are we doing this in a setTimeout? If there is a good reason, we should\n> have a comment explaining why.\n\nHmmm, I couldn\'t remember why I did that, but I think it should\'ve been a mistake. I removed the setTimeout call and tested the patch again to make sure everything\'s working properly.\n\nAll other comments and nits fixed as well.',0.00,0,0,3839446,5,'346103',0),(248970,233280,'2008-11-03 13:02:19','r=sdwilsh',0.00,0,0,3839472,6,'346103',0),(248970,251051,'2008-11-03 19:32:53','Private browsing code and dependencies landed (thanks Shawn). I\'ll update the bugs with changeset links and close it if everything stays green in about three hours.',0.00,0,0,3840060,0,NULL,0),(248970,251051,'2008-11-03 23:55:38','http://hg.mozilla.org/mozilla-central/rev/12487541851b',0.00,0,0,3840224,6,'345361',0),(248970,251051,'2008-11-03 23:56:08','http://hg.mozilla.org/mozilla-central/rev/a6712f1f6c4e',0.00,0,0,3840225,6,'345377',0),(248970,251051,'2008-11-03 23:57:13','http://hg.mozilla.org/mozilla-central/rev/c588d41a49e5',0.00,0,0,3840226,6,'345927',0),(248970,251051,'2008-11-03 23:57:46','http://hg.mozilla.org/mozilla-central/rev/743136ef83d9',0.00,0,0,3840227,6,'345990',0),(248970,251051,'2008-11-03 23:58:09','http://hg.mozilla.org/mozilla-central/rev/f67cc64a3517',0.00,0,0,3840228,6,'346103',0),(248970,251051,'2008-11-04 00:05:55','OK, I think this is now worth marking RESOLVED FIXED finally! :-)\n\nThe only test failure was filed as 462986 which already has a patch to fix the issue. The remaining work will be handled in separate bugs. I\'ll also file a bug to discuss what we want to do with the DOM Storage module for the final 3.1 release.',0.00,0,0,3840232,0,NULL,0),(248970,113380,'2008-11-04 06:06:59','+enterPrivateBrowsingCancelDownloadsAlertMsg=If you enter the Private Browsing mode now, 1 download will be canceled. Are you sure you want to enter the Private Browsing mode?\n+enterPrivateBrowsingCancelDownloadsAlertMsgMultiple=If you enter the Private Browsing mode now, %S downloads will be canceled. Are you sure you want to enter the Private Browsing mode?\n\nCould anyone tell why the built-in support for plural forms wasn\'t used here?',0.00,0,0,3840459,6,'346103',0),(248970,103593,'2008-11-04 09:05:58','(In reply to comment #508)\n> Could anyone tell why the built-in support for plural forms wasn\'t used here?\n\nBecause Ehsan hates localizers!\n\nReally though, better in general to just file a new bug when you notice someone like this, and CC the relevant people. :)',0.00,0,0,3840631,0,NULL,0),(458397,277293,'2008-11-04 12:14:53','seems this Memory Leak is on 1.9.1 bigger then on 1.9.0\n\n 0 TOTAL 39 52263449 17529916 2171241 (24239.31 +/- 0.00) 127384779 1144515 ( 8287.60 +/- 6056.31)\n\n\nnsTraceRefcntImpl::DumpStatistics: 709 entries\nnsStringStats\n => mAllocCount: 423244\n => mReallocCount: 65029\n => mFreeCount: 345432 -- LEAKED 77812 !!!\n => mShareCount: 497903\n => mAdoptCount: 113413\n => mAdoptFreeCount: 113397 -- LEAKED 16 !!!\nAssertion failed at c:/work/mozilla/builds/1.9.1-trace-malloc/mozilla/gfx/cairo/cairo/src/cairo-hash.c:199: hash_table->live_entries == 0\n\nhttp://www.grono.net: EXIT STATUS: NORMAL (754.041000 seconds)',0.00,0,0,3840890,5,'346303',0),(458397,277293,'2008-11-04 12:15:52','requesting blocking because of the results with Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b2pre) Gecko/20081030 Minefield/3.1b2pre, see comment#1',0.00,0,0,3840892,0,NULL,0),(248970,251051,'2008-11-04 13:02:52','(In reply to comment #508)\n> Could anyone tell why the built-in support for plural forms wasn\'t used here?\n\nThat\'s an oversight on my part, filed bug 463102 on that.\n\n(In reply to comment #509)\n> Because Ehsan hates localizers!\n\nThat\'d be weird, because I\'m also a localizer myself. ;-)',0.00,0,0,3840966,0,NULL,0),(248970,55600,'2008-11-06 04:38:29','Why are all windows closed when I go into private browsing mode? I would expect the window where I toggle the private browsing mode on, to go into private browsing mode.',0.00,0,0,3843370,0,NULL,0),(248970,251051,'2008-11-06 06:48:10','(In reply to comment #511)\n> Why are all windows closed when I go into private browsing mode? I would expect\n> the window where I toggle the private browsing mode on, to go into private\n> browsing mode.\n\nPrivate browsing mode is global, not per window/tab. Because we didn\'t have any way to associate only the newly opened window with the private browsing mode, we decided to close the current session to make the confusion about which tabs/pages were opened in private mode and which ones were not minimal.',0.00,0,0,3843500,0,NULL,0),(248970,283305,'2008-11-06 13:54:28','Ehsan: are we persisting the \"Save As...\" location? I completely forgot about that being something that we need to clear.',0.00,0,0,3844222,0,NULL,0),(248970,251051,'2008-11-06 15:24:48','(In reply to comment #513)\n> Ehsan: are we persisting the \"Save As...\" location? I completely forgot about\n> that being something that we need to clear.\n\nWe don\'t handle it currently. Can you please file a new bug and assign it to me to make sure I won\'t forget to work on it? Thanks!',0.00,0,0,3844355,0,NULL,0),(248970,251051,'2008-11-09 02:32:33','(In reply to comment #513)\n> Ehsan: are we persisting the \"Save As...\" location? I completely forgot about\n> that being something that we need to clear.\n\nFiled bug 463888 about this.',0.00,0,0,3847078,0,NULL,0),(248970,8519,'2008-11-12 11:09:35','https://litmus.mozilla.org/show_test.cgi?id=7394 added to Litmus.',0.00,0,0,3852038,0,NULL,0),(11040,254728,'2008-11-18 15:23:02','Now that custom filter actions are possible, I was able to add biff notification suppression as a custom action. My extension to provide this, which will be called FiltaQuilla, should be available soon after TB beta 1 is released (and will work with that version).',0.00,0,0,3861059,0,NULL,0),(11040,4410,'2008-11-18 15:28:37','Kent, that rocks, very nice.',0.00,0,0,3861066,0,NULL,0),(458397,12352,'2008-11-19 15:03:06','Leaks 85 windows, blocking.',0.00,0,0,3862788,0,NULL,0),(458397,24295,'2008-11-21 03:33:42','Stealing from bent.',0.00,0,0,3865261,0,NULL,0),(458397,24295,'2008-11-21 03:35:15','Didn\'t add unlinking for now, mContent is used in a bunch of places without null-checking.',0.00,0,0,3865262,5,'349397',0),(458397,24295,'2008-11-21 03:36:40','BTW, this fixes the leak on http://www.grono.net/. Not sure if it fixes all leaks on other pages, so Tomcat will need to retest after this lands.',0.00,0,0,3865264,0,NULL,0),(458397,200444,'2008-11-21 11:14:40','Yay!\n\n(Feel free to steal any and all of my leak bugs!)',0.00,0,0,3865796,6,'349397',0),(458397,233280,'2008-11-27 20:19:06','http://hg.mozilla.org/mozilla-central/rev/b81d78d6d81d',0.00,0,0,3873542,0,NULL,0),(248970,299942,'2008-12-10 17:31:05','Hello,\n\nToday I was using Firefox/3.1b2 and took notice that while in PB mode, shared objects/temp are still being serialized to disk (this is an Adobe Flash player feature) - as a result: page visits with flash that create shared objects are displayed clearly %appdata% profile.\n\ni.e., C:\\Users\\xxx\\AppData\\Roaming\\Macromedia\\Flash Player\\#SharedObjects\\4ZW9JGZ5\\tdcanadatrust.com\n\nWhere tdcanadatrust.com was the site I visited under PB mode. Not so private now :)\n\nI tested with Flash 10, FF 3.1b2 on Vista.\n\nIs this something we should address?',0.00,0,0,3889890,0,NULL,0),(248970,310130,'2008-12-10 17:42:58','I am not sure if this is even a flash issue even.',0.00,0,0,3889903,0,NULL,0),(248970,317549,'2008-12-10 17:52:52','I believe it is a feature called \"Flash Cookies\".',0.00,0,0,3889918,0,NULL,0),(248970,88484,'2008-12-10 18:12:51','(In reply to comment #517)\n> Hello,\n> Today I was using Firefox/3.1b2 and took notice that while in PB mode, shared\n> objects/temp are still being serialized to disk (this is an Adobe Flash player\n> feature) - as a result: page visits with flash that create shared objects are\n> displayed clearly %appdata% profile.\n> i.e., C:\\Users\\xxx\\AppData\\Roaming\\Macromedia\\Flash\n> Player\\#SharedObjects\\4ZW9JGZ5\\tdcanadatrust.com\n> Where tdcanadatrust.com was the site I visited under PB mode. Not so private\n> now :)\n> I tested with Flash 10, FF 3.1b2 on Vista.\n> Is this something we should address?\n\nFile a new bug if it isn\'t removed when you exit private browsing mode. Also make it dependent on this bug or at the very least post the bug number here.\n\nYou might also be needing these bugs to be fixed: bug 468879 and bug 468877',0.00,0,0,3889940,0,NULL,0),(248970,299942,'2008-12-10 18:30:52','Bug 46887 pretty much is the same idea at hand.',0.00,0,0,3889962,0,NULL,0),(248970,299942,'2008-12-10 18:32:06','^ Doh. Bug 468877',0.00,0,0,3889966,0,NULL,0),(248970,251051,'2008-12-11 01:42:01','Aaron: we are not going to provide plugin-specific protection for Flash, etc inside the Mozilla code. Bug 468877 is going to help with this issue if plugin vendors opt in to implement it. Bug 468879 will enable disabling all plugins in the private browsing mode, but that will only work for privacy conscious users who don\'t care if their private browsing session can\'t use plugins.\n\nAnd of course, extensions such as FlashBlock and NoScript can respond to private browsing mode changes to implement some amount of protection against this.',0.00,0,0,3890298,0,NULL,0),(248970,251051,'2008-12-18 01:39:21','Mass moving of all Firefox::General private browsing bugs to Firefox::Private Browsing.',0.00,0,0,3900224,0,NULL,0),(248970,61172,'2008-12-21 11:38:24','user-doc-complete\nhttp://support.mozilla.com/kb/Private+Browsing',0.00,0,0,3904671,0,NULL,0),(471427,259016,'2008-12-29 10:41:17','',0.00,0,0,3910763,0,NULL,0),(471427,259016,'2008-12-29 11:19:14','This is mostly the same as the l10n-upload-% target I landed last week. We have to separate out the win32 installer otherwise we\'ll end up with empty quotes on other platforms, which is interpreted as the cwd. I couldn\'t do the same sort of logic with the MARs on this one since we don\'t have a MOZ_MAKE_COMPLETE_MAR sortof var here. Only checking for existence here is fine though, imo.\n\nThe UPLOAD_EXTRA_FILES portion is currently going to be used for the $platform_info.txt files we must upload for releases. We\'ll probably have other uses for it later, though.',0.00,0,0,3910807,5,'354712',0),(471427,259016,'2008-12-29 11:24:22','This is similar to the l10n release build patch in that it subclasses the base build class for some nightly/release specific logic. The operations taking place for nightly builds have not changed at all - the upload step has just been moved to the subclass. The release builds are using the new upload target. I did not move the nightly builds to this in the interest of not making a big change right before I\'ll be gone for a week. I\'ll be moving them to the new target early in Q1.\n\nThe only other thing here is adding the \'env\' parameter to make package/installer/mar so MOZ_PKG_PRETTYNAMES is applied correctly for release builds.\n\nI gave this a go on staging and everything seemed to work properly.',0.00,0,0,3910814,5,'354713',0),(471427,259016,'2008-12-29 11:25:42','Not much to say about this one. It just gets nightly/release builds using the right Factory class and adds the appropriate parameters to the ReleaseBuildFactory calls.',0.00,0,0,3910818,5,'354714',0),(471427,30066,'2008-12-29 11:35:41','> + uploadEnv[\'UPLOAD_SSH_KEY\'] = \'~/.ssh/%s\' % self.stageSshKey\n\nDoes it make sense for us to check whether this key actually exists before calling the upload target?',0.00,0,0,3910827,6,'354713',0),(471427,259016,'2008-12-29 11:38:00','(In reply to comment #4)\n> (From update of attachment 354713 [details])\n> > + uploadEnv[\'UPLOAD_SSH_KEY\'] = \'~/.ssh/%s\' % self.stageSshKey\n> \n> Does it make sense for us to check whether this key actually exists before\n> calling the upload target?\n\nIt\'s kindof tough to, I\'m inclined to say \"meh\".',0.00,0,0,3910829,0,NULL,0),(471427,39022,'2008-12-30 10:37:45','I\'m not really happy with calling upload.py multiple times. We should be able to let make calculate all of this, and pass it in one go. You should just be able to leverage $(wildcard) here, which will return an empty string if the file doesn\'t exist, ( http://www.gnu.org/software/make/manual/make.html#Wildcard-Function ) so something like:\n$(PYTHON) $(topsrcdir)/build/upload.py --base-path $(DIST) \"$(DIST)/$(PACKAGE)\"\n$(wildcard $(DIST)/$(COMPLETE_MAR)) $(wildcard \"$(INSTALLER_PACKAGE)\")\n\nNot sure about UPLOAD_EXTRA_FILES. Are you intending that to be a list of files, or just a single file name or what? If a list of files, then you\'ll probably need something like:\n$(if $(UPLOAD_EXTRA_FILES),$(foreach f,$(UPLOAD_EXTRA_FILES),$(wildcard $(DIST)/$(f)))',0.00,0,0,3912004,6,'354712',0),(471427,259016,'2008-12-30 13:12:39','Alright, I\'ve implemented this the way you suggested. All files will be passed to upload.py at the same time, and the QUOTED_WILDCARD function you gave me fixes all of the problems I had trying to do this before.\n\nYou\'re absolutely right about UPLOAD_EXTRA_FILES, too, and I\'ve fixed that.',0.00,0,0,3912201,5,'354871',0),(471427,39022,'2008-12-30 13:21:56','+# deal with them.\n+space = $(empty) $(empty)\n\nYou should define $(empty) first, just:\nempty :=\n(I don\'t know that make really cares, but for sanity\'s sake.)\n\nI think you should use line continuations on the upload.py line, probably split it after the first $(DIST), then one arg per line after that will make it easier to read.\n\nLooks good, though!',0.00,0,0,3912214,6,'354871',0),(471427,259016,'2008-12-30 13:28:39','changeset: 634:41da1d8c2b2d',0.00,0,0,3912218,6,'354714',0),(471427,259016,'2008-12-30 13:29:26','Checking in factory.py;\n/cvsroot/mozilla/tools/buildbotcustom/process/factory.py,v <-- factory.py\nnew revision: 1.67; previous revision: 1.66\ndone',0.00,0,0,3912219,6,'354713',0),(471427,259016,'2008-12-30 13:36:22','checked in w/ nits fixed\nm-c: changeset: 23195:be8e227b1d8a\n1.9.1: changeset: 22557:c9b32bedc274',0.00,0,0,3912229,6,'354871',0),(11040,1537,'2009-01-09 16:09:57','While this would be nice, we\'re now at the point in the cycle where we have to start focussing on only the most critical bugs/features. While this would be nice to have, I don\'t think it belongs in that category. Setting wanted-. That said, Kent, you\'re more than welcome to submit a patch anyway.',0.00,0,0,3924541,0,NULL,0),(11040,254728,'2009-01-09 16:26:28','Suppression of BIFF is working well for me in the FiltaQuilla extension, so I\'m not sure it belongs in the main application anymore (or at least I don\'t have much motivation to put it there.) I do however wonder how the rest of the world gets along without suppression of BIFF from mailing lists, and the related custom sounds that ToneQuilla gives.\n\nLet me remove myself from assigned though to show that I am satisfied with the extension solution.',0.00,0,0,3924584,0,NULL,0),(11040,83436,'2009-01-09 16:54:38','I manage tbird BIFF by turning it off. It has been useless for me for years. It is useless otherwise. I\'ll try the extension.',0.00,0,0,3924638,0,NULL,0),(248970,76551,'2009-01-18 13:51:44','Everything is completed on this bug. No perf regressions with the checked-in patch. Now some weeks later we can mark this bug safely as verified. All remaining issues will be covered on their own bugs.',0.00,0,0,3935562,0,NULL,0),(248970,241123,'2009-02-11 13:11:30','Developer doc has been complete for a while now:\n\nhttps://developer.mozilla.org/en/Supporting_private_browsing_mode',0.00,0,0,3969736,0,NULL,0),(248970,15223,'2009-03-26 02:26:06','fwiw, comment 220\'s was addressed by bug 447648',0.00,0,0,4032990,0,NULL,0),(248970,15223,'2009-03-26 02:26:21','fwiw, comment 220 was addressed by bug 447648',0.00,0,0,4032991,0,NULL,0),(457765,278900,'2009-05-03 04:14:20','Thanks for reporting.',0.00,0,0,4082851,1,'324875',0),(248970,349399,'2009-06-23 16:20:01','I\'ve found a new bug. When I want to turn on Private/Porno Mode I have to use two hands (crtl+shift+p). Sometimes this is impossible, you know...',0.00,0,0,4165912,0,NULL,0),(248970,161650,'2009-06-23 18:56:22','(In reply to comment #530)\n> I\'ve found a new bug. When I want to turn on Private/Porno Mode I have to use\n> two hands (crtl+shift+p). Sometimes this is impossible, you know...\n\nThen use: Tools->Start Private browsing',0.00,0,0,4166118,0,NULL,0),(248970,88484,'2009-06-24 04:00:40','(In reply to comment #531)\n> (In reply to comment #530)\n> > I\'ve found a new bug. When I want to turn on Private/Porno Mode I have to use\n> > two hands (crtl+shift+p). Sometimes this is impossible, you know...\n> Then use: Tools->Start Private browsing\nYou can also use keyconfig (http://forums.mozillazine.org/viewtopic.php?f=48&t=72994&hilit=key) to change the access keys or toggle private browsing (https://addons.mozilla.org/en-US/firefox/addon/9517) to have a toolbar button to toggle between private and regular browsing modes.',0.00,0,0,4166502,0,NULL,0),(248970,29552,'2009-06-28 15:52:34','(In reply to comment #530)\n> I\'ve found a new bug. When I want to turn on Private/Porno Mode I have to use\n> two hands (crtl+shift+p). Sometimes this is impossible, you know...\n\nActually, you can type ctrl-shift-p with the right hand : almost all keyboards have ctrl and shift keys on the right hand side too. \n\nAnd may I congratulate you with the funniest bug report of the year :-)',0.00,0,0,4173351,0,NULL,0),(248970,350283,'2009-07-01 13:51:07','(In reply to comment #533)\n> Actually, you can type ctrl-shift-p with the right hand : almost all keyboards\n> have ctrl and shift keys on the right hand side too.\n\nObviously he\'s right-handed... :P But yes, he could still use his left hand to type the ctrl-shift-p assuming the keyboard supports it.',0.00,0,0,4179035,0,NULL,0),(248970,302581,'2009-07-02 06:27:33','Example: I use Windows with boot Camp on a mac computer\nI don\'t have a ctrl on the right side\n\nand: ctrl+shift+p is normally \'page setup\', so may be not a good combination',0.00,0,0,4180180,0,NULL,0),(248970,2687,'2009-07-10 19:01:44','there is a pretty interesting graphic about the kind of interest and impact this feature has had over in https://bug503576.bugzilla.mozilla.org/attachment.cgi?id=388008',0.00,0,0,4193505,0,NULL,0),(11040,101158,'2009-07-31 01:01:19','',0.00,0,0,4225682,2,'264634',0),(11040,362961,'2009-12-11 12:12:47','Being able to setup notifications using filters should be part of the base install. Requiring us to use an extension to do this is a poor choice. It\'s something that MS Outlook does out of the box.',0.00,0,0,4445590,0,NULL,0),(544327,279076,'2010-02-04 12:35:47','This is a placeholder bug for creating a Mozmill test script for the following Litmus test:\n\n[sessionstore] Normal exit without saving a session\nhttps://litmus.mozilla.org/show_test.cgi?id=6222 [Firefox 3.5]\nhttps://litmus.mozilla.org/show_test.cgi?id=8264 [Firefox 3.6]',0.00,0,0,4521658,0,NULL,0),(547727,325720,'2010-02-22 07:47:37','User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.3a2pre) Gecko/20100221 Minefield/3.7a2pre\nBuild Identifier: \n\nFirebug attaches itself as an observer to network requests,\nonce it gets called it tries to read the post body,\nthis fails since the object is already closed.\n\nThis happens for nsIXMLHttpRequests created in Firefogg\nhttp://bazaar.launchpad.net/~j/firefogg/trunk/annotate/head%3A/Firefogg/components/Firefogg.js#L1095\n\nthis fails here in firebug:\nhttp://code.google.com/p/fbug/source/browse/branches/firebug1.6/content/firebug/lib.js#3989\n\nwhen it is called here:\nhttp://code.google.com/p/fbug/source/browse/branches/firebug1.6/content/firebug/spy.js#281\n\nfor reference bug filed with firebug: http://code.google.com/p/fbug/issues/detail?id=2855\n\nReproducible: Always',0.00,0,0,4547594,0,NULL,0),(544327,76551,'2010-11-19 12:47:43','Mass move of Mozmill Test related project bugs to newly created components. You can filter out those emails by using \"Mozmill-Tests-to-MozillaQA\" as criteria.',0.00,0,0,5094585,0,NULL,0),(643420,137548,'2011-03-21 08:12:57','Taking, will edit .htaccess to remove this redirect I added in r83885',0.00,0,0,5357155,0,NULL,0),(643420,137548,'2011-03-21 08:14:58','Updated on trunk in r85826',0.00,0,0,5357158,0,NULL,0),(643420,137548,'2011-03-21 08:20:24','Confirmed fixed on trunk: http://www-trunk.stage.mozilla.com/en-US/firefox/comingsoon\n\nUpdated on stage in r85827\n\n(marking FIXED as per jlong, it\'ll get merged to production when we go live tomorrow)',0.00,0,0,5357170,0,NULL,0),(248970,113626,'2011-04-29 16:57:53','',0.00,0,0,5440788,2,'172993',0),(671185,246518,'2011-07-12 22:52:51','Problems discovered by static analysis and patched by hand.\n\nThis set of fixes touches stuff all over the place so I\'m requesting reviews from many people. To be clear:\n\nbjacob:\n content/canvas/src/WebGLContextValidate.cpp | 2 +-\n\ncpearce:\n content/media/ogg/nsOggCodecState.cpp | 2 +-\n\njosh:\n dom/plugins/base/nsPluginStreamListenerPeer.cpp | 3 +--\n\nehsan:\n editor/libeditor/base/nsSelectionState.cpp | 2 +-\n\nkhuey:\n layout/forms/nsFileControlFrame.cpp | 10 +++++-----\n\ndholbert:\n modules/libpr0n/src/VectorImage.cpp | 2 +-\n\nbiesi:\n netwerk/protocol/http/nsHttpChannelAuthProvider.cpp | 9 ++++++---\n\npike:\n rdf/base/src/nsRDFContainerUtils.cpp | 9 ++++++---\n\nbsmith:\n services/crypto/component/nsSyncJPAKE.cpp | 2 +-\n\nmak:\n browser/components/migration/src/nsProfileMigrator.cpp | 4 ++--\n toolkit/components/places/Helpers.h | 14 ++++++++++----\n toolkit/components/places/nsNavBookmarks.cpp | 2 +-\n toolkit/components/places/nsNavHistory.cpp | 4 ++--\n toolkit/components/places/nsNavHistoryResult.cpp | 14 +++++++++-----\n\ntaras:\n toolkit/components/telemetry/Telemetry.cpp | 2 +',0.00,0,0,5588360,5,'545596',0),(671185,278074,'2011-07-12 23:20:29','r=me (on the VectorImage line) Thanks for catching these!',0.00,0,0,5588380,6,'545596',0),(671185,8123,'2011-07-13 03:55:42','Review of attachment 545596:\n-----------------------------------------------------------------\n\nr=me on the RDF parts.',0.00,0,0,5588676,6,'545596',0),(671185,336670,'2011-07-13 08:48:29','Nice work.',0.00,0,0,5589055,6,'545596',0),(671185,18821,'2011-07-13 08:57:45','Review of attachment 545596:\n-----------------------------------------------------------------',0.00,0,0,5589079,6,'545596',0),(671185,240353,'2011-07-13 09:00:05','Review of attachment 545596:\n-----------------------------------------------------------------\n\nThank you!',0.00,0,0,5589083,6,'545596',0),(671185,261603,'2011-07-13 09:14:17','oops',0.00,0,0,5589117,6,'545596',0),(671185,287422,'2011-07-13 16:00:47','Thanks for pointing out this error.\n\nUnfortunately this condition is an unrecoverable error, and returning PR_FALSE from nsOggCodecState::PacketOutUntilGranulepos() doesn\'t enforce that. Just exclude the nsOggCodecState.cpp changes from your patch, and I\'ll make appropriate changes in another bug. Thanks!',0.00,0,0,5590210,6,'545596',0),(671185,251051,'2011-07-14 14:33:43','r=me on the editor hunk.',0.00,0,0,5592330,6,'545596',0),(671185,246518,'2011-07-20 16:56:53','Switching reviewers - bjacob -> joe on the WebGLContextValidate.cpp part.',0.00,0,0,5603279,6,'545596',0),(671185,382769,'2011-07-24 21:32:13','r+ for the WebGL part (back from vacation). Thanks for that.',0.00,0,0,5610296,6,'545596',0),(671185,246518,'2011-07-25 22:13:27','Thanks for all the reviews.\n\nhttp://hg.mozilla.org/integration/mozilla-inbound/rev/7a21ce9c4482',0.00,0,0,5613124,0,NULL,0),(671185,240353,'2011-07-26 04:06:10','http://hg.mozilla.org/mozilla-central/rev/7a21ce9c4482',0.00,0,0,5613441,0,NULL,0),(692436,292729,'2011-10-06 07:17:21','User Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0a1) Gecko/20111006 Firefox/10.0a1 Firefox/10.0a1\nBuild ID: 20111006041758\n\nSteps to reproduce:\n\nI downloaded the latest hourly build (Mozilla/5.0 (Windows NT 5.1; rv:10.0a1) Gecko/20111006 Firefox/10.0a1 Firefox/10.0a1 ID:20111006041758). This is the zipped version BTW. \n\n\nActual results:\n\nWhen you open the update channel you see that it is set to \"default\" instead of \"nightly\". This is also true for various other hourly builds from 10/5. The nightly build from 10/5 was OK.\n\n\nExpected results:\n\nUpdate channel should be \"nightly\"',0.00,0,0,5763251,5,'565211',0),(692436,161650,'2011-10-06 07:30:35','Confirmed, but its not limited to zip builds. I use hourly\'s almost all the time, and rarely a nightly build. My about:config shows \'default\' rather than \'nightly\'.\n\nUsing build:\napp.update.channel;default\nMozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0a1) Gecko/20111006 Firefox/10.0a1\nhttp://hg.mozilla.org/mozilla-central/rev/62ea504b378d',0.00,0,0,5763283,0,NULL,0),(692436,259016,'2011-10-06 07:36:49','I\'m pretty sure this is a result of bug 558180. I think this is WONTFIX\'able, though. I can\'t think of a use case for installing hourlies and wanting to get updated automatically. If you want nightlies, get a nightly. If you\'re downloading on-change builds, there\'s a specific reason you want to be on that build, right?',0.00,0,0,5763299,0,NULL,0),(692436,161650,'2011-10-06 07:43:10','Some of us use hourly builds, and on occasion, knowing full well I will get a full push, will go to Help-Check for updates, and grab a nightly. This serves some use in testing manually that the update system is still working. \n\nFor those that do bisection to find regression range for bugs will use hourly\'s to do so, then we would have to download a \'nightly\' to get back on track, otherwise testers are going to be confused why they are not getting updates, either manually or auto...',0.00,0,0,5763320,0,NULL,0),(692436,292729,'2011-10-06 07:49:01','What Ben says makes sense generally, but like Jim says I mostly use nightly builds, but when there are a lot of fixes I often use hourlies. This makes it kind of pain to have keep changing the channel. But not a deal breaker for me.',0.00,0,0,5763344,0,NULL,0),(692436,258668,'2011-10-06 07:50:00','(In reply to Ben Hearsum [:bhearsum] from comment #2)\n> I\'m pretty sure this is a result of bug 558180. I think this is\n> WONTFIX\'able, though. I can\'t think of a use case for installing hourlies\n> and wanting to get updated automatically. If you want nightlies, get a\n> nightly. If you\'re downloading on-change builds, there\'s a specific reason\n> you want to be on that build, right?\n\nBen,\n\nJust my two cents...\n\nMy use case is to download and install an hourly (.exe) over my regular Nightly installation either to test a bug fix that has just landed or because the hourly has a fix for a problem that affects the regular Nightly significantly to not want to use it. In the past, it was convenient that when the next day\'s Nightly build became available, I only needed to do a regular update and I was back on the regular Nightly with the desired bug patch in place.\n\nWith this in mind, it would be disappointing that hourlies would be built with the update channel set to \"default\" instead of \"nightly\" because of forcing the inconvenience of having to manually download/install the next day\'s Nightly to \"restore\" things to the way they were.',0.00,0,0,5763347,0,NULL,0),(692436,67981,'2011-10-06 08:31:10','I can\'t think of a use case for downloading an hourly build and wanting to stick with that build for the next one to six weeks, which is what a setting of \"default\" for the channel implies. It\'s probably better for the user (and for Mozilla) if the user gets notified reasonably soon that there is a newer build available.\n\n(When Firefox has fully implemented a silent update, it would probably be better if that doesn\'t happen after an hourly build is installed as you don\'t want to silently destroy a testing environment--but that\'s a topic for some other discussion.)',0.00,0,0,5763489,0,NULL,0),(692436,293623,'2011-10-20 16:44:21','Regression pushlog:\nhttp://hg.mozilla.org/mozilla-central/pushloghtml?fromchange=1ce1d59084e5&tochange=51d989ece4c5',0.00,0,0,5795911,0,NULL,0),(692436,30066,'2011-10-20 19:10:38','(In reply to Alice0775 White from comment #7)\n> Regression pushlog:\n> http://hg.mozilla.org/mozilla-central/\n> pushloghtml?fromchange=1ce1d59084e5&tochange=51d989ece4c5\n\nBased on this, it looks like we would simply need to set ${MOZ_UPDATE_CHANNEL} to \"nightly\" in the env for our dependent builds if this is something we\'d like to change.',0.00,0,0,5796118,0,NULL,0),(726635,128063,'2012-02-13 09:25:35','Establish criteria for reviewing community IT requests.',0.00,0,0,6056317,0,NULL,0),(726635,128063,'2012-03-13 10:09:17','Task force created to formalize this, and have it reviewed by council. Meeting soon.',0.00,0,0,6136253,0,NULL,0),(726635,128063,'2012-04-01 09:01:15','Need to decide how restrictive we want to be with applications, email sent to council.',0.00,0,0,6188472,0,NULL,0),(692436,338084,'2012-05-05 15:50:28','So this will not get fixed? I probably download an hourly maybe once or twice a week and run it side by side with nightly using \\Hourly and \\Nightly folders and -no-remote -P on the same profile. Sucks though that the installer won\'t know to install the hourly to my \\Hourly folder by default.',0.00,0,0,6283459,0,NULL,0),(726635,128063,'2012-07-23 11:50:29','First draft on wiki',0.00,0,0,6497445,0,NULL,0),(813650,373476,'2012-11-20 10:42:20','Currently crash stacks are of the form:\n\n{\ngetting files in \'/mnt/sdcard/tests/reftest/profile/minidumps/\'\nDownloading symbols from: http://ftp.mozilla.org/pub/mozilla.org/mobile/tinderbox-builds/mozilla-central-android-armv6/1353355545/fennec-20.0a1.en-US.android-arm-armv6.crashreporter-symbols.zip\nPROCESS-CRASH | Shutdown | application crashed (minidump found)\nCrash dump filename: /tmp/tmpEIdmpN/4c89b590-7ae7-4d61-565a1c7b-19bde431.dmp\nOperating system: Android\n 0.0.0 Linux 2.6.32.9-00002-gd8084dc-dirty #1 SMP PREEMPT Wed Feb 2 11:32:06 PST 2011 armv7l nvidia/harmony/harmony/harmony:2.2/FRF91/20110202.102810:eng/test-keys\nCPU: arm\n 0 CPUs\n\nCrash reason: SIGSEGV\nCrash address: 0x0\n\nThread 4 (crashed)\n 0 libxul.so!js::TraceChildren(JSTracer*, void*, JSGCTraceKind) [jsinferinlines.h : 1595 + 0x0]\n r4 = 0x4e2fb92c r5 = 0x5097a03f r6 = 0x00000000 r7 = 0x00000000\n r8 = 0x00000200 r9 = 0x548a2c0c r10 = 0x00000000 fp = 0xffffffff\n sp = 0x4e2fb748 lr = 0x53a81aa8 pc = 0x544ecc60\n Found by: given as instruction pointer in context\n 1 libxul.so!NoteJSChild [nsXPConnect.cpp : 719 + 0xe]\n r4 = 0x4e2fb92c r5 = 0x5097a03f r6 = 0x00000007 r7 = 0x00000000\n r8 = 0x4e2fb92c r9 = 0x00000001 r10 = 0x00000000 fp = 0x00242f08\n sp = 0x4e2fb788 pc = 0x53a81aa8\n Found by: call frame info\n...\n...\n}\n\nWhilst many crashes only occur during a small subset of tests (and as such can be starred by matching against the test filename), this still leaves:\n1) Shutdown crashes (of which there are too many open bugs, so we explicitly blacklist generating bug suggestions for them)\n2) Crashes that occur in so many different tests (eg GC related crashers)\n\n...both of which would benefit from being able to see the top frame in the annotated summary. (It would also improve our ability to confirm that crashes we are starring are actually the same; rather than just assuming so according to test name - if people don\'t open the full log).\n\nTo output the top frame we need to parse the minidump stackwalk output at:\nhttp://mxr.mozilla.org/mozilla-central/source/build/automationutils.py#168\n\n...and find the top frame by matching the line after the \"Process \\d+ (crashed)\", then output the PROCESS-CRASH in a form like:\n\nPROCESS-CRASH | testname | application crashed [@ top_frame]\n\nAs a follow-on bug we can even add a search link for the top frame to the annotated summary (likely added by the TBPL UI).\n\nFor reference for matching the top frame, common forms are:\n\n 0 libc.so + 0xa888\n\n 0 libnss3.so!nssCertificate_Destroy [certificate.c : 102 + 0x0]\n\n 0 mozjs.dll!js::GlobalObject::getDebuggers() [GlobalObject.cpp:89df18f9b6da : 580 + 0x0]\n\n 0 libxul.so!void js::gc::MarkInternal(JSTracer*, JSObject**) [Marking.cpp : 92 + 0x28]\n\n 0 crashinjectdll.dll!CrashingThread(void *) [crashinjectdll.cpp:2ee20348ae59 : 17 + 0x0]',0.00,0,0,6838711,0,NULL,0),(813650,373476,'2012-11-20 15:22:19','First pass:\nhttps://tbpl.mozilla.org/?tree=Try&rev=7cfcf4044c6e',0.00,0,0,6839870,0,NULL,0),(813650,373476,'2012-11-21 06:39:24','In order to output the PROCESS-CRASH line with the top frame (if found) appended, we need to hold off doing that log.info until after we\'ve called minidump stackwalk.\n\nHowever, we still want the PROCESS-CRASH line to be above the stacktrace, since otherwise when viewing the logs in TBPL, the anchor links to the PROCESS-CRASH line will unhelpfully link to the less relevant end of the stacktrace.\n\nAs such, this patch just queues up the minidump stackwalk related output until the end.',0.00,0,0,6841835,5,'683998',0),(813650,373476,'2012-11-21 06:48:59','* Whilst the regex used is a bit wtf, the alternative was iterating through every line, setting a flag once the \"Thread N (crashed)\" line found, scraping the line after that (still needing some regex) and then breaking after that. As such, I decided to just go with the horrific regex and give examples as to what we\'re trying to catch.\n\n* The \"universal_newlines=True\" is due to the minidump stackwalk output on Windows having CRLFs, which would otherwise break out regex (or at least require making it more complex).\n\n* We\'ll also need to change runpeptests.py (but not currently being used and will require adjusting the patch slightly + I guess we may end up using mozcrash there before we start using peptest again) and mozcrash (different repo). I\'ll file bugs for these two after this one; I\'m just keen to get this part landed asap to help sheriffs.\n\nTry run at:\nhttps://tbpl.mozilla.org/?tree=Try&rev=7cfcf4044c6e\n\nExamples of crashes with top frame on that try run:\nhttps://tbpl.mozilla.org/php/getParsedLog.php?id=17224313&tree=Try\nhttps://tbpl.mozilla.org/php/getParsedLog.php?id=17225063&tree=Try\nhttps://tbpl.mozilla.org/php/getParsedLog.php?id=17225055&tree=Try',0.00,0,0,6841861,5,'684004',0),(813650,39022,'2012-11-28 11:27:44','Review of attachment 683998:\n-----------------------------------------------------------------\n\nThis looks fine.',0.00,0,0,6860943,6,'683998',0),(813650,39022,'2012-11-28 12:01:23','Review of attachment 684004:\n-----------------------------------------------------------------\n\n::: build/automationutils.py\n@@ +183,5 @@\n> + # 0 mozjs.dll!js::GlobalObject::getDebuggers() [GlobalObject.cpp:89df18f9b6da : 580 + 0x0]\n> + # 0 libxul.so!void js::gc::MarkInternal(JSTracer*, JSObject**) [Marking.cpp : 92 + 0x28]\n> + match = re.search(r\"Thread \\d+ \\(crashed\\)\\n 0 (?:.*!)?(?:void )?([^\\[\\n]+)\", out)\n> + if match:\n> + topFrame = \"@ %s\" % match.group(1).strip()\n\nYeah, I\'m not digging this horrible regex. I think the simpler solution of iterating over the lines would be better. Something like:\nlines = out.splitlines()\nfor i, line in enumerate(lines):\n if \"(crashed)\" in line:\n topFrame = re.search(\"^0 ([^\\[]+)\", lines[out+1]).group(1)\n\n(regex needs more fiddling if you want to strip out library names, but whatever)\n\n@@ +198,5 @@\n> elif stackwalkPath and not os.path.exists(stackwalkPath):\n> stackwalkOutput.append(\"MINIDUMP_STACKWALK binary not found: %s\" % stackwalkPath)\n> + if not topFrame:\n> + topFrame = \"Unknown top frame\"\n> + log.info(\"PROCESS-CRASH | %s | application crashed [%s]\", testName, topFrame)\n\nnit: it\'d probably be clearer to put the @ in this string and have topFrame just be the bit from the stack trace.',0.00,0,0,6861103,6,'684004',0),(813650,373476,'2012-11-28 13:44:56','Using a loop this time :-)\n\n(In reply to Ted Mielczarek [:ted.mielczarek] from comment #5)\n> Something like:\n> lines = out.splitlines()\n> for i, line in enumerate(lines):\n> if \"(crashed)\" in line:\n> topFrame = re.search(\"^0 ([^\\[]+)\", lines[out+1]).group(1)\n> \n> (regex needs more fiddling if you want to strip out library names, but\n> whatever)\n\nThis causes exceptions if we don\'t match for whatever reason & results in having to shoehorn too much into one line, so I\'ve kept the |if match: topFrame = foo| of patch v1.\n\nThe strip() is also necessary otherwise we get the training space from examples 2-5 in comment 0. The alternative regex to avoid the strip is:\n\"^ 0 (?:.*!)?(?:void )?([^\\[]+[^ \\[]+)\"\n...which is even more of a mess, so I\'d rather stick with the strip().\n\n> @@ +198,5 @@\n> > elif stackwalkPath and not os.path.exists(stackwalkPath):\n> > stackwalkOutput.append(\"MINIDUMP_STACKWALK binary not found: %s\" % stackwalkPath)\n> > + if not topFrame:\n> > + topFrame = \"Unknown top frame\"\n> > + log.info(\"PROCESS-CRASH | %s | application crashed [%s]\", testName, topFrame)\n> \n> nit: it\'d probably be clearer to put the @ in this string and have topFrame\n> just be the bit from the stack trace.\n\nThis would prefix \"@\" to the \"Unknown top frame\" case, which seems counter-intuitive; which is why I kept these separate.\n\nTesting the changed lines in a standalone file seems to work fine & pyflakes doesn\'t complain. Will send to Try again before pushing as usual etc.',0.00,0,0,6861579,5,'686262',0),(813650,373476,'2012-11-28 13:46:14','Bah, qref.',0.00,0,0,6861590,5,'686264',0),(813650,373476,'2012-11-29 01:52:30','Oops forgot to set r?\n(See comment 6 for comment when attached)',0.00,0,0,6863304,6,'686264',0),(813650,373476,'2012-12-01 09:04:04','https://hg.mozilla.org/integration/mozilla-inbound/rev/e678ae110693\nhttps://hg.mozilla.org/integration/mozilla-inbound/rev/5216ba25182f',0.00,0,0,6871529,0,NULL,0),(813650,75935,'2012-12-01 18:02:54','https://hg.mozilla.org/mozilla-central/rev/e678ae110693\nhttps://hg.mozilla.org/mozilla-central/rev/5216ba25182f',0.00,0,0,6871903,0,NULL,0),(813650,373476,'2012-12-18 02:38:08','https://hg.mozilla.org/releases/mozilla-aurora/rev/4e7a71c31365\nhttps://hg.mozilla.org/releases/mozilla-aurora/rev/978b4f46db49\n\nhttps://hg.mozilla.org/releases/mozilla-beta/rev/aa43466faad2\nhttps://hg.mozilla.org/releases/mozilla-beta/rev/52a1c5824374\n\nhttps://hg.mozilla.org/releases/mozilla-b2g18/rev/0fd2e98a4b27\nhttps://hg.mozilla.org/releases/mozilla-b2g18/rev/f2c91a62946b\n\nhttps://hg.mozilla.org/releases/mozilla-esr17/rev/1734a9aa8636\nhttps://hg.mozilla.org/releases/mozilla-esr17/rev/c34cad5083fc',0.00,0,0,6924440,0,NULL,0),(544327,76551,'2013-06-04 21:10:55','This bug misses details about the test which now is even no longer accessible given that Litmus is gone. We decided to close this request.',0.00,0,0,7498780,0,NULL,0),(889880,428218,'2013-07-03 08:55:27','Here is the message I got from user twisfowt:\n\nFifteen (15) of my personas/themes deleted from getpersonas site prior to the migration still have entries on AMO. The gallery image is blank but there is a link to the large preview where there is a message \"...disabled by an administrator\".\n\nWith the new hover-to-add, the deleted theme is added to the addon appearance page but only the accent/background color is rendered; it appears the graphics have been deleted but not the pointers.\n\nYou can search for \"MacPro\" to see several of them. They also show up on on the Manage page, where I have a total of 153, but not on the Developer page, where I have only 138 - the difference of 15 in limbo.\n\nSince I can\'t access or delete these I\'m hoping you can. if not I guess they will become part of the immense internet dangling data dilemma.\n\nThe 15 in question are:\n\nhttps://addons.mozilla.org/en-US/firefo ... cproblue1/\nmacproblue2\nmacprogreen4\nmacprogrey\nmacpropurple2\nmacpropurple3\nmacpromaroon\nmacpromaroon2\nmacproorange\nmacprored2\nmacsortagreen\nmacsortapurple\nmactbargold\ntbirdmailolive\ntbirdmailthistle\n\n---\n\nComment from kmaglione: \"So the problem seems to be that the disabled personas show up in search results. It makes sense that there are only colors but no images (the colors are part of the persona JSON, the images are on our CDN, and we remove them when we disable an add-on). It also makes sense that they show up in the developer pages but not the user-facing pages.\"',0.00,0,0,7600169,0,NULL,0),(889880,475173,'2013-07-28 15:27:25','Since AmyT filed this bug based on my report, I\'m posting now to say that sometime over the last few days the primary problem - that these deleted/disabled-by-admin themes show up in search - is no longer the case. They are still there in the developer aspect, but that is not a significant problem. So far as I can see this bug now has zero importance and can be closed. - twisfowt',0.00,0,0,7685422,0,NULL,0),(889880,383219,'2013-07-29 09:45:32','We fixed this a few weeks ago. Thank you :)',0.00,0,0,7688111,0,NULL,0),(937428,446317,'2013-11-11 18:28:43','content team to update database fields on apps relevant to China',0.00,0,0,8068845,0,NULL,0),(692436,259016,'2013-11-14 14:04:55','(In reply to [not reading bugmail] from comment #9)\n> So this will not get fixed? I probably download an hourly maybe once or\n> twice a week and run it side by side with nightly using \\Hourly and\n> \\Nightly folders and -no-remote -P on the same profile. Sucks though that\n> the installer won\'t know to install the hourly to my \\Hourly folder by\n> default.\n\nThis is indeed the new way of things. I know it\'s inconvenient for some, but we\'ve been living with it for quite a long time without issue now.',0.00,0,0,8082297,0,NULL,0),(937428,446317,'2014-01-10 10:22:51','when you get a sec, status on this?\nhappy friday!!',0.00,0,0,8277065,0,NULL,0); +INSERT INTO `longdescs` VALUES (384,31,'1998-05-20 00:00:00','testing\n------- Additional Comments From arunr 05/19/98 14:27 -------\ntesting again please ignore',0.00,0,1,956,0,NULL,0),(384,31,'1998-06-01 18:48:59','Table of ISO 8859-1 Characters\nThis section gives an overview of the ISO 8859-1 character set. The\nISO 8859-1 character set consists of the following four blocks:\n00 19 CONTROL CHARACTERS\n20 7E BASIC LATIN\n80 9F EXTENDED CONTROL CHARACTERS\nA0 FF LATIN-1 SUPPLEMENT\nThe control characters and basic latin blocks are similar do those\nused in the US national variant of ISO 646 (US-ASCII), so they are not\nlisted here. Nor is the second block of control characters listed,\nfor which not functions have yet been defined.\n+----+-----+---+------------------------------------------------------\n|Hex | Dec |Car| Description ISO/IEC 10646-1:1993(E)\n+----+-----+---+------------------------------------------------------\n| | | |\n| A0 | 160 | | NO-BREAK SPACE\n| A1 | 161 | ¡ | INVERTED EXCLAMATION MARK\n| A2 | 162 | ¢ | CENT SIGN\n| A3 | 163 | £ | POUND SIGN\n| A4 | 164 | ¤ | CURRENCY SIGN\n| A5 | 165 | ¥ | YEN SIGN\n| A6 | 166 | ¦ | BROKEN BAR\n| A7 | 167 | § | SECTION SIGN\n| A8 | 168 | ¨ | DIAERESIS\n| A9 | 169 | © | COPYRIGHT SIGN\n| AA | 170 | ª | FEMININE ORDINAL INDICATOR\n| AB | 171 | « | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK\n| AC | 172 | ¬ | NOT SIGN\n| AD | 173 | ­ | SOFT HYPHEN\n| AE | 174 | ® | REGISTERED SIGN\n| AF | 175 | ¯ | MACRON\n| | | |\n| B0 | 176 | ° | DEGREE SIGN\n| B1 | 177 | ± | PLUS-MINUS SIGN\n| B2 | 178 | ² | SUPERSCRIPT TWO\n| B3 | 179 | ³ | SUPERSCRIPT THREE\n| B4 | 180 | ´ | ACUTE ACCENT\n| B5 | 181 | µ | MICRO SIGN\n| B6 | 182 | ¶ | PILCROW SIGN\n| B7 | 183 | · | MIDDLE DOT\n| B8 | 184 | ¸ | CEDILLA\n| B9 | 185 | ¹ | SUPERSCRIPT ONE\n| BA | 186 | º | MASCULINE ORDINAL INDICATOR\n| BB | 187 | » | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK\n| BC | 188 | ¼ | VULGAR FRACTION ONE QUARTER\n| BD | 189 | ½ | VULGAR FRACTION ONE HALF\n| BE | 190 | ¾ | VULGAR FRACTION THREE QUARTERS\n| BF | 191 | ¿ | INVERTED QUESTION MARK\n| | | |\n| C0 | 192 | À | LATIN CAPITAL LETTER A WITH GRAVE ACCENT\n| C1 | 193 | Á | LATIN CAPITAL LETTER A WITH ACUTE ACCENT\n| C2 | 194 | Â | LATIN CAPITAL LETTER A WITH CIRCUMFLEX ACCENT\n| C3 | 195 | Ã | LATIN CAPITAL LETTER A WITH TILDE\n| C4 | 196 | Ä | LATIN CAPITAL LETTER A WITH DIAERESIS\n| C5 | 197 | Å | LATIN CAPITAL LETTER A WITH RING ABOVE\n| C6 | 198 | Æ | LATIN CAPITAL LIGATURE AE\n| C7 | 199 | Ç | LATIN CAPITAL LETTER C WITH CEDILLA\n| C8 | 200 | È | LATIN CAPITAL LETTER E WITH GRAVE ACCENT\n| C9 | 201 | É | LATIN CAPITAL LETTER E WITH ACUTE ACCENT\n| CA | 202 | Ê | LATIN CAPITAL LETTER E WITH CIRCUMFLEX ACCENT\n| CB | 203 | Ë | LATIN CAPITAL LETTER E WITH DIAERESIS\n| CC | 204 | Ì | LATIN CAPITAL LETTER I WITH GRAVE ACCENT\n| CD | 205 | Í | LATIN CAPITAL LETTER I WITH ACUTE ACCENT\n| CE | 206 | Î | LATIN CAPITAL LETTER I WITH CIRCUMFLEX ACCENT\n| CF | 207 | Ï | LATIN CAPITAL LETTER I WITH DIAERESIS\n| | | |\n| D0 | 208 | Ð | LATIN CAPITAL LETTER ETH\n| D1 | 209 | Ñ | LATIN CAPITAL LETTER N WITH TILDE\n| D2 | 210 | Ò | LATIN CAPITAL LETTER O WITH GRAVE ACCENT\n| D3 | 211 | Ó | LATIN CAPITAL LETTER O WITH ACUTE ACCENT\n| D4 | 212 | Ô | LATIN CAPITAL LETTER O WITH CIRCUMFLEX ACCENT\n| D5 | 213 | Õ | LATIN CAPITAL LETTER O WITH TILDE\n| D6 | 214 | Ö | LATIN CAPITAL LETTER O WITH DIAERESIS\n| D7 | 215 | × | MULTIPLICATION SIGN\n| D8 | 216 | Ø | LATIN CAPITAL LETTER O WITH STROKE\n| D9 | 217 | Ù | LATIN CAPITAL LETTER U WITH GRAVE ACCENT\n| DA | 218 | Ú | LATIN CAPITAL LETTER U WITH ACUTE ACCENT\n| MySQL | 219 | Û | LATIN CAPITAL LETTER U WITH CIRCUMFLEX ACCENT\n| DC | 220 | Ü | LATIN CAPITAL LETTER U WITH DIAERESIS\n| DD | 221 | Ý | LATIN CAPITAL LETTER Y WITH ACUTE ACCENT\n| DE | 222 | Þ | LATIN CAPITAL LETTER THORN\n| DF | 223 | ß | LATIN SMALL LETTER SHARP S\n| | | |\n| E0 | 224 | à | LATIN SMALL LETTER A WITH GRAVE ACCENT\n| E1 | 225 | á | LATIN SMALL LETTER A WITH ACUTE ACCENT\n| E2 | 226 | â | LATIN SMALL LETTER A WITH CIRCUMFLEX ACCENT\n| E3 | 227 | ã | LATIN SMALL LETTER A WITH TILDE\n| E4 | 228 | ä | LATIN SMALL LETTER A WITH DIAERESIS\n| E5 | 229 | å | LATIN SMALL LETTER A WITH RING ABOVE\n| E6 | 230 | æ | LATIN SMALL LIGATURE AE\n| E7 | 231 | ç | LATIN SMALL LETTER C WITH CEDILLA\n| E8 | 232 | è | LATIN SMALL LETTER E WITH GRAVE ACCENT\n| E9 | 233 | é | LATIN SMALL LETTER E WITH ACUTE ACCENT\n| EA | 234 | ê | LATIN SMALL LETTER E WITH CIRCUMFLEX ACCENT\n| EB | 235 | ë | LATIN SMALL LETTER E WITH DIAERESIS\n| EC | 236 | ì | LATIN SMALL LETTER I WITH GRAVE ACCENT\n| ED | 237 | í | LATIN SMALL LETTER I WITH ACUTE ACCENT\n| EE | 238 | î | LATIN SMALL LETTER I WITH CIRCUMFLEX ACCENT\n| EF | 239 | ï | LATIN SMALL LETTER I WITH DIAERESIS\n| | | |\n| F0 | 240 | ð | LATIN SMALL LETTER ETH\n| F1 | 241 | ñ | LATIN SMALL LETTER N WITH TILDE\n| F2 | 242 | ò | LATIN SMALL LETTER O WITH GRAVE ACCENT\n| F3 | 243 | ó | LATIN SMALL LETTER O WITH ACUTE ACCENT\n| F4 | 244 | ô | LATIN SMALL LETTER O WITH CIRCUMFLEX ACCENT\n| F5 | 245 | õ | LATIN SMALL LETTER O WITH TILDE\n| F6 | 246 | ö | LATIN SMALL LETTER O WITH DIAERESIS\n| F7 | 247 | ÷ | DIVISION SIGN\n| F8 | 248 | ø | LATIN SMALL LETTER O WITH OBLIQUE BAR\n| F9 | 249 | ù | LATIN SMALL LETTER U WITH GRAVE ACCENT\n| FA | 250 | ú | LATIN SMALL LETTER U WITH ACUTE ACCENT\n| FB | 251 | û | LATIN SMALL LETTER U WITH CIRCUMFLEX ACCENT\n| FC | 252 | ü | LATIN SMALL LETTER U WITH DIAERESIS\n| FD | 253 | ý | LATIN SMALL LETTER Y WITH ACUTE ACCENT\n| FE | 254 | þ | LATIN SMALL LETTER THORN\n| FF | 255 | ÿ | LATIN SMALL LETTER Y WITH DIAERESIS\n+----+-----+---+------------------------------------------------------\nFootnote: ISO 10646 calls Æ a `ligature\', but this is a\n letter in (at least some) Scandinavian languages. Thus, it\n is not in the same, merely typographic `ligature\' class as\n `oe\' ({\\oe} in {\\LaTeX} convention) which was not included\n in the ISO8859-1 standard.\n***Tentative info***\nSupposedly the Danish press, some months ago, reported that ISO has\nchanged the standard so from now on æ and Æ are classified as\nletters.',0.00,0,1,957,0,NULL,0),(384,31,'1998-06-01 18:58:59','update - 1',0.00,0,0,958,0,NULL,0),(384,31,'1998-06-01 19:19:59','update - 3',0.00,0,0,959,0,NULL,0),(384,31,'1998-06-24 23:59:59','Testing bugs assigning it to myself',0.00,0,0,960,0,NULL,0),(384,31,'1998-06-24 23:59:59','Test bug moved to fixed',0.00,0,0,961,0,NULL,0),(384,3794,'1998-10-06 14:48:59','The database is being reorganized a bit. Instead of the Bugzilla product,\na new Webtools product has been created, with Bugzilla being a component of it.\n\nThis bug is being moved from the old Bugzilla product to the new Webtools\nproduct.',0.00,0,1,962,0,NULL,0),(1045,3881,'1998-10-09 17:29:37','It would be nice to support the CSS1 properties background-position and\nbackground-attachment. There seems to be some attempt at supporting background-\nposition, since it sometimes seems to cause a background that is tiled only in\none direction (using background-repeat) to run twice in that direction\n(parallel) rather than once. See the URL given for an example. See tests\n5.3.4, 5.3.6, and 5.3.7 (link above) for examples of these properties.‰',0.00,0,1,4602,0,NULL,0),(1045,3824,'1998-10-09 18:01:59','Note that we do support some of background-position; currently only the pixel\nvalues work, percentages and the enumerateds do not.',0.00,0,1,4603,0,NULL,0),(1045,3824,'1998-10-27 11:36:59','Background position is now working fully. So I changed the bug title...\n\nSupporting background-attachment is currently waiting on a css2 spec\nclarification.',0.00,0,1,4604,0,NULL,0),(1045,3881,'1998-12-22 12:07:59','I am curious what the spec clarification was that you were waiting for. I had\nassumed it was related to the relation between background-position and\nbackground-attachment when background-attachment was fixed (on a non-BODY\nelement), but I now think that is actually well defined in the CSS2 spec (at\nthe end of the section on background-position).',0.00,0,1,4605,0,NULL,0),(1045,4054,'1999-01-16 13:20:59','In case the clarification required is what to do with fixed background\non non-BODY elements, here is how I understand the spec:\n\nThe image should be fixed relative to the viewport, but hidden except\nthe element is over the viewport, when the image \"shines through\" the\nelement. Thus in:\n\n http://www.bath.ac.uk/%7Epy8ieh/internet/eviltests/bgafixed.html\n\n...the navy bar should be plain navy, except when it is in the middle of\nthe viewport, when you should be able to see the two cats in the navy box,\nabove the drawing of the other cat (Astrophy).\n\nRight, David?',0.00,0,1,4606,0,NULL,0),(1045,3881,'1999-01-16 14:27:59','Basically, except the blue DIV should hide the first cat, so you should never\nbe able to see both cat images at once.\n\nHere\'s my way of explaining it:\n\n1) Position and tile the background as if it were a background on the viewport.\n2) Clip whatever the result is at the edges of the element whose background it\n actually is.\n\nThis means:\n1) A tiled background image that is fixed shouldn\'t move around when the\n document is scrolled. The element whose background it is should \"move over\n it.\"\n2) A non-tiled background image should appear only when the (padding edge of\n the) element whose background it is is over that part of the viewport.',0.00,0,1,4607,0,NULL,0),(1045,3826,'1999-01-17 20:17:59','Ok, now what happens to the background when it is inside an element, say a DIV\nwith width & height properties and overflow: scroll? What about two DIVs that\nscroll nested inside each other?',0.00,0,1,4608,0,NULL,0),(1045,3881,'1999-01-17 21:25:59','Nothing different. The background is still fixed with respect to the viewport.\n\n(Background fixing with respect to an arbitrary (scrolling) element is an\ninteresting idea. I think this would best be handled by additional values on\nbackground-attachment. It is an interesting feature to think about, but it\nisn\'t in the spec now. Background fixing is wrt viewport.)',0.00,0,1,4609,0,NULL,0),(1045,3853,'1999-02-03 08:09:59','Setting all current Open/Normal to M4.',0.00,0,0,4610,0,NULL,0),(1045,3819,'1999-03-05 22:38:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,4611,0,NULL,0),(1045,3824,'1999-03-16 19:36:59','Since you\'ve been working with michael to get all the basic features we need to\nsupport this, and since you\'ll probably end up writing the code to make it work,\nI\'m giving the bug to you so you can enjoy closing it when finished :-)',0.00,0,1,4612,0,NULL,0),(1045,3825,'1999-03-22 07:54:59','*** Bug 3963 has been marked as a duplicate of this bug. ***',0.00,0,0,4613,0,NULL,0),(1045,3825,'1999-03-25 11:21:59','*** Bug 3478 has been marked as a duplicate of this bug. ***',0.00,0,0,4614,0,NULL,0),(1045,3825,'1999-04-07 17:43:59','Per my conversation with Hakon:\n\n> Okay, that\'s what we\'ll do then. Treat fixed background images as fixed with\n> regard to the nearest scrolling container\n\nYes. I can\'t make any guaratees what solution the WG will settle on,\nbut I would be very surprised if it\'s different from yours.',0.00,0,1,4615,0,NULL,0),(1045,3825,'1999-04-24 20:12:59','Okay, layout has been changed and it works correctly except in one case. Fixing\nthat requires compositor changes.\n\nThe way fixed background attachment works is that layout sets the\nNS_VIEW_PUBLIC_FLAG_DONT_BITBLT flag which tells the compositor that the view\nshould be repainted and not bitblt when moving or scrolling the view.\n\nThe nsScrollingView::Scroll() code has been changed to check the scrolled view\'s\nflags and if that flag is set, then the view is repainted and not bitblt\'d\n\nThe case that doesn\'t currently work is when there\'s a non-scrollable nested\nelement that has a fixed background attachment (see example below). What happens\nin this case is that because the scrolled view can be bitblt\'d we go ahead and\nbitblt it. However, one of its child views can not be bitblt\'d, and see we need\nto make sure that it is repainted after doing the scroll.\n\nDoing this efficiency (i.e., not walking each of the scrolled view\'s\nchild frames each time checking if any of them have this flag bit set) requires\ncompositor changes.\n\n\n\nSome text\n
    \nSome text in a DIV\n
    \n\n',0.00,0,1,4616,0,NULL,0),(1045,4151,'1999-04-25 14:26:59','This also looks suspicously similar to bug #1045.',0.00,0,0,4617,0,NULL,0),(1045,4151,'1999-04-25 14:28:59','which it is, anybody else confused by bugzilla sometimes? what bug is this?',0.00,0,0,4618,0,NULL,0),(1045,3823,'1999-04-27 13:59:59','Moving to M6.',0.00,0,0,4619,0,NULL,0),(1045,3831,'1999-05-20 11:15:59','Patrick, This is a view/compositor bug so I am re-assigning back to you. Troy\ndescribes the solution in his 4/24 message.',0.00,0,1,4620,0,NULL,0),(1045,2687,'1999-07-07 19:32:59','moving to m9. beard\'s on vacation',0.00,0,0,4621,0,NULL,0),(1045,3825,'1999-09-16 07:55:59','*** Bug 12008 has been marked as a duplicate of this bug. ***',0.00,0,0,4622,0,NULL,0),(1045,4151,'1999-09-18 15:57:59','The test cases work as they should. Is this really a performance bug? I\'ll defer\nperformance for later.',0.00,0,0,4623,0,NULL,0),(1045,4054,'1999-09-27 06:10:59','beard: I don\'t think this is a performance issue. Take a look at this page:\n http://www.bath.ac.uk/%7Epy8ieh/internet/projects/mozilla/overflowscroll.html\n\nScroll it up and down. The white box in the middle explains the problem:\nbasically, we seem to be only repainting the inner element (overflow:scroll)\nwhen the scrolling has finished, which leads to trails during the scroll.\nIts difficult to explain; have a look.',0.00,0,1,4624,0,NULL,0),(1045,4054,'2000-01-13 15:58:59','Migrating from {css1} to css1 keyword. The {css1}, {css2}, {css3} and {css-moz}\nradars should now be considered deprecated in favour of keywords.\nI am *really* sorry about the spam...',0.00,0,1,4625,0,NULL,0),(1046,3881,'1998-10-09 17:34:25','It would be nice to support the CSS attributes word-spacing and letter-spacing.\nAlthough I would have to say I would put them among the lowest priorities in\nCSS1, I think they are still definitely worth implementing, especially if you\nwant to claim complete CSS1 support.‰',0.00,0,1,4626,0,NULL,0),(1046,3824,'1998-10-27 11:39:59','We now support them fully; however, the spec is unclear about how some aspects\nshould be handled so don\'t go nuts if it renders oddly; the implementation will\nbe updated when our css guy gets clarification back from the working group.\n\nI\'m reassigning this to peter so that he can assign it back once the\nclarification has arrived.',0.00,0,1,4627,0,NULL,0),(1046,70,'1998-11-18 10:58:59','Last I heard from the CSS list, the clarification was that the value of this\nproperty is the delta to the default value. In other words, if default letter\nspacing is 0.1em, and the author says letter-spacing: -0.1em, the total letter\nspacing applied should be 0.0em, not -0.1em. I thought this was extremely\ncounterintuitive, but it\'s what the CSS gods said.',0.00,0,1,4628,0,NULL,0),(1046,3826,'1998-11-18 11:16:59','Actually, the latest clarification from the CSS w/g is that _I_ write up a\nproposal to define the normative behavior, since the spec doesn\'t. Expect\nsomething next week.',0.00,0,1,4629,0,NULL,0),(1046,3819,'1999-03-05 22:38:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,4630,0,NULL,0),(1046,4054,'1999-05-21 10:25:59','Isn\'t this resolved now??? The last relevant comment is from six months ago!',0.00,0,0,4631,0,NULL,0),(1046,3826,'1999-09-07 17:45:59','Pushing off non-beta 1 issues',0.00,0,0,4632,0,NULL,0),(1046,4126,'1999-10-21 01:06:59','Reassigning peterl\'s bugs to myself.',0.00,0,0,4633,0,NULL,0),(1046,4126,'1999-10-21 01:12:59','Accepting peterl\'s bugs that have a Target Milestone',0.00,0,0,4634,0,NULL,0),(1046,3881,'1999-10-26 15:34:59','My opinion is that the default value of \'word-spacing\' (i.e., \'normal\') should\n*not* be equivalent to 0 (and 0 should mean that \"a bc\" and \"abc\" should look\nthe same), while the default value of \'letter-spacing\' (again,\n\'normal\') *should* be equivalent to 0 (since you don\'t adjust letter spacing for\njustification). I think this can (mostly) be implied from CSS1.',0.00,0,1,4635,0,NULL,0),(1046,4126,'1999-12-20 21:10:59','Pushing my M15 bugs to M16',0.00,0,0,4636,0,NULL,0),(1046,4054,'2000-01-13 15:58:59','Migrating from {css1} to css1 keyword. The {css1}, {css2}, {css3} and {css-moz}\nradars should now be considered deprecated in favour of keywords.\nI am *really* sorry about the spam...',0.00,0,1,4637,0,NULL,0),(1108,70,'1998-10-15 19:51:24','I can\'t modify the line-height property via the CSS OM.',0.00,0,0,5070,0,NULL,0),(1108,1679,'1998-10-16 11:31:59','I\'m doing the right thing as far as I can tell. It\'s the style system that needs\nto respond to the change.',0.00,0,0,5071,0,NULL,0),(1108,3826,'1998-11-05 16:09:59','Note that the example URL doesn\'t actually attempt to modify the line-height\nproperty, but when I hack it to do that, it works fine...',0.00,0,1,5072,0,NULL,0),(1157,3988,'1998-10-19 23:02:08','(Note: I ran these tests with both the plugins from\nNavigator 4.5 PR2 and the old versions from Navigator 3.0.\nI changed the plugins by modifying the registry at\n\"hkey_current_user/software/netscape/netscape\nnavigator/main/install directory\".)\n\nTrouble with AVI and WAV OBJECTs. The following\nproblems occurred on any OBJECT with the MIME type\n\"video/x-msvideo\" or \"audio/wav\".\n\nThe plugin gets loaded, but the video/audio clip won\'t play.\n\nWhen using the plugins from 4.5 PR2, the AVI object is just\nan empty space where the previous page shows through.\nClicking right button on the space gives a NPAVI32 menu, but\nselecting \"Play\" or anything else does nothing. When I use\nthe plugins from Nav3.0, NGLayout crashes immediately on\nloading the page!\n\nIn the WAV tests, a LiveAudio plugin panel saying \"Loading\naudio file...\" is shown. Clicking on the panel a few times\ncauses a crash. The behaviour is identical with both plugin\nversions.\n\nHere\'s a sample output from my NGLayout on a WAV object test:\n\n loaded plugin npaudio.dll for mime type audio/wav\n result of creating plugin adapter: 0\n successfully created plugin instance 01253dd0 for\n npaudio.dll, mimetype audio/wav\n instance start called\n\nThe output is similar in the AVI tests.',0.00,0,1,5339,0,NULL,0),(1157,3682,'1998-11-23 18:15:59','I can\'t even get to the stage where you\'re experiencing the bug. I crash when I\ncall into the initial entry point. The plugin calls NPN_GetJavaEnv(), and since\nwe no longer support a JRI based LiveConnect, we return NULL. It looks like the\nplugin does not handle this correctly.\n\nCan you try your test with a more recent build of NGLayout? Also what is the\nexact version of the plugin you\'re using (I have been using npaudio 1.1.1515)',0.00,0,0,5340,0,NULL,0),(1157,3853,'1998-11-23 20:55:59','Putting on ss: radar.',0.00,0,0,5341,0,NULL,0),(1157,3988,'1998-11-24 00:38:59','Right, I ran the tests again with an Nov-18 debug build of NGLayout:\n\n- The WAV test doesn\'t crash any more. It doesn\'t matter if I use npaudio.dll\n version 1.1.1515 or 1.01. The sound still won\'t play, though!\n\n- The AVI test crashes immediately on loading the page when using the\n npavi32.dll from Nav3.0. It doesn\'t crash when using the npavi32.dll\n from Nav4.5. Again, the video clip won\'t play either.',0.00,0,1,5342,0,NULL,0),(1157,4367,'1999-01-26 12:52:59','Don\'t forget to implement the attribute TABINDEX for element OBJECT.',0.00,0,0,5343,0,NULL,0),(1157,3853,'1999-02-03 08:04:59','Setting all current Open Critical and Major to M3',0.00,0,0,5344,0,NULL,0),(1157,3819,'1999-03-05 23:15:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,5345,0,NULL,0),(1157,3849,'1999-03-06 07:45:59','reassigning to Greg Lynn as QA contact',0.00,0,0,5346,0,NULL,0),(1157,4082,'1999-03-06 15:16:59','Antti please try again with recent build of NGLayout, March 5 or later. Code at\ntime you tried last in November was in early Dev phase. Please enter new\nfindings with updates to test cases.',0.00,0,0,5347,0,NULL,0),(1157,3988,'1999-03-07 11:14:59','OK, I downloaded the March 4th nightly build for Win32 and tried again.\nIt seems that the build has no support for plugins whatsoever, which\neffectively solves the problem for the time being - no plugins, no\ncrashes. :-)\n\nThe viewer just renders a grey box in the place of any audio or video\nOBJECT.',0.00,0,1,5348,0,NULL,0),(1157,3988,'1999-03-07 11:15:59','Sorry, I meant March 5th build - *not* 4th.',0.00,0,0,5349,0,NULL,0),(1157,4082,'1999-03-08 21:57:59','Leaving bug open to track inclusion of ability to play avi and wav files now\nthat crash is solved.',0.00,0,1,5350,0,NULL,0),(1157,3682,'1999-03-12 18:32:59','This works for me now.',0.00,0,0,5351,0,NULL,0),(1157,3988,'1999-03-13 05:59:59','Update on a March 12th Win32 build:\n\nViewer now seems to crash on any OBJECT with a MIME type other than\nimage/gif, image/jpeg or image/png (which render correctly). Audio and\nvideo OBJECTs, too, crash the viewer immediately on loading the page.\n\nAlso noteworthy: any OBJECT with no \'type\' attribute whatsoever crashes\nthe build, too.',0.00,0,1,5352,0,NULL,0),(1157,3682,'1999-03-15 11:11:59','There are a few different bugs going on here:\n- bug with no mimetype specified on image content (crash in CSS code)\n- bug with no height or width specified on plugin content (crash in webshell)\n- bug with no mimetype specified on plugin content (no crash, plugin does not\nget loaded, alternative content gets displayed)\n\nLet\'s concentrate this bug on the second matter and I\'ll open a separate bug for\nthe other two (basically problems when no mimetype is specified).\n\nThe crash in this case occurs when you go to the above url and then go back to a\nprevious page. First, you get a precondition violation in\nnsParser::OnDataAvailable():\n\nNS_PRECONDITION(((eOnStart==mParserContext->mStreamListenerState)||(eOnDataAvail\n==mParserContext->mStreamListenerState)),kOnStartNotCalled);\n\nThen you crash in: nsWebShell::OnConnectionsComplete(). I\'m cc\'ing rickg so he\ncan comment on the parser precondition. Also, who owns web shell problems?\n\nNOTE: you might have to go back and forth on the test page more than once to\nmake it crash.',0.00,0,1,5353,0,NULL,0),(1157,3682,'1999-03-15 11:16:59','There are a few different bugs going on here:\n- bug with no mimetype specified on image content (crash in CSS code)\n- bug with no height or width specified on plugin content (crash in webshell)\n- bug with no mimetype specified on plugin content (no crash, plugin does not\nget loaded, alternative content gets displayed)\n\nLet\'s concentrate this bug on the second matter and I\'ll open a separate bug for\nthe other two (basically problems when no mimetype is specified).\n\nThe crash in this case occurs when you go to the above url and then go back to a\nprevious page. First, you get a precondition violation in\nnsParser::OnDataAvailable():\n\nNS_PRECONDITION(((eOnStart==mParserContext->mStreamListenerState)||(eOnDataAvail\n==mParserContext->mStreamListenerState)),kOnStartNotCalled);\n\nThen you crash in: nsWebShell::OnConnectionsComplete(). I\'m cc\'ing rickg so he\ncan comment on the parser precondition. Also, who owns web shell problems?\n\nNOTE: you might have to go back and forth on the test page more than once to\nmake it crash.',0.00,0,1,5354,0,NULL,0),(1157,3682,'1999-03-15 15:16:59','Reassigning to Andrei as he is more familiar with object tag issues.',0.00,0,0,5355,0,NULL,0),(1157,3682,'1999-03-16 17:26:59','Now I can\'t repro this anymore.\n\nAndrei - can you verify this?',0.00,0,1,5356,0,NULL,0),(1157,4059,'1999-03-16 18:05:59','No it does not crash any longer',0.00,0,0,5357,0,NULL,0),(1157,4082,'1999-03-17 17:08:59','First time I tried URL it crashed on win98 optimized March 17 current build,\napprunner causes invalid page fault in module unknown. (Went to bugzilla, pulled\nup bug, clicked on URL to repro and adios application.) Mac and Linux did not\ncrash but no sound is played. 2nd pass on win98 worked in same fashion as Mac/\nLinux, third pass crashed again. Reopening.',0.00,0,1,5358,0,NULL,0),(1157,3682,'1999-03-18 13:23:59','Looks like this only crashes in Apprunner, not viewer.\n\nAndrei has a fix.',0.00,0,1,5359,0,NULL,0),(1157,2687,'1999-03-18 14:37:59','marking fixed',0.00,0,0,5360,0,NULL,0),(1157,4082,'1999-03-18 20:44:59','Ok, latest M3 build timestamped after 8pm does work, i.e. it does not crash.\nSound still does not play but at least it does not crash. Marking verified.',0.00,0,1,5361,0,NULL,0),(1157,3988,'1999-04-21 05:02:59','AVI and WAV OBJECT are crashing again.\n\nThat is, all tests at\nhttp://www.student.oulu.fi/%7esairwas/object-test/audio/ and\nhttp://www.student.oulu.fi/%7esairwas/object-test/video/\ncrash the Apr 20 Win32 build.',0.00,0,1,5362,0,NULL,0),(1157,4059,'1999-04-22 14:37:59','We checked in a fix for a crash which could be related yesterday. Try today\'s\nbuild. I cannot reproduce the crash.',0.00,0,1,5363,0,NULL,0),(1157,3988,'1999-04-23 01:25:59','OK, no crash anymore on April 22th Win32 build.\nWhat is more, the audio/video plug-ins actually work! This is\nthe first time I\'ve seen them in action. Just impressive.\n\nThere\'s still a problem with unsized video OBJECTs (with no width\nand height attributes) - they are not displayed at all - but I\'ll\nfile another bug about that as soon as I have created some more\nthorough test cases for the issue.',0.00,0,1,5364,0,NULL,0),(1157,4059,'1999-04-23 11:43:59','And assign it to me. Marking this one fixed.',0.00,0,0,5365,0,NULL,0),(1157,4130,'1999-06-01 21:25:59','beppe, do you get these(plugin stuff) now?',0.00,0,0,5366,0,NULL,0),(1157,3849,'1999-06-02 09:12:59','I just tested all 4 audio clip tests and they all work perfectly, used build\n1999060108',0.00,0,1,5367,0,NULL,0),(1865,4211,'1998-12-10 22:15:18','Take a look at http://home.dipswitch.com.\nNotice the animated background.\nThe latest version of mozilla refreshes animated GIF backgrounds every second.',0.00,0,1,10579,0,NULL,0),(1865,4150,'1999-01-05 15:17:59','batch-reassigning all Garrett Blythe bugs to Don Melton',0.00,0,0,10580,0,NULL,0),(1865,1674,'1999-01-06 12:21:59','Re-assinged to pnunn@netscape.com.\n\nPam, do you have any idea who should get this bug? Someone in layout maybe?',0.00,0,1,10581,0,NULL,0),(1865,1681,'1999-01-07 18:02:59','In an attempt to reproduce the problem I generated:\nhttp://jazz/users/pnunn/publish/anibkgif.html\nto replace\nhttp://www.dipswitch.com',0.00,0,1,10582,0,NULL,0),(1865,1681,'1999-01-08 11:46:59','My test page does show the problem. Interestingly enough, an\nanimated gif in table bkground works, but a page bkground does not.\n-pn',0.00,0,1,10583,0,NULL,0),(1865,1681,'1999-01-08 12:01:59','The bkground image animation does work sometimes. So its an intermittant bug.\n(pn: note to self:?timer/layout related problem?)',0.00,0,1,10584,0,NULL,0),(1865,3853,'1999-02-25 11:22:59','beppe...can you put in a QA Contact please to check this with latest build?\nThanks!',0.00,0,1,10585,0,NULL,0),(1865,1681,'1999-02-25 11:48:59','Just check this on linux 02-23-99 build and it all animates\nbut very very very slowly. very.\nfyi,\n-pn',0.00,0,1,10586,0,NULL,0),(1865,3849,'1999-02-27 10:13:59','assigning Eli as QA assigned',0.00,0,0,10587,0,NULL,0),(1865,3853,'1999-03-02 15:01:59','Bulk moving Mozilla/ImageLig bugs to NGLayout/Image in preparation for a move to\nBrowser/ImageLib.',0.00,0,0,10588,0,NULL,0),(1865,1698,'1999-04-26 20:23:59','On Mac OS (4.26.99 build), Seamonkey performs the animation on Jazz at\napproximately half the speed of Communicator 4.5 on the same system (about 5.5\nseconds per iteration on Seamonkey, versus about 2 seconds on 4.5).\n\n(The speed is equivalent to Communicator 4.5 on Win32 & Linux. Also, on Linux,\nthere\'s a 6th column of animated moons that appears to the right of the table,\nflickering on and off. If it\'s still present when this is actually fixed, I\'ll go\nahead and break it into a separate bug. Thanks!)',0.00,0,1,10589,0,NULL,0),(1865,1681,'1999-04-27 12:17:59','changing milestone.\n-pn',0.00,0,1,10590,0,NULL,0),(1865,1681,'1999-05-10 13:29:59','I don\'t see this problem. marking worksforme.\nps. it looks like the extra \"moon\" column is fixed too.\n-pn',0.00,0,1,10591,0,NULL,0),(1865,1698,'1999-05-10 14:44:59','Re-opening; the application behavior is unchanged from the 4.26.99 comment that I\ntossed in.\n\nTo reproduce, take a Macintosh, go to the test page (I\'m using a full 1024x768,\nwindow, 16-bit video), and compare the animation speed in Gecko vs. Communicator;\nit\'s about 4 seconds per cycle on Communicator, but about 8-10 seconds per cycle\non Gecko.',0.00,0,0,10592,0,NULL,0),(1865,1698,'1999-05-10 14:48:59','(And, yes, I\'m still seeing the flashing moon on Linux, too, although only for\nthe first few cycles; let me know if you\'d like me to show it to you.)',0.00,0,1,10593,0,NULL,0),(1865,1698,'1999-05-11 20:08:59','I\'ve now broken down the moon issue from 4.26.99 comment into bug #6302.\n\n(strangely enough, I\'m listening to \"Over the Moon\" from Rent while typing the\nabove... ;)',0.00,0,1,10594,0,NULL,0),(1865,1681,'1999-05-12 10:22:59','I\'m pushing this bug out. crashers get priority over\nperformance.\n-pn',0.00,0,1,10595,0,NULL,0),(1865,1681,'1999-05-14 12:07:59','?Could this be because NU_Cache is not enabled for mac?\n-pn',0.00,0,1,10596,0,NULL,0),(1865,1681,'1999-06-11 17:41:59','I\'m marking this one as a dupe of #3958.\\\n-pnunn\n\n*** This bug has been marked as a duplicate of 3958 ***',0.00,0,1,10597,0,NULL,0),(1865,1698,'1999-06-15 12:57:59','Verifying as duplicate, with a note in 3958 to double-check that the bug\ndescribed in this report is also fixed upon verification of 3958.',0.00,0,1,10598,0,NULL,0),(1869,4218,'1998-12-11 07:03:24','These tags work in current browsers, but I couldn\'t get it to work with gecko:\n\n
    \n\n
    \n\nI use these, and switch between the two via javascipt and the z-index.',0.00,0,1,10613,0,NULL,0),(1869,3824,'1998-12-11 08:07:59','Can you give me a better test case? I made a simple test case and it works for\nme...Also, the url you\'ve given me is a frame-set. Which frame-cell has the\nproblem page?\n\nthanks...',0.00,0,1,10614,0,NULL,0),(1869,3824,'1998-12-14 20:57:59','Email from dustin:\nHere\'s the frame link:\n\nhttp://www.e-corp.com/home_nav.asp\n\nwhen i looked at it in gecko, all the text in the hidden divisions was\nshown. now that i think about it, it could be a javascript or a css\nproblem, because javascript unhides layers according to which image you\nclick on.\n\nThanks,\n\nDustin',0.00,0,1,10615,0,NULL,0),(1869,3853,'1999-02-03 08:08:59','Setting all current Open/Normal to M4.',0.00,0,0,10616,0,NULL,0),(1869,3819,'1999-03-05 22:38:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,10617,0,NULL,0),(1869,3824,'1999-03-23 19:25:59','Probably fixed, but since you are the minister of things positioned absolute\n(ahem), I figured you should look into it.',0.00,0,1,10618,0,NULL,0),(1869,3825,'1999-03-23 20:10:59','Looks like it works to me, too',0.00,0,0,10619,0,NULL,0),(1869,4110,'1999-03-26 22:24:59','Using the 3/26 build, there is still bug behavior. The frame should display with\n8 orange menu items. When clicked on, the orange bar turns yellow and a drop\ndown menu displays. Geckco is displaying the 8 menu items in yellow, not orange.\nClicking on them does not display a drop down menu and, at the end of the items\nthere is residual drop down information from the \'Press Room\' section.\n\nReopening bug.',0.00,0,0,10620,0,NULL,0),(1869,3825,'1999-03-27 08:44:59','You\'re describing three separate problems, and they need to be addressed in\nthree separate bugs. We need very specific test cases that determine whether\neach of the problems are layout of HTML or DOM\n\nThe problem is it is very time consumming to narrow these kind of bugs down',0.00,0,1,10621,0,NULL,0),(1869,2687,'1999-05-20 21:37:59','unlikey this is going to be fixed in M6.\nchris, any luck in trying to get to a narrower test case?',0.00,0,1,10622,0,NULL,0),(1869,4110,'1999-06-15 12:28:59','Using 6/14 Apprunner, the display problems spelled out in the 3/26 comments no\nlonger appear. However, drop down (using the frame link from 12/14 comments) do\nnot work. It looks to be a javascript problem but that is not my expertise so I\nam unable to break down the sample test case further. Reassigning back to\nengineer.',0.00,0,1,10623,0,NULL,0),(1869,3828,'1999-06-15 23:29:59','Chris -- Running viewer under NT looks exactly like Nav4.5.\nI need a test case to see what the problem is, or we should close this.',0.00,0,1,10624,0,NULL,0),(1869,4110,'1999-06-16 12:17:59','I tested the frame link using 6/19 Viewer and Apprunner on NT:\n\nNav 4.5 behavior:\nWhen you click on a dark orange option, two things happen - (1) orange link\nturns yellow and you get a drop down menu (2) a new window comes up related to\nthe first drop down item.\n\nViewer behavior:\nWhen you click on a dark orange option, a new window comes up related, but the\ndark orange option does NOT turn yellow and a drop down menu DOES NOT display.\n\nApprunner behavior:\nWhen you click on a dark orange option, nothing happens. However, the console\ndoes indicate that a page is loading.',0.00,0,1,10625,0,NULL,0),(1869,3828,'1999-06-17 10:48:59','Ah -- missed that. Thanks Chris. Kevin -- let\'s start with widgets, but this\ncould be a script or event bug. Please take a closer look.',0.00,0,1,10626,0,NULL,0),(1869,3831,'1999-06-17 17:51:59','Looks like they are using document.layers to display and animate the drop-down\nmenus.\n\n document.layers[moveobj].ypos = parseInt(document.layers[moveobj].top)\n if (document.layers[moveobj].ypos > (tabtops[movetab] - mfactor)) {\n for(movetab; movetab < arraylen; movetab++) {\n moveobj = tabs[movetab]\n document.layers[moveobj].ypos = parseInt(document.layers[moveobj].top)\n document.layers[moveobj].ypos -= 5\n document.layers[moveobj].top = document.layers[moveobj].ypos}\n setTimeout(\"objslide()\",30)}\n\nAre we supporting document.layers?\nVidur, Please take a look at the document.layer code in the far left frame.',0.00,0,1,10627,0,NULL,0),(1869,1679,'1999-06-17 18:01:59','Wow, this one\'s been around.\n\nThe original initial layout issues look OK. The nifty sliding menus aren\'t going\nto work because our lack of JS access to the document.layers array.\n\nPassing along to ekrock to put on our layers pile.',0.00,0,1,10628,0,NULL,0),(1869,3845,'2000-01-03 13:22:59','INVALID. LAYER, ILAYER, document.layers[] not supported in Gecko/Nav5. Closed.\nNotified reporter and site owner via template at\nhttp://sites.netscape.net/ekrock/fixit/layer.html',0.00,0,1,10629,0,NULL,0),(1869,4110,'2000-01-07 17:14:59','Verified invalid',0.00,0,0,10630,0,NULL,0),(1877,4224,'1998-12-11 13:06:35','Hi,\nI have a file with the following code. When I try to load in the NGlayout (Geko)\nit fails to load.\n\n\n\n\nJavascript error: Screen is not defined.\nURL: file ://N:/alerts/index.html, LineNo:3\nLine text: \'(null)\', Error text: \'null\'\n\n\nThanks',0.00,0,1,10684,0,NULL,0),(1877,3827,'1999-01-28 18:21:59','I\'ve added the screen object so as to stop causing errors. The value it\nreturns are still bogus, though. Rick, passing this to you as a reminder that\nI need this api for screen info. Pass it back to me when you\'re done.',0.00,0,1,10685,0,NULL,0),(1877,3853,'1999-02-03 08:03:59','Setting all current Open Critical and Major to M3',0.00,0,0,10686,0,NULL,0),(1877,1674,'1999-03-05 16:55:59','Changed platform and OS to all, and component to Apprunner.\n\nRick, figure out whether you or Nisheeth should implement this.',0.00,0,1,10687,0,NULL,0),(1877,1674,'1999-03-05 17:29:59','Can we downgrade the severity to normal on this one?',0.00,0,0,10688,0,NULL,0),(1877,3819,'1999-03-05 21:58:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,10689,0,NULL,0),(1877,3853,'1999-03-10 07:27:59','Setting QA Contact to rpotts since eng will have to verify this code fix.',0.00,0,0,10690,0,NULL,0),(1877,1674,'1999-03-10 21:02:59','Changed component to XPApps and milestone to M4.',0.00,0,0,10691,0,NULL,0),(1877,1674,'1999-04-07 01:15:59','Re-assigned to davidm@netscape.com and changed target milestone to M5.',0.00,0,0,10692,0,NULL,0),(1877,1008,'1999-04-07 01:59:59','Is implementing js objects really an XPApp task? I don\'t mind doing it if someone\npoints me in the right direction but I would like to know how many of these\nobjects there are so I can fix them before they make it to the bug list.',0.00,0,0,10693,0,NULL,0),(1877,1008,'1999-04-15 01:16:59','so I don\'t get spammed',0.00,0,0,10694,0,NULL,0),(1877,1674,'1999-04-23 00:06:59','Changed milestone to M6.',0.00,0,0,10695,0,NULL,0),(1877,1008,'1999-04-24 21:37:59','*** Bug 5463 has been marked as a duplicate of this bug. ***',0.00,0,0,10696,0,NULL,0),(1877,1008,'1999-05-18 16:38:59','m7',0.00,0,1,10697,0,NULL,0),(1877,1008,'1999-06-08 14:55:59','Filed bugs against layout for not implimenting\nnsDeviceContextMac::GetDeviceSurfaceDimensions. Still have to figure out how to\ndetermine which chrome is on a screen when given a window',0.00,0,1,10698,0,NULL,0),(1877,1008,'1999-06-11 14:24:59','',0.00,0,1,10699,5,'383',0),(1877,1008,'1999-06-11 14:25:59','Checked in code. The avail functions currently return default values ( 0 for the\noffsets or the hieght/width). On Mac/GTK the values will be garabage until the\ndependant bugs are fixed. Still have to work out a strategy for calculating\nwindow chrome location and size. Moving off to m9. I have attached my sample test\nfile',0.00,0,0,10700,0,NULL,0),(1877,1008,'1999-06-28 16:49:59','*** Bug 8763 has been marked as a duplicate of this bug. ***',0.00,0,0,10701,0,NULL,0),(1877,1008,'1999-07-01 18:29:59','added dependency',0.00,0,0,10702,0,NULL,0),(1877,159,'1999-07-13 17:57:59','*** Bug 9731 has been marked as a duplicate of this bug. ***',0.00,0,0,10703,0,NULL,0),(1877,1008,'1999-07-23 20:14:59','Not going to happen for m9 lets try ,11',0.00,0,0,10704,0,NULL,0),(1877,1008,'1999-09-04 19:52:59','Fix checked in an verified on the mac.',0.00,0,0,10705,0,NULL,0),(2586,4054,'1999-01-23 06:27:55','Quite comical, really.\n\nIn Print Preview, animated GIFs are still animated. I would love to say\nthat it is not a bug, but unless the printing code can then back the\npreview up by animating the printed copy, I suggest the Print Preview\nshould show a static image.\n\nThis also applies to applets, Javascript, \"hover\" and \"active\" pseudo\nclasses, and so on.',0.00,0,1,16615,0,NULL,0),(2586,3825,'1999-01-23 10:05:59','Yeah, if we\'re going to be WYSIWYG then animating an image seems wrong.\n\nMichael, this is a fun one',0.00,0,1,16616,0,NULL,0),(2586,3819,'1999-03-05 22:01:59','per leger, assigning QA contacts to all open bugs without QA contacts according\nto list at http://bugzilla.mozilla.org/describecomponents.cgi?product=Browser',0.00,0,1,16617,0,NULL,0),(2586,4110,'1999-03-07 12:18:59','changing QA contact to elig@netscape.com',0.00,0,0,16618,0,NULL,0),(2586,4048,'1999-09-22 15:37:59','There is no way to have layout do a static image on an animated gif at the\nmoment. Maybee sometime in the future we can make a switch that will stop the\nanimation.. but for the time being.. this will be a low priority.',0.00,0,1,16619,0,NULL,0),(2586,1698,'1999-10-07 15:14:59','Verified REMIND.',0.00,0,0,16620,0,NULL,0),(3140,4084,'1999-02-12 14:50:53','When catching events on top level (or in the body node) the target points at\nthe HTML node in cases it should point at BODY node. I\'ll give you an example.\n\n \n\nGives \"HTML\" when I enter a \"BODY\" part of the page.',0.00,0,1,21618,0,NULL,0),(3140,3827,'1999-04-13 14:27:59','There are compatibility issues here based on old Navigator behavior for things\nin the Body tag which reflected into the document (onload, for example).\nPushing out to M6 to give more time to resolve these.',0.00,0,1,21619,0,NULL,0),(3140,3827,'1999-05-17 18:49:59','Moving out to M7',0.00,0,0,21620,0,NULL,0),(3140,3924,'1999-07-27 05:49:59','',0.00,0,1,21621,5,'1002',0),(3140,3924,'1999-07-27 05:51:59','To create the test case (bugathon) I simply reformatted the URL that is listed\nabove (created by d96erik@dtek.chalmers.se) to reduce extraneous tags. I tested\nit both in Win95 and in Linux on the 1999/07/26 daily build, and this is still\nbroken.',0.00,0,1,21622,0,NULL,0),(3140,3827,'1999-07-27 20:14:59','Troy, can I get your comments on this? My question is what should define the\nbody of the doc? In this test, the body no larger than the textual content and\nthus you immediately mouse into the HTML area, not the BODY. If you expand the\ncontent, and therefore the body, you can then hit the body. I think the current\nbehavior may be correct.\n\nIn any case, not a pressing issue.',0.00,0,1,21623,0,NULL,0),(3140,3825,'1999-07-27 20:26:59','From the CSS perspective the BODY isn\'t special and so the events going to\nthe document element is correct. Certainly for non-HTML documents (e.g., XML)\nthat\'s what should happen\n\nThere are some places where the CSS2 spec makes concessions for HTML documents,\ne.g., the body\'s background is rendered by the HTML element (unless there\'s a\nbackground specified for the HTML element)\n\nSo I suppose you could treat events on the HTML element as associated with the\nBODY element if you wanted to. Only for HTML elements, of course. We won\'t\nconsider expanding the BODY frame, because the BODY isn\'t special and can be\neither block or inline depending on style',0.00,0,1,21624,0,NULL,0),(3140,3924,'1999-07-29 17:29:59','Even if it is the correct behavior for the HTML tag to recieve the event, why\nshould that trigger the onMouseOver on the BODY tag, with an\nevent.target.nodeName of HTML? It seems to me that if the target is HTML, the\nHTML tag should recieve the event, which it does not (See bug 10702). If the\nevent on the body tag recieves the event, shouldn\'t it have a target.nodeName of\nBODY? It seems to work that way with every other element.',0.00,0,1,21625,0,NULL,0),(3140,3827,'1999-11-04 10:15:59','Moving multiple bugs to m12',0.00,0,0,21626,0,NULL,0),(3140,3828,'1999-12-01 14:15:59','Moving to m13 because Joki seems to be distracted.',0.00,0,0,21627,0,NULL,0),(6810,4432,'1999-05-20 11:45:20','Unix printing should launch lp/lpr with a title (that banner pages get a more\nusefull info than \"job xxxx\", for example).\n\nMaybe this can be implemented by printf-Style formattings:\n%t Page title (be carefull with the charset; maybe page charset must be\nconverted to system charset, chars like \" must be escaped...)\n%f Page file (e.g. xxx.html)\n%u URL\n\n----\n\nThe default should be\nlpr -T \"%t\"\n(for BSD systems like Linux)\n\nlp -t \"%t\"\nfor Solaris (System 5 !?) OSes',0.00,0,1,50753,0,NULL,0),(6810,4144,'1999-06-30 11:27:59','This issue still occurs in the June 30th Build (1999063009).',0.00,0,0,50754,0,NULL,0),(6810,4048,'1999-08-03 07:55:59','This is just for you.',0.00,0,0,50755,0,NULL,0),(6810,4432,'1999-08-03 07:59:59','????\nWhat is for me ? And who is \"me\" ??',0.00,0,1,50756,0,NULL,0),(6810,4529,'1999-08-31 14:06:59','I\'ll look into this for M11.',0.00,0,0,50757,0,NULL,0),(6810,4432,'1999-09-24 02:29:59','What is the problem with this feature ?\n\nThe implementation should be easy:\n(java pseudo-code:)\n-- snip --\nString s = doc.getTitle();\nString cmdstring = \"lp -t \\\" + s + \"\\\";\nruntime.runCmd( cmdstring, stdin, postscriptOut, stderr );\n-- snip --\n\nThe only thing we should take care is that the title is correctly escaped that\nspecial chars won\'t be interpreted anything else than a title...',0.00,0,1,50758,0,NULL,0),(6810,3819,'1999-11-19 16:52:59','Sorry for the spam, changing QA contact on printing bugs to our new printing\ntester, Shrirang!',0.00,0,1,50759,0,NULL,0),(6810,4529,'1999-12-01 22:12:59','Mass moving these bugs to M13',0.00,0,0,50760,0,NULL,0),(6810,3682,'2000-01-12 18:48:59','Moving Syd\'s non-PDT+ bugs to M15 to indicate that he will not have time to get\nto them for Beta.',0.00,0,1,50761,0,NULL,0),(6810,4432,'2000-01-12 23:45:59','OK, then please tell me where to get the following things:\n- The current page title, e.g. something like getPageTitle()\n- A encoder which transforms the page encoding into the local encoding\nThen I\'ll write this little piece of code...',0.00,0,1,50762,0,NULL,0),(9622,4150,'1999-07-11 19:08:09','Drag in: Incoming drags need to generate proper Gecko events 2d mcafee\n0%',0.00,0,1,72571,0,NULL,0),(9622,4150,'1999-07-11 19:43:59','Mass changing all XPToolkit M9 feature \'bugs\' to target as p2 for M9',0.00,0,0,72572,0,NULL,0),(9622,4150,'1999-07-11 22:57:59','Mass changing all M9 feature \'bugs\' to \'enhancement severity.',0.00,0,0,72573,0,NULL,0),(9622,1672,'1999-07-24 02:24:59','I think we\'ve pretty much got this working.',0.00,0,0,72574,0,NULL,0),(9622,4078,'1999-07-26 14:49:59','chris, is there some way for me to verify this, or should i just mark it\nverified?',0.00,0,1,72575,0,NULL,0),(9622,1672,'1999-07-26 15:05:59','I think you should just verify it.',0.00,0,0,72576,0,NULL,0),(9622,4078,'1999-07-26 15:42:59','ok, marking verified. (thanks :)',0.00,0,0,72577,0,NULL,0),(9622,4078,'1999-07-26 15:42:59','[clearing status whiteboard]',0.00,0,0,72578,0,NULL,0),(10575,3849,'1999-09-29 09:14:59','changing QA contact to Leger since this is a tracking bug',0.00,0,0,79391,0,NULL,0),(10575,3794,'1999-09-29 16:31:59','This bug was stomped all over by rudiklm@indosat.net.id; I am undoing the\ndamage.',0.00,0,1,79392,0,NULL,0),(10575,3853,'1999-12-08 13:41:59','Updating QA Contact.',0.00,0,0,79393,0,NULL,0),(10575,1674,'1999-12-22 18:39:59','Getting rid of this old tracking bug that caused lots of unecessary\ndependencies.',0.00,0,1,79394,0,NULL,0),(11040,4410,'1999-08-01 13:34:59','I was thinking of doing this - it\'s just a matter of adding a filter action, and\ndoing a folder notification. But if someone beats me to it, that\'s fine too.',0.00,0,0,82747,0,NULL,0),(11040,1869,'1999-08-24 10:28:59','Bulk-resolving requests for enhancement as \"later\" to get them off the Seamonkey\nbug tracking radar. Even though these bugs are not \"open\" in bugzilla, we\nwelcome fixes and improvements in these areas at any time. Mail/news RFEs\ncontinue to be tracked on http://www.mozilla.org/mailnews/jobs.html',0.00,0,0,82748,0,NULL,0),(11040,1869,'1999-08-31 17:35:59','Reopen mail/news HELP WANTED bugs and reassign to nobody@mozilla.org',0.00,0,0,82749,0,NULL,0),(12911,3858,'1999-08-31 17:25:27','I\'m having a problem where my prefs are being saved in\n/builds/akkana/.mozilla/akkana/prefs.js instead of\n$HOME/.mozilla/akkana/prefs.js. I switched my home directory some time ago from\n/builds to /u, and hadn\'t realized \'til now that my prefs were still being saved\nin the old location. Where is it getting this path? Not from anything in the\nbuild tree (I pull a new tree nearly every day), and not from $HOME/.mozilla\nsince the whole problem is that it isn\'t looking there. What do I have to\nchange to get it to use $HOME the way other apps do?',0.00,0,1,96239,0,NULL,0),(12911,3822,'1999-09-02 17:18:59','The original description of this bug resolved down to a problem of using\nabsolute pathnames in the registry file. I\'m changing this bug to capture the\nidea that the registry file should store relative pathnames instead of absolute\npathnames. The pathnames should be stored relative to the directory that\ncontains the registry file and the pathname handling must be careful to rebuild\nthe absolute name correctly (i.e. the CWD must NOT be used :-)\n\nIf the user enters a pathname for the profile directory, we must detect whether\nit is an absolute or relative pathname and store/rebuild it accordingly.\n\nThe problem we\'re solving here is that on Unix the user\'s home directory was\ncopied to a new place - including the registry that still pointed to the old\nplace. At best this is confusing, at worst it would fail because the old place\ngot deleted. By using relative names, the whole problem is avoided.',0.00,0,1,96240,0,NULL,0),(12911,3853,'1999-09-13 21:15:59','Putting on [PP] list.',0.00,0,0,96241,0,NULL,0),(12911,3853,'1999-09-15 11:35:59','Removing [PP] since this is only relative to Unix.',0.00,0,0,96242,0,NULL,0),(12911,3853,'2000-01-20 09:17:59','Moving all Profile Manager bugs to new Profile Manager Backend component.\nProfile Manager component to be deleted.',0.00,0,1,96243,0,NULL,0),(13534,4412,'1999-09-09 19:33:25','I think that we should endeavour to remove REMIND and LATER from Bugzilla. I\nbelieve that they achieve more harm than good.\n\nThere are many disadvantages:\n\n(a) They can easily not appear as queries. After all, they are _unresolved_.\n(b) Effort to reopen, resulting in comments/activity which clutter the bug\nreport.\n(c) They are usually set by Netscape employees and hence imply Netscape\'s agenda\nfor what will go in. Mozilla, at least, is a open project, where anyone can\ncontribute.\n\nSo, what\'s the alternative? The obvious answer is, the milestone.\n\nRemind can already be handled by moving the bugs to a later milestone where\nthey need to get reevaluated. Remind could even get turned into a bug flag\n(see bug #11155).\n\nFor LATER, there needs to be an \"No Target\" milestone. This means that there is\ncurrently no plan for implementation, but it has been considered, and hence\nwon\'t appear on groups\' new bugs radar (ie having a blank milestone, which might\nbe renamed to \"To Be Considered\").\n\nThis would require a little modification of queries by Netscape employees to\nexclude untargetted bug reports, but they generally know how to use Bugzilla.\nIt is a lot more important that Bugzilla newbies can quickly find the issues\nthat do not have a target date and they should help out on, and point (a) can\nprevent this. This, combined with the introduction of assigning to\n\"nobody@mozilla.org\", covers all the issues that I know of.\n\nNote that this works just as well for closed or in-house projects that use\nBugzilla.',0.00,0,1,100413,0,NULL,0),(13534,3881,'1999-09-09 20:16:59','Remind and later could just be added to the milestone list (and removed\nelsewhere). This seems like a good idea.',0.00,0,1,100414,0,NULL,0),(13534,4412,'1999-09-09 23:03:59','I think remind is unnecessary, and \"No Target\" is a better, although longer name\nfor \"Later\".',0.00,0,0,100415,0,NULL,0),(13534,8444,'2000-01-16 19:09:59','Here\'s a more general solution: merge the Status and Resolution fields.\n\n* Have Status be one of {New, Assigned, Reopened, Fixed, Later, Wontfix,\n Invalid, Worksforme, Duplicate, Closed}.\n\n* Have a single `Verified\' checkbox. Whenever the bug\'s Status is changed,\n `Verified\' is unchecked, so that the new status can be verified by someone\n else (usually a QA person).\n\n* `New\' + `Verified\' == triaged. This makes things easier for people like me who\n spend time triaging bugs, to tell which bugs haven\'t been processed yet.\n\n* If `Assigned\', a bug can only be `Verified\' by the person who it is assigned\n to. This is equivalent to accepting the bug, so the `Accept bug\' control is\n no longer needed. Elegant, eh?\n\n* `Remind\' and `Later\' are nuked, as explained by matty.',0.00,0,1,100416,0,NULL,0),(13534,4403,'2000-01-16 19:54:59','I think the mpt@mailandnews.com comment is orthogonal to this bug.',0.00,0,0,100417,0,NULL,0),(13534,3794,'2000-01-17 16:27:59','Leaving this bug open, but be warned I\'m not likely to do anything about it.\n\nPeople making their own installation of bugzilla can customize away REMIND and\nLATER.',0.00,0,1,100418,0,NULL,0),(13534,4403,'2000-01-17 16:58:59','This is really a mozilla.org policy issue. What is the proper forum for\nresolving it?',0.00,0,1,100419,0,NULL,0),(13534,3794,'2000-01-17 17:01:59','You can try the netscape.public.mozilla.qa.general newsgroup.',0.00,0,0,100420,0,NULL,0),(13534,4412,'2000-01-17 19:00:59','True, but the \"No Target\"/\"To Be Determined\" milestone separation is something\nthat should be Bugzilla standard I think, and if not implemented first, the\nLATER removal will be shot down in flames.',0.00,0,1,100421,0,NULL,0),(3140,3845,'2000-01-21 13:50:58','Bulk moving [testcase] code to new testcase keyword. Sorry for the spam!',0.00,0,0,169926,0,NULL,0),(6810,10982,'2000-02-03 10:15:49','Even if I cannot get the title/URL/etc. in the script to print the page, the\npostscript code for it should contain the same information as the windows\nversion (URL, Title, Page number, Date, etc). I just don\'t get why Netscape for\nWindows has these since ever and Unix doesn\'t. It\'s not that it would be hard to\nadd this :-(',0.00,0,1,183349,0,NULL,0),(1045,4151,'2000-02-07 11:13:27','Both test cases appear to work fine now in my 7-Feb-2000 build, using \nnsViewManager2. I should be able to close this bug when final migration is \ncomplete.\n',0.00,0,1,187120,0,NULL,0),(1045,4151,'2000-02-09 12:47:00','Fixed by nsViewManager2\n',0.00,0,1,190173,0,NULL,0),(13534,4403,'2000-02-16 23:35:07','Every bug should either have a target or be closed WONTFIX. It would be \nreasonable to have a target of 5.1M1 for things not expected to be fixed in 5.0.\n',0.00,0,1,200436,0,NULL,0),(1045,4054,'2000-02-21 16:35:13','I\'m verifying this and reopening a new bug. This bug has gotten unwieldy.\nThe new bug is bug 27841.\n',0.00,0,1,205568,0,NULL,0),(1045,3881,'2000-02-21 16:53:38','No, it\'s bug 28741. :-)',0.00,0,0,205612,0,NULL,0),(1045,4054,'2000-02-21 17:18:59','Well... You knew what I meant, right? ;-)\nThanks David.\n',0.00,0,1,205665,0,NULL,0),(13534,4412,'2000-03-04 00:26:07','Every bug maybe, but what about enhancements? There are lots in this system.',0.00,0,0,219079,0,NULL,0),(13534,4412,'2000-03-04 00:27:55','MPT, one problem with your proposal is that Closed loses the\nFixed/WontFix/Invalid/etc. resolution. Have you filed this separately yet?',0.00,0,1,219080,0,NULL,0),(13534,4403,'2000-03-04 11:44:03','Enhancements without assigned resources are now regularly left open and assigned \nto nobody@mozilla.org.\n',0.00,0,0,219222,0,NULL,0),(13534,4412,'2000-03-04 18:05:39','Yes, a lot are, but not all, and I\'m not sure everyone would want to do it this\nway. If the vast majority of developers were happy with this I would be too.',0.00,0,1,219363,0,NULL,0),(13534,8444,'2000-03-04 21:06:33','matty: No, I\'m still thinking about how to represent the unverified/verified \nscheme from a user\'s point of view, in order to make it obvious what it\'s for. \nInterestingly, Bugzilla\'s the extra UNCONFIRMED status was introduced after my \nsuggestion, but it provides another example of something that could be simplified \nusing the verified/unverified scheme -- by having NEW -verified and\nNEW +verified.\n\nHowever, the simple fix for this bug is the same as I described in my earlier \nsuggestion: simply to move REMIND and LATER from the Resolution field into the \nStatus field. (I have to admit I don\'t follow the logic behind the existence of \nCLOSED -- it seems to me to be based on a fallacious assumption that bugs can\'t \npossibly regress after a particular version of the product has been shipped.)\n',0.00,0,1,219432,0,NULL,0),(384,4412,'2000-03-07 02:50:23','Verified that this was a test. No correspondence will be entered into.',0.00,0,0,221881,0,NULL,0),(13534,4412,'2000-03-08 14:41:37','Not suprisingly, I found someone the other day whose most popular votes query\ndidn\'t have REMIND and LATER.',0.00,0,1,224456,0,NULL,0),(1046,9018,'2000-03-27 15:02:36','Letterspacing is defined as space between characters, but that doesn\'t include \nspaces, does it? \nCurrently, letterspacing is (effectively) added to the space between words.\nAlso, trailing letterspacing affects whether a word fits on a line and the width \nof a line. IMO, this should not be so.\n\n(See attachment.)',0.00,0,1,243674,0,NULL,0),(1046,9018,'2000-03-27 15:05:45','',0.00,0,1,243675,5,'6996',0),(3140,3827,'2000-04-04 12:22:28','Mass-moving bugs out of M15 that I won\'t get to. Will refit individual \nmilestones after moving them.',0.00,0,1,250600,0,NULL,0),(6810,3682,'2000-04-06 14:21:47','Moving to M20\n',0.00,0,1,254909,0,NULL,0),(6810,4432,'2000-04-07 04:55:03','To digulla@hepe.com: Printing banner (info), page number etc. is the job of the\nprint system and should not be part of Mozilla itself. \nIn Unix/X11 the Xprt (X print server) or a special filter in the lp-printsystem\nwould be the location where to \"enable\" page count/number printing...',0.00,0,1,255673,0,NULL,0),(1046,3828,'2000-04-07 14:39:18','non-essential for m16',0.00,0,0,256342,0,NULL,0),(1157,12902,'2000-04-08 04:33:36','don\'t know if linux is supposed to be able to do avi files, since there is no\nplace i can specify which app to use for it, but clicking on a link to an avi\nfile crashes build ID 2000040708. Expected functionality in this case - IF no\nplayer was defined - would be a request to download the file, i believe.\n-\nHow to reproduce:\nWent to http://www.wapland.no/art/450.html\nClicked link millennium.avi (about middle down the page)\nThis happens:\nDocument http://www.wapland.no/art/450.html loaded successfully\nDocument: Done (12.044 secs)\nError loading URL http://www.wapland.no/art/450.html \nDocument: Done (3.454 secs)\n\nProgram received signal SIGSEGV, Segmentation fault.\n0x40b73156 in NSGetModule ()\n(gdb) bt\n#0 0x40b73156 in NSGetModule ()\n#1 0x40ba853f in NSGetModule ()\n#2 0x40eb0d18 in NSGetModule ()\n#3 0x40ebe9ba in NSGetModule ()\n#4 0x40eaf87d in NSGetModule ()\n#5 0x4048f00a in nsWidget::DispatchEvent ()\n#6 0x4048ef35 in nsWidget::DispatchWindowEvent ()\n#7 0x4048efaa in nsWidget::DispatchFocus ()\n#8 0x404934c4 in nsWindow::SetFocus ()\n#9 0x401ea5f6 in GlobalWindowImpl::Focus ()\n#10 0x404273ab in NSGetModule ()\n#11 0x4048f00a in nsWidget::DispatchEvent ()\n#12 0x40495641 in handle_toplevel_focus_in ()\n#13 0x40545809 in gtk_marshal_BOOL__POINTER ()\n#14 0x4057333d in gtk_handlers_run ()\n#15 0x40572782 in gtk_signal_real_emit ()\n#16 0x405708d5 in gtk_signal_emit ()\n#17 0x405a5c9c in gtk_widget_event ()\n#18 0x40544a5a in gtk_main_do_event ()\n#19 0x404885e8 in handle_gdk_event ()\n#20 0x405eefcb in gdk_event_dispatch ()\n#21 0x4061cf96 in g_main_dispatch ()\n#22 0x4061d561 in g_main_iterate ()\n#23 0x4061d701 in g_main_run ()\n#24 0x405442f9 in gtk_main ()\n#25 0x40481e0a in nsAppShell::Run ()\n#26 0x4042563a in NSGetModule ()\n#27 0x804b20c in JS_PushArguments ()\n#28 0x804b523 in JS_PushArguments ()\n#29 0x40300a1b in __libc_start_main (main=0x804b3a0 ,\nargc=1, argv=0xbffffa34, \n init=0x804938c <_init>, fini=0x804c284 <_fini>, rtld_fini=0x4000ae60\n<_dl_fini>, stack_end=0xbffffa2c)\n at ../sysdeps/generic/libc-start.c:92\n(gdb) \n\n',0.00,0,1,257100,0,NULL,0),(6810,10982,'2000-04-10 01:26:28','So that\'s why Unix and Windows printouts differ: Mozilla just passes this\ninformation to the Windows printer and omits it on Unix. In that case, you\nreally have to put these information into ENV variables or replace specific\nparts of the commandline (as suggested in the first post in this thread).',0.00,0,1,258119,0,NULL,0),(13534,3794,'2000-04-13 07:36:34','tara@tequilarista.org is the new owner of Bugzilla and Bonsai. (For details,\nsee my posting in netscape.public.mozilla.webtools,\nnews://news.mozilla.org/38F5D90D.F40E8C1A%40geocast.com .)',0.00,0,1,262321,0,NULL,0),(10575,7298,'2000-04-24 15:35:48','Sorry for the spam. changing qa contact.',0.00,0,0,272461,0,NULL,0),(10575,8793,'2000-04-24 15:52:02','verif.',0.00,0,1,272520,0,NULL,0),(2586,4054,'2000-05-20 15:00:47','Reopening and marking Future.\n\nIt would be nice to get this fixed, though. Animated GIFs in a print preview\nis quite silly...',0.00,0,1,301396,0,NULL,0),(2586,1749,'2000-05-21 09:29:02','Someone is working on flags to control gif animations which should be useable \nfor this bug (see bug 33810). This is to be able to control animations in the \neditor (see bug 14768) where they don\'t want animations either. I\'ll mark this \nbug as dependent on that so that the solution they used can be copied to the \nprint preview.\n',0.00,0,1,301742,0,NULL,0),(2586,4048,'2000-05-21 19:41:27','There are no API\'s to do this, will give this to Pam Nunn.. I suggest a remind \nsince I don\'t think this is a high priority for this release.',0.00,0,1,301947,0,NULL,0),(2586,1681,'2000-05-22 11:42:54','Don:\n\nAs of last week you can set \'animation controls\' from\nnsPresContext. The editor folk needed it too.\n\n\nGo to nsIFrameImageLoader.h \nHere are the possible settings:\n\nenum nsImageAnimation {\n eImageAnimation_Normal = 0, // looping controlled by image\n eImageAnimation_None = 1, // don\'t loop; just show first frame\n eImageAnimation_LoopOnce = 2 // loop just once\n};\n\nIn image lib the control field (for now) is\nic->animate_request.\n\nTo set it from nsPresContext, take a look at\nmozilla/layout/base/src/nsPresContext.cpp ~line 941\nwhere loader->init() is called in nsPresContext::StartLoadImage().\n\nReassigning to you, since you know where the \nprint stuff should be hooked up.\nCall me if you need to know more...\n-Pam\n\n',0.00,0,1,302403,0,NULL,0),(12911,4423,'2000-05-31 14:15:28','Reassigning to myself. Moving to M20.',0.00,0,0,313637,0,NULL,0),(1046,3845,'2000-06-05 14:42:49','I\'ve asked dbaron to research what the \"Right Thing\" really is for this bug. \nOnce we know that, we can figure out what to do for FCS.',0.00,0,1,318359,0,NULL,0),(1157,15928,'2000-06-11 01:09:40','I\'m still getting the problem on the Linux 2000060908 build. The URL is\nhttp:\n//www.nizkor.org/ftp.cgi/r/people/z/zundel.ernst/Yecheskeli_Interview/Zundel-\nTsadok-001.avi\n\nThe stack trace I get is:\n\n0x2b6fd5c2 in NSGetModule ()\n(gdb) where\n#0 0x2b6fd5c2 in NSGetModule ()\n#1 0x2b737111 in NSGetModule ()\n#2 0x2b73701f in NSGetModule ()\n#3 0x2bae5825 in NSGetModule ()\n#4 0x2baf394a in NSGetModule ()\n#5 0x2bae444d in NSGetModule ()\n#6 0x2b05d5ca in NSGetModule ()\n#7 0x2b05d4ed in NSGetModule ()\n#8 0x2b05d569 in NSGetModule ()\n#9 0x2b061c2f in NSGetModule ()\n#10 0x2ae7a00e in GlobalWindowImpl::Focus ()\n#11 0x2ae30d2b in NSGetModule ()\n#12 0x2b05d5ca in NSGetModule ()\n#13 0x2b064195 in NSGetModule ()\n#14 0x2b1176cf in gtk_marshal_BOOL__POINTER ()\n#15 0x2b1489a8 in gtk_handlers_run ()\n#16 0x2b147d7f in gtk_signal_real_emit ()\n#17 0x2b145d37 in gtk_signal_emit ()\n#18 0x2b17e61c in gtk_widget_event ()\n#19 0x2b1873cb in gtk_window_real_set_focus ()\n#20 0x2b11795b in gtk_marshal_NONE__POINTER ()\n#21 0x2b147dbd in gtk_signal_real_emit ()\n#22 0x2b145d37 in gtk_signal_emit ()\n#23 0x2b18464e in gtk_window_set_focus ()\n#24 0x2b17f14a in gtk_widget_real_grab_focus ()\n#25 0x2b117b63 in gtk_marshal_NONE__NONE ()\n#26 0x2b147dbd in gtk_signal_real_emit ()\n#27 0x2b145d37 in gtk_signal_emit ()\n#28 0x2b17ef98 in gtk_widget_grab_focus ()\n#29 0x2b0640b2 in NSGetModule ()\n#30 0x2b1176cf in gtk_marshal_BOOL__POINTER ()\n#31 0x2b1489a8 in gtk_handlers_run ()\n#32 0x2b147d7f in gtk_signal_real_emit ()\n#33 0x2b145d37 in gtk_signal_emit ()\n#34 0x2b17e61c in gtk_widget_event ()\n#35 0x2b1167bb in gtk_main_do_event ()\n#36 0x2b0587c8 in NSGetModule ()\n#37 0x2b1c85a4 in gdk_event_dispatch ()\n#38 0x2b1f3f96 in g_main_dispatch ()\n#39 0x2b1f4561 in g_main_iterate ()\n#40 0x2b1f4701 in g_main_run ()\n#41 0x2b115fdc in gtk_main ()\n#42 0x2b05146c in NSGetModule ()\n#43 0x2ae2ee3a in NSGetModule ()\n#44 0x804d207 in JS_PushArguments ()\n#45 0x804d60d in JS_PushArguments ()\n#46 0x2acf0fb3 in __libc_start_main (main=0x804d508 ,\nargc=1, argv=0x7ffff924, init=0x804a77c <_init>, fini=0x8051d28 <_fini>,\nrtld_fini=0x2aab55d0 <_dl_fini>, stack_end=0x7ffff91c)\nat ../sysdeps/generic/libc-start.c:78\n',0.00,0,1,325666,0,NULL,0),(1046,4126,'2000-06-12 04:05:11','This bug has been marked \"future\" because the original netscape engineer working \non this is over-burdened. If you feel this is an error, that you or another known \nresource will be working on this bug, or if it blocks your work in some way -- \nplease attach your concern to the bug for reconsideration. \n\n',0.00,0,0,326148,0,NULL,0),(1046,3845,'2000-06-14 18:23:51','Marking nsbeta3 for tracking. Recc. nsbeta3+. This is a CSS1 W3C Official \nTest Suite bug. Have asked dbaron to investigate this issue and try to determine \nwhat the Right Thing is, then we need to see if we can do it.',0.00,0,1,330009,0,NULL,0),(1046,3881,'2000-06-14 22:19:41','',0.00,0,1,330147,5,'10171',0),(1046,3881,'2000-06-14 22:21:14','The above testcase (which shows that we are doing deltas from normal, rather \nthan values, which I don\'t like but is what the spec says), along with:\nhttp://www.w3.org/Style/CSS/Test/current/sec541.htm\nhttp://www.w3.org/Style/CSS/Test/current/sec542.htm\nshow that our behavior is correct except possibly for the issue mentioned by \nfantasai@escape.com above. I will raise this on www-style.',0.00,0,1,330150,0,NULL,0),(1046,3881,'2000-06-14 22:44:41','I take that back. I think the remaining issues are the following:\n * How does \'letter-spacing\' apply at word gaps? Should it:\n + not apply\n + apply once\n + apply twice (once on each side of space)\n * What happens where \'letter-spacing\' and \'word-spacing\' change? Should it \nwork like collapsed margins, as Matthew Brealey proposed in \nhttp://lists.w3.org/Archives/Public/www-style/1999Nov/0237.html ? Do we care?',0.00,0,1,330162,0,NULL,0),(1046,4126,'2000-06-16 02:46:58','We should apply letter-spacing twice at word-gaps like MacIE5 does. It preserves \nthe legibility of the text when letter-spacing becomes larger than the normal \nword-spacing.\n\nIn the 2 lines below, letter-spacing is 3 times the width of the space. In the \nfirst line, it is applied once between words; in the second one, it is applied \ntwice.\n\n g a p s a r e n o t v i s i b l e\n\n g a p s a r e v i s i b l e\n\nReassigned to erik who is taking care of Text Layout. Changed the summary line to \n\"letter-spacing should apply on space characters too\". Reset the milestone from \n\"future\" to M20 because of nsbeta3 nomination.\n',0.00,0,0,331750,0,NULL,0),(1046,4126,'2000-06-16 02:48:53','',0.00,0,1,331751,5,'10238',0),(3140,12990,'2000-06-21 13:39:05','M16 has been out for a while now, these bugs target milestones need to be \nupdated.',0.00,0,1,336860,0,NULL,0),(3140,3827,'2000-06-26 21:45:34','Adding [DOM] prefix to bugs related to DOM Level 0, 1, or 2 \ncompatibility/compliance.',0.00,0,1,342479,0,NULL,0),(3140,3827,'2000-06-27 18:47:39','Updating Milestone to M18.',0.00,0,0,343640,0,NULL,0),(1046,3845,'2000-07-20 11:18:59','correctness of compliance with official W3C CSS1 test suite. Passing this is a\nkey product goal. Test suite results will be closely watched by reviewers.\nPlease approve for nsbeta3.',0.00,0,1,363985,0,NULL,0),(12911,4423,'2000-07-24 19:19:13','I need to examine the registry and debug this further.\n\nIf the directory doesn\'t exists (say deleted), we recreate the directory\ndepending on the path we get from the registry and launch the browser...we don\'t\ncrash.\n\nAfter finding the actual work involved, I will consider nominating this for nsbeta3.\n',0.00,0,1,368254,0,NULL,0),(3140,4120,'2000-08-09 16:31:46','PDT: Nominating nsbeta3+. Standards Compliance.',0.00,0,0,388191,0,NULL,0),(3140,4030,'2000-08-09 16:47:37','I am the virtual joki.',0.00,0,0,388230,0,NULL,0),(3140,4030,'2000-08-09 17:22:46','Per discusion with Nisheeth, marking nsbeta3+. Will email ekrock to verify.',0.00,0,0,388315,0,NULL,0),(1046,1904,'2000-08-15 15:04:27','mark nsbeta3+ P2 per bug meeting (ekrock)',0.00,0,0,395091,0,NULL,0),(3140,4030,'2000-08-15 16:45:06','Bug triage with nisheeth & ekrock: nsbeta3-. Adding relnote3 keyword.',0.00,0,0,395406,0,NULL,0),(3140,4030,'2000-08-15 17:17:56','This bug has been marked \"future\" because the original netscape engineer working \non this is over-burdened. If you feel this is an error, that you or another\nknown resource will be working on this bug,or if it blocks your work in some way \n-- please attach your concern to the bug for reconsideration.',0.00,0,0,395494,0,NULL,0),(1046,4126,'2000-08-17 08:42:43','Marking M18 because it\'s been approved for beta3\n',0.00,0,1,397450,0,NULL,0),(1046,16235,'2000-08-24 14:23:01','Adding buster to cc: list.',0.00,0,0,406383,0,NULL,0),(1046,1904,'2000-08-29 16:19:48','mark it as P4. shanjian, can you help to look at this bug ?',0.00,0,0,412014,0,NULL,0),(1046,3845,'2000-08-29 18:12:03','Marking [nsbeta3-] and Future because Netscape engineering is overburdened. \nLetter spacing on space characters is frankly a rather obscure issue. Will \ndocument this as a known issue in release notes. Please feel free to note your \nconcerns or objections, but please don\'t clear nsbeta3- unless you are \ncommitting to accept the bug and implement the fix yourself in the nsbeta3 \ntimeframe.',0.00,0,1,412246,0,NULL,0),(1046,3881,'2000-08-29 18:19:25','For the record, letter-spacing on space characters isn\'t an obscure issue. It\nmakes letter-spacing look horrible on any multi-word text. The workaround is to\nuse word-spacing, but then once the bug is fixed it will look horrible on any\npages with that workaround.',0.00,0,1,412262,0,NULL,0),(1869,3845,'2000-08-30 19:06:53','Moving all [LAYER] bugs to Evangelism component for tracking and open-source\nevangelism by mozilla community members of sites that need to upgrade to support \nweb standards such as HTML 4.0 (instead of LAYER/ILAYER) and the W3C DOM\n(instead of Nav4 document.layers[] or IE document.all()). Sites should be\nlobbied to do the upgrade using the email templates that are linked to from\nhttp://www.mozilla.org/newlayout/bugathon.html#layerbugs . When a site\'s owner\nhas confirmed receipt of the message requesting an upgrade, the bug should be\nmarked with the keyword evangelized to indicate that evangelism for that bug is\ncomplete. When the site finishes the upgrade and supports standards, the bug\nshould be closed.',0.00,0,1,413896,0,NULL,0),(1869,3845,'2000-08-30 19:48:36','Marking bug evangelized and clearing cc:s.',0.00,0,0,413960,0,NULL,0),(1869,3845,'2000-08-30 19:50:57','Reopening to register fact that this page isn\'t yet upgraded (until it is, at \nwhich point we\'ll close the bug).',0.00,0,1,413963,0,NULL,0),(1869,15368,'2000-08-31 20:32:15','SPAM:Changing QA contact on 111 evang bugs as I am now the new QA contact for \nthis component.\n\nSorry about the spam\n\nzach',0.00,0,1,415793,0,NULL,0),(1869,13548,'2000-08-31 22:21:13','Reassigning Evangelism bugs to me, the component\'s new owner. I would like to \ntake this opportunity to thank nobody@mozilla.org for all of his dedication, \ncontributions, and hard work, and wish him luck at his new job. Thanks, nobody.',0.00,0,1,415967,0,NULL,0),(1046,3845,'2000-09-01 10:55:43','Possible hack workaround I thought of: since letter spacing on characters works \nbut space characters doesn\'t, if you want to create the visual appearance of \nspaces but have letter spacing work correctly, simulate spaces by surrounding a \nnon-space character (e.g. an \"a\" or an \"m\" or a \"_\" or something) with a SPAN \nand set STYLE=\"visibility:hidden\" on the SPAN. If the enclosure within the SPAN \ndoesn\'t change how spacing is calculated, that ought to work both in the \ninitial release with the bug and future releases without it. If anyone has a \nsecond to test this and confirm this idea that would be great!',0.00,0,0,416360,0,NULL,0),(1869,15368,'2000-09-04 10:02:09','Removing the evangwanted keyword from 49 evangilizm bugs that also \nhave the evangelized keyword. Having both of these keywords on a bug \nmakes it really hard to do a query for all open evangilizm bugs that are \nevangwanted. Sorry for the spam.',0.00,0,1,418545,0,NULL,0),(1869,15368,'2000-09-08 16:57:23','Sorry about this problem. I somehow screwed up the keyword changes. \nSorry about this spam.',0.00,0,1,425155,0,NULL,0),(1046,3881,'2000-09-22 20:03:51','That workaround won\'t work on any browsers that don\'t support CSS2\'s visibility \nproperty. We also shouldn\'t expect authors to do things that messy.\n',0.00,0,0,444557,0,NULL,0),(13534,11608,'2000-09-26 09:56:05','To fix this, query for *browser* bugs marked as remind/later and click \"change \nseveral bugs at once\", select the \"future\" milestone, and add a comment \nlike \"replacing remind/later resolutions with future milestone.\" Then do \nsimilar things for other products, which have different milestone systems.',0.00,0,1,448052,0,NULL,0),(1046,4054,'2000-09-27 16:59:30','This bug basically kills \'letter-spacing\' for multi-word spans. I would \nrecommend removing support for this property altogether if we do not fix it.\n\nIf nothing is done then:\n\nRELEASE NOTE ITEM:\n Netscape 6 does not support the CSS \'letter-spacing\' property correctly when \n applied to spaces. Work around: Do not use \'letter-spacing\' to affect any \n multi-word phrases in any of your documents until such time as Netscape 6 is\n no longer in use (probably some time in 2004).',0.00,0,1,451831,0,NULL,0),(1046,3845,'2000-09-27 21:30:39','No, documentation group, do *not* put the above text into the release notes, \nit\'s a complete overreaction. We should document the problem and my hack \nworkaround instead. See me for details; I\'ll supply appropriate text. \n\nIan: I applaud your passion for standards compliance, but let\'s please try to \nkeep things in proper perspective. The tone of that proposed text was simply \ninappropriate for release notes. We\'re talking about a problem with *spacing* \nfor the first release; the text can still be read. If authors are really steamed \nabout this, they can client-sniff and tell folks to upgrade to Netscape 6.0x or \n6.x that fixes this or to use IE. This bug is *nothing* like the Nav4 CSS1 \n*crash* bugs that so hampered adoption of CSS on the web. Is the glass 0.5% \nempty or 99.5% full? And does any other browser support this many standards this \ndeeply simultaneously across platforms? No. It is not the few-and-far-between \nflaws in standards compliance of Netscape 6 that will be holding back the \nusability of standards; it is overwhelmingly the yawning holes of IE5.5 Win and \nIE5 Mac.\n\nDavid: Since Nav4+ and IE4+ and Opera 4+ support visibility, that covers the \noverwhelming majority of current browser users. They can use the workaround, \naccept the bug in the first release, or not use the feature; their call.',0.00,0,1,452361,0,NULL,0),(1046,3881,'2000-09-28 07:04:38','I agree with Ian\'s proposal. Eric\'s workaround is inappropriate and will mess\nup lots of other user-agents (for example, non-CSS browsers, browsers with CSS\nor author styles turned off, CSS1 browsers that don\'t support CSS2\'s visibility\nproperty, search engines, etc.).',0.00,0,1,452687,0,NULL,0),(1046,4126,'2000-09-28 08:09:16','Reassigned to myself, I have a fix:\n\nelasticsearch.Index: nsTextFrame.cpp\n===================================================================\nRCS file: /m/pub/mozilla/layout/html/base/src/nsTextFrame.cpp,v\nretrieving revision 1.276\ndiff -r1.276 nsTextFrame.cpp\n543a544,545\n> mWordSpacing += mLetterSpacing; // bug 1046\n> \n',0.00,0,1,452739,0,NULL,0),(1046,3829,'2000-09-28 08:46:21','looks fine, a=buster',0.00,0,0,452792,0,NULL,0),(1046,3845,'2000-09-28 11:05:47','Thank God, a fix! (Actually, thank Pierre! ;-> ) I strongly endorse for RTM. \nNote that this is extremely high profile standards compliance. It\'s a test where \nGecko is failing and IE5 Mac is succeeding on the W3C CSS1 Standards Compliance \ntest suite--the only standard for which an official W3C-blessed test suite \nexists.\n\nDavid, Ian: to help us make the case to PDT, would you please summarize as a \nlist of bullet points the impact of *not* accepting this fix? Points to note: \nretard ability of content developers to use feature going forward, the fact that \nworkarounds won\'t then be forwardly compatible with a fixed version, \naccessibility, etc.\n\nPierre: am I right in thinking that this fix is very low-risk?',0.00,0,1,452992,0,NULL,0),(1046,4054,'2000-09-28 14:37:49','Thanks Pierre.\n\nPDT: Eric summmed it up quite well.\n * High profile CSS1 test suite bug.\n * Relatively low risk (one line fix)\n * Improves readability/accessibility of any page using this property\n * Bug would cause headaches for any web author trying to migrate to CSS\n * No usable workaround exists\n\nI t m a k e s t h e d i f f e r e n c e b e t w e e n t e x t \ns p a c e d l i k e t h i s a n d t e x t s p a c e d l i k e t h i s.',0.00,0,1,453527,0,NULL,0),(1046,178851,'2000-09-29 10:30:47','Looks good to me to. r=erik',0.00,0,0,454988,0,NULL,0),(1046,3823,'2000-09-29 13:55:47','Adding rtm+. This is css1 compliance and low risk.',0.00,0,0,455491,0,NULL,0),(1046,1728,'2000-10-02 16:46:35','Marking rtm++. Let\'s get this one checked into the branch.\n',0.00,0,1,458295,0,NULL,0),(1046,4126,'2000-10-09 01:48:32','Fix checked in nsTextFrame.cpp (trunk + Netscape_20000922_BRANCH).\n',0.00,0,1,466759,0,NULL,0),(1046,4110,'2000-10-11 17:43:20','Using Pierre\'s 6/16 textcase, verified fixed on Win, Mac and Linux with 10_11 \nbranch build. Added vtrunk keyword.',0.00,0,1,471968,0,NULL,0),(1046,5003,'2000-10-17 15:37:10','This testcase seems to be fine for Mozilla win32 and Mac builds on the trunk\n(101704) but it fails for me on trunk (101708) and trunk (101712) linux builds.\n\n',0.00,0,1,480296,0,NULL,0),(6810,4529,'2000-10-23 17:22:43','assigning to kevin ',0.00,0,0,487694,0,NULL,0),(6810,3831,'2000-10-25 17:32:47','Reassigning to waqar',0.00,0,0,491404,0,NULL,0),(1046,4113,'2000-10-31 09:56:26','The testcase worksforme with the 10/31 Linux trunk build.',0.00,0,0,497195,0,NULL,0),(1046,4110,'2000-11-02 12:18:35','Marking verified as it has been tested successfully for fix on branch and trunk\nbuilds across platform',0.00,0,1,500722,0,NULL,0),(3140,4030,'2000-11-07 13:54:41','Sending most of my events bugs to joki.',0.00,0,0,506431,0,NULL,0),(1869,13548,'2000-11-17 17:06:02','Site has been evangelized.',0.00,0,0,515087,0,NULL,0),(12911,4423,'2000-12-04 18:29:48','Doing a mass reassign to Conrad Carlen.\n\nConrad is going address all current and upcoming profile manager issues. Please\ndo not hesitate to involve me in any of the issues.',0.00,0,1,526417,0,NULL,0),(12911,18780,'2000-12-11 10:10:12','We could use an object that represents an XP relative file spec. If the file\nspec is truly XP, the only way to do it is relative. We could make the file\nrelative not to the registry but to any key defined by nsIDirectoryService that\nis defined on all platforms (most of them). Then, we store a flattened\nrepresentation of this object in the registry. It\'s more complex than that\nthough - all files which were stored in prefs, etc, would have to use this\ntechnique. If we had an XP way to specify relative files, you could even use\n(copy) the same profile from one platform to another (yea!) as well as just move\nyour home dir on Unix. Making this object should go to the XPCOM folks though.',0.00,0,1,531520,0,NULL,0),(12911,18780,'2000-12-19 05:32:30','*** Bug 63204 has been marked as a duplicate of this bug. ***',0.00,0,0,539315,0,NULL,0),(3140,3847,'2001-01-11 17:10:53','Nominating for nsbeta1\n',0.00,0,1,561141,0,NULL,0),(13534,4412,'2001-01-12 07:02:10','I\'d like to see this happen in 2.12 for new installations. I don\'t expect it\'d\nbe much effort. I\'d like it if other installations don\'t repeat mozilla.org\'s\nmistakes.',0.00,0,1,561659,0,NULL,0),(13534,10297,'2001-01-17 18:53:07','bugzilla.mozilla.org currently has 239 bugs that still have REMIND or LATER \nresolutions. Do we need to force them to fix those before this gets implemented?\nAre they willing to do it this way?\n',0.00,0,1,567925,0,NULL,0),(13534,4897,'2001-01-17 19:58:31','This one is a bit of a pain to change being that it\'s an enum. I suppose we \ncould just change the line at:\nhttp://lxr.mozilla.org/mozilla/source/webtools/bugzilla/checksetup.pl#626\n\nREMIND also shows up at:\nhttp://lxr.mozilla.org/mozilla/source/webtools/bugzilla/checksetup.pl#1638\n(where the UNCONFIRMED status gets added). I haven\'t looked at this second \nchunk of code to see what impact removing REMIND and LATER from it would have. \n\nChanging the first line shouldn\'t have any ill side effects (as it is only run \nif the \"bugs\" table doesn\'t exist.',0.00,0,1,567952,0,NULL,0),(13534,4412,'2001-01-17 23:10:52','I wanted to change this for the default setting, not for existing installations,\nso it shouldn\'t matter what mozilla.org is doing.\n\nI don\'t know of any systems that use this other than mozilla.org (who are\nphasing it out), which suggests that:\n\n(a) some installations know it\'s unnecessary and remove it\n(b) the rest don\'t need it anyway and we shouldn\'t encourage them to do so\n\nWrt the effort required to change this, I would have thought it would be easier,\nbut it seems maybe it isn\'t if it\'s in code, although if it\'s only in\nchecksetup.pl it might be easy - I can\'t tell.\n\nWe might want to let this slide for 2.12, and at some stage should let\nresolutions be specified by the admin (in a table) rather than hardcoded.',0.00,0,0,568044,0,NULL,0),(13534,11345,'2001-01-18 11:09:55','definitely not for 2.12 at this point',0.00,0,0,568555,0,NULL,0),(12911,8020,'2001-01-31 02:06:09','wow, this is an old bug',0.00,0,0,582423,0,NULL,0),(6810,7298,'2001-01-31 20:13:57','spam : changing qa to sujay (new qa contact for Printing)',0.00,0,0,583744,0,NULL,0),(67742,24936,'2001-02-05 19:01:26','From Bugzilla Helper:\nUser-Agent: Mozilla/5.0 (X11; U; SunOS 5.7 sun4u; en-US; m18) Gecko/20010204\nBuildID: 2001020409\n\n\n\nReproducible: Always\nSteps to Reproduce:\n1.start mozilla\n2.go to https://www.fortify.net/sslcheck.html\n3.Observe error\n\nActual Results: Error loading URL https://www.fortify.net/sslcheck.html:\n804b0033 shows up in terminal that mozilla was started from. The browser makes\nno further effort to load page\n\nExpected Results: Should have loaded page\n\nThe good fellows at #mozcrypto helped me deduce that the psm module isn\'t being\ncompiled into the nightly build on Solaris (no start-psm, libpsmglue.so, etc)\n\nIs it broken in solaris or is it something else?',0.00,0,1,589315,0,NULL,0),(67742,18534,'2001-02-06 00:52:21','I built mozilla from CVS today from scratch. No leftovers from previous builds,\nnot even a ~/.mozilla/ directory. I get the same error on https sites, so I\nsuspect something is missing in some Makefiles. This is on Linux.',0.00,0,1,589588,0,NULL,0),(67742,4113,'2001-02-06 08:27:16','Reassigning',0.00,0,1,589788,0,NULL,0),(67742,11097,'2001-02-06 10:26:02','leaf:\n\nWho\'s the right person to get in touch with about this?\n\nAndreas, if you want to build PSM, follow the instructions at:\nhttp://www.mozilla.org/projects/security/pki/psm/buildpsm.html',0.00,0,1,589965,0,NULL,0),(67742,4016,'2001-02-06 17:11:01','first question: does it build? =)\ni can pretty easily add it to the build automation for solaris, provided it\nbuilds the same way as it does on linux.',0.00,0,1,590748,0,NULL,0),(67742,11097,'2001-02-06 17:17:15','I haven\'t been able to build Mozilla on a solaris box in ages. It always barfs \nin layout during the link phase.\n\nSolaris was a supported platform back in the days of Communicator 4.7x support, \nso the trunk should still build on Solaris.\n\nSo, I can\'t 100% guarantee that it builds, but I\'m fairly confident that it will \nbuild.',0.00,0,0,590765,0,NULL,0),(67742,18534,'2001-02-06 20:13:31','Javier, why do I have to go through the PSM build page, then NSS build page, and\nfinally end up with multiple build options? I would expect that \'gmake -f\nclient.mk\' builds the same mozilla as the nightlies are. If it doesn\'t, \nit should be explained in http://www.mozilla.org/build/unix.html. Or there\nshould be a link to the script used to build the nightlies.',0.00,0,0,590988,0,NULL,0),(67742,24936,'2001-02-07 08:38:08','I second that motion. When I tried to build from source I got lost somewhere in\nthere and had to delete my entire tree because \"make clean\" wouldn\'t work\nanymore :(',0.00,0,1,591496,0,NULL,0),(67742,11097,'2001-02-07 10:08:02','You don\'t have to build NSS as a step in building PSM.\n\nFrom your top level build directory you run\n\nconfigure --enable-modules=psm\ngmake BUILD_MODULES=psm\n\nand that\'s pretty much it. I don\'t know where you got the idea to go build NSS\nfirst. The web page doesn\'t tell you to do that.',0.00,0,1,591615,0,NULL,0),(67742,4424,'2001-02-07 11:02:47','cc\'ing jdunn since he\'s the OEM ports guru. We currently do not build PSM in\nthe Solaris verification builds as far as I know.',0.00,0,1,591714,0,NULL,0),(67742,18534,'2001-02-07 11:35:52','Javier, the first thing I tried, was exactly what you say:\n\n% ./configure --enable-module=psm\nAdding configure options from /home/k/.mozconfig:\n --enable-idltool\n --enable-svg\nloading cache ./config.cache\nchecking host system type... i686-pc-linux-gnu\nchecking target system type... i686-pc-linux-gnu\n[...further output omitted...]\n% make BUILD_MODULES=psm\nmake: *** No rule to make target `security/Makefile.in\', needed by\n`security/Makefile\'. Stop.\nzsh: exit 2 make BUILD_MODULES=psm\n\n\nSo I carefully reread the first sentence on\nhttp://www.mozilla.org/projects/security/pki/psm/buildpsm.html, and it says:\n\nThese instructions also assume you have a completed NSS build tree.\n',0.00,0,1,591803,0,NULL,0),(67742,3117,'2001-02-07 11:54:36','\nMargaret Chan (sun) is looking at PSM on the trunk.\nShe has a couple of diffs already that she feels is needed\nto get PSM working on solaris.\n\nHowever, you are running into a different problem here.\nI will give solaris is a try to see what I find...\n\nthe configure --enable-psm should have generated the makefile\nin security... not sure why it didn\'t. Is there anything in\nthe config.log?\n\n\n',0.00,0,1,591841,0,NULL,0),(67742,11021,'2001-02-07 12:27:35','Jim has pointed out this bug to me.\n\nI had successfully built psm with the tip of the trunk on my Solaris 8 box\nusing gcc2.95.2. That was about 2 weeks ago. I have to add some ifdef in the\npsm/server/Makefile to make it build because it seems to assume that I will\nalways use Sun\'s Compiler, which I don\'t at the moment. We are still in the\nprocess of building it on other Solaris platforms.\nI had been using a slightly different approach to build it however. See\nbelow:\n\nsetenv NO_MDUPDATE 1\nsetenv BUILD_OFFICIAL 1\nsetenv NS_USE_GCC 1\ngmake -f client.mk checkout BUILD_MODULES=psm\ngmake -f client.mk build BUILD_MODULES=psm\n\nI have not got the time to build it by feeding the enable option into\nconfigure, so I don\'t know if I will have any problem with that.\nI will post out the diffs of the Makefile changes later. However, I think\nthat my change will only affect building on Solaris using gcc. If the\nnightlies are built using Sun\'s Compiler, then that makefile should work.\n ',0.00,0,1,591886,0,NULL,0),(67742,11021,'2001-02-07 12:35:19','Would that make a difference if the --enable-module=psm is put inside\nthe .mozconfig file, i.e.,\n\n --enable-idltool\n --enable-svg\n --enable-module=psm\n\nSorry if it is an ignorant question because I am not keeping up-to-date as\nto what configure will pick up if you have the command line option and\na .mozconfig file.',0.00,0,1,591902,0,NULL,0),(67742,18534,'2001-02-07 20:11:36','If I add\n ac_add_options --enable-module=psm\nto ~/.mozconfig and then run\n gmake -f client.mk build\nthen the resulting mozilla does not connect to https either. If I try\n gmake -f client.mk BUILD_MODULES=psm\nthen I get a mozilla that cannot start up. Instead it says\n ./mozilla-bin: error in loading shared libraries:\n /home/k/bin/moz/mozilla-20010205/mozilla/dist/bin/components/libnecko.so:\n undefined symbol: Left__C8nsStringR8nsStringi\nIf I run\n ./configure --enable-module=psm\n gmake -f client.mk BUILD_MODULES=psm build\nthen I get the same error. If I try\n make BUILD_MODULES=psm\nthen I get the same error.\n\nThe config.log reports four fails: one for sizeof(long), two for \"nspr.h: No\nsuch file or directory\", and one for PNG_LIBPNG_VER.\n\nI\'m ready to try other suggestions. But still I consider it a bug that the\ndefault build is without PSM. The default build should be the same as the\nnightlies.',0.00,0,1,592680,0,NULL,0),(67742,4016,'2001-02-07 21:29:20','it was decided to have it off by default to shield third party distributors of\nbinaries and source from possible breach of export restriction (any change to\nthe source must be reported to a government agency, and even then i\'m not sure\nnon-netscape, non-mozilla.org parties have an export license with that agency).\n\nI\'m not sure if there were issues other than that, but that still seems pretty\nvalid.',0.00,0,1,592722,0,NULL,0),(67742,18534,'2001-02-07 23:02:53','Oh, thanks for the background info. Certainly I can\'t argue with legal\nrestrictions:-( Still, it is quite a handicap that PSM can\'t be en-/disabled in\nthe same way as IDL or SVG.',0.00,0,1,592774,0,NULL,0),(67742,3117,'2001-02-08 05:50:26','\nI just built it too:\nsetenv NO_MDUPDATE 1\nsetenv BUILD_OFFICIAL 1\nsetenv NS_USE_GCC 1\ncvs co mozilla/client.mk\ncd mozilla\ngmake -f client.mk pull_all\ngmake -f client.mk build_all\ngmake -f client.mk pull_all BUILD_MODULES=psm\ngmake -f client.mk build_all BUILD_MODULES=psm\n\nNOTE: I had to modify security/psm/server/Makefile\nI changed line 42:\n< ifeq ($(OS_ARCH), Linux)\n---\n> ifneq (,$(filter Linux SunOS,$(OS_ARCH)))\n\nthis isn\'t a good permanent fix, but it should get you building.\nbasically sunos using gcc needs to link in the c++ stuff just like\nLinux, so the ifneq - filter thing sets this up. I know Margaret\nis working on the \'correct\' set of fixes and will be working with\nJavi/security to get these checked in at some time.',0.00,0,1,592969,0,NULL,0),(67742,11097,'2001-02-08 10:34:23','Everyone who\'s having problems building from instructions on the web site.\n\nThere was a type-o brought to my attention yesterday.\n\nThe configure line should read:\n\nconfigure --enable-modules=psm [--enable-nspr-autoconf]\n ^\n\nPlease try again with the correction.',0.00,0,1,593244,0,NULL,0),(67742,18534,'2001-02-08 15:50:06','Success! I can confirm that Jim\'s solution worked. After that I also tried\nJavier\'s typo-fix and it worked too. As the sources were not virgin anymore at\nthat point, there may be a small chance that this is not a perfect proof.\nAnyway, thanks so much for your help.\n\nIf you want me to try again with a fresh directory, let me know.\n',0.00,0,1,593898,0,NULL,0),(67742,24936,'2001-02-12 12:43:29','I\'ve been able to build a working copy of mozilla with PSM following the\ndirections from Jim Dunn. :)\n\nSo the next step is to wait for the nightlies to incorporate this.',0.00,0,1,597307,0,NULL,0),(67742,3117,'2001-02-12 12:52:07','\nnot quite...\nFirst Margaret (or someone) needs to check into the solaris \nspecific psm changes (security/psm/server/Makefile) so that \na \'clean\' tree builds. \nThen margaret (or someone) needs to get granrose & co to update\nthe nightly build scripts to set BUILD_PSM=\"true\" for solaris gcc\nbuilds.',0.00,0,1,597318,0,NULL,0),(67742,11021,'2001-02-12 16:28:07','I have the diffs for the ../mozilla/psm/server/Makefile available (will attach\nlater).\nThe changes are mainly made to allow it to build with gcc as well.\nOur build went fine on the Sparc platform using gcc, but it failed on the\nIntel platform. The intel build failed to compile libfreebl.a. I am \nstill checking on the reason for the failure. Below is the error we have got\nfrom our intel build:\n\ngcc -o SunOS5.7_i86pc_gcc_OPT.OBJ/arcfour.o -c -pedantic -Wno-long-long -O3 -O \n-DNDEBUG -DTRIMMED -O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__\n-DSOLARIS -D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG\n-DNDEBUG -I/usr/dt/include -I/usr/openwin/include\n-I../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/ \n-O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__ -DSOLARIS\n-D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG -DNDEBUG\n-DMP_API_COMPATIBLE -I/usr/dt/include -I/usr/openwin/include\n-I../../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/security\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/security \narcfour.c\narcfour.c: In function `rc4_wordconv\':\narcfour.c:349: warning: `nextInWord\' might be used uninitialized in this\nfunction\ngcc -o SunOS5.7_i86pc_gcc_OPT.OBJ/desblapi.o -c -pedantic -Wno-long-long -O3 -O \n-DNDEBUG -DTRIMMED -O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__\n-DSOLARIS -D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG\n-DNDEBUG -I/usr/dt/include -I/usr/openwin/include\n-I../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/ \n-O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__ -DSOLARIS\n-D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG -DNDEBUG\n-DMP_API_COMPATIBLE -I/usr/dt/include -I/usr/openwin/include\n-I../../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/security\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/security \ndesblapi.c\ngcc -o SunOS5.7_i86pc_gcc_OPT.OBJ/des.o -c -pedantic -Wno-long-long -O3 -O \n-DNDEBUG -DTRIMMED -O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__\n-DSOLARIS -D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG\n-DNDEBUG -I/usr/dt/include -I/usr/openwin/include\n-I../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/ \n-O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__ -DSOLARIS\n-D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG -DNDEBUG\n-DMP_API_COMPATIBLE -I/usr/dt/include -I/usr/openwin/include\n-I../../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/security\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/security \ndes.c\ncd mpi; cp mpi-config.h ..\ncd mpi; cp mpi.h ..\ncd mpi; cp mpi-priv.h ..\ncd mpi; cp mplogic.h ..\ncd mpi; cp mpprime.h ..\ncd mpi; cp logtab.h ..\ncd mpi; cp primes.c ..\ngcc -o SunOS5.7_i86pc_gcc_OPT.OBJ/dh.o -c -pedantic -Wno-long-long -O3 -O \n-DNDEBUG -DTRIMMED -O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__\n-DSOLARIS -D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG\n-DNDEBUG -I/usr/dt/include -I/usr/openwin/include\n-I../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/ \n-O -Wall -Wno-format -fPIC -DSVR4 -DSYSV -D__svr4 -D__svr4__ -DSOLARIS\n-D_REENTRANT -Di386 -DSOLARIS2_7 -D_SVID_GETTOD -DXP_UNIX -UDEBUG -DNDEBUG\n-DMP_API_COMPATIBLE -I/usr/dt/include -I/usr/openwin/include\n-I../../../../dist/SunOS5.7_i86pc_gcc_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/include\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/public/security\n-I/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/dist/SunOS5_x86_OPT.OBJ/private/security \ndh.c\nIn file included from dh.c:46:\nmpi.h:114: too many `l\'s in integer constant\ngmake[5]: *** [SunOS5.7_i86pc_gcc_OPT.OBJ/dh.o] Error 1\ngmake[5]: Leaving directory\n`/net/crumple.eng/export/nc-re/release/build/MOZILLA/5.7/i386-opt/mozilla/security/nss/lib/freebl\'\n\n',0.00,0,1,597752,0,NULL,0),(67742,11021,'2001-02-12 16:32:50','',0.00,0,1,597808,5,'25101',0),(12911,3858,'2001-02-13 15:22:37','For several other reasons, we need a url scheme to reference the profile dir\n(e.g. profile:///prefs.js or profile:///chrome/userContent.css). Such a scheme\nwould also solve the relative url problem, since prefs and other code needing to\nrefer to profile files could refer to them via the scheme. For any of the uses\nI\'ve seen, we wouldn\'t need to flatten out the whole profile directory (e.g. it\nwould be okay to specify chrome/userContent.css instead of just userContent.css\n-- the important thing is not to have to specify\n/u/user/.mozilla/blah/blah/chrome/userContent.css (and then have security refuse\nto load it because it\'s a file url).\n\nWhat do we need to do to make this happen? Do we need approval from anyone? \nSounds like it just needs little bit of netlib love (should it be added to the\ncached handlers in nsIOService.h?) Besides, wouldn\'t we then get relative\npathnames for free if we still wanted them, via nsIoService::ResolveRelativePath?',0.00,0,1,599106,0,NULL,0),(12911,1214,'2001-02-13 16:18:17','I thought warren already solved a more general problem, whereby\nres://profile/... or perhaps res://$profile/... did the trick. Isn\'t there a\none-level (host part) macro-like facility in res: or resource: already?\n\nI\'d rather see something generic and plugable that didn\'t add a new URI scheme\nfor each new macro.\n\n/be\n\n\n/be',0.00,0,1,599204,0,NULL,0),(12911,18780,'2001-02-14 06:08:51','There is something like that in the resource: protocol. See\nhttp://lxr.mozilla.org/seamonkey/source/netwerk/protocol/res/src/nsResProtocolHandler.cpp#94.\nProfile relative files are not dealt with their but I don\'t see why they\ncouldn\'t be. Akkana - maybe this isn\'t as relevant to your problem as I first\nthought. More on this elsewhere. I need this on the nsLocalFile level for\nprofile registry and prefs.',0.00,0,1,599714,0,NULL,0),(12911,302291,'2001-02-14 09:34:51','if anything, I would like to have this as a res protocol extension as suggested:\n\nresource:///res/profile/dougt/xxx\n\nWe also have to make sure that this is cool with mstoltz who owns some code\nwhich protects local URLs. ccing him.',0.00,0,0,599835,0,NULL,0),(12911,6444,'2001-02-14 11:58:36','We went through a big effort to keep web content from being able to find your\nprofile directory. The resource URL pointing at the user profile directory seems\nlike a good idea, but we have to make sure it can only be used locally, not by\ncontent.',0.00,0,1,600028,0,NULL,0),(12911,3858,'2001-02-14 12:24:48','I tried every combination I could think of of resource:/*[$]profile/filename and\nthey all stayed within the resource directory, none of them went to my profile\ndirectory.\n\nSomething like Brendan suggests would be great (I don\'t care if it\'s profile:,\nI\'d be perfectly happy using resource:) but it doesn\'t appear to be hooked up.\n\nShould I add some code to nsResProtocolHandler to implement the $profile syntax?\nWhere should the security issue (not allowing external pages to access the url)\nbe handled, using what mechanism?',0.00,0,0,600064,0,NULL,0),(12911,1214,'2001-02-14 13:51:24','akkana: see ccarlen\'s comment with the lxr link. Someone needs to extend the\nsubstitution list to include ProfileDir, and make sure \"relative\" paths work.\n\n/be',0.00,0,1,600196,0,NULL,0),(12911,6444,'2001-02-14 17:59:58','I will double check but I think it\'s already the case that Web content can\'t\ncall resource: URLs. So we should be OK on security. Is there still such a thing\nas \"res:\" (as opposed to resource:) URLs, and is that relevant here?',0.00,0,1,600518,0,NULL,0),(12911,3858,'2001-02-14 18:08:41','There\'s a res: protocol, which is handled by the same objects (under slightly\ndifferent rules) as the resource: protocol.\n\nBrendan and I spent some time going through the code to figure out why the\nspecial dirs don\'t work, e.g. resource://TempDir/foo.html (that appears to be\nthe correct syntax) doesn\'t work. There appear to be several problems,\nincluding TempDir being treated as a hostname and case folded, so it no longer\nmatches the key in the hash table; and if that problem is fixed, there are other\nproblems as well. Perhaps this worked once. :-)',0.00,0,1,600526,0,NULL,0),(12911,3858,'2001-02-14 18:19:42','If you add tempdir as well as TempDir in nsResProtocolHandler.cpp, what happens\nis that nsResChannel::AsyncRead calls EnsureNextResolvedChannel, which correctly\nmaps the url to file:///tmp/..., then AsyncRead does\nmResolvedChannel->AsyncRead, then while we\'re waiting for the read,\nEnsureNextResolvedChannel gets called again many more times from\nnsResChannel::GetLocalFile (and perhaps from other routines), and this time it\ndoesn\'t find the right match, probably because mCurrentelasticsearch.Index is now wrong inside\nNext. This I think causes mResolvedChannel, which was set correctly before, to\nget reset to null, so the actual load of the url fails (but there\'s no error\nmessage because netlib now thinks it never had a url to load at all).\n\nNetlib async hell. Is there any chance we could get a netlib person to help\nwith getting this to work?',0.00,0,1,600534,0,NULL,0),(12911,1214,'2001-02-14 19:24:19','Cc\'ing warren in case he can enlighten us as to how this stuff should work.\n\n/be',0.00,0,1,600560,0,NULL,0),(12911,1214,'2001-02-14 22:48:20','And adding gagan. The ToLowerCase (which could use \'s tolower, no?)\nroutine was added a year or more ago, and its use in nsStdURLParser.cpp almost\nthat far back. What changed to break these resource://TempDir/... paths by\nlowercasing to tempdir? Or did they never quite work?\n\nI think we should fix up this code, obviously. Conrad, you up for it?\n\n/be',0.00,0,1,600631,0,NULL,0),(12911,18780,'2001-02-15 05:04:46','I\'m up for fixing it. I\'ll take a look at what pointed out on this bug in the\npast day.',0.00,0,1,600758,0,NULL,0),(12911,1214,'2001-02-15 11:10:04','valeski was in the cvs annotate output; Jud, do you remember any of this\nresource://MagicVar/... jazz, and why it stopped working? The ToLowerCase\'ing\nof host parts is implicated, but that\'s old.\n\n/be',0.00,0,1,601004,0,NULL,0),(12911,18780,'2001-02-15 12:38:46','If resource://MagicVar/ used to work and now it doesn\'t, I\'d say it\'s time for a\nnew bug. This bug started out being \"Use relative pathnames for profile\ndirectories\" and then morphed into a necko issue.',0.00,0,0,601100,0,NULL,0),(12911,3858,'2001-02-15 12:56:37','Good point. I\'ve split off bug 68950, and made this bug dependant on that one.',0.00,0,0,601121,0,NULL,0),(13534,4412,'2001-02-15 22:05:01','At least 3.0 fix: Should redesign so that the admin can specify resolutions. \nDupe is probably a special case as it is universally applicable and has special\nfunctionality. Also need to update bug_status.html documentation appropriately.',0.00,0,1,601646,0,NULL,0),(67742,6582,'2001-02-23 14:42:01','Does the routine for building PSM suggested here still work for anyone?\nI can\'t get it to work. \n\nThere are still problems pulling the security part of the source with cvs, so\nI first download th e source with ftp. Then I (following Javier\'s suggestion):\n\n1. Build mozilla without psm.\n2. Patch the security/psm/server/Makefile with patch from above.\n3. Set NS_USE_GCC. This is all with gcc 2.95.2 on Sparc Solaris 2.7\n4. Set --enable-modules=psm in ~/.mozconfig \n5. Run make -f client.mk\n\nI then get errors:\n\ncd nsinstall; make libs\nmake[5]: Entering directory\n`/net/aurora/a1/crumley/sun/mozilla/security/coreconf/nsinstall\'\ngcc -o SunOS5.7_LOCAL_OPT.OBJ/nsinstall.o -c -O -Wall -Wno-format -fPIC -DSVR4\n-DSYSV -D__svr4 -D__svr4__ -DSOLARIS -DSOLARIS2_7 -D_SVID_GETTOD -MDupdate\nSunOS5.7_LOCAL_OPT.OBJ/.md -DXP_UNIX -UDEBUG -DNDEBUG -I/usr/dt/include\n-I/usr/openwin/include -I../../../dist/SunOS5.7_LOCAL_OPT.OBJ/include\n-I/net/aurora/a1/crumley/sun/mozilla/dist/SunOS5_sparc_LOCAL_OPT.OBJ/include\n-I/net/aurora/a1/crumley/sun/mozilla/dist/SunOS5_sparc_LOCAL_OPT.OBJ/public/coreconf\n-I/net/aurora/a1/crumley/sun/mozilla/dist/SunOS5_sparc_LOCAL_OPT.OBJ/private/coreconf\n nsinstall.c\ngcc: cannot specify -o with -c or -S and multiple compilations\nmake[5]: *** [SunOS5.7_LOCAL_OPT.OBJ/nsinstall.o] Error 1\n\n\nSo it looks like there are still cc/gcc problems. I also tried \nJim Dunn\'s suggestions with similar results. Anybody having any luck some\nother way? Does it work better with Sun cc?',0.00,0,1,611212,0,NULL,0),(67742,24936,'2001-02-25 22:11:00','I ran into that. You have to make sure that you set the NO_MDUPDATE \nenvironmental variable to 1 or else that error shows up.',0.00,0,1,612468,0,NULL,0),(6810,3831,'2001-02-27 15:10:25','Setting milestone to future.',0.00,0,0,614525,0,NULL,0),(13534,10297,'2001-02-27 19:52:42','Moving to real milestones...\n',0.00,0,1,615446,0,NULL,0),(13534,4054,'2001-03-14 14:53:47','Taking all Bugzilla 3.0 bugs -- congratulations to MattyT for the triage, it\nreally was spot on. Note: I may end up pushing some of these bugs back to 3.2,\nwe\'ll see. However, I believe all these bugs should just fall out of the \nredesign. Let\'s hope I\'m right!\n\n(Note: I\'m also resetting the priority field to \"---\" so that I can retriage any\nthat I consider important or likely to be dropped.)',0.00,0,1,634273,0,NULL,0),(67742,24709,'2001-03-19 07:55:53','Any definitive info as to whether there are plans to get PSM working in Solaris\nnightlies? I\'d build it myself but (1) I cant pull cvs through the corporate\nfirewall here (2) I\'ve got enough bandwidth issues without dragging a full\ntarball through the pipe everytime I want to update my mozilla. Everybodies\npatches, fixes and instructions assume (quite understandably) that the user is\nbuilding mozilla from cvs but for those of us that depend on the nightlies to\nstay updated it isnt much help.',0.00,0,1,638664,0,NULL,0),(67742,11021,'2001-03-22 14:44:02','Javier: Can you approve these changes/new files to be checked in to the tip of\nthe trunk please?\n1. ../mozilla/security/server/Makefile \n (changes to allow both gcc & Sun Workshop/Forte build)\n2. ../mozilla/security/coreconf/SunOS5.9.mk \n (new file to allow builds on Solaris 9 - Sun\'s next release)\n3. ../mozilla/security/coreconf/SunOS5.9_i86pc.mk\n (new file to allow builds on Solaris 9 - Sun\'s next release)\nAttachments follow.\n\n ',0.00,0,1,645149,0,NULL,0),(67742,11097,'2001-03-22 14:55:03','You\'ll have to get approval from the NSS team to check-in to\nmozilla/security/coreconf\n\nWhere are the patches/contents of the new files?',0.00,0,1,645166,0,NULL,0),(67742,11021,'2001-03-22 15:13:02','',0.00,0,1,645205,5,'28529',0),(67742,11021,'2001-03-22 15:16:13','',0.00,0,1,645212,5,'28530',0),(67742,11021,'2001-03-22 15:20:04','',0.00,0,1,645217,5,'28532',0),(67742,11021,'2001-03-22 15:26:18','Encountered some weird problems trying to attached these files.\nAll the files are attached now. \n\nCaught a typo. This line should read as:\n\n1. ../mozilla/security/psm/server/Makefile \n (changes to allow both gcc & Sun Workshop/Forte build)\n\nJavier: Who from the NSS team should I ask? wtc is on sabbatical, right?\n\n',0.00,0,1,645240,0,NULL,0),(67742,11097,'2001-03-22 15:28:58','relyea: could you review the changes to NSS/coreconf?',0.00,0,0,645252,0,NULL,0),(67742,11099,'2001-03-22 16:09:11','Are these targetted for the tip (NSS 3.3) or the NSS 3.2.1 branch?\n\nbob',0.00,0,1,645312,0,NULL,0),(67742,11021,'2001-03-22 18:04:33','All these changes should go into the trunk.\n\nAs to whether they need to go into the other branch (i.e., NSS 3.2.1 branch)\nwhich you have mentioned, that depends on what PSM2.0 is picking up.\nJavier: Is PSM2.0 (planning to go into Netscape6.5) picking up\nNSS from the trunk or from the branch? If it is from the branch, which\nbranch exactly?\n',0.00,0,1,645526,0,NULL,0),(67742,27047,'2001-03-28 00:48:23','It seems like someone accidentally changed the components to \"activeX wrapper\"',0.00,0,0,651102,0,NULL,0),(67742,26315,'2001-03-28 02:13:42','If anyone is interested, I\'ve uploaded a 0.81 package I\'m using to:\nhttp://www.crosswinds.net/~alfandary/mozilla-sparc-sun-solaris2.6.tar.bz2\n',0.00,0,1,651151,0,NULL,0),(67742,11021,'2001-03-30 17:35:59','The psm/server/Makefile has already been checked in by Javier (see 64713). \nI still need the coreconf files to be checked in. \nrelyea: can we check them in to the trunk? \nWe can worry about the branch later.',0.00,0,1,655302,0,NULL,0),(6810,1548,'2001-04-06 07:18:18','\nRM> To digulla@hepe.com: Printing banner (info), page number etc. is the job of the\nRM> print system and should not be part of Mozilla itself.\nRM> In Unix/X11 the Xprt (X print server) or a special filter in the lp-printsystem\nRM> would be the location where to \"enable\" page count/number printing...\n\n I don\'t think that\'s the case. You might be right if what the printer\nsystem is handed over is just a plain text file. Then, the printing system\ncan do whatever it wants to do (adding header, footer with page number,\ntitle, etc). However, what Netscape gives the printing system is, in\nUnix/X11, a postscript file. Do you think the printer system has to/can\nmanipulate this postscript file (e.g. resizing the whole page and adding\nheader and footer)? Things like n-page up, duplex printing, banner page\nwith title are certainly in the realm of the printing system. However,\nadding headers and footer with the page title, page number, date, the\nURL of the page has to be taken care of by Mozilla. Please, also note\nthat Unix/X11 version offers a way to print to a file. If the printing\nsystem has to add header and footer, PS file obtained by \'printing to\na file\' would be different from the hardcopy.\n\n\nAD> So that\'s why Unix and Windows printouts differ: Mozilla just passes this\nAD> information to the Windows printer and omits it on Unix. In that case, you\nAD> really have to put these information into ENV variables or replace specific\nAD> parts of the commandline (as suggested in the first post in this thread).\n\n I guess your original question is still valid. I\'ve been also wondering\nwhy Windows version of NS can add date, page number, URL (which is very\nhandy), title while Unix/X11 version can\'t.\n\n When I printed out with 2001-04-03 build for Linux, I was pleasantly\nsuprised to see the page title, page number ( x of y ) and date (current)\nwere printed in header and footer. However, there\'s still one item\nmissing which is present in print-out of MS-Windows version, which is\nthe URL of the page being printed. Now, I got really curious as to why\non earth MS-Windows version can print all four items (title, url, date,\nand page number) while Unix/X11 version can only three of them (title,\ndate and page number). I guess this(printing out URL as well in Unix/X11\nversion of Mozilla) should be an easy fix.\n\n Jungshik Shin',0.00,0,1,662891,0,NULL,0),(67742,25631,'2001-04-09 07:13:20','\nThe last builds I have tries are as follows:\n\n20010321: Makefile broken, but PSM Good when compiled.\n20010408: Makefile good. PSM builds, and I can open the window from the Tasks\nmenu. I cannot however open a secure page. e.g.\nhttps://www.fortify.net/sslcheck.html\njust gives be a blank page, (\"Document: Done\"), no error messages.',0.00,0,1,665071,0,NULL,0),(67742,20369,'2001-04-09 13:20:53','Tested on Windows 2000.\nUsed Mozilla Build 2001040504.\nThe bug DID occur in Windows.\nThe URL took a long time to load, so I checked the Task Manager and found that\nmy CPU is at 100% (I have a P3, 600) and under applications the \"Fortify For\nNetscape was Not Responding\". I had to \"end task\" mozilla to resume using my\nsystem.',0.00,0,1,665549,0,NULL,0),(3140,4030,'2001-04-13 16:31:07','nsbeta1-, but moving to 1.0 to have another look, might be a simple fix.',0.00,0,0,673139,0,NULL,0),(67742,15540,'2001-04-17 16:38:57','Updating Platform/OS categories to windows 2000',0.00,0,0,678012,0,NULL,0),(67742,4424,'2001-04-17 17:01:07','resetting back to Solaris. This bug is about getting PSM in Solaris, not Win2k.\n If you\'re having problems with win2k file a different bug.',0.00,0,0,678078,0,NULL,0),(67742,11021,'2001-04-17 17:35:34','There is some confusions with the original nature of this bug, and hence\nthe accidental change of category. This should be Solaris only as stated\nin the summary. One more update: thanks to relyea@netscape.com, the last\n2 patches have been checked in to the trunk as well as to the NSS3.2.1 branch\nas well. With PSM2.0 landed (I am still trying to build it), I am not sure\nif we should include PSM2.0 in the nightlies instead.',0.00,0,1,678164,0,NULL,0),(67742,11107,'2001-04-23 17:59:32','Mass changing of product. Browser:Security:Crypto --> PSM 2.0',0.00,0,0,686890,0,NULL,0),(3140,3827,'2001-04-25 09:13:15','*** Bug 73940 has been marked as a duplicate of this bug. ***',0.00,0,0,689680,0,NULL,0),(6810,4432,'2001-04-30 12:40:48','OT: Who wrote the header/footer stuff for Unix ? I currently have much \"fun\"\nwith this feature because it breaks a lot of stuff in Xprint (header/footer font\nis incredibly large (~~1/6 of page height)... ;-((',0.00,0,1,696778,0,NULL,0),(3140,3847,'2001-05-03 17:03:37','not my area, off to desale',0.00,0,0,703802,0,NULL,0),(67742,5443,'2001-05-03 20:19:14','Is this matter still pending? Or has this it been resolved? I\'m tempted to\nmark this as FIXED, but I\'d appreciate it if someone could give an update before\nI do that.\n',0.00,0,1,704178,0,NULL,0),(67742,11021,'2001-05-03 20:39:54','Hi Bob:\n\nI cannot really answer your question on whether or not it has been resolved\ncompletely or not. We have been fixing it so that it can build PSM1.x. \nBy the time we get all the fixes in, PSM2.0 is coming out. We then see common\nproblem for building PSM1.x and PSM2.0. And we have switched to tackle PSM2.0\'s\nbuild problems (77123,77788,77792...). Eventually, when PSM2.0 is built, I\nthink we\'ll check with leaf/granrose to see how we can get it built in the\nnightlies. ',0.00,0,1,704198,0,NULL,0),(67742,5443,'2001-05-30 14:50:37','-> 2.0\n-> P3\n-> ssaux\n\n',0.00,0,1,749985,0,NULL,0),(67742,5521,'2001-05-30 17:29:18','Uh, it seems to be working for me. I\'m typing this text in a nightly Mozilla\nbuild with the \"--enable-crypto\" configure option set. Does this mean that PSM\nis in Solaris nightlies?\nMargaret, maybe you can comment as well.',0.00,0,1,750580,0,NULL,0),(67742,11021,'2001-05-31 13:48:40','Yes. Now psm2.0 is fully integrated into mozilla. We can simply build mozilla\nwith --enable-crypto to get all the psm functionalities. It is built the same\nway as Linux. I guess now we can go back to one of Leaf\'s earlier comments to\nget this into the nightlies:\n\n\"first question: does it build? =)\ni can pretty easily add it to the build automation for solaris, provided it\nbuilds the same way as it does on linux.\"\n\nLeaf: can you make this happen for us please? Thanks\n',0.00,0,1,752111,0,NULL,0),(67742,20209,'2001-06-03 17:47:44','*** Bug 83916 has been marked as a duplicate of this bug. ***',0.00,0,0,756361,0,NULL,0),(3140,4616,'2001-06-05 11:58:52','Updating QA contact to Shivakiran Tummala.',0.00,0,0,759439,0,NULL,0),(6810,4432,'2001-06-12 03:50:33','Xprint module now supports this feature without problems...',0.00,0,0,771280,0,NULL,0),(67742,20209,'2001-06-15 11:39:37','*** Bug 82767 has been marked as a duplicate of this bug. ***',0.00,0,0,778309,0,NULL,0),(67742,11021,'2001-06-15 12:04:28','Hi Leaf:\n\nCan you add this to the build automation for solaris please?\n\nThanks, Margaret',0.00,0,1,778373,0,NULL,0),(67742,4424,'2001-06-15 12:19:19','\nLoan\'s coming up to speed on the SeaMonkey unix builds so she should take care\nof this. Assuming PSM is built on Solaris like it is on Linux, I think the\nautomation just has an environment variable that needs to be set for Solaris builds.',0.00,0,1,778416,0,NULL,0),(67742,6582,'2001-06-15 12:26:29','WFM. PSM seems to building on Solaris nightlies, already. At least https\nsites have worked for me under Solaris nightlies for at least the last couple of\nweeks. Works right now with 2001061322 on the fortify.net url listed in this bug.',0.00,0,1,778433,0,NULL,0),(67742,11021,'2001-06-15 14:25:38','Yep, right you are. Just download the bit from:\n\nftp://ftp.mozilla.org/pub/mozilla/nightly/2001-06-15-09-trunk/\n\nAll the psm files below are there:\n\n/dist/bin/libnssckbi.so\n /components/libpipnss.so\n /components/libpippki.so\n /chrome/pippki.jar\n /chrome/pipnss.jar\n/dist/bin/libfreebl_hybrid_3.so\n /libfreebl_pure32_3.so\n\nso PSM is in Solaris nightlies now. Mark it resolved.\n\n\n\n\n\n',0.00,0,1,778670,0,NULL,0),(67742,4113,'2001-06-18 08:24:03','Verified.',0.00,0,1,781308,0,NULL,0),(2586,29007,'2001-06-18 17:03:40','I don\'t even see a print preview anymore... (someone tell me how to get to it?)\n What\'s the status here?\n',0.00,0,0,782791,0,NULL,0),(2586,4048,'2001-06-22 07:36:42','print preview is not a feature.. so this is invalid till that feature is \nworking.',0.00,0,1,791205,0,NULL,0),(2586,4054,'2001-06-22 07:51:55','Reopening and reassigning to me so that I don\'t lose track of this bug.',0.00,0,0,791224,0,NULL,0),(2586,4054,'2001-06-22 07:53:36','I\'ll reassign as appropriate once we have print preview again.',0.00,0,0,791225,0,NULL,0),(3140,29320,'2001-07-25 14:32:53','not my area --- how did i end up as contact person for this ',0.00,0,0,842277,0,NULL,0),(13534,4412,'2001-07-27 11:26:21','Just thinking - we don\'t need to remove REMIND and LATER from the schema to do\nthis in BZ2. All we really need to do is have a param called remindandlater. \nIf on, people can resolve bugs and REMIND and LATER, if off, they can\'t but\nexisting REMIND and LATER bugs can still exist.\n\nI\'m thinking we should just make this off by default but I guess we\'re gonna\nsuprise some admins if we don\'t ask. Something like:\n\n---\n\nThe resolutions REMIND and LATER are deprecated.\n\nIt is suggested you use a target milestone to mean \"Future\" instead, and that\nyou remove the REMIND and LATER resolutions from your installation.\n\nIf you choose to remove these resolutions, existing bugs will continue to have\nthese resolutions, but users will be unable to mark new bugs as REMIND or\nLATER. Remove them (Y/N)?\n\n---\n\nIf we are creating a new database, or if we don\'t find any bugs with these\nresolutions, just turn the parameter off.',0.00,0,1,845100,0,NULL,0),(2586,11608,'2001-07-27 12:54:25','Why isn\'t print preview handled by operating systems?',0.00,0,0,845245,0,NULL,0),(1869,23402,'2001-08-10 20:08:10','All Evangelism Bugs are now in the Product Tech Evangelism. See bug 86997 for\ndetails.',0.00,0,1,867264,0,NULL,0),(13534,10297,'2001-08-10 21:15:46','The Bugzilla 3 component is going away. We\'re going to depend on the Milestones \nfor this. At the time this component was created, we didn\'t have milestones for \nBugzilla.\n',0.00,0,0,867408,0,NULL,0),(13534,4412,'2001-08-11 06:25:29','I am working on a solution for this by implementing customised resolutions over\nat bug #94534.',0.00,0,1,867719,0,NULL,0),(96421,20606,'2001-08-22 07:36:33','From Bugzilla Helper:\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.3+) Gecko/20010821\nBuildID: 2001082108\n\nCould you add a keyborad shortcut to \"Mark thread as read\"? It\'s a feature I use\noften, and ot\'ll be easier to have a shortcut rather than clicking in \"mark\" and\nthen on \"thread as read\".\n\nReproducible: Always\nSteps to Reproduce:\nn/a\n\nActual Results: n/a\n\nExpected Results: n/a',0.00,0,1,882821,0,NULL,0),(96421,25000,'2001-08-22 08:50:35','You\'d think this would be a dup, but I don\'t see it... confirming.\n\nOS/Platform -> ALL/ALL',0.00,0,1,882924,0,NULL,0),(96421,21544,'2001-08-22 08:53:29','\n\n*** This bug has been marked as a duplicate of 75027 ***',0.00,0,1,882932,0,NULL,0),(96421,25000,'2001-08-22 09:08:30','my old nemesis hwaara has foiled me again.... :) verified',0.00,0,0,882957,0,NULL,0),(13534,4412,'2001-08-27 13:16:40','As such, taking this ...',0.00,0,0,889653,0,NULL,0),(12911,18780,'2001-08-27 14:52:44','Front-burnering to 0.9.5\nAlso, changing the summary. This bug was originally about using relative paths\nin the profile registry file. It also needs to include using relative names for\nall paths *within* a profile dir. Mainly, paths in prefs.js which are used by\nmailnews.',0.00,0,1,889881,0,NULL,0),(13534,4412,'2001-08-27 16:22:57','Moving to new Bugzilla product ...',0.00,0,0,890117,0,NULL,0),(2586,7289,'2001-08-28 18:08:49','It appears to be, by Mac OS X.',0.00,0,0,892324,0,NULL,0),(13534,4412,'2001-08-30 18:35:50','Taking (again) ...',0.00,0,0,896318,0,NULL,0),(2586,4054,'2001-09-04 05:40:45','Jesse: On Linux, exactly how would you say that should work?',0.00,0,0,901377,0,NULL,0),(2586,11608,'2001-09-07 19:39:03','I don\'t use Linux much, and I haven\'t written any graphical programs for it, so \nI don\'t know how it would work.\n\nThis is what I would expect to happen if print preview worked at the OS level \n(I haven\'t seen Mac OS X\'s print preview feature):\n\n- Application developers would be able to add a print preview feature much more \neasily, so more apps would have the feature. (The OS-level feature might even \nbe a button in the print dialog, making it work with old applications as well \nas new ones.)\n\n- Users wouldn\'t have to figure out a new UI each time they select \"print \npreview\" in a new application.\n\n- The print preview window would be grayscaled if the printer is a black-and-\nwhite printer, so the user would be able to tell if there are contrast problems \nwith the colors chosen.\n\n- The print preview window would be able to show the actual fonts that will be \nused to print, rather than the font shown in a normal document window scaled to \nthe zoom factor of the print preview window.',0.00,0,0,909361,0,NULL,0),(12911,20209,'2001-09-09 23:24:11','*** Bug 99030 has been marked as a duplicate of this bug. ***',0.00,0,0,911133,0,NULL,0),(384,10297,'2001-09-15 01:51:24','moving to Bugzilla product\nreassign to default owner/qa for INVALID/WONTFIX/WORKSFORME/DUPLICATE',0.00,0,1,919319,0,NULL,0),(2586,4054,'2001-09-15 09:37:17','Jesse: The problem on Linux is that there is no one subsystem that is in charge\nof both the windowing system and the printing system, and the OS doesn\'t do either.',0.00,0,1,919839,0,NULL,0),(3140,29320,'2001-09-27 16:52:00','Vladimir, the described failure is about the event.target property, in DOM 2 Events.\n\n',0.00,0,0,942605,0,NULL,0),(12911,20209,'2001-10-01 13:38:06','*** Bug 102540 has been marked as a duplicate of this bug. ***',0.00,0,0,947629,0,NULL,0),(12911,9911,'2001-10-01 14:04:24','That last-marked duplicate has a list of all the places where we are using\nabsolute paths in the prefs. This is also a problem in the mail cache file,\npanacea.dat.\n\nGerv',0.00,0,1,947737,0,NULL,0),(12911,18780,'2001-10-01 14:42:24','Copying that useful info to this bug:\n\nHowever, mail stores absolute paths in\nthe following places:\n\na) Throughout the file panacea.dat\n\nb) In the following pref keys:\nmail.directory\nmail.imap.root_dir\nmail.newsrc_root\nmail.root.imap\nmail.root.nntp\nmail.root.none\nnews.directory\nmail.server.serverX.directory\nmail.server.serverX.newsrc.file\n(for multiple values of X)\n',0.00,0,1,947872,0,NULL,0),(12911,18780,'2001-10-04 08:15:32','-> 0.9.6',0.00,0,0,953179,0,NULL,0),(6810,3831,'2001-10-04 16:22:51','bulk reassigning Waqar\'s bugs to Don.',0.00,0,0,954879,0,NULL,0),(12911,22599,'2001-10-10 15:05:16','The user\'s search provider (incl. default, I think) is stored as absolute path\nto the sherlock file (last time I checked). (Note that this lives in the\ninstalaltion dir, not the profile dir.) That most likely the reason why the\ndefault pref for the search provider doesn\'t work for me.',0.00,0,1,965754,0,NULL,0),(2586,12280,'2001-11-07 13:04:17','Just a heads up: print preview is back in recent builds. Gifs are still \nanimated.',0.00,0,1,1013049,0,NULL,0),(1869,23402,'2001-11-10 12:20:04','it\'s dead jim ',0.00,0,0,1018908,0,NULL,0),(12911,20209,'2001-11-13 06:38:22','*** Bug 109873 has been marked as a duplicate of this bug. ***',0.00,0,0,1021640,0,NULL,0),(2586,3821,'2001-11-13 12:12:44','taking bug',0.00,0,0,1022290,0,NULL,0),(2586,3821,'2001-11-13 12:14:06','I don\'t think this is a compositor issue, changing to \"printing\"',0.00,0,0,1022292,0,NULL,0),(2586,3821,'2001-11-13 12:16:58','This also includes the beginnings of code for switching back to galley mode\nwhen in PrintPreview',0.00,0,1,1022299,5,'57624',0),(2586,3821,'2001-11-13 13:28:08','Overview patch:\nRenamed the mIsDoingPrintPreview to mIsCreatingPrintPreview and added a new \nvariable mIsDoingPrintPreview which is NOT static and is per DocViewer, that way \nthe DocumentViewer knows whether it is in PP mode.\n\nFor now the Print Preview menu item toggles between print preview and galley \nmode.\n\nAlso, added method for switching back to galley mode (re-creates lall the \nframes)\n\nAdded code to the PresContext to walk the content tree looking for images and \nits hash table of images, so when the Animation mode changes they can be turned \non or off.\n\nAdded code in the imgContainer to start and stop animation depending on the \ncurrent state of the animation.',0.00,0,1,1022462,0,NULL,0),(2586,10025,'2001-11-13 13:44:02','sr=attinasi\nOne thing I dislike about the change is having to walk every image to disable\nthe animation when, in reality, very few of the images will even be animated.\nIt would be far better to tell the imageLib that animation is globally\ndisabled, and then every animation would be overridden until that global flag\nwas cleared. Granted, PP is not a performance intensive operation, but an O1 is\nbetter than an O2n algo anyday.',0.00,0,1,1022501,6,'57624',0),(2586,4048,'2001-11-13 14:47:41','r=dcone.\none comment.. it would be nice to have #defines or enums for\neven if its just in this file.. it would make it easier to maintain.. and \ndocument what your trying to test for.\nif (mAnimationMode == 0 && (aAnimationMode == 1 || aAnimationMode == 2))',0.00,0,1,1022639,0,NULL,0),(2586,3821,'2001-11-14 11:05:04','fixed',0.00,0,1,1023968,0,NULL,0),(12911,18780,'2001-11-15 07:01:37','Mass move to 0.9.7',0.00,0,0,1025514,0,NULL,0),(13534,10297,'2001-11-17 18:17:19','We are currently trying to wrap up Bugzilla 2.16. We are now close enough to\nrelease time that anything that wasn\'t already ranked at P1 isn\'t going to make\nthe cut. Thus this is being retargetted at 2.18. If you strongly disagree with\nthis retargetting, please comment, however, be aware that we only have about 2\nweeks left to review and test anything at this point, and we intend to devote\nthis time to the remaining bugs that were designated as release blockers.',0.00,0,1,1029819,0,NULL,0),(12911,12902,'2001-11-23 04:44:34','*** Bug 111591 has been marked as a duplicate of this bug. ***',0.00,0,0,1037889,0,NULL,0),(12911,18780,'2001-11-27 13:27:04','-> 0.9.8',0.00,0,0,1043543,0,NULL,0),(3140,5003,'2001-12-03 10:55:43','Bugs targeted at mozilla1.0 without the mozilla1.0 keyword moved to mozilla1.0.1 \n(you can query for this string to delete spam or retrieve the list of bugs I\'ve \nmoved)',0.00,0,0,1053837,0,NULL,0),(12911,18780,'2001-12-17 13:54:29','*** Bug 76245 has been marked as a duplicate of this bug. ***',0.00,0,0,1075731,0,NULL,0),(12911,3858,'2001-12-21 17:54:14','This was with 0.9.7, BTW.',0.00,0,0,1082842,0,NULL,0),(12911,14534,'2001-12-22 14:32:28','*** Bug 116601 has been marked as a duplicate of this bug. ***',0.00,0,0,1083409,0,NULL,0),(12911,14534,'2001-12-23 09:38:13','*** Bug 116685 has been marked as a duplicate of this bug. ***',0.00,0,0,1083875,0,NULL,0),(3140,4833,'2002-01-04 13:48:50','The testcase in attachment 1002 is wrong. it does not tell you where the event\nrecieved, just where the originate from. It was always showing HTML because the\n element had no border or padding (seems like margin doesn\'t count as\npart of the body), However the event listener is to the \"Window\" object as the\ncurrentTarget in the testcase I\'m attaching shows.',0.00,0,1,1096047,5,'63566',0),(2586,7924,'2002-01-10 09:05:31','Verified with 2002010703 on Win2K using bongo.gif out of res/samples/sampleimages.\nMac? Linux?',0.00,0,0,1105131,0,NULL,0),(12911,14534,'2002-01-11 11:04:44','*** Bug 119445 has been marked as a duplicate of this bug. ***',0.00,0,0,1107772,0,NULL,0),(12911,33436,'2002-01-12 02:21:23','Just want to stress the fact that this would be a severe \"ship stopper\" for\npeople who want to use Mozilla with shared profiles on a network. In my case,\nsome directories\nP:\\Daten\\Netscape\\Thommie\\w2patixq.slt\\ImapMail\\192.168.0-1.1\nP:\\Daten\\Netscape\\Thommie\\w2patixq.slt\\ImapMail\\post.gaia-1.de\nP:\\Daten\\Netscape\\Thommie\\w2patixq.slt\\ImapMail\\post.gaia-2.de\nP:\\Daten\\Netscape\\Thommie\\w2patixq.slt\\ImapMail\\post.gaia.de\nare created in the networked (Unix) /home/thommie directory when I open \nMozilla. This is not a Unix-specific issue but a thing which is caused when the\nprofile is stored under Unix but mapped (e.g. through Samba) to a networked Win\nclient.\n\nI would nominate this for mozilla1.0.',0.00,0,1,1109004,0,NULL,0),(12911,14534,'2002-01-12 16:25:42','*** Bug 119707 has been marked as a duplicate of this bug. ***',0.00,0,0,1109500,0,NULL,0),(12911,32335,'2002-01-12 20:08:58','Nominating for mozilla1.0 on behalf of Thommie Rother in comment 43, and\nchanging OS to All.',0.00,0,1,1109619,0,NULL,0),(12911,18780,'2002-01-15 09:35:57','Mass move to 0.9.9',0.00,0,0,1113341,0,NULL,0),(12911,11608,'2002-01-21 14:01:51','*** Bug 118921 has been marked as a duplicate of this bug. ***',0.00,0,0,1123843,0,NULL,0),(6810,4432,'2002-01-24 06:35:17','rods:\nAny idea how we can implement this ?',0.00,0,1,1128462,0,NULL,0),(2586,4079,'2002-01-31 14:42:22','verified.',0.00,0,1,1141599,0,NULL,0),(123203,20048,'2002-02-02 22:57:02','nsHttpChannel should own a nsStandardURL instead of a generic nsIURI. this\nwould allow nsHttpChannel to save on space my making mSpec reference\nnsStandardURL::mSpec directly. it would also avoid a number of other pointless\nbuffer copies throughout the HTTP impl.',0.00,0,1,1144873,0,NULL,0),(12911,42246,'2002-02-08 15:57:46','Also, make sure Downloaded Pop/IMAP Mail and Newsgroups Data can be shared\nbetween different Intallations / OSes (e.g. Windows and Linux on same Laptop)',0.00,0,1,1157241,0,NULL,0),(12911,35848,'2002-02-09 09:48:45','What about the seperator characters used in stored pathnames (Unix \"/\" vs.\nWindows \"\\\\\")? If people want to use the same profile data across different\nOSes, it needs to be standardized (-> \"/\").\n\nAt this time Windows-like separators are not recognized on Unix and vice versa.',0.00,0,1,1158188,0,NULL,0),(12911,18780,'2002-02-09 11:04:44','That\'s right - the path separators will be taken care of. I plan on using a\nUTF-8 encoded descriptor. This descriptor will have the same format on all\nplatforms. Internally, the nsLocalFile impls of each platform will convert this\nto native format for that platform.',0.00,0,1,1158255,0,NULL,0),(12911,14753,'2002-02-09 20:16:51','I really don\'t think a utf-8 descriptor is necessary. Up unit now, the file is\nquite editable in 7-bit ascii, unless the user is using higher characters. At\nleast in the Unix and Windows cases, \'/\' is quite acceptable for a path\nseparator. All of the internal windows API\'s accept \'/\' as a path separator.\nOn the other hand, I don\'t know anything at all about the Mac API\'s, so I don\'t\nknow what is acceptable there.\nThere is a related problem with line separators, that is not directly covered by\nthis bug. One of the primary purposes of this bug is to allow profiles to be\nportable between OS\'s, so the line separator issue may be related.',0.00,0,1,1158728,0,NULL,0),(12911,15223,'2002-02-09 21:43:26','F:\\build\\mozilla>cd js/src\nF:\\build\\mozilla\\js>\n\nplease stop making the assertion that / is well recognized by windows. under \nXP this would work, on 2k it does not.\n\nccarlen\'s suggestion is fine. your justification for you suggestion is \nabsolutely not.',0.00,0,1,1158756,0,NULL,0),(12911,7978,'2002-02-09 21:46:08','Timeless -- he didn\'t say \"the windows command prompt\". he said \"all of the\ninternal windows API\'s\". There\'s obviously a difference there.\n\n',0.00,0,1,1158758,0,NULL,0),(12911,14753,'2002-02-10 00:21:03','Timeless, Mathew Miller pretty much covered my point. The internal Windows API\'s\nare quite agnostic about \'/\' versus \'\\\' going right back to DOS 2.0. In DOS 1.0\nthere were no subdirectories, so the issue mever came up The comand line\ninterface, which is a very different thing from the API\'s, had support for \'/\'\nup until DOS 5.0, I believe. Once they went to a GUI, I believe that support for\n\'/\' in the edit boxes was spotty at best.\nDoes anybody know what Apple uses in their API\'s? As of OS-X, I presume that the\nUnix base for the underlying OS implies that \'/\' will work.\nOne of the strengths of the prefs.js file is the ability to edit it in an\nemergency. If it depends on non-7-bit-ASCII characters, It will be much harder\nto deal with.\nThis shouldn\'t be the only factor in the decision, of course, but I see no\nreason to mess with a fairly widespread standard unnecessarily.\nIdeally, the path separator could be either \'/\' or \'\\\' (and any others in use as\nwell) and Mozilla versions from all OS\'s would recognize all of them.\nI am by no means claiming that \'/\' is common to all OS\'s. There was a recent\nthread on alt.folklore.computers that went into this at great length. Some of\nthe older OS\'s had positively byzantine methods of specifying the path. As far\nas I could tell, a lot of them used \' \' as a separator, but they usually were\nquite limited as to how far you could nest the directories.',0.00,0,0,1158824,0,NULL,0),(12911,22599,'2002-02-10 01:20:36','Can\'t we separate cross-platform profiles from this bug? That\'s a superset of\nprofiles being movable on one machine or on machines with the same architecture\n(which is what this bug was about) and a less common case.',0.00,0,1,1158858,0,NULL,0),(12911,15223,'2002-02-10 01:33:02','Here\'s the deal as i see it, you\'re arguing against an arbitrary character \nbased on the assumption that it\'s a useful character to the end user. / is not \nuseful to me as an end user.\n\nI can\'t |cd \"/build\"| (i can |cd \"js/src\"|) and your average dos/windows user \nwill *not* figure out that quoting paths will make a few more paths work.\n\nEntering \"f:/build\" into a windows filepicker gives me a nice error message, \nand even your average prefs.js editor does *not* write or know dos api calls, \nand isn\'t going to know that they can magically quote escape in some cases.\n\nThe simplest XP approach is to use file:/// or resource:/// for paths. Both of \nthese would be recognizable as taking / as their path separator and have well \nknown escaping algorithms. resource: can be extended to handle home \ndirectories and other magical things. See comments up to 20.\n\nAs long as we make paths look like urls instead of native paths, there isn\'t a \nproblem.\n\nOn MacOS classic, only : is a path sep, and using full paths is about the most \nevil thing you can do (it gets you stoned and worse).',0.00,0,1,1158862,0,NULL,0),(12911,7978,'2002-02-10 06:28:41','Maybe I\'m confused; I thought the talk was about the internal representation of\ndirectory separators. Obviously the UI should use whatever is native to the\nplatform.',0.00,0,1,1158968,0,NULL,0),(12911,15223,'2002-02-10 09:03:21','you\'re crazy. the goal of this bug is to make prefs portable. the only way \nreasonable way to make it portable is to use URLs. any \'internal\' \nrepresentation that isn\'t a URL is a disaster. I really don\'t understand why we \nhave any need for this discussion.\n\nComment 49 caused the problems, here\'s a minor quote: \"At this time \nWindows-like separators are not recognized on Unix and vice versa.\" If you \nread the recognizer as users instead of operating systems then you\'re where I \nsit. Before comment 49 we were clearly leaning to URLs, the fact that the bug \nhadn\'t been fixed is just the bug and not an indication of a rational \ndirection.',0.00,0,1,1159067,0,NULL,0),(12911,7978,'2002-02-10 09:12:54','Don\'t call me names. That\'s totally inappropriate. I\'m wasn\'t even advocating\nanything: just trying to clarify the situation. \n\nNote that comment 49 starts by saying \"What about the seperator characters used\nin stored pathnames [...]\" -- *stored* pathnames, not user representation.\n\nBut anyway, I agree with you that using file:/// urls is the right and sensible way.',0.00,0,1,1159080,0,NULL,0),(12911,31092,'2002-02-10 10:57:18','Unfortunately file:/// URLs are not relative but absolute. See the Summary of\nthis bug for more details...',0.00,0,1,1159157,0,NULL,0),(12911,15223,'2002-02-10 14:29:59','that\'s why we\'d use resource: or an equivalent.',0.00,0,0,1159358,0,NULL,0),(12911,1833,'2002-02-10 16:38:35','this bug is about storing relative pathnames in your prefs.js file - not for how\nyou\'re calling APIs, what you see in the UI, etc etc. Conrad has already\nasserted that the format he has in mind is both relative and cross-platform.\n\nThe actual storage format is irrelevant to all the above discussion, please take\nthis rediculous debate to the newsgroups.',0.00,0,0,1159458,0,NULL,0),(12911,14753,'2002-02-10 19:23:19','I agree that the paths should be stored as some form of resource: urls. Anything\nis better than the current absolute paths, and a resource: makes a lot of sense. \nMy main argument, appearances notwithstanding, is that it would be preferable to\navoid the use of a unicode(non-ascii) character for the separator. The\ndiscussion of API\'s, command line options, etc. was entirely to establish that\nthe \'/\' shouldn\'t break anything in particular, and preserves compatibility with\nexisting editors. While it is certainly not a requirement for the file to be\ncompatible with ASCII editors, I also don\'t see any good reason to break that\ncompatibility just because we can.\nIt is quite possible that I misinterpreted Conrad\'s meaning when he said he\nwould use a UTF-8 encoded descriptor, but he seemed pretty clear (Unlike me,\napparently)\n\n',0.00,0,0,1159583,0,NULL,0),(12911,20209,'2002-02-10 19:31:23','You missed the point. The separator is not in question. The question is how to\npoint to files which may have non-ASCII characters in the filenames. Conrad\nsaid that he will just encode the filenames as UTF8 which means that as long as\nyour filenames are 7-bit clean your prefs file will be too.',0.00,0,0,1159596,0,NULL,0),(12911,14753,'2002-02-10 20:21:22','Unfortunately, my reading of Conrad\'s comment# 50 doesn\'t agree with that\ninterpretation. I expect that Conrad will be able to clear up any\nmisunderstandings that have arisen.\n',0.00,0,1,1159621,0,NULL,0),(12911,44558,'2002-02-17 19:37:31','I\'d also like the ability to specify a remote path so that users could store their profiles on a network \nserver and have access to them from anywhere on the LAN. This should be specified through the \nuse of environment variables or usernames -- on a Windows workstation on a Netware network or \nSaMBA/Win network in the system login script a virtual drive letter like U: would be created \npointing at the user\'s , and each user\'s profiles are in U:\\Netscape\\Users\\Default. On a \n*BSD/Linux network I\'m sure the same procedure could be worked out. This would allow a use to \nlog in to the network from any workstation and have personal settings. THIS IS NOT A ROAMING \nPROFILE where the profile is copied to the server when Mozilla shuts down and then copied to the \nlocal workstation when Mozilla starts. The profile info stays on the server all the time.',0.00,0,0,1173553,0,NULL,0),(123203,20048,'2002-02-20 18:50:27','-> future',0.00,0,0,1180958,0,NULL,0),(6810,4048,'2002-02-22 07:35:15','-> I think this is a UI issue on linux.. is this fixed already?',0.00,0,0,1184271,0,NULL,0),(12911,6183,'2002-02-22 08:38:41','Unless I\'m misunderstanding, the last comment asks for something which is\nalready in place- you can tell Mozilla where to find your profile using the\nprofile wizard as long as the profile is on a filesystem visible to your\nmachine. I\'d just like to add my voice to ask for an implementation to fix this\nASAP. What\'s in the way of fixing it via a resource: url? Perhaps it would be a\ngood idea to split off the unicode pref encoding idea into a different bug and\nresolve this quickly- after all, not that many people use non-ascii characters\nin their directory and file names. Does the resource: fix have a shot at being\nimplemented for .9.9, the current target? With 23 votes and a dup count\napproaching mostfreq [and definitely mostfreq if you count the bugs which are\ndups of the dependent bugs 7067 and 58647 which appear to me to be dups of this\n(with the additional request for big vs. little endian in 7067 and a UI mention\nor hack in 58647)] this bug seems to deserve a quick squashing.',0.00,0,1,1184369,0,NULL,0),(6810,4079,'2002-02-22 09:39:54','Roland, please check if this is fixed...thanks.',0.00,0,0,1184456,0,NULL,0),(6810,4432,'2002-02-25 02:10:36','No, this has not been fixed.\n\nThis bug is about setting the print jobs title for the print spooler. Currently\nwe include the title in the page itself but to not pass it to the print spooler\nsystem.',0.00,0,1,1188174,0,NULL,0),(12911,18780,'2002-02-25 08:40:58','> this bug seems to deserve a quick squashing.\n\nI\'m glad you think this problem is so easy - why don\'t you supply a patch then ;-)\n\nSeriously, my patch is coming along. I\'m using a resource: URL, because it\'s\nhere, it works, etc. A resource URL is not quite as XP as what I had in mind.\nThough escaped, non-ASCII chars will be in the native charset for that platform.\nI don\'t think that\'s such a problem because all of the files created within a\nprofile dir are made programatically, under our control. We don\'t create files\nwithin the profile dir with non-ASCII characters anyway. The path *to* the\nprofile dir can contain any characters of whatever charset. The laborious part\nof this is fixing up the many callsites in mailnews. ',0.00,0,1,1188479,0,NULL,0),(12911,9769,'2002-02-25 09:04:39','> profile dir are made programatically, under our control.\nActually not all - You could create Mail/Folder with local names (just tested).\nIt will then create directory or FILE + FILE.msf, where \"FILE\" contains\ndifferent charset (for me it is Russian languange + Koi8-r charset for Linux OS)\n\nAlso some RFE to this talk. Onece on discuassion forum I was asked \"if it\npossible to have mail/news archive on CD (CD-RW or CD-R) and still have ability\nto read it from newsreader. The answer was \"no for MS OE\", \"yes for Netscape4\".\nThere you could specify different directory location for mail/news instead of\nsubdirectory of Profile. I do not know how to solve this problem if separate\n\"profile\" URL whould be used, but just keep in mind that there is need in\nseparate storage for mail/news archives.\n',0.00,0,1,1188506,0,NULL,0),(12911,18780,'2002-02-25 10:59:03','> Actually not all - You could create Mail/Folder with local names (just tested).\nIt will then create directory or FILE + FILE.msf, where \"FILE\" contains\ndifferent charset (for me it is Russian languange + Koi8-r charset for Linux OS)\n\nYou\'re right - but the folder names are not stored in the prefs as part of\nabsolute paths. The prefs which need to be fixed for this are the ones which are\nabsolute paths to the top-level mail directories. For example, \"mail.directory\",\n\"mail.server.server1.directory\", etc. Once those top-level dirs are resolved,\nfolder names can be appended in whatever charset.\n\n> There you could specify different directory location for mail/news instead of\nsubdirectory of Profile.\n\nYeah, relative paths cannot always be used - as in this case. If the file pref\nto be saved is not a subdirectory of the profile dir, it will be written out as\nan absolute file path. BTW, even if a file pref can be made relative, the\nabsolute path pref will still be written out until some point when compatibility\nwith older builds can be dropped (maybe never). Given that, we\'ll have to\nsupport both kinds of paths anyway.',0.00,0,0,1188725,0,NULL,0),(12911,19670,'2002-02-25 11:48:46','>Seriously, my patch is coming along. I\'m using a resource: URL, because it\'s\n>here, it works, etc. A resource URL is not quite as XP as what I had in mind.\n>Though escaped, non-ASCII chars will be in the native charset for that platform.\n\nCcarlen: would fix for bug 84186 and bug 124042 make it possible to use UTF-8\nencoding for resource: URLs? If so, it might be worth to store everything\nencoded as UTF-8...\nAscii is just a subset of UTF-8, so it would only be necessary to ensure\ngraceful support for rare cases where there are some multibyte characters in\nsuch an URL (just a suggestion, correct me if I got something wrong).',0.00,0,1,1188857,0,NULL,0),(12911,14534,'2002-02-25 16:28:28','*** Bug 127771 has been marked as a duplicate of this bug. ***',0.00,0,0,1189769,0,NULL,0),(12911,14534,'2002-02-25 18:46:26','*** Bug 127771 has been marked as a duplicate of this bug. ***',0.00,0,0,1190170,0,NULL,0),(12911,18780,'2002-02-27 10:25:42','',0.00,0,1,1193005,5,'71696',0),(12911,18780,'2002-02-27 10:30:37','This snippet of the actual patch shows how the code is used in mailnews. There\nare many callsites that need to be changed which will make for a long, boring\npatch. Also, I changed nsIFileSpec usage to nsILocalFile in any method I\ntouched which makes the final patch bigger.\n\nAlec, before I do the tedium of converting the rest of mailnews, can you tell\nme what you think of the approach?',0.00,0,1,1193012,5,'71697',0),(12911,1833,'2002-02-27 10:31:55','I have to admit that I\'m not fond of this approach. I feel like this would\nincrease our security risk w.r.t. profiles - essentially hiding the \"salt\"\ndirectory name behind a URL, rendering it useless (in effect, it makes access\nto resource://default/prefs.js incredibly easy if there is every a URL-based\nsecurity breach.\n\nHonestly, it seems like this bug ought to be something handled internal to the\npref service',0.00,0,1,1193013,6,'71696',0),(12911,14753,'2002-02-27 11:10:24','Regarding Alec\'s comment, this bug is at least partially INTENDED to hide the\n\'salt\' directory name. We have a conflict here between the security granted by\nthe \'salt\' dir, and the overall usability of prefs file.\nI\'m usually pretty paranoid about security issues, but in this case I\'m pretty\nsure that we only have a problem if resource:// urls are accessible to the user.\nIf that happens, I imagine the lack of \'salt\' protection is perhaps not the\ngreatest problem we will have to deal with.\nOn the other hand, at least some of the benefits of the relative paths could be\nhad if we use resource://profiledir/foo.SLT/prefs.js.\nThis happens to eliminate the benefits of relative paths that I am personally\ninterested in, but isn\'t totally bad.\n',0.00,0,1,1193106,0,NULL,0),(12911,1833,'2002-02-27 11:49:49','Woah there.. we can hide the salt directory within prefs, because the mechanism\nis more convoluted than adding this capability to necko..\n\ni.e. if I say that a pref has the value:\nuser_pref(\"wallet.SchemaValueFileName\", \"${profiledir}/abcd.w\");\n\nand then prefs internally handles this wacky syntax, then this does not give us\nany further indication about salt directory name. It does give us the name of\nthe wallet schema file, but that risk is already present in the current codebase.\n\nIf we add this capability in a more global space, such as necko, then it makes\nit easier for code which is searching for well-known filenames (such as\nprefs.js) to read these files.\n\nI\'ve intentionally made a lame strawman syntax above.. I\'m not suggesting that\nwe use the ${ } syntax, I just stole it from perl. I welcome other suggestions.\nThe resource:// syntax is interesting, but I\'m against it mostly because it\nimplies that it works elsewhere, such as in necko, where I don\'t think it should!',0.00,0,1,1193212,0,NULL,0),(12911,18780,'2002-02-27 12:22:49','Bad idea. Alec\'s right. Working on a new scheme which will solve problem with\nresource:// URLs.',0.00,0,1,1193304,6,'71696',0),(12911,14753,'2002-02-27 19:27:24','I see what Alec is saying, now. It makes a lot of sense. I was working on the\nassumption that it had already been decided to use resource: urls. I suppose\nnothing is really decided until it is checked in to the trunk. I definitely\nagree that there are security concerns with putting this functionality into Necko.\nI\'ll go lurk again...',0.00,0,1,1194445,0,NULL,0),(12911,18780,'2002-02-28 10:33:22','Here\'s the funtionality needed in prefs to support this. Next, I\'m working on\nnsLocalFile::Get/SetRelativeDescriptor. At that point, we\'ll have support for\nrelative file prefs and I\'ll check that in as the first phase. It won\'t have\nany effect until mailnews uses it everywhere but, with everything at once, the\npatch will be frightenly large.',0.00,0,1,1195276,5,'71905',0),(12911,18780,'2002-03-04 08:32:10','-> 1.0, in progress though...',0.00,0,0,1201185,0,NULL,0),(12911,4448,'2002-03-04 19:20:18','Moving Netscape owned 0.9.9 and 1.0 bugs that don\'t have an nsbeta1, nsbeta1+,\ntopembed, topembed+, Mozilla0.9.9+ or Mozilla1.0+ keyword. Please send any\nquestions or feedback about this to adt@netscape.com. You can search for\n\"Moving bugs not scheduled for a project\" to quickly delete this bugmail.',0.00,0,1,1202967,0,NULL,0),(12911,18780,'2002-03-05 10:36:59','Putting back to 1.0 since it\'s topembed now.',0.00,0,0,1203966,0,NULL,0),(12911,302291,'2002-03-07 17:11:40','the javascript component loader requires this functionality.',0.00,0,0,1209541,0,NULL,0),(2586,20209,'2002-03-07 23:35:21','*** Bug 129471 has been marked as a duplicate of this bug. ***',0.00,0,0,1210042,0,NULL,0),(12911,4346,'2002-03-13 09:07:50','Another profile directory bug.... It\'d be nice if we fix this in MachV.',0.00,0,0,1218967,0,NULL,0),(12911,16235,'2002-03-13 09:43:17','If this would be \"nice for MachV\", please explain why, and nominate it. ',0.00,0,0,1219037,0,NULL,0),(12911,18780,'2002-03-13 10:02:04','> If this would be \"nice for MachV\", please explain why, and nominate it.\n\nIt already is topembed+ and in-progress.\n',0.00,0,1,1219107,0,NULL,0),(12911,338084,'2002-03-13 23:08:19','so are relative pathnames part of the reason map-networked profiles dont work as\nin bug 79419?',0.00,0,0,1221018,0,NULL,0),(12911,18780,'2002-03-14 10:05:03','',0.00,0,1,1221795,5,'74104',0),(12911,14534,'2002-03-14 17:09:42','*** Bug 131054 has been marked as a duplicate of this bug. ***',0.00,0,0,1223158,0,NULL,0),(12911,18780,'2002-03-19 15:52:34','This patch gets around the skanky *this = *(nsLocalFile *)targetFile business\nin the previous patch. On the Mac, it was a little involved - I needed a new\niface for private getters in order to init a file with an existing file. On\nother platforms, a GetPath()/SetPath() is cheap and non-lossy.',0.00,0,1,1232165,5,'75079',0),(12911,18780,'2002-03-19 15:55:58','Adding Brian to review the prefs portion. Can Doug and Alec r=/sr= attachment\n71905 and attachment 75079?',0.00,0,1,1232178,0,NULL,0),(12911,16517,'2002-03-19 16:42:03','I\'m sorry, I must be stupid... in GetComplexValue() I don\'t see where you are\never storing your object into the return value...\n\n+ nsCOMPtr relativePref;\n+ rv = NS_NewRelativeFilePref(theFile, key.get(), getter_AddRefs(relativePref));\n+ if (NS_FAILED(rv))\n+ return rv;\n+\n+ NS_ADDREF(NS_STATIC_CAST(nsIRelativeFilePref*, *_retval));\n+ return NS_OK;\n\nOther than that, the prefs patch seems ok...',0.00,0,1,1232307,0,NULL,0),(12911,18780,'2002-03-20 16:13:04','D\'oh - nice catch. I\'m stupid. Here\'s a patch which was actually tested.',0.00,0,1,1234525,5,'75295',0),(12911,16517,'2002-03-21 09:11:54','r=bnesse on the prefs patch.',0.00,0,1,1235592,6,'75295',0),(12911,1833,'2002-03-26 10:14:57','\nthat would simplify some of the code in SetRelativeDescriptor, you\'d need less\nXP_MAC stuff because you\'d just be able to pass in targetFile\n\n\n\n>+ void initWithFile(in nsILocalFileMac aFile);\n\nI wonder if we should make InitWithFile() exist on \nnsILocalFile()? It seems like this would be useful to more than just the mac...\nespecially since the implementation you\'ve given doesn\'t actually rely on\nnsILocalFileMac...\n\n\n\n>+#if defined(XP_MAC)\n>+static const nsCAutoString kSlashStr(\"/\");\n>+static const nsCAutoString kESCSlashStr(\"%2F\");\n>+#endif\n\nthis is worrysome because you use these for ReplaceSubstring, and nsString.h\nsays\n> void\n> nsCString::ReplaceSubstring(const nsCString& aTarget,const nsCString& aNewValue){\n> \n> //WARNING: This is not working yet!!!!!\n\nhowever, it kinda looks like the const char* versions work (or at least don\'t\nhave the warning)\nI remember something about an infinite loop with the broken ReplaceSubstring()\n\n>+ rv = GetUnicodePath(&thisPath);\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ rv = fromFile->GetUnicodePath(&fromPath);\n>+ if (NS_FAILED(rv)) {\n>+ nsMemory::Free(thisPath);\n\nCan you use nsXPIDLString here?\n\n>+ for (nodeelasticsearch.Index = branchelasticsearch.Index; nodeelasticsearch.Index < thisNodeCnt; nodeelasticsearch.Index++) {\n>+ NS_ConvertUCS2toUTF8 nodeStr(thisNodes[nodeelasticsearch.Index]);\n>+#ifdef XP_MAC\n>+ nodeStr.ReplaceSubstring(kSlashStr, kESCSlashStr);\n>+#endif\n\nthis is the spot I was worried about.\n\n\n>+ nsMemory::Free(thisPath);\n>+ nsMemory::Free(fromPath);\n\nagain, more nsXPIDLCString?\n\n>+ const nsCAutoString kParentDirStr(\"../\");\n\nuse NS_NAMED_LITERAL_CSTRING(kParentDirStr, \"../\"); - you\'ll get length for\nfree, plus no \nextra copying and no extra stack buffer\n\n>+ \n>+ nsCOMPtr parentDir;\n>+ while (FindInReadable(kParentDirStr, nodeBegin, nodeEnd)) {\n>+ rv = targetFile->GetParent(getter_AddRefs(parentDir));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ targetFile = parentDir;\n>+ \n>+ nodeBegin = nodeEnd;\n>+ pos = nodeEnd;\n>+ nodeEnd = strEnd;\n>+ }\n>+ \n\nNot sure I understand the point of this loop.. are you removing \"../\"? can you\ncomment here?\n\n>+ nodeBegin = nodeEnd = pos;\n>+ while (nodeEnd.size_forward() > 0) {\n>+ FindCharInReadable(\'/\', nodeEnd, strEnd);\n>+ nsCAutoString nodeString(Substring(nodeBegin, nodeEnd)); \n>+#ifdef XP_MAC\n>+ nodeString.ReplaceSubstring(kESCSlashStr, kSlashStr);\n>+#endif\n>+ targetFile->AppendUnicode((NS_ConvertUTF8toUCS2(nodeString)).get());\n>+ nodeBegin = ++nodeEnd;\n\nThis last line is a little scary because you might advance past the end of the\nstring - nodeEnd exists just past the end of the \nstring, if FindCharInReadable matched at the end of the string..\nthough now that I look at this loop, I am again confused :) Can you explain\nwhat\'s going on here? :)\n\n>+ }\n>+\n>+#ifdef XP_MAC\n>+ nsCOMPtr macFile(do_QueryInterface(targetFile, &rv));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ return InitWithFile(macFile);\n>+#else\n>+ nsXPIDLCString nativePath;\n>+ rv = targetFile->GetPath(getter_Copies(nativePath));\n>+ if (NS_FAILED(rv))\n>+ return rv;\n>+ return InitWithPath(nativePath.get());\n>+#endif\n\nThis is the bit that would be simplified by putting InitWithFile into\nnsILocalFile',0.00,0,1,1244147,6,'75079',0),(12911,1833,'2002-03-26 10:38:42','>+ * \n>+ */\n>+\n>+[scriptable, uuid(2f977d4e-5485-11d4-87e2-0010a4e75ef2)]\n>+interface nsIRelativeFilePref : nsISupports\n>+{\n>+ /**\n>+ * file\n>+ *\n>+ * The file whose location is stored or retrieved.\n>+ */\n>+ attribute nsILocalFile file;\n>+\n>+ /**\n>+ * relativeToKey\n>+ *\n>+ * A directory service key for the directory\n>+ * from which the file path is relative.\n>+ */\n>+ attribute string relativeToKey;\n\nActually, I\'m thinking this should be an ACString, because then:\n\n>+inline nsresult\n>+NS_NewRelativeFilePref(nsILocalFile* aFile, const char* relativeToKey, nsIRelativeFilePref** result)\n>+{\n\nthis could take a |const nsACString&|\n\nand then:\n\n>+ nsCAutoString key(Substring(keyBegin, keyEnd));\n\nthis could become \nconst nsAString& key = Substring(keyBegin, keyEnd);\n\n>+ rv = directoryService->Get(key.get(), NS_GET_IID(nsILocalFile), getter_AddRefs(fromFile));\n\nhere you\'d use PromiseFlatCString()\n\n>+ rv = NS_NewRelativeFilePref(theFile, key.get(), getter_AddRefs(relativePref));\n\nbut here this could just be \"key\"\n\n\n>+ nsCOMPtr mFile;\n>+ nsCAutoString mRelativeToKey;\n\nand, possibly, this could be nsSharableCString..(that\'s not as important)\nbut even if this is an nsCAutoString, I think we should comment as to why this\nis good\n(i.e. that keys are never longer than xxx bytes, so we know we\'ll never\noverflow autostring\'s buffer,\nso this just saves us an allocation)\n\noverall the approach looks great though, just these minor tweaks.',0.00,0,1,1244197,6,'75295',0),(12911,20048,'2002-03-26 10:52:06','what is the charset of relativeToKey? ASCII? UTF-8? platform dependent?',0.00,0,0,1244228,0,NULL,0),(12911,18780,'2002-03-26 11:13:10','\n> what is the charset of relativeToKey? ASCII? UTF-8? platform dependent?\nIt\'s ASCII. The charset isn\'t really an issue there - the key is just a constant\nfrom nsDirectoryServiceDefs.h or nsAppDirectoryServiceDefs.h\n\nWorking on alec\'s points...',0.00,0,1,1244291,0,NULL,0),(12911,18780,'2002-03-26 11:53:40','> I wonder if we should make InitWithFile() exist on nsILocalFile()?\n\nHmm - probably so.\n\n> this is worrysome because you use these for ReplaceSubstring, and nsString.h\nsays\n\nYikes - thanks for catching that. Just checked and nsString.h doesn\'t say that\nthough it does in .cpp. It worked in my testing of that case though. I\'ll ask\nscc or jag and, if that really is broken, not use it.\n\n> >+ rv = fromFile->GetUnicodePath(&fromPath);\n>+ if (NS_FAILED(rv)) {\n>+ nsMemory::Free(thisPath);\n\n> Can you use nsXPIDLString here?\n\nI would sure like to. Problem was, I chop the string into substrings by\ninserting NULL chars. Is it recomended to use GetWritableFragment() with an\nnsXPIDL[C]String and operate on that?\n\n> use NS_NAMED_LITERAL_CSTRING(kParentDirStr, \"../\"); - you\'ll get length for\n free, plus no extra copying and no extra stack buffer\n\nOK\n\n> Not sure I understand the point of this loop.. are you removing \"../\"? can you\n comment here?\n\nYes. While we have leading \"../\" they get removed and I get the parent of the\nfile. That\'s what \"resolves\" or normalizes the \"../\" in an XP way.\n\n> This last line is a little scary because you might advance past the end of the\n string - nodeEnd exists just past the end of the \n string, if FindCharInReadable matched at the end of the string..\n though now that I look at this loop, I am again confused :) Can you explain\n what\'s going on here? :)\n\nwhat\'s going on here is that I\'m taking each node, which are separated by \'/\'s\nand appending that to the file. You\'re right that the loop is wrong. After\nputting up this patch, I changed it. It\'ll be in the next patch.\n\n> Actually, I\'m thinking this should be an ACString, because then:\n\nOK - A[C]String classes everywhere!',0.00,0,1,1244400,0,NULL,0),(12911,1833,'2002-03-26 12:05:23','oh! I didn\'t see that :)\nYou can use Substring() to get access to fragments of strings, though now that I\nsee what you\'re doing maybe that isn\'t the best option. Eh, nevermind :) back to\nraw PRUnichar I suppose, unless you can find a neat way of doing Substring() tricks.\n\nbtw, you can do stuff like this:\nconst nsAString& sub = Substring(str, start, len);\n\nif \"str\" is a any kind of nsAString',0.00,0,1,1244421,0,NULL,0),(12911,1833,'2002-03-26 12:07:05','> OK - A[C]String classes everywhere!\n\nAll the k00l kids are doing it :)',0.00,0,1,1244423,0,NULL,0),(12911,18780,'2002-03-26 12:29:33','> back to raw PRUnichar I suppose\nFor this, it\'s hard to beat for efficiency as well as easy code. If only there\nwas such a thing as an nsMemoryAutoPtr ;-)',0.00,0,1,1244473,0,NULL,0),(12911,18780,'2002-03-27 13:17:22','I made the API change to nsIRelativeFilePref to use ACString for the key. It\nmade things easier in the impl and saved some allocations. One suggestion I\ndidn\'t take was this one (though I tried it):\n\n>+ nsCAutoString key(Substring(keyBegin, keyEnd));\n\nthis could become \nconst nsAString& key = Substring(keyBegin, keyEnd);\n\n>+ rv = directoryService->Get(key.get(), NS_GET_IID(nsILocalFile),\ngetter_AddRefs(fromFile));\n\nhere you\'d use PromiseFlatCString()\n\nUsing the nsCAutoString in this case is better because no allocation ever\nhappens. If I were to use PromiseFlatCString on the nsACString& made from\nSubstring, PromiseFlatCString would be forced to allocate so it could make its\npromised string null-terminated. I stepped though this, and saw how the\nallocation happens.\n\nBrian, can you r= again? Alec, can you sr?',0.00,0,1,1246813,5,'76452',0),(12911,1833,'2002-03-27 14:13:16','true enough. I think in the future stack allocation will happen automatically\nthough. Until that happens, I guess nsAutoString is best..I\'ll try to review\nthis today',0.00,0,1,1246923,0,NULL,0),(12911,16517,'2002-03-27 14:52:39','r=bnesse.',0.00,0,1,1246990,6,'76452',0),(12911,1833,'2002-03-27 15:39:15','looks great!\n\nsr=alecf',0.00,0,1,1247094,6,'76452',0),(12911,18780,'2002-03-27 16:13:15','This patch differs from the previous this way:\n(1) Puts InitWithFile on nsILocalFile instead of only nsILocalFileMac. The Mac\nhas its own implementation though.\n(2) Fixed up the logic in a loop in SetRelativeDesc\n(3) Using the const char* versions of ReplaceSubstring()\n(4) Using NS_NAMED_LITERAL_CSTRING where I can.\n\nThis patch also has the test program I\'ve been using on this stuff.',0.00,0,1,1247145,5,'76482',0),(12911,1833,'2002-03-28 09:42:42','ok, everything looks good...except for one thing that I just realized with this\npatch.\n\nWhen you do the ReplaceSubstring() on a UTF8 string, you run the danger of\nreplacing a single byte in a fragment of a UTF8 character sequence, and thus\nchanging its UCS2-encoded value.\nWhat I mean is, say you have a UTF8-encoded string and the first \"character\" is\na 4-byte sequence that would translate to a single UCS2 character. If the 3rd\nbyte of that sequence happens to be \'/\', then you\'ll be inserting \"%2F\" which\nwill make the last 2 bytes of that sequence \"%2\" which would mean the\ntranslated UCS2 byte would be a different byte, plus you\'d be adding in an\nextra \'F\' before the next character.\n\nAll this basically means is that you have to do the ReplaceSubstring() step on\nthe UCS2 string rather than the UTF8 string.. \n\nfortunately, SplitPath() is working on PRUnichar strings, so it is safe.\n\nI see this in two places. It will unfortunately complicate the code because\nyou\'ll have to make a temporary nsAutoString somewhere, but I think its the\nonly way to avoid this problem.\n\nother than that, the patch looks great!',0.00,0,1,1248213,6,'76482',0),(12911,20048,'2002-03-28 10:25:25','> What I mean is, say you have a UTF8-encoded string and the first \"character\" \n> is a 4-byte sequence that would translate to a single UCS2 character. If the \n> 3rd byte of that sequence happens to be \'/\'\n\nalecf: no, its not possible for \'/\' to appear as part of a UTF-8 multibyte\ncharacter. that\'s in fact why UTF-8 is so nice. the 8-th bit is set on each\nbyte in a UTF-8 multibyte sequence :-)\n\nUTF-8 bits mapped to UCS2 bits goes like this:\n\n 110xxxxx 10xxxxxx -> 00000xxx xxxxxxxx\n 1110xxxx 10xxxxxx 10xxxxxx -> xxxxxxxx xxxxxxxx\n\nnotice that the UTF-8 bytes all have the high bit set.',0.00,0,1,1248316,0,NULL,0),(12911,1833,'2002-03-28 10:43:00','oh! neat. I thougt it was only the leading byte of a multi-byte sequence that\nhad the high-bit set.\n\nThat explains why it can take so many bytes to represent one UCS2 character :)\nsr=alecf then!',0.00,0,1,1248359,6,'76482',0),(12911,18780,'2002-04-02 15:19:18','',0.00,0,1,1257525,5,'77309',0),(12911,1833,'2002-04-02 15:30:45','adding seth for account manager stuff (I don\'t know who the current mail account\nmanager owner is, but I\'d like seth\'s input on this)\n\nI\'m a bit concerned about just going with the new pref, or at least just tacking\n-rel onto the end of the pref name. I like the idea in general but I\'m wondering\nif mail will have any preferences in this area..\n\nanother possible approach is to add stuff to the pref migration code to convert\nall the mail prefs over automatically. I don\'t think we\'ve generally worried\nabout backwards-compatibility (i.e. at least making old browsers work with\ncurrent prefs) so its possible that a one-time migration may be all we really need.',0.00,0,0,1257562,0,NULL,0),(12911,302291,'2002-04-02 16:44:30','r-dougt. this needs to land before mozilla 1.0. After mozilla 1.0, these API\nchanges will not be allowed.',0.00,0,1,1257786,6,'76482',0),(12911,18780,'2002-04-02 18:43:40','> another possible approach is to add stuff to the pref migration code to convert\nall the mail prefs over automatically. I don\'t think we\'ve generally worried\nabout backwards-compatibility\n\nI think we should be worried about backward compatibilty. It is an headache for\n users who download nightlies. You\'d be surprised at the number of bugs that\ncome in against profile mgr where people say \"I ran the new build and it\ncorrupted the profile for my old build.\" Compatibilty in both directions should\nalways be maintained, at least for a few milestones. Then, as the number of\nusers who would run into this problem drop, support for the old pref can be dropped.',0.00,0,0,1258040,0,NULL,0),(12911,93208,'2002-04-03 13:57:38','Wow, this is some pretty scary stuff. Particularly for mailnews. May I ask a\nsilly question. I don\'t see this listed on the mozilla.org branch landing plan.\nNor do I see the branch name that this is on? Is it not a branch? A change this\nsize definetly needs to be on a branch AND it needs to be on the landing page.\nBranch bits need to be given to QA for testing purposes as well. \n\nGiven where we are in the cycle, I really would rather not see the mailnews\nchanges go into the tree for this. If you can land the prefs and xpcom stuff\nwithout taking the mailnews changes, I\'d prefer that. That\'s my take....',0.00,0,1,1259946,0,NULL,0),(12911,14753,'2002-04-03 15:04:21','While I agree that in some ways this is a scary change, that is the point of\nhaving to get it in for 1.0. If it doesn\'t make 1.0, there will be no good way\nto work it in later without breaking the prefs file. ',0.00,0,1,1260256,0,NULL,0),(12911,16235,'2002-04-04 13:57:47','When would you be thinking about landing this, and where (1.0 branch/trunk)?',0.00,0,0,1262546,0,NULL,0),(12911,5003,'2002-04-04 14:22:40','a=asa (on behalf of drivers) for checkin to the 1.0 trunk',0.00,0,1,1262624,6,'76452',0),(12911,5003,'2002-04-04 14:24:03','a=asa (on behalf of drivers) for checkin to the 1.0 trunk',0.00,0,1,1262631,6,'76482',0),(12911,16235,'2002-04-04 15:00:18','adding myself.',0.00,0,0,1262723,0,NULL,0),(12911,16235,'2002-04-05 17:30:58','adt1.0.0+ (on behalf of ADT) for checkin to 1.0, for all reviewed changes except\nthe mailnews patch.',0.00,0,0,1265765,0,NULL,0),(12911,19345,'2002-04-06 22:50:38','A couple quick comments on this:\n\n1) Anything that currently uses a file path that is within the user\'s profile\ndirectory needs to be converted to use a relative path, but absolute paths\nshould also be allowed. For example, \"ImapMail/mail/rules.dat\" vs\n\"/var/foo/mail/rules.dat\". Perhaps this could be implemented as\nresource://profile/ImapMail/mail/rules.dat vs file:///var/foo/mail/rules.dat? \nWould that be a bad idea?\n\n2) From a UI perspective, I think the user should be shown only absolute paths,\nand they should be converted to relative paths if they are within the profile\ndir. The average user won\'t notice a difference, until they move their profile\ndir and find that everything still works.\n\n3) Mac OS uses \":\" as a path seperator and \"/\" is a valid character in a\nfilename. If we\'re storing paths as URLs, \"Folder:file/name.txt\" can just be\nencoded as \"Folder/file%2Fname.txt\" which probably already works in file://\nURLs. Obviously a filename like that isn\'t portable to Windows, but that\'s not\nMozilla\'s problem.\n\n4) I think the ability to copy a profile between platforms is REALLY cool. \nAnything referencing an absolute path will break, but that should only be things\nthe user has explicitly defined (and thus is aware of). If a Windows user keeps\nhis IMAP data at qb:\\Imap\\, he\'ll be expecting Mac OS not to be able to find it\nthere if he moves his profile over, and he\'ll know he needs to change the path\nmanually. However, if he keeps everything in the default locations, he should\nbe able to boot Linux and point Mozilla to \"/mnt/windows/Documents\\ and\\\nSettings/username/Application\\ Data/Mozilla/Profiles/default/a1b2c3d4.slt\" and\nhave everything work perfectly. That would rule.',0.00,0,1,1267112,0,NULL,0),(12911,5834,'2002-04-06 23:02:28','FWIWk, I really think the mailnews prefs need to be able to use both relative\nand absolute paths.',0.00,0,1,1267121,0,NULL,0),(12911,18780,'2002-04-08 05:45:19','>3) Mac OS uses \":\" as a path seperator and \"/\" is a valid character in a\nfilename. If we\'re storing paths as URLs\n\nThat\'s taken care of in the current patch and, no, URLs are not being used.\n\n\n> 1) Anything that currently uses a file path that is within the user\'s profile\ndirectory needs to be converted to use a relative path, but absolute paths\nshould also be allowed.\n\n> FWIWk, I really think the mailnews prefs need to be able to use both relative\nand absolute paths.\n\nThe current patch does that.\n\nCan people refrain from this sort of comment unless they\'ve read the patches and\nknow what they do?',0.00,0,1,1268353,0,NULL,0),(12911,16235,'2002-04-08 09:15:41','really adt1.0.0+ this time!',0.00,0,0,1268634,0,NULL,0),(12911,5834,'2002-04-08 09:30:48','Re: Comment #126\n\nConrad, perhaps I should have referenced Comment #117 in the original comment. \nI can read the patches, I know what they are doing. It seemed like a fairly\nlarge dissenting voice, to not do the diffs to the mailnews area, and I thought\nI would chime up, in favor of the changes not that my voice matters much.',0.00,0,1,1268656,0,NULL,0),(12911,18780,'2002-04-09 07:29:10','Prefs and xpcom patches are landed. As soon as I can make test builds on all\nplatforms with the mailnews patch which makes use of this, that tests well, adt\nwants it, this could be fixed. ',0.00,0,1,1270708,0,NULL,0),(12911,18780,'2002-04-11 17:28:48','The part of this which was adt1.0.0+ (the facility for having XP relative file\ndescs) is in so I\'m calling it fixed.\n\nThe new bug which will have mailnews use this (and actually do some good) is bug\n137006. ',0.00,0,1,1276615,0,NULL,0),(6810,4432,'2002-05-14 02:07:19','Updating summary, this is PostScript-module only; feature is working in Xprint\nmodule...',0.00,0,1,1340652,0,NULL,0),(12911,29655,'2002-05-20 00:49:47','*** Bug 139514 has been marked as a duplicate of this bug. ***',0.00,0,0,1350630,0,NULL,0),(12911,4395,'2002-06-04 11:55:39','verified code fixes',0.00,0,0,1378957,0,NULL,0),(12911,16235,'2002-06-04 13:43:08','If this was verified on 1.0.0 or 1.0.1, pls add the keyword vefified1.0.0 or\nvefified1.0.1. thanks!',0.00,0,1,1379210,0,NULL,0),(12911,8020,'2002-06-05 09:17:10','For better understanding:\n1. Will this bug fix old profiles? Will old profiles be \"converted\"?\n2. What are the *filenames* where the pathname is now stored as \"relative\"?\n3. What are the things that users can *do*, now that this bug is fixed?',0.00,0,1,1380884,0,NULL,0),(12911,35848,'2002-06-05 10:03:26','-> 3. Users can\n\n(a) move their profile directories *without* getting all of their mail folders\nlost (=> without having to correct all related path settings manually)\n\n(b) use their profile directories across different os. this was impossible as\nlong as idividual mail folder paths were given as absolute names\n(e:\\mozilla\\mail\\mymail... not working under linux, /home... not under windows etc.)\n\njust read the comments to find more problems described that ware issued by this bug.',0.00,0,1,1381024,0,NULL,0),(12911,18780,'2002-06-05 10:21:22','Sorry, what was checked in from this bug offers no gain whatsoever to the end\nuser. See comment 117. That was the consensus - to check in the portion which\nprovided the facility of XP relative paths in the codebase but not the mailnews\ncode which would make use of the facility. That portion was split off into bug\n137006 so that the part of this bug which had adt approval (prefs and xpcom)\ncould be closed out. Probably, when this was still on adt radar, it should have\nbeen re-summarized as \"Add support for XP relative paths\" and 137006 should have\nbeen given this bug\'s summary. I think it\'s better just to move along to bug 137006.',0.00,0,1,1381059,0,NULL,0),(2586,12280,'2002-07-07 14:13:21','Not really sure if bug 133808 is a dupe of this bug, the former involves\nchanging orientation in Print Preview and GIFs becoming reanimated (but only on\npages with frames). I was able to verify this behavior on trunk build\n2002070708 under Windows 98. Would bug 2586 need to be reopened for this\nspecial case?',0.00,0,1,1434534,0,NULL,0),(12911,62773,'2002-08-12 13:06:25','This is not fixed. I\'ve been using Mozilla a few months, starting with a 0.9\nrelease, moving to 1.0 and finally 1.1\n\nHear my saga...\n\nI run a home business and we had set up all the Windows98 computers to save all\nuser data to an NT server. This means everything, the MyDocuments folder,\nFavorites for IE, Navigator profiles, Outlook email folders, etc. The reason we\ndid this is because I don\'t want work stopping because a computer is fubar\'d (we\ncan\'t ghost easily because each machine ahs different hardware - we\'re using a\nlot of used equipment). If I have a work deadline, and my machine gets toasted,\nI need to be able to move to another machine, login and have everything, and go\nto work ASAP. All our machines were setup so anyone could login and work on any\nof them as needed.\n\nWhen we decided to move to Mozilla for browsing, mail, news and calendaring, we\nset up all the profiles on the same server. At the same time, we set up our own\nIMAP on a Redhat server and gathered our email via fetchmail and pointed to our\nIMAP server. This worked great. Even in the field with a laptop (different\nprofile, of course), I just hit my IMAP server and had access to all my email.\n\nThen we moved to a very rural location where we could not get cable, DSL or\nwireless. Being back on dial-up meant I could not access our IMAP server away\nfrom home. So I reconfigured Mozilla to grab my email via POP, turned off\nfetchmail, and manually moved all my email from the IMAP folders to the newly\ncreated Mozilla mail folders via the mail-and-news application. \n\nI did this on a stationary PC at home. I then copied the profile to my laptop.\n Since Mozilla was entirely fubar\'d, and a reinstall didn\'t help, I rebuilt my\nlaptop from scratch. Then I then wrote a little DOS batch file to copy the\nentire profile from my home box (which is on a network server) to my laptop\nmanually and vice-versa (and copy a few other things I need).\n\nBasically, it took me over a week, and way more research than was necessary, to\nfix my laptop due to all the absolute paths in various files within the profile.\n In spite of folders for each POP address already present, Mozilla made new ones\nand I had to manually change the directory in each case.\n\nIt\'s taken me scores of hours to get Mozilla working properly on both boxes, and\nmy batch files are about ten times longer than necessary since I have to specify\nthe exact path of every single file to be copied (now that I know which are safe\nto copy and which are not). \n\nAnd once that was working properly, Mozilla crashed on every form submission (an\n*entire* crash of all applications) due to some problem with copying the .w and\n.s files.\n\nAt a minimum, the location of the main profile directory needs to exist in one\nhuman-editable file... all other paths should be relative to it. \n\nAnd frankly, the profile manager should have a button to click to copy a profile\nfrom wherever it actually is to *exactly* the directory where I want it to be -\nand auto-convert anything that eneds to be converted. \n\nI should not have needed to learn this much about Mozilla and what all the\nspecific files do in order to copy a profile. It\'s been a bit much, and I can\'t\nsee the average user going through all this. And it makes Mozilla look bad, my\nco-workers know I am the only Mozilla person around, and also know I have been\nunable to do my email at work for a few weeks now.\n\nI\'m not writing to criticize, I don\'t know enough programming to actually help.\n Sorry. I\'m writing to clarify the types of issues that come up. I need to\nstore my profile on a server *and* on a local machine *and* be able to\nsynchronize the two. I\'ve been using Mozilla just a couple months and this\nreally drove me crazy to the degree of thinking seriously about going back to IE\nand Outlook (god forbid!) I can\'t go back now, I have learned too much. ;)',0.00,0,1,1492942,0,NULL,0),(12911,18780,'2002-08-12 13:41:19','Jackie, read comment #136.',0.00,0,0,1493046,0,NULL,0),(12911,4395,'2002-08-13 08:48:25','v',0.00,0,1,1494337,0,NULL,0),(12911,9700,'2002-08-14 23:54:38','Have you read the comments for bug 12911 ? Could be a bug caused by solving bug\n12911',0.00,0,1,1497248,0,NULL,0),(2586,12280,'2002-08-18 19:15:03','Bug 133808 still exists in Win98 build 2002081716 and seems quite related to\nthis bug, so I\'m reopening it...',0.00,0,1,1502163,0,NULL,0),(11040,4080,'2002-11-05 18:36:19','mozillamail@myrealbox.com - when you added yourself to the cc: list, you cut off\nthe summary. Restoring summary.',0.00,0,0,1622274,0,NULL,0),(11040,27980,'2002-11-06 16:42:21','Very odd. Nonetheless, sorry! I\'ll be more careful.',0.00,0,0,1624018,0,NULL,0),(178960,48391,'2002-11-07 14:54:52','Time announcements should at least include the GMT offset.\n\nNotes like the one that was being shown at 20:06 BRDT (GMT -02:00) \"Bugzilla\nwill be down for an upgrade on Friday, November 8 from 6:00PM to midnight PST\"\nmeans almost nothing to me. It only means that sometime in between November 8\nand 9 Bugzilla will be down. I don\'t know what does \"PST\" mean, and, honestly, I\ndon\'t care, nor will you care what does \"BRDT\" mean, now you have the GMT\noffset. So, the announcements should look like the following ( <> means optional):\n\n(1)\"This bug is being written at 20:46 (GMT - 02:00)\"\nor\n(2)\"This bug is being written at 20:46 (22:00 GMT)\"\nor, using am/pm:\n(3)\"This bug is being written at 08:46 pm (GMT - 02:00)\"\nor\n(4)\"This bug is being written at 08:46 pm (10:00 pm GMT)\"\nor even only GMT:\n(5)\"This bug is being written at 22:46 GMT\"\nor\n(6)\"This bug is being written at 10:46 pm GMT\"\n\nMy personal vote is for (2) or (5).',0.00,0,1,1625571,0,NULL,0),(178960,27300,'2002-11-07 15:22:31','I did (3).',0.00,0,0,1625627,0,NULL,0),(3140,59276,'2002-11-25 04:02:46','I confirm everything said in comment #29. Attachment 63566 WFM without a\nproblem. XP Pro SP1 and build 2002112204.',0.00,0,1,1649983,0,NULL,0),(11040,46544,'2002-12-09 11:30:00','*** Bug 184391 has been marked as a duplicate of this bug. ***',0.00,0,0,1670151,0,NULL,0),(11040,46544,'2002-12-12 12:06:29','*** Bug 185016 has been marked as a duplicate of this bug. ***',0.00,0,0,1675020,0,NULL,0),(11040,46544,'2002-12-12 12:31:13','Reassigning to correct component (I think) - maybe that way this might get some\nattention too...',0.00,0,1,1675051,0,NULL,0),(11040,9136,'2002-12-12 13:32:48','Restoring old assignment, component and CC: fields. ',0.00,0,0,1675115,0,NULL,0),(11040,31814,'2002-12-13 00:31:46','Maybe this should be in mail notidication component anyway (I was responsible\nfor the 185016 dupe, just because I was looking for this feature in the \'mail\nnotification\' component (which would make more sense from a user point of view)',0.00,0,1,1675856,0,NULL,0),(3140,17252,'2003-01-08 17:23:03','wfm based on coments, and the last testcase. ',0.00,0,0,1702923,0,NULL,0),(11040,46544,'2003-02-05 16:01:57','*** Bug 162780 has been marked as a duplicate of this bug. ***',0.00,0,0,1735262,0,NULL,0),(2586,11171,'2003-02-10 16:11:38','Now that bug 133808 is confirmed as fixed, this can be closed as well.',0.00,0,0,1740227,0,NULL,0),(3140,17252,'2003-02-14 10:00:28','verifying',0.00,0,1,1745835,0,NULL,0),(12911,51898,'2003-03-07 07:37:45','Please change someone the summary as mentioned in comment 136. It\'s confusing.',0.00,0,0,1770985,0,NULL,0),(11040,46544,'2003-03-28 16:35:25','*** Bug 199697 has been marked as a duplicate of this bug. ***',0.00,0,0,1798224,0,NULL,0),(13534,46638,'2003-04-30 15:00:16','Are there any news regarding this bug? (Last comment is from November 2001)\n',0.00,0,1,1834106,0,NULL,0),(13534,10297,'2003-05-01 23:09:55','They\'ve already been removed (via local hack) at mozilla.org :-)\n\nSomeone was going to do custom resolutions at some point, at which time this\nwould get removed from the defaults on new installations and existing\ninstallations could feel free to delete them (see the dependency).\n\nBut I haven\'t seen any action there in a while either. Matty?',0.00,0,1,1835703,0,NULL,0),(11040,29552,'2003-05-24 07:41:22','*** Bug 206983 has been marked as a duplicate of this bug. ***',0.00,0,0,1860470,0,NULL,0),(11040,43202,'2003-05-24 11:00:18','Nothing seems to be happening with this bug. The way I see it, although this is\nmarked as enhancement, this is a major pain in the ass, whoever is using filters\nto weed out junk mail. Mozilla has an excellent Junk Mail Control right now, I\nam really really happy with it. Except now I keep getting these mail\nnotifications, when I go check I don\'t see any mail, because it has been moved\nto Junk folder. It will be really really nice to have this\n',0.00,0,0,1860618,0,NULL,0),(6810,34853,'2003-06-03 22:37:50','It looks like this should be fairly easy to implement. Simply extend\nnsPostScriptObj::settitle() to set an environment variable holding the document\ntitle (say MOZ_DOCUMENT_TITLE), with code similar to that used to set\nMOZ_PRINTER_NAME in nsPostScriptObj::Init(). As with the Xprint code, the title\nwould need to be converted from UCS2 first.\n\nThen it is a simple matter of modifying print.postscript.print_command in\nunix.js to include \'-J \"${MOZ_DOCUMENT_TITLE}\"\' in the print command.',0.00,0,1,1870277,0,NULL,0),(11040,57902,'2003-09-29 07:07:33','*** Bug 220461 has been marked as a duplicate of this bug. ***',0.00,0,0,1968757,0,NULL,0),(11040,57902,'2003-09-29 07:09:11','Updating component, because I missed finding this when looking for the dupe of \n220461.',0.00,0,1,1968758,0,NULL,0),(11040,119363,'2003-11-14 18:21:17','As written, this strikes me as an overly complex solution to the problem. The problem as I see it is \nthat when junk arrives, even if you have the Junk Mail Controls set to move it to a junk folder, you \nstill get the same notification that you would if it weren\'t junk.\n\nIf you want a whole extra feature that lets you finely control the relationship between filters, that\'s \nmore complicated. But how about a simple change to notification that makes ti ignore messages \nthat have been marked as junk? And add a checkbox to the Junk Mail Controls window that turns \nthis behavior on or off.',0.00,0,0,2005701,0,NULL,0),(11040,31814,'2003-11-17 00:37:51','Well, junk is one part, but mailinglists are, for me, just as big of a problem.\nI\'ve got several mailinglist generating, in total, hundreds of messages a day\n(more than the amount of spam I receive). I don\'t want to be notified of those\neither. ',0.00,0,1,2007593,0,NULL,0),(11040,57902,'2003-11-25 09:52:29','*** Bug 226745 has been marked as a duplicate of this bug. ***',0.00,0,0,2014370,0,NULL,0),(12911,16008,'2003-12-29 07:28:55','a quote from http://www.mozilla.org/unix/customizing.html#key_example\n> For editor and browser windows, create a file called userHTMLBindings.xml and \n> link it into res/builtin wherever mozilla is installed on your machine. \n> (Eventually we want this to live in the user\'s chrome directory, but that doesn\'t \n> work yet; watch bug 12911 for progress on this. We recommend, for now, that you \n> keep the real user bindings file in your chrome directory and make a symbolic \n> link (=shortcut on Windows, alias on Mac) from there to res/builtin.)\n\nthis bug is supposedly fixed (though bug 201011 is not), \nand that should be reflected in the documentation on that page.\nthe current text is confusing, mentioning this bug is not needed.',0.00,0,1,2036072,0,NULL,0),(13534,10297,'2004-01-04 13:22:05','Taking Jake\'s bugs... his Army Reserve unit has been deployed.',0.00,0,0,2039473,0,NULL,0),(6810,35075,'2004-01-19 18:31:51','This patch sets MOZ_DOCUMENT_TITLE to the title of the document (duh), using\nnsIPlatformCharset and nsIUnicodeEncoder to convert from PRUnichar to native\nencoding.\nIt does _not_ make it suitable for inserting in a command line, so the patch is\nnot ready for checkin.\nJust looking for some feedback.\n\n(This is also my first c++-ish patch, so there may well be horrible things in\nit.)',0.00,0,1,2051737,5,'139469',0),(6810,34853,'2004-01-20 21:43:40','In what way is the environment variable set by the patch not suitable for use on\na command line? The whole point of using an environment variable here (as\nopposed to substituting in the document title directly) is so it can be used on\nthe command line without worrying about shell quoting issues.\n\nThe shell should just pass \"${MOZ_DOCUMENT_TITLE}\" to lpr as a single argument\n(unevaluated), no matter whether it includes spaces, quotes, dollar signs or\nother punctuation. You can test this quite easily with a few Python scripts,\nfor example:\n\n--- Start printargs.py ---\n#!/usr/bin/python\nimport sys; print sys.argv\n--- End printargs.py ---\n\n--- Start call-system.py ---\n#!/usr/bin/python\nimport os\nos.environ[\"MOZ_DOCUMENT_TITLE\"] = \"abc def \\\" \\\" `echo foo` $USER\"\nos.system(\"./printargs.py \\\"${MOZ_DOCUMENT_TITLE}\\\"\")\n--- End call-system.py ---\n\n(I chose Python here because it doesn\'t do any special substitutions in strings\nitself). If you run the second program, it should show that the first was\ncalled with only a single argument and none of the potentially evil characters\ngot touched.',0.00,0,0,2052827,0,NULL,0),(6810,35075,'2004-01-21 09:18:23','Ok, let me rephrase that, I did not check it to be suitable for use in a command\nline. (=\nI think we should at least check it\'s length before passing it to system.\n\nIf that\'s not a problem, we still have the design issue, setting environment\nvariables is not a particulary nice way to do this. One solution could be to set\nthe variables on the same command line (\"MOZ_PRINTER_NAME=sumthin\nMOZ_DOCUMENT_TITLE=\\\"a title\\\" lpr \").\n',0.00,0,0,2053198,0,NULL,0),(6810,10982,'2004-01-21 12:39:11','When you do that, why not \n \n lpr -T$(title) \n \n? When Mozilla prints the page, it could expand some variables (like $(title), \n$(url), $(date)) in the command which would allow for some very sophisticated \nthings. \n \nAs for whitespace and variable processing (example: The title of the document \nis \"make $$$ fast\" -> \"lpr -Tmake $$$ fast\"), mozilla should first split the \nprint command into words (space delimited) and then call execv(const char \n*path, char *const argv[]);. ',0.00,0,1,2053347,0,NULL,0),(6810,35075,'2004-01-21 13:13:07','re #31:\nProblem is, we don\'t want to pass on -T if there is no title, just as we don\'t\nwant to pass -P if we don\'t want to specify a printer.\n\n> which would allow for some very sophisticated things. \nSophistication is not the goal here, IMHO. Simple, clean code is. Right now\npopen()/system() or whatever seems to be a lot simpler than exec*(). Let /bin/sh\ndo the dirty work instead of us reinventing the wheel.',0.00,0,1,2053385,0,NULL,0),(11040,9186,'2004-02-10 14:19:45','A suggestion (don\'t know if this is hard to imlpement or not) is to have the\nability to mark a folder as \"don\'t send biffnotifications for this folder\". That\nway you could set up such a folder for your mailinglist or whatever you want to\nnot be notified and create a filter to move messages to that folder.\n\nFor me that would even allow me to not use filters at all since my imap server\nsorts messages for me.\n\nThis could also solve bug 91498 since you could just mark the trashfolder with\nthis flag.',0.00,0,1,2070406,0,NULL,0),(11040,5671,'2004-02-12 21:52:33','as of bug 206050 this can be done with filters\n\nis this now fixed, wfm or wontfix?',0.00,0,1,2073143,0,NULL,0),(11040,4410,'2004-02-12 21:54:30','no, this is separate from bug 206050 - you might want the filtered message to\nremain unread, but not trigger biff.',0.00,0,1,2073145,0,NULL,0),(11040,62128,'2004-03-14 10:11:13','I special notification (sound f.e.) should be available for newsgroups, too.',0.00,0,0,2101171,0,NULL,0),(13534,10297,'2004-03-14 23:17:26','Enhancements which don\'t currently have patches on them which are targetted at\n2.18 are being retargetted to 2.20 because we\'re about to freeze for 2.18. \nConsideration will be taken for moving items back to 2.18 on a case-by-case\nbasis (but is unlikely for enhancements)',0.00,0,1,2101645,0,NULL,0),(11040,44845,'2004-05-24 04:08:48','This would solve bug 91052 , too, I think. Duplicate?!',0.00,0,0,2158488,0,NULL,0),(11040,57902,'2004-05-24 08:09:56','This might not solve bug 91052, depending on the implementation. I suspect that \nthis bug would be fixed by having the filter action reduce the count of \n\"messages requiring notification\" and after all messages were processed, Moz \nwould only notify if the count were greater than zero. Since there is currently \nno notification for newsgroups, such an action wouldn\'t change the behavior \nthere.',0.00,0,0,2158607,0,NULL,0),(248970,144221,'2004-06-28 16:30:15','User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040615 Firefox/0.9\nBuild Identifier: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040615 Firefox/0.9\n\nIn the next version of OS X, Safari will have a \"Private Browsing\" mode which,\nbasically, disables writing to cache, URL history, etc.\nI think this is a good idea, and it\'s small and useful enough that it should go\ninto the browser, not an extension.\n\nReproducible: Always\nSteps to Reproduce:',0.00,0,0,2188772,0,NULL,0),(248970,96908,'2004-06-28 17:23:18','So basically, implement some sort of universal pref to toggle all of the various\ncache/cookies/etc off without opening prefs? I don\'t know if this deserves a\ntoggle in this manner, or how practical that is.\n\nmorphing summary to describe what this actually does in Safari (whenever Tiger\ncomes out)\n\nThe flipside to this is the plan to have Ctrl-Shift-C act as a global privacy\nclear option, so that if you want to clear a certain group of things, you can\nset it to do that.\n\n',0.00,0,0,2188806,0,NULL,0),(248970,144221,'2004-06-29 02:18:39','(In reply to comment #1)\nNo, more like a \"don\'t remember what I\'m doing now\" toggle, which would allow\nbrowsing sites without cookies/history/cache being written to. This would allow\nusers to do any privacy-sensitive browsing (online banking on a public computer,\nshopping for gifts on the family computer, etc.) without having to completely\nclear history/cache/cookies afterwards. This is more useful because when\nclearing all privacy sensitive material you would loose for example login\ncookies for other sites, the complete history which may contain useful items,\nand all of the cache making browsing slower until the cache is refilled.\nPrivacy mode is also more complicated than a global privacy clear option, as it\nmeans cookies and history would have to be moved to a two-layer memory/disk\nmodel like cache, and individual items would need to have a flag that prevents\nthem to move from memory to disk. This is necessary beause the browser would\nstill need to handle cookies and history, just not write them to disk\ncompletely. I\'m not sure wether this can be done in an extension at all.',0.00,0,1,2189080,0,NULL,0),(248970,11608,'2004-06-29 10:07:24','See also bug 155300 (guest profiles) and bug 103765 (anonymous mode).',0.00,0,0,2189453,0,NULL,0),(11040,57902,'2004-08-18 13:54:42','*** Bug 237938 has been marked as a duplicate of this bug. ***',0.00,0,0,2236067,0,NULL,0),(13534,10297,'2004-09-18 18:08:16','Bugzilla 2.20 feature set is now frozen as of 15 Sept 2004. Anything flagged\nenhancement that hasn\'t already landed is being pushed out. If this bug is\notherwise ready to land, we\'ll handle it on a case-by-case basis, please set the\nblocking2.20 flag to \'?\' if you think it qualifies.',0.00,0,1,2264923,0,NULL,0),(248970,69136,'2004-10-02 11:57:54','*** Bug 260266 has been marked as a duplicate of this bug. ***',0.00,0,0,2280922,0,NULL,0),(248970,49640,'2004-10-21 03:26:08','would be a great addition for Firefox, esp. if you have to use a public Terminal\n\n(and it would be great for the Mac 1.0 to have this feature before safari gets it)\n\nbtw: shouldnt this be moved to browser, since the suite could use this too?',0.00,0,0,2301299,0,NULL,0),(12911,15150,'2004-10-29 07:03:45','(In reply to comment #142)\n> this bug is supposedly fixed (though bug 201011 is not), \n> and that should be reflected in the documentation on that page.\n> the current text is confusing, mentioning this bug is not needed.\n\nI\'ve raised bug#266695 about updating the key binding customisation docs\n\n',0.00,0,1,2310723,0,NULL,0),(12911,3858,'2004-10-29 18:41:15','Conrad: could you or someone else involved with the patch explain how these\nprofile-relative paths are used? Is it a resource://MagicVar url, or something\nelse? I didn\'t get a response asking in bug 201011, but the xbl key binding\ncode needs to be fixed to reference a profile-relative file in order to fix that\nbug.',0.00,0,1,2311468,0,NULL,0),(12911,15223,'2004-10-31 16:39:22','akk: they kinda look like this:\n\nmail.server.server4.directory-rel\n[ProfD]../../../../../../../Documents and Settings/user/Application\nData/Mozilla/Profiles/default/random.slt/ImapMail/127.1\nmail.server.server4.directory\nC:\\Documents and Settings\\user\\Application\nData\\Mozilla\\Profiles\\default\\random.slt\\ImapMail\\127.1\n\nEspecially when the code messes up, as it clearly did here.\n\nA better version would be:\nmail.server.server4.directory-rel\n[ProfD]ImapMail/127.1\n\nexcept, that the code is clearly not working well (fixing it is on my todo list).\n\nnote that code has to specifically pick a pref and treat it as a Complex pref w/\na certain type (nsIRelativeFilePref)',0.00,0,1,2313296,0,NULL,0),(248970,96908,'2004-11-18 07:27:36','If Browser needs a bug for it too, great, file a bug there. No one still\nworking/triaging Seamonkey really cares about Firefox.',0.00,0,1,2334100,0,NULL,0),(11040,152096,'2004-12-06 14:59:52','I am surprised with 40+ votes this bug hasn\'t seen any bugzilla activity in\nseveral months. I am using 0.9, and this is the one thing about TB that\nirritates me right now. I am on a mailing list for school with a pop3 account.\n I have to be on this list, and I have to read this mail occssionally, so I\ncan\'t just delete it. Currently, I mark it as junk and filter it to its own\n\"listserv\" folder (different than a general junk/spam folder). However, 90% of\nmy new mail notifications are this dumb listserv, which doesn\'t need my\nattention but once every few days. I would expect that a message flagged as\njunk should *not* notify the user the email has arrived. It is, afterall, \"junk\".',0.00,0,1,2353890,0,NULL,0),(11040,76735,'2005-01-11 23:14:00','I totally agree with orion. I also searched for bugs with as many votes as this\none (46 today), and only found around 150 such bugs (in all of bugzilla) - so\nhow can such a bug just lie there for over 5 years?\n\n(In reply to comment #26)\n',0.00,0,1,2383731,0,NULL,0),(11040,123868,'2005-01-18 11:28:59','*** Bug 216624 has been marked as a duplicate of this bug. ***',0.00,0,0,2389869,0,NULL,0),(11040,83436,'2005-02-05 09:42:35','After having users wait over 5 years for a solution, I\'ll take a stab at\ndefining the problem and proposing a potential solution. This is all I can\ncontribute since I know very little about coding stuff for T-bird. I keep\nrevisiting the bug because the current notification system is worthless to me\nbecause of spam and mailing lists.\n\nObservations:\n\nFirst, it appears the notifications are simply a result of receiving any new\nmessages -- this check apparently is done prior to any processing. In order to\nprevent unwanted notifications the check would have to be moved to after\nfiltering stage. Also it appears the mail is first loaded into the Inbox, then\nfiltered.\n\nOne possible solution is:\n\no Move notifications check to later stage\no When new mail is available first note the old inbox size and/or time stamp.\no Set alert flag to false\no Add filtering options for disable alerts.\no When processing filters, set flag to true as appropriate\no Compare the inbox size and/or time stamp. If these have changed then\n set the alert flag to true.\no Now if the alert flag is true then notify per the general preferences\n settings.\n\nLet\'s get feedback then hopefully someone is willing to pick-up the coding.\n\n\n-Noel',0.00,0,1,2407000,0,NULL,0),(11040,83436,'2005-02-05 09:49:07','Change flag to counter, since I just realized the notification show the number\nof new messages. The counter would be increased for each new message in the\nfilter stage and in the later inbox new message count stage.\n\n\n-Noel',0.00,0,1,2407007,0,NULL,0),(11040,29552,'2005-02-22 12:31:26','*** Bug 283196 has been marked as a duplicate of this bug. ***',0.00,0,0,2422241,0,NULL,0),(6810,61337,'2005-03-07 13:42:13','This bug hasn\'t had activity for quite a few months, so excuse me if I\'m\ndigging up a corpse. But I wanted to add that this feature would be extremely\nuseful for people who print to community printers. These print systems, which\nare used by hundreds or thousands of people, often print cover pages which\ninclude the job title (along with the print date, user name, etc.). Right now,\nthe job title is nondescript (to be exact, it says \"stdin\"). I can see this as\na particular inconvenience for users at universities (as myself) and\nbusinesses, among others.\n\nI\'ve attached an update to the previous patch, so that it applies cleanly.\nUnfortunately, I\'m not at all qualified to back up its validity. Just hoping I\nmight encourage someone else who knows better.',0.00,0,1,2437308,5,'176614',0),(6810,35075,'2005-03-07 16:21:33','obsoleted by new patch',0.00,0,1,2437523,6,'139469',0),(6810,35075,'2005-03-07 16:32:53','(In reply to comment #33)\n> This bug hasn\'t had activity for quite a few months, so excuse me if I\'m\n> digging up a corpse. \n\nThe reason I didn\'t push my patch was that Someone was rewriting the ps module.\nRight now it\'s sort of messy, with lots of global variables, env variables,\netc.. Which makes it impossible to print several documents simultaneously and\nstuff. My patch added more globals and sort of made the change to a new ps\neven harder, so I dropped it.\n\nNow it seems like nobody cares(?) about postscript, so maybe some \"bad\" code to\nfix a problem is the way to go. I still think somebody should check it for \nsecurity reasons, though. (The XXX in the patch.)\n',0.00,0,1,2437541,0,NULL,0),(6810,34853,'2005-03-08 00:25:45','I think the XXX can be removed. Since the document title is in an environment\nvariable, if the print command is written appropriately, the string shouldn\'t\nget interpreted by the shell.\n\nThe appropriate print command would look something like this:\n\n lpr ${MOZ_PRINTER_NAME:+\'-P\'}${MOZ_PRINTER_NAME} \\\n -T \"${MOZ_DOCUMENT_TITLE:-Mozilla: Untitled Document}\"\n\nThis way, lpr will be passed 2 or 3 arguments (depending on whether\n$MOZ_PRINTER_NAME is set), no matter what characters are in $MOZ_DOCUMENT_TITLE\n(it also provides a slightly nicer document title in the case where no title is\nset).',0.00,0,1,2437913,0,NULL,0),(123203,15223,'2005-03-18 15:28:50','at some point my company is going to try to force http to use some other impl of\nnsIURI. we don\'t want to have to reimplement http or all of necko, we like\nmozilla, but this would be fairly bad for us.',0.00,0,0,2448640,0,NULL,0),(11040,198208,'2005-04-28 00:51:00','*** Bug 292087 has been marked as a duplicate of this bug. ***',0.00,0,0,2488623,0,NULL,0),(248970,198492,'2005-04-28 14:05:14','See http://live.gnome.org/Epiphany_2fFeatureDesign_2fPrivateBrowsing for a\ndiscussion related to this.',0.00,0,1,2489213,0,NULL,0),(6810,5077,'2005-04-28 16:38:22','(In reply to comment #35)\n> Now it seems like nobody cares(?) about postscript, so maybe some \"bad\" code to\n> fix a problem is the way to go. I still think somebody should check it for \n> security reasons, though. (The XXX in the patch.)\n\nActually, I\'m hoping to work on this during the gecko 1.9 development cycle, by\nadding a print job class that can construct an lpr command rather than just\nsetting some environment variables and launching an opaque command. See bug\n135695 comment 20.\n\nI\'d prefer not to add any more environment variables to the classic printing\nsupport, though I\'m not absolutely opposed to it. Any new code should definitely\nsupport multiple simultaneous print operations though, which means treating the\nenvironment as a shared resource. If you want to pursue this, you should look at\ngfx/src/ps/nsPrintJobPS.cpp, specifically the nsPrintJobPipePS class and the\nenvironment-handling functions toward the end of the file.',0.00,0,1,2489402,0,NULL,0),(248970,128546,'2005-05-10 04:34:07','It is an extremely useful feature specifically for internet cafes or machines\nwhich are used by multiple users with the same login or even for the security\nparanoid. It is not that difficult to implement either. Definately something I\nwould be keen to see and would be one less feature safari has that we don\'t.',0.00,0,1,2498195,0,NULL,0),(6810,35075,'2005-06-26 17:32:13','Hopefully this should work with multiple simultaneous print jobs.\nBut it\'s a one-night-job so please be merciful. (:\nAdding a global here, for unicode->native charset(locale) conversion of title. ',0.00,0,1,2536391,5,'187366',0),(6810,35075,'2005-06-26 17:34:07','also changed the lpr and lp lines as in comment #36.',0.00,0,0,2536392,0,NULL,0),(6810,35075,'2005-06-27 02:39:27','',0.00,0,1,2536554,5,'187379',0),(6810,5077,'2005-06-29 13:37:55','Alge,\n\nTo start with, I think it\'d be better design to set MOZ_DOCUMENT_TITLE for\nevery print job, rather than setting it only for jobs that have a title. In\nreality, virtually every print job has a title, so I\'d rather not junk up the\nmodel command line with the fallback title logic. Also, the fallback title\nshould not contain \"Mozilla\"; see bug 293268 and bug 285696.\n\nIt looks like you\'re leaking the unicode encoder object. EnvLockInit()\nunconditionally creates a new encoder for every print job, and it\'s not freed\nanywhere. Also, based on other uses of unicode encoders, it looks like you\nshould set the encoder\'s error behavior with SetOutputErrorBehavior().\n\nI don\'t know how large this encoder object is, or how expensive it is to\ninitialize it. I also don\'t know if it\'s possible for the local character set\nto change while mozilla is running. I suspect it\'d be better to allocate an\nencoder for each print job, rather than allocating it once and caching it for\nreuse. If you take that route, you should store the encoder in an nsCOMPtr<>\ninstead of a raw pointer.\n\nPersonally, I think I\'d do the character set conversion inside of\nSetJobTitle(), and then substitute the fallback title in StartSubmission() as\nis done with the CUPS logic. SetJobTitle() has to be threadsafe, so if I were\nusing a cached encoder I\'d do the whole thing in StartSubmission().\n\n\n>-/* Routines to set the MOZ_PRINTER_NAME environment variable and to\n>- * single-thread print jobs while the variable is set.\n>+/* Routines to set the MOZ_PRINTER_NAME and MOZ_DOCUMENT_TITLE environment variables \n>+ * and to single-thread print jobs while the variable is set.\n> */\n\nCould you format your code to fit in 80 columns where it\'s not inconvenient?\nAlso, \"the variable is\" should be \"these variables are\".\n\n\n>+ nsresult res = gNativeEncoder->GetMaxLength(PromiseFlatString(aTitle).get(), srcLength, &destLength);\n>+ if( NS_SUCCEEDED(res) ) {\n>+ nativeTitle = NS_STATIC_CAST(char*, nsMemory::Alloc(destLength+1));\n>+ if(nativeTitle) {\n>+ gNativeEncoder->Convert(PromiseFlatString(aTitle).get(), &srcLength, nativeTitle, &destLength);\n>+ }\n>+ }\n>+ \n>+ if(!nativeTitle)\n>+ return PR_FAILURE;\n>+\n>+ /* Make sure title is null-terminated */\n>+ nativeTitle[destLength] = \'\\0\';\n>+ \n>+ /* Construct the new environment string */\n>+ char *newVar = PR_smprintf(\"%s=%s\", EnvJobTitle, nativeTitle);\n>+ if (!newVar)\n>+ return PR_FAILURE;\n\nIf you leave the character set conversion in this function, could you avoid\ndoing two separate memory allocations here? You could make your first\nallocation large enough for the full environment string, or you could just\nconvert into a fixed-size buffer on the stack. It wouldn\'t be a big deal if\nlong titles were truncated.',0.00,0,1,2538988,6,'187379',0),(13534,5603,'2005-07-12 08:30:05','Since we continue to release bugzillas with this embarassing bug, and bug 94534\ndoesn\'t seem to be going anywhere. So attached are some patches. They don\'t\nhandle the upgrade path for reports and such; I\'m not sure what that would look\nlike. But applied, they\'d at least remove them from fresh installs, which seems\nlike a step.\n\n[And yes, these patches are brain-dead simple, but... something has to jumpstart\nthis.]',0.00,0,1,2549549,0,NULL,0),(13534,5603,'2005-07-12 08:34:24','Probably worth pointing out that we basically don\'t even document REMIND +\nLATER, just one note in the dia diagram. If this group of patches is not\naccepted, I\'ll submit a patch to document that you should remove these\nimmediately after install.',0.00,0,1,2549554,5,'189061',0),(13534,5603,'2005-07-12 09:02:11','',0.00,0,1,2549585,5,'189062',0),(13534,5603,'2005-07-12 09:04:52','Note:\n* doesn\'t attempt to handle the upgrade case (hence I assume it will be\nrejected.)\n* this doesn\'t attempt to change how the collectstats stuff is configured-\nAFAICT, if these fields don\'t exist, things will fail quietly (though I have\nonly read the code, and not tested it)',0.00,0,1,2549587,5,'189063',0),(13534,5603,'2005-07-12 09:06:01','',0.00,0,1,2549589,5,'189064',0),(6810,35075,'2005-07-26 20:45:37','(In reply to comment #41)\n\nKenneth, thanks for you time and comments. (=\n\n> (From update of attachment 187379 [edit])\n> To start with, I think it\'d be better design to set MOZ_DOCUMENT_TITLE for\n> every print job, rather than setting it only for jobs that have a title. \n\nAgreed. Should the fallback be localizable by some means, though? For the time\nbeing I\'ve made it a static const char and use it for both PS and CUPS.\n\n> It looks like you\'re leaking the unicode encoder object. EnvLockInit()\n> unconditionally creates a new encoder for every print job, and it\'s not freed\n> anywhere. Also, based on other uses of unicode encoders, it looks like you\n> should set the encoder\'s error behavior with SetOutputErrorBehavior().\n\nAs far as I can tell, EnvLockInit is only called once (by PR_CallOnce()),\nso it shouldn\'t be leaking? I\'ll look at the error behaviour.\n\n> I don\'t know how large this encoder object is, or how expensive it is to\n> initialize it. I also don\'t know if it\'s possible for the local character set\n> to change while mozilla is running. I suspect it\'d be better to allocate an\n> encoder for each print job, rather than allocating it once and caching it for\n> reuse. \n\nYou think so? If the charset can change, I\'ll agree, but I can\'t see how the\nlocale can change while an application is running on *nix..\n\n> Personally, I think I\'d do the character set conversion inside of\n> SetJobTitle(), and then substitute the fallback title in StartSubmission() as\n> is done with the CUPS logic. SetJobTitle() has to be threadsafe, so if I were\n> using a cached encoder I\'d do the whole thing in StartSubmission().\n\nI\'ll stick with the cached encoder, so.. You think I should move the conversion\nfrom EnvSetJobTitle to StartSubmission?\n\n> Could you format your code to fit in 80 columns where it\'s not inconvenient?\n> Also, \"the variable is\" should be \"these variables are\".\n\nOK.\n\n>> [EnvSetJobTitle]\n> If you leave the character set conversion in this function, could you avoid\n> doing two separate memory allocations here? You could make your first\n> allocation large enough for the full environment string, or you could just\n> convert into a fixed-size buffer on the stack. It wouldn\'t be a big deal if\n> long titles were truncated.\n\nSure, I\'ll just allocate one string that\'s big enough.\n\nNow I\'ll just have to get a better network connection so I can do cvs diff to\nmake a new patch. GPRS is a bit too expensive and slow. (=',0.00,0,1,2563482,0,NULL,0),(11040,76735,'2005-12-13 22:53:46','How is it possible to elevate the priority of this bug?\n',0.00,0,0,2723161,0,NULL,0),(11040,168663,'2006-01-14 00:26:04','I was looking into writing an extension to do this but am having trouble understanding how the current biff system works. Any starting hints would be welcome: e.g. what are the variable names, function names, broadcasters associated with the new message indicators? I see lots of references to biff, but they lead lots of directions. Which js file should I be hunting in?',0.00,0,0,2747906,0,NULL,0),(11040,57902,'2006-01-17 11:54:33','*** Bug 323758 has been marked as a duplicate of this bug. ***',0.00,0,0,2750440,0,NULL,0),(248970,24356,'2006-02-17 19:39:11','FWIW, this feature has been seperately implemented by both the Stealther and Distrust extensions.\n\nWhich means someone can probably close this bug.',0.00,0,0,2780374,0,NULL,0),(248970,144221,'2006-02-18 10:19:03','(In reply to comment #9)\n> Which means someone can probably close this bug.\nsecond.',0.00,0,0,2780684,0,NULL,0),(11040,160370,'2006-03-08 07:27:04','No real helpful coding suggestion. I just want to add to the clamor begging someone knowledgable enough to take a stab at it. I turn notifications off entirely now because it\'s too irritating that they\'re frequently not my main inbox. I just don\'t need to read mailing list emails the second they come in, and I already know how to set up filters to sort them by folder. The notification suppression is just an obvious extension of that. ',0.00,0,0,2796879,0,NULL,0),(248970,25585,'2006-05-01 07:49:28','(In reply to comment #9)\n> FWIW, this feature has been seperately implemented by both the Stealther and\n> Distrust extensions.\n> \n> Which means someone can probably close this bug.\n\nSince when should bugs be closed because there is an extension for it?\n\n',0.00,0,0,2843663,0,NULL,0),(6810,29811,'2006-05-22 14:03:06','reassigning to defaults as no one seems to be on top of the patch.',0.00,0,0,2862342,0,NULL,0),(11040,57902,'2006-06-19 06:36:46','*** Bug 341777 has been marked as a duplicate of this bug. ***',0.00,0,0,2886699,0,NULL,0),(123203,20048,'2006-06-21 16:11:13','-> default owner',0.00,0,0,2890054,0,NULL,0),(13534,120380,'2006-08-15 02:53:25','Now that bug 94534 is fixed, it should be easy to remove these resolutions so that they do not appear by default for new installations.',0.00,0,0,2945287,0,NULL,0),(13534,127400,'2006-08-15 15:31:24','',0.00,0,0,2946083,5,'233867',0),(13534,173190,'2006-08-22 16:55:50','On its own, this looks good from here. I thought through this asking myself - what conditions could possibly break this removal... Since we\'re off ENUM types, the only possible conflict I could see is if someone is trying to merge legacy Bugzilla installations and RESOLVED/LATER or REMIND was used there. It wouldn\'t hurt to include documentation somewhere in the release notes about this.',0.00,0,0,2953747,6,'233867',0),(13534,120380,'2006-09-02 16:59:24','You also have to fix contrib/gnats2bz.pl @ line 652: $resolution = \"LATER\";, docs/images/bzLifecycle.xml @ line 1123: LATER# and template/en/default/global/field-descs.none.tmpl @ 94: \"LATER\" => \"LATER\",. That\'s for LATER. About REMIND, you have to fix the same places, except contrib/gnats2bz.pl which doesn\'t use it.\n\nElse your patch works fine. I just tested it on a fresh installation.',0.00,0,0,2967966,6,'233867',0),(13534,120380,'2006-09-02 17:03:07','About contrib/gnats2bz.pl, you should probably force it to make sure that LATER is a valid resolution, and if not, use another valid one.',0.00,0,0,2967969,0,NULL,0),(13534,127400,'2006-09-03 04:22:48','changes made per communication on IRC',0.00,0,0,2968206,5,'236598',0),(13534,120380,'2006-09-03 04:26:58','r=LpSolit',0.00,0,0,2968208,6,'236598',0),(13534,120380,'2006-09-03 13:37:51','Checking in Bugzilla/MySQL.pm;\n/cvsroot/mozilla/webtools/bugzilla/Bugzilla/MySQL.pm,v <-- MySQL.pm\nnew revision: 1.85; previous revision: 1.84\ndone\nChecking in contrib/gnats2bz.pl;\n/cvsroot/mozilla/webtools/bugzilla/contrib/gnats2bz.pl,v <-- gnats2bz.pl\nnew revision: 1.8; previous revision: 1.7\ndone\nChecking in docs/images/bzLifecycle.xml;\n/cvsroot/mozilla/webtools/bugzilla/docs/images/bzLifecycle.xml,v <-- bzLifecycle.xml\nnew revision: 1.3; previous revision: 1.2\ndone\nChecking in template/en/default/global/field-descs.none.tmpl;\n/cvsroot/mozilla/webtools/bugzilla/template/en/default/global/field-descs.none.tmpl,v <-- field-descs.none.tmpl\nnew revision: 1.17; previous revision: 1.16\ndone\n',0.00,0,0,2968461,0,NULL,0),(3140,151347,'2006-09-04 09:47:11','If this is working can someone update: http://www.mozilla.org/docs/dom/mozilla/bug-events.html',0.00,0,0,2968915,0,NULL,0),(3140,59276,'2006-09-06 02:00:35','http://www.mozilla.org/docs/dom/mozilla/bug-events.html\n \nhas been updated accordingly.',0.00,0,0,2970831,0,NULL,0),(13534,73187,'2006-09-07 17:53:52','Added to relnotes in bug 349423. Please let me know if I missed any critical information about this bug in the release notes.',0.00,0,0,2973051,0,NULL,0),(11040,240395,'2006-10-14 08:54:48','My added two cents: I have 10 or 20 filters categorizing mail into various mailing list folders, and often automatically marking them as \"read\". Biff (moztraybiff.mozdev.org) often indicates I have new mail, and I\'ll take a look at the Thunderbird window, only to find an Inbox folder with no new messages, yet still has a star next to it indicating new mail. That\'s one issue.\n\nIdeally, biff would only be activated if my inbox folder has new mail, and none of that new mail was automatically marked as junk and/or scam. I don\'t know how much of that is configuration, how much of it is this bug, and how much of it is in other bugs (e.g. Bug 232104), but such a system would be perfect for me.\n',0.00,0,0,3010837,0,NULL,0),(11040,57902,'2006-11-12 11:06:26','(In reply to comment #0)\n> I was thinking of doing this - it\'s just a matter of adding a filter action,\n> and doing a folder notification.\n\nFolder notification is bug 201420. This is a more important issue for IMAP (and maybe other mail types, but not POP) where the mail can be filtered into folders on the server.\n\nSuppression of notification when mail moved to certain folders is bug 224573; and suppression of notification for certain mail accounts is bug 104809. Both features could be handled via a filter suppressing notification on a per-message basis, altho I think a per-account setting would be a reasonable feature to implement above and beyond \n\nI think the primary aspect of this bug is a filter action to control notification. There are many aspects of this that could be implemented; perhaps the action could be:\n Notify as: None, Normal, Priority\nwhere Normal is the default action taken if no filters change the notification status. If *all* new items are filtered with Notify As, None, then no new notification occurs. If *any* new item is filtered with Notify As, Priority,\nthen the priority alert would apply -- a different sound, a colored tray icon.\n\nThis could obviously be much more complex, with individually configurable sounds, slide-up appearance, and tray-icon appearance, and there are many RFEs to that effect. Also note that TB has implemented a different alert popup (in Windows, anyway) that shows information about the new messages, and that could also be finetuned even further with filters, if these were allowed to grow to that level of complexity. I think in terms of maintainability and overall usefulness, a three-level scheme as I propose is a decent compromise; it would cover bug 190989, bug 219510, and possibly others I haven\'t found.',0.00,0,0,3036070,0,NULL,0),(367518,31324,'2007-01-19 10:40:49','User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1\nBuild Identifier: \n\nFor some reason, suddendly, parts of the files of my email accounts were gone.\n(missed inbox, outbox, etc...)\nI saw this, because I compared with a backup.\nI did a re-install, re-created my profile and tried to get my mailboxes back using the backup and the descriptions at :\nhttp://kb.mozillazine.org/Importing_and_exporting_your_mail#Manually_importing_and_exporting\nhttp://kb.mozillazine.org/Migrating_settings_to_a_new_profile\n\nMy mailboxes still aren\'t showing.\nSo apart from data loss, the recovery procedure is \na) incomplete\nb) I\'ve forgotten something\nc) we\'ve run into a new situation\n\nWhat bothers me very much is the absence of an importing tool for Thunderbird mailboxes. Outlook yes. Eudora yes. Thunderbird\'s own mailboxes : NO (loop entry after entry of some faq page somewhere).\nSecondly, I\'ve tried to find a page describing me how to enable logging in Thunderbird, but couldn\'t find none.\nFor some reason, the mailboxes in my profile are skipped and I want to know why.\n\nReproducible: Always\n\nSteps to Reproduce:\n1.\n2.\n3.',0.00,0,0,3087891,0,NULL,0),(367518,31324,'2007-01-19 11:18:46','I got it back to work.\nI re-created my account in Thunderbird as if it was the first time.\nQuitted Thunderbird and tried copying my inbox as a test.\nThis worked.\nThen I copied all other, everything seems to be working normal.\nWhy the restore didn\'t work before... I dunno.\n\nThis is not a forum to discuss development.\nYet I\'d like to know : when Thunderbird launches, how does it scan the Mail folder ? Where is the info kept which accounts have been made and are present in the \'mail\'folder ?\nIf it just scans subfolders, then something weird just happened to me.\nI\'d really like a toggle to put debugging info on.\nWhich byte or file or entry that has caused all of this : I wouldn\'t know as there are no recordings. (I did make a backup of my old Thunderbird Program Files folder).\nPlease allow a logfile : In the end, it\'s up to the user to deal with a megabyte-eating file.\nFurthermore it might help find errors much more quickly !',0.00,0,0,3087913,0,NULL,0),(367518,31324,'2007-01-19 11:31:49','The paths to the mailboxes are in prefs.js\n\nWhy is it mentioned in the migration guide (http://kb.mozillazine.org/Migrating_settings_to_a_new_profile) that migrating prefs.js is not recommended ?\nIt seems very necessary to put the paths of the mailboxes you\'d like to copy in the new prefs.js.\nNeither is mentioned in the chapter on \'corrupted mailboxes\' (http://kb.mozillazine.org/Profile_folder#What_do_I_do_if_my_profile_is_corrupted.3F)\nthat it is possible to create a new profile/new account and just copy your mailboxes, to get it back to work.\n',0.00,0,0,3087922,0,NULL,0),(367518,101158,'2007-01-23 09:19:19','I don\'t see what more we could do here, since you got it working. ->WFM\n\nIf the wiki pages say something wrong, do correct the wrong parts. That\'s the thing with wikis... \n\nThe full debug info you seem to want can only be seen if you build your own build and enable debug info. I don\'t know exactly how the scanning for mails work, but after the account is found, all mail folders in it should appear.',0.00,0,0,3090820,0,NULL,0),(367518,31324,'2007-01-23 09:56:14','If I would know, I\'d adjust the wikis.\nMy attempt was just trial and error.\nFew added value, especially since I\'m not a developer.\n\nThe ultimate solution is adding proper import of Thunderbird\'s own mailboxes.\nThere\'s a request for that (yet untouched for six years) :\nhttps://bugzilla.mozilla.org/show_bug.cgi?id=63389\n\nConcerning log : If it requires a separate build, why not releasing debug versions of Thunderbird, allowing (customisable) log ?',0.00,0,0,3090874,0,NULL,0),(367518,101158,'2007-01-23 10:11:33','Because debug builds are usually really huge, and also all the logging slows them down enough to make them not (IMO) usable for real business. You may be able to find someone who can provide you with one in some third party build forum (see mozillazine), if you really a interested.',0.00,0,0,3090897,0,NULL,0),(367518,31324,'2007-01-25 11:09:02','Two remarks on this.\n\n1) Of course no one will use these debug versions in production, this is obvious to most. So that\'s not what I meant. Don\'t take this personally, but this kind of reply is symptomatic for the way a lot of bugs on Mozilla products are handled.\nMe, not a Mozilla developer but somebody kind enough to report bugs/enhancements on your product, makes a suggestion which might enable you to fix bugs easier and quicker, and gets a non-answer as a reply.\nA better reply might have been : \"Gee, indeed a logfile might sometimes come in handy. We currently have to rely on third parties to make these debugbuilds. Why not include them in our build procedure ? You know what, if you\'d like a debugbuild of Thunderbird, you could find one there http://blabla. Kind of you offering to use install these slow debugbuilds in your spare time. If the current situation is indeed all or nothing (nothing is logged or EVERYTHING), then maybe we ought to consider a more flexible logging. Or a medium logbuild.\"\n\n2) The guys from Qualcomm\'s Eudora, did manage to have logging in Eudora. Seemingly without much loss of speed. In case of a bug, one could easily attach this log to the report. Since they are coming aboard, ask them how :-)\nhttp://www.qualcomm.com/press/releases/2006/061011_project_collaboration_mozilla.html',0.00,0,0,3093081,0,NULL,0),(367518,4410,'2007-01-25 11:16:02','we do actually have a fair amount of logging in release builds. But not for the folder scanning part - and we\'ve never actually had a request for that before. Folder scanning for local folders is so simple (we literally enumerate the files in your mail directory, and then sub-folders with the name .sbd',0.00,0,0,3093092,0,NULL,0),(367518,101158,'2007-01-25 11:25:55','For logging support in non-debug builds, see\nhttp://www.mozilla.org/quality/mailnews/mail-troubleshoot.html#imap\n(though I think that page is missing a few options)\n\nI think the point of not making debug builds in the GB-size per build available for download is also that you need to look at the code to understand what\'s going on. If you can look at the code, building it isn\'t a huge step, on linux that is;). To pinpoint the problem you would most likely still have to make some small changes and build.',0.00,0,0,3093098,0,NULL,0),(367518,31324,'2007-01-25 12:00:10','Thanks for the feedback.\nRandom remarks :\n\n1) Good to know that a protocol log exists and can be enabled without the need of an external build!\n1a) These variables(NSPR_LOG_MODULES and NSPR_LOG_FILE), can they also be set through \"Tools – Options – Advanced – General and press the Config Editor... button\" ?\n1b) \"Renaming logs after Mozilla quits\" : In Java, there\'s a library called Log4J http://logging.apache.org/log4j/. This incredibly flexible logging lib features something called a RollingFileAppender. As the name implies, log files will be rotated automatically per day or size or ... .\n\n2) Of course, Magnus, I won\'t look at the code myself (maybe one day I will). The logs really aren\'t that much for me. They are meant for the Mozilla development team to decipher why something went wrong. The privilege of interpretation is rather reserved for them :-)\nEasy things like \'file x not found at location y\' can of course be sufficient for me to fix it myself.\n\n3) I\'m quite sure that somebody with a reproducable bug won\'t mind installing this debug version. The developers on their part are most likely interested in getting this logfile. Why then not making a single debug build available ? One of the latest nightly, one of the latest official. About how many MB are we talking ?',0.00,0,0,3093152,0,NULL,0),(372836,7044,'2007-03-06 08:39:20','These minor changes allow tinderbox to build with MSYS/MozillaBuild.',0.00,0,0,3127923,5,'257522',0),(372836,17036,'2007-03-06 11:12:31','Looks find, I am curious why these are needed though (see below)\n\n>elasticsearch.Index: build-seamonkey-util.pl\n>===================================================================\n>RCS file: /cvsroot/mozilla/tools/tinderbox/build-seamonkey-util.pl,v\n>retrieving revision 1.351\n>diff -u -8 -r1.351 build-seamonkey-util.pl\n>--- build-seamonkey-util.pl 9 Feb 2007 02:19:18 -0000 1.351\n>+++ build-seamonkey-util.pl 6 Mar 2007 16:30:26 -0000\n>@@ -287,16 +287,19 @@\n> #$Settings::ObjDir = \'\';\n> my $build_type = $Settings::BuildDepend ? \'Depend\' : \'Clobber\';\n> my $host = ShortHostname();\n> chomp($Settings::OS, $os_ver, $Settings::CPU, $host);\n> \n> # Redirecting stderr to stdout works on *nix, winnt, but not on win98.\n> $Settings::TieStderr = \'2>&1\';\n> \n>+ # Mingw uname -r returns 1.0.10(0.46/3/2) - remove the parens section\n>+ $os_ver =~ s/\\(.*\\)//;\n>+\n\n\nWhy is this important? Do the parens cause problems elsewhere?\n\n\n> if ($Settings::OS eq \'AIX\') {\n> my $osAltVer = `uname -v`;\n> chomp($osAltVer);\n> $os_ver = \"$osAltVer.$os_ver\";\n> }\n> \n> $Settings::OS = \'BSD_OS\' if $Settings::OS eq \'BSD/OS\';\n> $Settings::OS = \'IRIX\' if $Settings::OS eq \'IRIX64\';\n>@@ -413,22 +416,16 @@\n> \n> # Assume this file lives in the base dir, this will\n> # avoid human error from setting this manually.\n> $Settings::BaseDir = get_system_cwd();\n> \n> my $topsrcdir = \"$Settings::BaseDir/$Settings::DirName/mozilla\";\n> $objdir = \"$topsrcdir/${Settings::ObjDir}\";\n> \n>- if (not -e $objdir) {\n>- # Not checking errors here, because it\'s too early to set $status and the \n>- # build will fail anyway; failing loudly is better than failing silently.\n>- run_shell_command(\"mkdir -p $objdir\");\n>- }\n>-\n\n\nIt\'s not really clear to me from the CVS log why this was added.. shouldn\'t the build system create the objdir if it doesn\'t exist? Why does this cause a problem for MSYS?',0.00,0,0,3128076,6,'257522',0),(372836,7044,'2007-03-06 13:23:58','> Why is this important? Do the parens cause problems elsewhere?\n\nYes. This becomes the directory name, and both parens and slashes in the directory name cause major hiccups. Besides which it is ugly and unwieldy.\n\n> It\'s not really clear to me from the CVS log why this was added.. shouldn\'t the\n> build system create the objdir if it doesn\'t exist? Why does this cause a\n> problem for MSYS?\n\nThe build system does create the objdir in every incantation I know of. The problem is with stock cvs 1.11 if you check out into a directory that already exists but doesn\'t have a CVS/ directory:\n\n$ mkdir mozilla\n$ cvs co mozilla/client.mk\ncvs checkout: in directory mozilla:\ncvs checkout: cannot open CVS/Entries for reading: No such file or directory.',0.00,0,0,3128223,0,NULL,0),(372836,7044,'2007-03-08 07:40:02','Fixed on trunk.',0.00,0,0,3130269,0,NULL,0),(11040,101158,'2007-04-25 04:01:44','',0.00,0,0,3169543,2,'249938',0),(11040,101158,'2007-04-26 22:39:48','',0.00,0,0,3171508,2,'378844',0),(11040,111144,'2007-06-01 09:21:37','I was looking at how I organized my folders, and it occurred to me that it might be possible to simplify this feature, and yet retain the bulk of it\'s power.\n\nSuggestion: \nInstead of having sophisticated controls on a per-filter or per-folder basis, have a single flag which can be turned on and off.\n\nIf this flag is active, then biff notifications are only displayed for mail messages which end up in the \"Inbox\" folder or one of it\'s children.\n\nThis means that you can create child folders under the \"Inbox\" folder and use filters to route messages there, and still have notifications.\n\nOther messages can be routed to folders outside of the \"Inbox\" folder, and will then will then not result in biff notifications.\n',0.00,0,0,3201475,0,NULL,0),(248970,243208,'2007-06-03 05:35:26','I\'ll take this. I managed to get a working mode today (purely back-end and pref based, no UI just yet), and I\'ll post the patch in the morning once I find suitable reviewers.',0.00,0,0,3202846,0,NULL,0),(248970,243208,'2007-06-04 16:19:44','If Private Browsing (\"privacy.privatebrowsing\") is turned on:\n\n* Cache won\'t be touched.\n* Nothing will be added to Places history.\n* No new entries will be saved in autocomplete.\n* Download records will delete themselves when the download is complete.\n* Cookies are kept until Private Browsing is turned off, or the browser closes, at which point the cookies will be deleted.\n\nI can almost guarantee this won\'t break anything, because all this does is it sneakily manipulates pref-check functions and return values in each section to do the right thing.',0.00,0,0,3204500,5,'267216',0),(248970,20209,'2007-06-04 20:24:38','> I can almost guarantee this won\'t break anything\n\nview-source and meta charset reloads come to mind as things it could break. Also wyciwyg:. I assume you\'ve tested all of these? I assume you\'ve also tested the performance impact of getting the pref every single time and determined that it\'s cheap enough that caching it is not worth it?\n\nThis probably also breaks visited link coloring, unless I\'m missing something.\n\nIn any case, I\'m not going to be able to review this thoroughly in a reasonable timeframe. Please ask someone else? biesi might be a good idea.',0.00,0,0,3204641,0,NULL,0),(248970,243208,'2007-06-04 22:45:01','(In reply to comment #14)\n> view-source and meta charset reloads come to mind as things it could break.\n\nview-source works.\n\n> Also wyciwyg:. I assume you\'ve tested all of these? \n\nI haven\'t yet tested meta charset reloads or wyciwyg, I\'m not really sure how to test them. The reason for my (over)confidence is that this patch only really changes existing preference or policy checks.\n\n> I assume you\'ve also\n> tested the performance impact of getting the pref every single time and\n> determined that it\'s cheap enough that caching it is not worth it?\n\nI can\'t find an impact at all. Some of the functions which I change already seem to check a pref every time they\'re called.\n\n> This probably also breaks visited link coloring, unless I\'m missing something.\n\nNo, this does as expected (expected IMO being: visited link colours show up when a link is visited outside of Private Browsing, but not when its visited while turned on).\n\n> In any case, I\'m not going to be able to review this thoroughly in a reasonable\n> timeframe. Please ask someone else? biesi might be a good idea.\n> \n\nOK.',0.00,0,0,3204709,6,'267216',0),(248970,243208,'2007-06-04 23:05:47','(In reply to comment #15)\n> I can\'t find an impact at all. Some of the functions which I change already\n> seem to check a pref every time they\'re called.\n\nI actually forgot to mention the primary reason, many existing pref listeners in each section of Mozilla that this patch touches have a branch (eg \"browser.foo\") and changing the existing nsIPrefBranch2, or implementing a separate one, for each section would be messier than just reading the pref when needed.',0.00,0,0,3204724,0,NULL,0),(248970,24534,'2007-06-05 18:07:02','I\'m not the right person to review this, and I don\'t think biesi is the right sr -- you really want mconnor, at the very least.',0.00,0,0,3205948,6,'267216',0),(248970,243208,'2007-06-05 18:22:29','(In reply to comment #17)\n> (From update of attachment 267216 [details])\n> I\'m not the right person to review this, and I don\'t think biesi is the right\n> sr -- you really want mconnor, at the very least.\n> \n\nThats precisely the problem I had before I submitted a patch like this, which touched different sections of Mozilla. From the list of reviewers at http://www.mozilla.org/hacking/reviewers.html you were under toolkit and biesi was under netwerk. \n\nI\'ll get mconnor.',0.00,0,0,3205958,6,'267216',0),(248970,233280,'2007-06-11 17:42:02','\n> PRInt32 \n> nsDownloadManager::GetRetentionBehavior()\n> {\n> // We use 0 as the default, which is \"remove when done\"\n> nsresult rv;\n> nsCOMPtr pref = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv);\n> NS_ENSURE_SUCCESS(rv, 0);\n>+\n>+ // The user is in private browsing mode, delete the download record when\n>+ // completed\n>+ PRBool privMode = PR_FALSE;\n>+ pref->GetBoolPref(\"privacy.privatebrowsing\", &privMode);\n>+ if (privMode)\n>+ return 0;\nPlease declare a constant at the top of the file, just as everything else that uses a pref does in the file.\n\nAlso, this will require some UI changes if the download manager is already open:\nhttp://mxr.mozilla.org/seamonkey/source/toolkit/mozapps/downloads/content/downloads.js#152',0.00,0,0,3212391,6,'267216',0),(248970,14419,'2007-06-18 16:55:51','',0.00,0,0,3220668,2,'283024',0),(248970,96908,'2007-06-25 22:17:00','So, I thought I\'d commented here, but I didn\'t. I think this is a good start, but there\'s some things I think need addressing:\n\n* Toggling the mode on/off\n\nUsing prefs and/or pref observers seems kinda wrong, why not just have observers/notifications?\n\n* Cookies\n\nThis is a pretty painful impl, since this would mean that you\'ll lose cookies that you had before you started in private browsing mode and accessed while you\'re there. Fortunately, the cookie service now has a creationTime that would be useful here. I think only clearing new cookies is acceptable for this feature, since stuff you\'ve already been to will likely be in your history as well...\n\n* History\n\nIt makes more sense to kill everything from the visits table, and remove any URLs that have zero visits. Achieves the same thing, but means link coloring etc still work during the session. I\'m not sure if we can suppress flushing to disk, but if not I\'m not as concerned about \"must never touch magnetic media\" as some are.\n\n* Cache\n\nTotally disabling cache feels like a mistake. Why not just disable the disk cache, and clear memory cache before re-enabling disk cache? (biesi, does disabling the disk cache preclude reloading from disk on exit of private browsing?)\n\n* Downlaods\n\nI bet sdwilsh\'s comments are bang on, so I\'ll stay quiet.',0.00,0,0,3229604,0,NULL,0),(248970,230739,'2007-06-26 00:16:51','A non-programmer suggestion:\n\nWhat would happen if a \'guest\' temporary user were whipped up and the browser were restarted using that profile? Would this sort of feature be more thorough or be a more \"clean\" way to implement a feature like this?\n\nA restart isn\'t not as convenient as having a button/hotkey to enable/disable private browsing, but it might be something to think about.\n',0.00,0,0,3229666,0,NULL,0),(248970,21544,'2007-06-26 11:22:21','(In reply to comment #22)\n> A non-programmer suggestion:\n> \n> What would happen if a \'guest\' temporary user were whipped up and the browser\n> were restarted using that profile? Would this sort of feature be more thorough\n> or be a more \"clean\" way to implement a feature like this?\n\nThat would not be this feature (see comment 0), since you wouldn\'t be able to access to any of your current bookmarks or history.\n\nNote that this feature already exists in Safari, and it looks like we\'re going to try to implement it more or less the same way.',0.00,0,0,3230165,0,NULL,0),(248970,243208,'2007-06-28 01:42:27','(In reply to comment #21)\n> * Toggling the mode on/off\n> \n> Using prefs and/or pref observers seems kinda wrong, why not just have\n> observers/notifications?\n\nIt\'d be more code, but I suppose that\'s best.\n\n> * Cookies\n> \n> This is a pretty painful impl, since this would mean that you\'ll lose cookies\n> that you had before you started in private browsing mode and accessed while\n> you\'re there. Fortunately, the cookie service now has a creationTime that\n> would be useful here. I think only clearing new cookies is acceptable for this\n> feature, since stuff you\'ve already been to will likely be in your history as\n> well...\n\nI wrote this patch before the cookie rewrite ;) I wanted to do that but couldn\'t before because creation \"time\" was just an incremented counter. I can do that now that the MySQL uses a proper creationTime.\n\n> * History\n> \n> It makes more sense to kill everything from the visits table, and remove any\n> URLs that have zero visits. Achieves the same thing, but means link coloring\n> etc still work during the session. I\'m not sure if we can suppress flushing to\n> disk, but if not I\'m not as concerned about \"must never touch magnetic media\"\n> as some are.\n\nPut on a tinfoil hat for a sec. Do we want link colouring to work? It can be used as another method to trace your steps...\n\n> * Cache\n> \n> Totally disabling cache feels like a mistake. Why not just disable the disk\n> cache, and clear memory cache before re-enabling disk cache? (biesi, does\n> disabling the disk cache preclude reloading from disk on exit of private\n> browsing?)\n\nI don\'t know much about how cache works, that just seemed like an easy way to go.\n\n> * Downlaods\n> \n> I bet sdwilsh\'s comments are bang on, so I\'ll stay quiet.\n\nLike I said, I should probably know more about the code I\'m touching before I touch it ;)\nThat being said, this isn\'t a top priority for me right now as I have other bugs I really want fixed. I wouldn\'t object if anyone else wanted to take this in the meantime.\n\n',0.00,0,0,3232299,0,NULL,0),(248970,11608,'2007-06-28 02:26:17','> Put on a tinfoil hat for a sec. Do we want link colouring to work? It can be\n> used as another method to trace your steps...\n\nI think the idea is to make link coloring work, but just during the private browsing session. After the session, that (temporary) history data goes away, and the links are no longer marked as visited.',0.00,0,0,3232319,0,NULL,0),(248970,243208,'2007-06-28 03:25:00','(In reply to comment #25)\n> > Put on a tinfoil hat for a sec. Do we want link colouring to work? It can be\n> > used as another method to trace your steps...\n> \n> I think the idea is to make link coloring work, but just during the private\n> browsing session. After the session, that (temporary) history data goes away,\n> and the links are no longer marked as visited.\n> \n\nI know, but I was wondering if we even want that....',0.00,0,0,3232348,0,NULL,0),(248970,283305,'2007-07-26 14:33:32','Michael, thanks for working on this bug, this is a feature I would personally very much like to see land in Firefox 3.\n\nI have a few questions about the implementation that might impact the UI:\n\n1) Are we still considering launching a new instance, which would potentially enable us to display Firefox with a modified theme?\nhttp://wiki.mozilla.org/PrivateBrowsing\n\n2) If not, would it be possible to modify the color and opacity of the current theme, similar to how Personas for Firefox doesn\'t require a restart?\nhttp://www.puffinlabs.com/personas/\n\nThere hasn\'t been much activity on this bug over the last month, can anyone give me an update on what the status is?',0.00,0,0,3261333,0,NULL,0),(372836,12567,'2007-08-08 18:14:42','I\'m gonna reopen this and reassign it to me.\n\nI guess MSYS doesn\'t support symlinks, and we rely extensively on symlinks for things like tinderbox autoupdate and cvs-based configs.\n\nI can fix this, but I\'ll have to tweak the tinderbox code to do it.',0.00,0,0,3274740,0,NULL,0),(372836,7044,'2007-08-08 18:41:36','Can you use hardlinks?',0.00,0,0,3274758,0,NULL,0),(372836,39022,'2007-08-08 19:02:57','This should fix the goofy OS version on the tinderbox.',0.00,0,0,3274766,5,'275913',0),(248970,137548,'2007-08-08 23:48:31','(In reply to comment #27)\n> 1) Are we still considering launching a new instance, which would potentially\n> enable us to display Firefox with a modified theme?\n> http://wiki.mozilla.org/PrivateBrowsing\n> \n> 2) If not, would it be possible to modify the color and opacity of the current\n> theme, similar to how Personas for Firefox doesn\'t require a restart?\n> http://www.puffinlabs.com/personas/\n\nAlex, Madhava, Connor and I discussed this in various fora, and I think we\'ve actually agreed that heavy modifications to the theme on entry of Private Browsing mode would probably be antithetical to its purpose, as it would call attention to the very fact that the user had entered a mode all about being unobserved.\n',0.00,0,0,3274907,0,NULL,0),(372836,3881,'2007-08-09 00:59:53','(In reply to comment #1)\n> It\'s not really clear to me from the CVS log why this was added.. shouldn\'t the\n> build system create the objdir if it doesn\'t exist? Why does this cause a\n> problem for MSYS?\n\nLast I checked (pretty recently, I think), the build system doesn\'t use mkdir -p to create the objdir, so it fails if the objdir\'s parent directory doesn\'t exist.',0.00,0,0,3274952,0,NULL,0),(372836,12567,'2007-08-09 12:33:34','(In reply to comment #5)\n> Can you use hardlinks?\n\nAccording to the test I did, no. Not sure if this is because MSYS doesn\'t support linking at all, or because we\'re using FAT32 on this filesystem, for build performance reasons.',0.00,0,0,3275513,0,NULL,0),(372836,12567,'2007-08-09 14:12:20','This is a patch (untested, BTW; I\'m gonna do that while people are pointing and laughing at this patch...) to manually copy files into place in all the locations where we expected (haha, joke\'s on us!) that symlinks would work.\n\nIn MSYS, symlinks don\'t exist (because they don\'t exist in Win32... except in Vista, but there are a lot of issues with... well... nevermind...), and hardlinks only work on NTFS. We use FAT32 for performance reasons in these directories.',0.00,0,0,3275668,5,'276034',0),(372836,12567,'2007-08-09 19:24:33','Don\'t bother reviewing this patch... it\'s close, but I had to jump through a couple of extra hoops to get things working (oh, how I hate thee, post-mozilla.pl!)\n\nExpect another patch tomorrow when I see the one I currently have stays running all night.',0.00,0,0,3275943,6,'276034',0),(372836,12567,'2007-08-13 13:46:41','Just a few changes that I had to make to get this reliably working...',0.00,0,0,3279364,5,'276529',0),(372836,12567,'2007-08-13 17:39:13','This fixes the problem where the builds wouldn\'t run on the testing tinderboxen.',0.00,0,0,3279656,5,'276570',0),(372836,17036,'2007-08-13 23:10:11','ugh :P',0.00,0,0,3279889,6,'276570',0),(372836,30066,'2007-08-14 16:22:34','I\'d much prefer a situation where we didn\'t rely on having an existing local checkout already on each machine and simply checked the harness code out fresh each time. It\'s not that much code, and it avoids much of this hackery.\n\nI also wish we didn\'t rely on the presence of a file (post-mozilla-rel.pl) to determine the release status for the current build instance. Is it the future yet?\n\nI\'m r+ing this because it\'s tinderbox and you\'re simply adding more crap to the pile that is tinderbox, which is really the only short-term way to proceed. ;-)',0.00,0,0,3280793,6,'276529',0),(372836,12567,'2007-08-15 15:58:56','Landed both of these patches, painful and ouchy though they are, and stabby though they make me.',0.00,0,0,3281858,0,NULL,0),(393845,55600,'2007-08-27 04:58:28','See testcase, when clicking 1 or 2 times on the button while the movie is playing, Mozilla crashes. Probably because the Windows Media Player 10 is crashing.\n\nThis started crashing between 2005-09-21 and 2005-09-23, I guess somehow a regression of bug 1156.\n\nIt doesn\'t crash on my Windows Vista computer which has the Windows Media Player 11 installed.',0.00,0,0,3292863,5,'278393',0),(393845,15661,'2007-08-27 09:54:31','do you have a stacktrace/breakpad id?',0.00,0,0,3293080,0,NULL,0),(393845,55600,'2007-08-27 15:02:29','Ok, for some reason I do get a breakpad id now with the testcase online, I didn\'t get one offline.\n\nhttp://crash-stats.mozilla.com/report/index/e995110f-54e6-11dc-b1c0-001a4bd43e5c\n0 nsObjectFrame::StopPluginInternal(int) mozilla/layout/generic/nsObjectFrame.cpp:1575\n1 nsObjectFrame::PrepareInstanceOwner() mozilla/layout/generic/nsObjectFrame.cpp:1378\n2 nsObjectFrame::Instantiate(char const*, nsIURI*) mozilla/layout/generic/nsObjectFrame.cpp:1414\n3 nsObjectLoadingContent::Instantiate(nsIObjectFrame*, nsACString_internal const&, nsIURI*) mozilla/content/base/src/nsObjectLoadingContent.cpp:1502\n4 nsObjectLoadingContent::TryInstantiate(nsACString_internal const&, nsIURI*) mozilla/content/base/src/nsObjectLoadingContent.cpp:1471\n5 nsObjectLoadingContent::LoadObject(nsIURI*, int, nsCString const&, int) mozilla/content/base/src/nsObjectLoadingContent.cpp:991\n6 nsObjectLoadingContent::LoadObject(nsAString_internal const&, int, nsCString const&, int) mozilla/content/base/src/nsObjectLoadingContent.cpp:818\n7 nsHTMLSharedObjectElement::SetAttr(int, nsIAtom*, nsIAtom*, nsAString_internal const&, int) mozilla/content/html/content/src/nsHTMLSharedObjectElement.cpp:285\n8 nsGenericHTMLElement::SetAttrHelper(nsIAtom*, nsAString_internal const&) mozilla/content/html/content/src/nsGenericHTMLElement.cpp:2313\n9 nsHTMLSharedObjectElement::SetSrc(nsAString_internal const&) mozilla/content/html/content/src/nsHTMLSharedObjectElement.cpp:327\n10 NS_InvokeByelasticsearch.Index_P mozilla/xpcom/reflect/xptcall/src/md/win32/xptcinvoke.cpp:101\n11 AutoJSSuspendRequest::SuspendRequest() mozilla/js/src/xpconnect/src/xpcprivate.h:3317\n12 xul.dll@0x68218f\n\nThis testcase doesn\'t crash with the Windows Media Player 11, however I do have a testcase that also crashes with this kind of stacktrace with the Windows Media Player 11, though. (I have a bit of trouble getting it minimized further).\n\nThe stacktrace looks like it\'s related to bug 354102. I can\'t find it anymore on the topcrasher list, though.',0.00,0,0,3293399,0,NULL,0),(393845,15661,'2007-08-27 18:34:31','If you could attach even the non-minimized WMP11 testcase that would be great, since I don\'t have WMP10 available to test with here.',0.00,0,0,3293706,0,NULL,0),(393845,55600,'2007-08-27 18:41:29','Ok, this is a not completely minimized testcase that crashes with the windows media player 11 for me with current trunk build, usually after 10 seconds or so. I hope it does the same for you.',0.00,0,0,3293712,5,'278511',0),(393845,55600,'2007-08-27 18:45:25','Oh, you need to download that testcase, using right-click Save As.. and also download the video file from http://martijn.martijn.googlepages.com/testmovie.wmv',0.00,0,0,3293715,0,NULL,0),(393845,55600,'2007-08-28 04:32:20','Feel free to open the testcase up, if you don\'t think it should remain security sensitive.',0.00,0,0,3294024,0,NULL,0),(393845,15661,'2007-08-28 16:02:57','OK, the original testcase crashes here (winxp home/wmp11).\n\n0012d4a8 01f8d2b4 gklayout!nsPluginInstanceOwner::SetOwner+0xd [c:\\mozilla\\layout\\generic\\nsobjectframe.cpp @ 386]\n0012d4c8 01f8ca13 gklayout!nsObjectFrame::StopPluginInternal+0xb4 [c:\\mozilla\\layout\\generic\\nsobjectframe.cpp @ 1639]\n0012d4e0 01f8cc0a gklayout!nsObjectFrame::PrepareInstanceOwner+0x13 [c:\\mozilla\\layout\\generic\\nsobjectframe.cpp @ 1380]\n0012d544 02529d62 gklayout!nsObjectFrame::Instantiate+0x4a [c:\\mozilla\\layout\\generic\\nsobjectframe.cpp @ 1414]\n0012d578 02529bd8 gklayout!nsObjectLoadingContent::Instantiate+0x182 [c:\\mozilla\\content\\base\\src\\nsobjectloadingcontent.cpp @ 1502]\n0012d598 025280dd gklayout!nsObjectLoadingContent::TryInstantiate+0x98 [c:\\mozilla\\content\\base\\src\\nsobjectloadingcontent.cpp @ 1472]\n0012d7dc 02527828 gklayout!nsObjectLoadingContent::LoadObject+0x88d [c:\\mozilla\\content\\base\\src\\nsobjectloadingcontent.cpp @ 991]\n0012d870 0251aab0 gklayout!nsObjectLoadingContent::LoadObject+0x1c8 [c:\\mozilla\\content\\base\\src\\nsobjectloadingcontent.cpp @ 818]\n0012d8ec 02171129 gklayout!nsHTMLSharedObjectElement::SetAttr+0x70 [c:\\mozilla\\content\\html\\content\\src\\nshtmlsharedobjectelement.cpp @ 286]\n0012d90c 0217c5fb gklayout!nsGenericHTMLElement::SetAttr+0x29 [c:\\mozilla\\content\\html\\content\\src\\nsgenerichtmlelement.h @ 213]\n0012d928 0251af19 gklayout!nsGenericHTMLElement::SetAttrHelper+0x1b [c:\\mozilla\\content\\html\\content\\src\\nsgenerichtmlelement.cpp @ 2314]\n0012d938 00305137 gklayout!nsHTMLSharedObjectElement::SetSrc+0x19 [c:\\mozilla\\content\\html\\content\\src\\nshtmlsharedobjectelement.cpp @ 327]\n0012d94c 00feb1e3 xpcom_core!NS_InvokeByelasticsearch.Index_P+0x27 [c:\\mozilla\\xpcom\\reflect\\xptcall\\src\\md\\win32\\xptcinvoke.cpp @ 102]\n\n\n\n 384: void SetOwner(nsObjectFrame *aOwner)\n 385: {\n> 386: mOwner = aOwner;\n\n|this| is null... (and so\'s aOwner)\n',0.00,0,0,3294802,0,NULL,0),(393845,15661,'2007-08-28 17:22:57','OK, this is a fun (?) bug.\n\nSo StopPluginInternal gets reentered:\ngklayout!nsObjectFrame::StopPluginInternal+0x32\ngklayout!nsObjectFrame::Destroy+0x4f\ngklayout!nsBlockFrame::DoRemoveFrame+0x41f\ngklayout!nsBlockFrame::RemoveFrame+0x32\ngklayout!nsFrameManager::RemoveFrame+0x3f\ngklayout!nsCSSFrameConstructor::ContentRemoved+0x413\ngklayout!nsCSSFrameConstructor::RecreateFramesForContent+0xf5\ngklayout!nsCSSFrameConstructor::RestyleElement+0x9b\ngklayout!nsCSSFrameConstructor::ProcessOneRestyle+0x9c\ngklayout!nsCSSFrameConstructor::ProcessPendingRestyles+0x163\ngklayout!PresShell::DoFlushPendingNotifications+0xcf\ngklayout!PresShell::WillPaint+0x39\ngklayout!nsViewManager::DispatchEvent+0x38b\ngklayout!HandleEvent+0x46\ngkwidget!nsWindow::DispatchEvent+0xc1\ngkwidget!nsWindow::DispatchWindowEvent+0x24\ngkwidget!nsWindow::OnPaint+0x694\ngkwidget!nsWindow::ProcessMessage+0x6aa\ngkwidget!nsWindow::WindowProc+0x142\nUSER32!InternalCallWinProc+0x28\nUSER32!UserCallWinProcCheckWow+0x150\nUSER32!DispatchClientMessage+0xa3\nUSER32!__fnDWORD+0x24\nntdll!KiUserCallbackDispatcher+0x13\nUSER32!NtUserDispatchMessage+0xc\nUSER32!DispatchMessageW+0xf\nWARNING: Stack unwind information not available. Following frames may be wrong.\nwmp!Ordinal3003+0x8b902\nwmp!Ordinal3002+0x116aae\nwmp!Ordinal3003+0x860eb\nwmp!Ordinal3002+0x88bf3\nwmp!Ordinal3003+0xacf0b\nwmp!Ordinal3003+0xadafb\nwmp!DllGetClassObject+0xa2a0\nwmpdxm!CWMPShim::SetClientSite+0xb7\nnpdsplay!unuse_netscape_plugin_Plugin+0x1a4e\nnpdsplay!native_NPDS_npDSJavaPeer_StreamSelect+0x25b8\nnpdsplay!NP_Shutdown+0x1fd\ngkplugin!ns4xPluginInstance::Stop+0x1bb\ngklayout!DoStopPlugin+0x195\ngklayout!nsObjectFrame::StopPluginInternal+0xdb\ngklayout!nsObjectFrame::PrepareInstanceOwner+0x25\ngklayout!nsObjectFrame::Instantiate+0x4a\ngklayout!nsObjectLoadingContent::Instantiate+0x182\ngklayout!nsObjectLoadingContent::TryInstantiate+0x98\ngklayout!nsObjectLoadingContent::LoadObject+0x88d\ngklayout!nsObjectLoadingContent::LoadObject+0x1c8\ngklayout!nsHTMLSharedObjectElement::SetAttr+0x70\ngklayout!nsGenericHTMLElement::SetAttr+0x29\ngklayout!nsGenericHTMLElement::SetAttrHelper+0x1b\ngklayout!nsHTMLSharedObjectElement::SetSrc+0x19\n\nSo we stop the plugin, which processes events (!?), we get a paint event, attempting to paint flushes the pending notifications (there\'s a pending restyle event due to the setting of position to absolute), which destroys the frame, which calls StopPluginInternal again.\n',0.00,0,0,3294917,0,NULL,0),(393845,15661,'2007-08-28 17:46:02','btw, the reason why this works pre-1156 is that setting src didn\'t have any effect, and once the new frame got constructed it just instantiated the plugin again.',0.00,0,0,3294964,0,NULL,0),(393845,15661,'2007-08-28 18:05:51','A similar testcase (changes display to none instead of changing position)',0.00,0,0,3294989,5,'278687',0),(393845,15661,'2007-08-28 18:44:19','',0.00,0,0,3295023,5,'278696',0),(393845,20209,'2007-08-28 19:00:15','Oh, the usual \"Windows processes events any time you destroy a widget\" thing? Fun times.',0.00,0,0,3295035,0,NULL,0),(393845,20209,'2007-08-28 19:31:49','>elasticsearch.Index: layout/generic/nsObjectFrame.cpp\n>elasticsearch.Index: content/base/src/nsObjectLoadingContent.cpp\n>+ // We came here via eState_Loading. Therefore, our frame if newly\n\ns/if/is/\n\n>+ // Stop the plugin first. As that might destroy the frame,\n\ns/As/Since/\n\nr+sr=bzbarsky',0.00,0,0,3295064,6,'278696',0),(393845,15661,'2007-09-05 13:33:42','Checking in content/base/src/nsObjectLoadingContent.cpp;\n/cvsroot/mozilla/content/base/src/nsObjectLoadingContent.cpp,v <-- nsObjectLoadingContent.cpp\nnew revision: 1.62; previous revision: 1.61\ndone\nChecking in layout/generic/nsObjectFrame.cpp;\n/cvsroot/mozilla/layout/generic/nsObjectFrame.cpp,v <-- nsObjectFrame.cpp\nnew revision: 1.615; previous revision: 1.614\ndone\n',0.00,0,0,3302922,0,NULL,0),(393845,55600,'2007-09-06 21:10:37','Verified fixed using WMP11 and windows vista:\nMozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9a8pre) Gecko/2007090604 Minefield/3.0a8pre\n\nAlso verified fixed with that same dated build on windowsXP using WMP10.\nNo crash anymore with any of the testcases.\n\nNice job!',0.00,0,0,3304706,0,NULL,0),(393845,235989,'2007-09-07 10:09:49','Sorry Folks,\n\nbut it seems that this bug is not fully fixed.\n\nWe have another crash related to Java with AdBlock Plus 0.7.5.1 installed.\n\nSteps to reproduce:\nWith AdBlock Plus 0.7.5.1 installed, go to http://www.java.com/en/download/installed.jsp and click on the green \"Verify Installation\" button.\n\nRegressionwindow:\nWorks as expected in 20070905_1328\nBroken in 20070905_1344 (crash)\n\nBreakpad:\nhttp://crash-stats.mozilla.com/report/index/da4932d7-5d5e-11dc-96ec-001a4bd46e84\nhttp://crash-stats.mozilla.com/report/index/3d3753e3-5d5e-11dc-a943-001a4bd43ef6\n',0.00,0,0,3305207,0,NULL,0),(393845,55600,'2007-09-07 12:27:20','Gerd, could you file a new bug on that and make it blocking this bug? Thanks.',0.00,0,0,3305345,0,NULL,0),(393845,235989,'2007-09-08 07:27:08','OK, filed \nBug 395412 – Crash on Java install verification with AdBlock Plus 0.7.5.1 installed',0.00,0,0,3305906,0,NULL,0),(393845,144324,'2007-09-21 16:48:52','It looks like this patch caused bug 397051',0.00,0,0,3319411,0,NULL,0),(393845,55600,'2007-09-25 04:33:05','Maybe this patch should be backed out for now, because of the regressions it\'s causing?',0.00,0,0,3322115,0,NULL,0),(393845,103593,'2007-09-25 13:42:43','I\'ve backed this patch out per IRC discussion with Peter and Christian.\n\nmozilla/layout/generic/nsObjectFrame.cpp 1.616\nmozilla/content/base/src/nsObjectLoadingContent.cpp 1.64 ',0.00,0,0,3322655,0,NULL,0),(11040,289144,'2007-10-15 10:35:41','I too think that the filter action would be the best.\nNoel, if you were using IMAP you would know that all folders are children of the Inbox folder. The flag solution would be useless with IMAP and busy Mailinglists.',0.00,0,0,3341932,0,NULL,0),(11040,111144,'2007-10-16 00:07:42','Joao, that may be true of the IMAP data model, but that does not appear to be how Thunderbird organises it\'s data model.\n',0.00,0,0,3342607,0,NULL,0),(11040,289144,'2007-10-16 03:07:55','So you are saying that a folder that is a children of the INBOX folder in the IMAP model isn\'t a children of the INBOX in the Thunderbird data model?\n\nI always leave all my mail on the server because I switch computer and OS a lot.\nPlease configure an IMAP account in 2 thunderbird profiles and try to use it like I do. Then you will realize that your suggestion doesn\'t help me.\n\nThe only thing I could accept as a compromise would be not to display biff notifications of any folder except the Inbox. But then all the important (as notification worthy) messages would end up in the Inbox.',0.00,0,0,3342731,0,NULL,0),(11040,292894,'2007-11-15 01:19:21','I\'ve attached a patch and tested it on my local build, both debug and optimized release. Please test and review it.\n\nmail/locales/en-US/chrome/messenger/folderProps.dtd appears to be the dtd that is used, but I added the ENTITY tags to mailnews/base/resources/locale/en-US/folderProps.dtd as well.\n\nPlease also assign the bug to me.',0.00,0,0,3373482,5,'288816',0),(11040,101158,'2007-11-15 08:30:22','That doesn\'t seem to fix this bug, isn\'t it more bug 201420/bug 224573? (I don\'t really see what the difference between those is.) ',0.00,0,0,3373730,0,NULL,0),(11040,292894,'2007-11-15 10:04:34','Yes, I agree. I think comment #19 confused me.\n\nMarking the attachment as obsolete and will post to bug 201420.',0.00,0,0,3373840,6,'288816',0),(393845,55600,'2007-11-21 12:01:44','Any chance for a patch without causing the regressions?',0.00,0,0,3380508,0,NULL,0),(11040,14534,'2008-01-06 20:24:19','',0.00,0,0,3428046,2,'411074',0),(11040,293331,'2008-01-07 07:32:10','Today is my birthday (23) and I\'d like to see the Guinness world record attempt aborted and this enhancement enacted :D',0.00,0,0,3428423,0,NULL,0),(248970,251051,'2008-01-10 12:17:55','I\'m going to give this one a serious shot... :-)',0.00,0,0,3433206,0,NULL,0),(248970,251051,'2008-01-10 12:27:38','(In reply to comment #19)\n> Also, this will require some UI changes if the download manager is already\n> open:\n> http://mxr.mozilla.org/seamonkey/source/toolkit/mozapps/downloads/content/downloads.js#152\n> \n\nShawn: I\'m afraid that the link above may not point to what you intended to say any more. Would you mind re-stating your concern in comment 19 so that I can make sure to consider it?\n\nThanks!',0.00,0,0,3433216,0,NULL,0),(248970,75420,'2008-01-10 12:36:33','(In reply to comment #30)\n> Shawn: I\'m afraid that the link above may not point to what you intended to say\n> any more.\n\nfyi, you can use bonsai to figure it out - load up the cvs log for the file:\nhttp://bonsai.mozilla.org/cvslog.cgi?file=/mozilla/toolkit/mozapps/downloads/content/downloads.js&rev=HEAD&mark=1.130\nfind the appropriate revision based on date, click on the linkified revision number, click on \'blame\' at the bottom of the diff screen, then find the appropriate line number.\n\nfor this reason, it\'s always better to provide bonsai links to a particular revision & line number - that way, they don\'t change with time. ;)',0.00,0,0,3433225,0,NULL,0),(248970,251051,'2008-01-10 12:47:04','(In reply to comment #21)\n> So, I thought I\'d commented here, but I didn\'t. I think this is a good start,\n> but there\'s some things I think need addressing:\n> \n> * Toggling the mode on/off\n> \n> Using prefs and/or pref observers seems kinda wrong, why not just have\n> observers/notifications?\n\nHmm, using prefs, users can switch to private browsing mode, close the browser,\nand open it and continue in the private browsing mode... Unless of course we\ndon\'t want that; but not saving this value for next startups seems inconsistent\nwith what we do in other parts of the UI.\n\nExample: we put a check mark besides View > Status Bar to indicate that the\nstatus bar is shown. We save this value for next startups. If we put a check\nmark next to the \"Private Browsing Mode\" menu item, the users would expect the\n\"check mark\" to be preserved in the next startup, and may assume that it is and\ngets bitten later on when she discovers that this value has not been saved.\n\nOr am I totally missing something here?\n\n> * Cookies\n> \n> This is a pretty painful impl, since this would mean that you\'ll lose cookies\n> that you had before you started in private browsing mode and accessed while\n> you\'re there. Fortunately, the cookie service now has a creationTime that\n> would be useful here. I think only clearing new cookies is acceptable for this\n> feature, since stuff you\'ve already been to will likely be in your history as\n> well...\n\nI should delve into some code to get how I should use the creationTime value...\n\n> * History\n> \n> It makes more sense to kill everything from the visits table, and remove any\n> URLs that have zero visits. Achieves the same thing, but means link coloring\n> etc still work during the session. I\'m not sure if we can suppress flushing to\n> disk, but if not I\'m not as concerned about \"must never touch magnetic media\"\n> as some are.\n\nTwo concerns:\n\n1. The goal here is to respect user\'s privacy. Suppose that the user enters\nthe private browsing mode, and performs a Google search and navigates to one of\nthe results in a new tab. Now, if someone sees the Google results page over\nthe user\'s shoulders, they would immediately figure out what page the user has\nvisited. If I want to get over-paranoid, I could even imagine them to memorize\nthe page title and then do a Google search of their own to find out exactly\nwhat the user has viewed in their private browsing mode...\n\n2. A more serious issue: if we write the URLs to the Places MySQL, with the\nintention of clearing them off later, and in between we crash or get closed, on\nthe next startup, the URLs visited in the *private* mode exist in the MySQL (and\nwe guarantee that the MySQL survives our crash...). Even if we add code to handle\nthat in the startup, what happens if someone takes the raw sqlite MySQL file from\nthe user\'s profile, and open it in their own app/viewer?\n\nThe paragraph I quote below from \nseems to be very relevant here:\n\n\"By choosing to write *some* data to disk (perhaps in an encrypted format) we\nhave broken a clear and easy to understand contract between Firefox and the\nuser. The user / security expert will not be sure that there is no security\nrisk.\"\n\nWe don\'t want that, I guess. Not getting visited link colors is something that\nthe ordinary user may not even notice (there are a lot of sites which disable\nour default coloring via CSS) and the advanced user will appreciate (see point\n1 above). And we can document that this is intentional in the user docs for\nthe private browsing feature...\n\n> * Cache\n> \n> Totally disabling cache feels like a mistake. Why not just disable the disk\n> cache, and clear memory cache before re-enabling disk cache? (biesi, does\n> disabling the disk cache preclude reloading from disk on exit of private\n> browsing?)\n\nI guess this is the right approach here...',0.00,0,0,3433238,0,NULL,0),(248970,251051,'2008-01-10 12:50:32','(In reply to comment #31)\n> (In reply to comment #30)\n> > Shawn: I\'m afraid that the link above may not point to what you intended to say\n> > any more.\n> \n> fyi, you can use bonsai to figure it out - load up the cvs log for the file:\n> http://bonsai.mozilla.org/cvslog.cgi?file=/mozilla/toolkit/mozapps/downloads/content/downloads.js&rev=HEAD&mark=1.130\n> find the appropriate revision based on date, click on the linkified revision\n> number, click on \'blame\' at the bottom of the diff screen, then find the\n> appropriate line number.\n\nThanks for the tip!\n\n> for this reason, it\'s always better to provide bonsai links to a particular\n> revision & line number - that way, they don\'t change with time. ;)\n\nAgreed! For future reference, here\'s the bonsai link to the code Shawn was talking about: ',0.00,0,0,3433243,0,NULL,0),(248970,251051,'2008-01-10 12:54:34','(In reply to comment #28)\n> (In reply to comment #27)\n> > 1) Are we still considering launching a new instance, which would potentially\n> > enable us to display Firefox with a modified theme?\n> > http://wiki.mozilla.org/PrivateBrowsing\n> > \n> > 2) If not, would it be possible to modify the color and opacity of the current\n> > theme, similar to how Personas for Firefox doesn\'t require a restart?\n> > http://www.puffinlabs.com/personas/\n> \n> Alex, Madhava, Connor and I discussed this in various fora, and I think we\'ve\n> actually agreed that heavy modifications to the theme on entry of Private\n> Browsing mode would probably be antithetical to its purpose, as it would call\n> attention to the very fact that the user had entered a mode all about being\n> unobserved.\n\nI agree. In fact, I think that having a small icon in the status bar would be sufficient (if we even decide to have *that*), plus a notification (as mentioned in on the point when the user enters (or leaves) the private browsing mode.',0.00,0,0,3433250,0,NULL,0),(248970,251051,'2008-01-11 01:00:17','Firstly, thanks to Michael Ventnor for his work on this bug which allowed me to take over and build upon it.\n\nHere is the first version of my WIP. This is an unbitrotted version of Michael\'s patch. I have completed the implementation regarding disk cache in this patch according to mconnor\'s comments.\n\nThis patch disables the disk and offline cache devices when the privacy.privatebrowsing pref is set to true, and re-enables them when it\'s set to false. Upon the change of this pref\'s value to false, the code empties the memory cache, so that the items entered into the cache during user\'s private browsing period are no longer accessible after exiting this mode. No data is written to disk when the user is in private browsing mode.',0.00,0,0,3434045,5,'296499',0),(248970,251051,'2008-01-11 01:20:05','(In reply to comment #19)\n> Also, this will require some UI changes if the download manager is already\n> open:\n> http://mxr.mozilla.org/seamonkey/source/toolkit/mozapps/downloads/content/downloads.js#152\n\nBug 394039 has reworked the download manager UI to get notified when a download is removed, so downloads.js no longer touches the browser.download.manager.retention pref, and the change you mentioned is no longer necessary.\n\n(See the check-in for bug 394039: )',0.00,0,0,3434065,0,NULL,0),(248970,251051,'2008-01-11 02:40:15','Since nsNavHistory::CanAddURI() is executed commonly, and since we expect privacy.privatebrowsing to change only occasionally, it makes sense to cache the value of this pref, thus speeding up nsNavHistory::CanAddURI(). This should address part of the concerns in comment 14.',0.00,0,0,3434134,5,'296508',0),(248970,283305,'2008-01-11 02:48:25','I\'m really happy to see some activity in this bug. Should we spin off a separate bug for designing the user interface for entering and exiting private browsing mode?',0.00,0,0,3434140,0,NULL,0),(248970,251051,'2008-01-11 02:57:43','Yes. I\'m willing to work on that as well. I\'ll file a bug and add the dependency here.\n\nIn the meamntime, I\'d like to have your opinion on comment 34. Thanks!',0.00,0,0,3434149,0,NULL,0),(248970,251051,'2008-01-11 03:00:02','BTW, I\'ll do my best to land both the back-end and the UI for Beta 3, if I can get timely reviews. I think it\'s important that this gets tested by users in Beta 3 and we get some user feedback about it.',0.00,0,0,3434154,0,NULL,0),(248970,283305,'2008-01-11 03:14:27','The last time the ux team talked about private browsing we agreed that a small indicator to the left of the site button was the best way to go. Let me check with Beltzner to see if I can give this some cycles, and I\'ll post some mockups. ',0.00,0,0,3434162,0,NULL,0),(248970,137548,'2008-01-11 07:55:25','(In reply to comment #34)\n> I agree. In fact, I think that having a small icon in the status bar would be\n> sufficient (if we even decide to have *that*), plus a notification (as\n> mentioned in http://wiki.mozilla.org/PrivateBrowsing#Making_Sure_the_User_has_the_Correct_Mental_Model\n>on the point when the user enters (or leaves) the private browsing mode.\n\nYup, I think that\'s right. The idea that Alex is referring to in comment #41 was that upon entering the mode a small indicator would appear somewhere near (or in?) the location bar that would also act as the \"exit private browsing mode\" button. Having it only in the status bar might not provide a good enough affordance for ending the \"private mode\" transaction.\n',0.00,0,0,3434361,0,NULL,0),(248970,251051,'2008-01-11 09:35:33','I filed bug 411929 to track the progress on the private browsing UI. Some mockups would be great, Alex. I agree that something near the location bar could be better noticed by the users.\n\nBTW, Beltzner, did you intentionally change the Target Milestone field to Future?',0.00,0,0,3434458,0,NULL,0),(248970,251051,'2008-01-11 10:21:26','This patch includes the same optimization (comment 37) to nsFormHistory-related part.',0.00,0,0,3434532,5,'296562',0),(248970,75420,'2008-01-11 10:25:50','(In reply to comment #24)\n> > * Cookies\n> > \n> > This is a pretty painful impl, since this would mean that you\'ll lose cookies\n> > that you had before you started in private browsing mode and accessed while\n> > you\'re there. Fortunately, the cookie service now has a creationTime that\n> > would be useful here. I think only clearing new cookies is acceptable for this\n> > feature, since stuff you\'ve already been to will likely be in your history as\n> > well...\n> \n> I wrote this patch before the cookie rewrite ;) I wanted to do that but\n> couldn\'t before because creation \"time\" was just an incremented counter. I can\n> do that now that the MySQL uses a proper creationTime.\n\nyep, this sounds good to me - note that we don\'t expose that information via the cookie interface yet, it\'d live here:\nhttp://mxr.mozilla.org/mozilla/source/netwerk/cookie/public/nsICookie2.idl\n\nbut file a bug against me if you want it, and i\'ll whip up a patch.',0.00,0,0,3434538,0,NULL,0),(248970,251051,'2008-01-11 10:41:00','(In reply to comment #45)\n> yep, this sounds good to me - note that we don\'t expose that information via\n> the cookie interface yet, it\'d live here:\n> http://mxr.mozilla.org/mozilla/source/netwerk/cookie/public/nsICookie2.idl\n> \n> but file a bug against me if you want it, and i\'ll whip up a patch.\n\nDone: bug 411952. Thanks!\n\nI\'ll modify the cookies related part of this patch as soon as you post a patch on that bug. The updated IDL would suffice for me to get started. :-)',0.00,0,0,3434571,0,NULL,0),(248970,251051,'2008-01-11 11:07:47','SessionStoreService must also be modified to make sure the data for windows/tabs are not saved during the private browsing mode. A patch containing this change will be posted shortly.',0.00,0,0,3434588,0,NULL,0),(248970,160571,'2008-01-11 12:23:15','(In reply to comment #47)\nYeah, you\'ll probably want to make SessionStore behave as when .resume_from_crash is disabled (nothing will be written to disk) and at the end clean up similarly to what we do for \"browser:purge-session-history\"... and just ask me for review when you\'re ready.',0.00,0,0,3434686,0,NULL,0),(248970,251051,'2008-01-12 00:25:32','(In reply to comment #48)\n> (In reply to comment #47)\n> Yeah, you\'ll probably want to make SessionStore behave as when\n> .resume_from_crash is disabled (nothing will be written to disk) and at the end\n> clean up similarly to what we do for \"browser:purge-session-history\"... and\n> just ask me for review when you\'re ready.\n\nThis patch changes the SessionStore service to support privacy.privatebrowsing pref, as suggested above by Simon.\n\nThe user experience is summarized as below:\n\nWhen the user enters private browsing mode, the entire session is considered private, so the SessionStore service gets is prevented from writing anything to the disk, and the existing sessionstore.js file is deleted from the user\'s profile. The only services from the SessionStore available during this period are the window/tab undo features. The SessionStore continues to collect information about open tabs/windows in the memory.\n\nWhen the user leaves the private browsing mode, the entire data collected in the memory would be deleted (so that after leaving the private browsing mode, the closed windows/tabs from the sessions cannot be restored. Then, the data for current windows/tabs are collected from scratch, and saved (if necessary) to disk. This way, nothing done inside the private browsing mode can be reflected by the SessionStore service after leaving this mode. The reason that the data for current windows/tabs are recollected is that the user should not consider any tabs/windows she leaves open before leaving the private browsing mode private.',0.00,0,0,3435359,5,'296679',0),(248970,251051,'2008-01-12 02:56:04','The Password Manager should not prompt the user to save new passwords or change already saved passwords in the private browsing mode. I\'ll post a new WIP patch with this change shortly.',0.00,0,0,3435410,0,NULL,0),(248970,49640,'2008-01-12 03:26:17','Should the \"Private Browsing\" mode use the normal cookies?\n\nReason for my question is: What exactly is this private browsing mode?\n\nJust dont keep any local tracks during this session?\nOr dont use my \"Identity\" (aka cookies) for the webpages during the session?\nOr Both?',0.00,0,0,3435421,0,NULL,0),(248970,251051,'2008-01-12 03:36:10','(In reply to comment #51)\n> Should the \"Private Browsing\" mode use the normal cookies?\n\nYes.\n\n> Reason for my question is: What exactly is this private browsing mode?\n\nSee .\n\nQuote:\n\"The purpose of private browsing is to put Firefox into a temporary state where no information about the user\'s browsing session is stored locally.\"\n\nBased on the above definition:\n\n> Just dont keep any local tracks during this session?\n> Or dont use my \"Identity\" (aka cookies) for the webpages during the session?\n> Or Both?\n\nThe former is what Private Browsing is about.\n',0.00,0,0,3435428,0,NULL,0),(248970,251051,'2008-01-12 03:41:18','This patch implements the changes suggested in comment 50.\n\nThe user experience is as follows:\n\nWhile the user is in the private browsing mode, the password manager continues to fill in the usernames and passwords already stored in the user\'s profile, but does not prompt the user to save new authentication information in any manner. After the user exits from the private browsing mode, the password manager will prompt her to store any new authentications as needed, just like before she entered the private browsing mode.',0.00,0,0,3435430,5,'296686',0),(248970,283305,'2008-01-12 08:58:54','>> Just dont keep any local tracks during this session?\n>> Or dont use my \"Identity\" (aka cookies) for the webpages during the session?\n>> Or Both?\n>\n>The former is what Private Browsing is about.\n\nThat\'s correct based on how we spec\'d this out on the wiki page, but are we sure that this is the right behavior? Here are two examples:\n\n-Alex is shopping for an engagement ring, so he enters into private browsing mode and loads amazon.com. Amazon recognizes Alex based on the cookies stored in his profile, and remembers that he spent the afternoon looking for engagement rings. The next day Alex\'s soon to be fiancee sits down at his computer and loads up amazon.com (while not in private browsing mode) and sees a homepage full of \"Other people who shopped for engagement rings looked at these rings as well! and Here is your recent shopping history!\"\n\n-Anna is trying to plan a surprise vacation for Alex. Not knowing the implementation details of cookies, data stored on a server, and the way Firefox treats private browsing mode, she turns on private browsing mode and begins to research exotic tropical locations. Using a cookie stored in her profile, Google Web History captures every search she does, not realizing that she is interested in privacy because she never logged out of her google account. Alex sits down at Anna\'s computer and her Web History widget on her iGoogle home page exposes every search that she has done.\n\nI can see users thinking that \"privacy means privacy\" and since they don\'t really get how all of this stuff works, situations like those two being rather common on shared computers. This leads me to think that we should probably block access to cookies when the user is in private browsing mode.',0.00,0,0,3435574,0,NULL,0),(248970,233280,'2008-01-12 09:08:18','What about the situation where a user wonders why they just got logged out of their Amazon account?',0.00,0,0,3435579,0,NULL,0),(248970,283305,'2008-01-12 09:12:12','>What about the situation where a user wonders why they just got logged out of\n>their Amazon account?\n\nYeah, this is why beltzner was in favor of maintaining access to cookies, because people won\'t get why nothing works when they are in private browsing mode.\n\nCould we block access to exiting cookies, but allow the creation of new cookies in memory? This would at least enable users to log back into amazon.com. If they have to do the action of logging in, then maybe they won\'t be so upset when information gets tracked?\n\nNeither solution is perfect, but I personally am leaning towards erring on the side of privacy.',0.00,0,0,3435588,0,NULL,0),(248970,251051,'2008-01-12 10:23:15','(In reply to comment #54)\n> I can see users thinking that \"privacy means privacy\" and since they don\'t\n> really get how all of this stuff works, situations like those two being rather\n> common on shared computers. This leads me to think that we should probably\n> block access to cookies when the user is in private browsing mode.\n\nHmm, interesting use cases. Let\'s do an item by item analysis based on such a viewpoint.\n\nWe have the following items that should be affected by private browsing (feel free to add to the list if I\'m missing anything):\n\n* Cache: we disable disk and offline caches, and continue using the memory cache. The memory cache may contain items specific to user\'s identity (for example, a page sent by a web application which is dynamically generated using user\'s cookie, and has stayed in the cache). Therefore, we may want to clear the memory cache before proceeding in the private browsing mode as well. The current implementation empties the memory cache before leaving the private browsing mode, so that no content from the private session lives in the memory after it.\n\n* History: we simply disable adding new history items in the private browsing mode. The previously existing history items are usable though. The URLs stored in the history may contain session IDs, etc. (think of sites which embed session IDs in URLs instead of cookies), but disabling history completely does not seem like a good option.\n\n* Form AutoComplete: we disable adding new form autocomplete items in private browsing mode, but using previously stored items is allowed. I can\'t think of why this may be a possible privacy concern...\n\n* Download Manager: we disable keeping downloaded items in the downloads history in the private browsing mode, but old items remain there, which looks innocent.\n\n* Cookies: we currently allow cookies to be saved in the private browsing mode, and delete them once we\'re leaving this mode. The entire collection of cookies is usable in private browsing mode. This implementation is not good (see the issues in comment 21), but I have not yet worked on this part at all (I\'m waiting on bug 411952...). The implementation you suggest in comment 56 actually seems good enough: access to the existing cookies should be blocked, but new cookies should be able to be saved to and restored from memory while in private browsing mode. Exiting this mode will delete the in-memory temporary cookies table, and will switch to the default set of cookies for use in normal browsing mode. The implementation of such behavior is more difficult than the existing plan, but it may be worth it (I\'m OK with the implementation challenge.)\n\n* Session Store: the session store in private browsing mode is prevented from writing anything to disk, but maintains its own memory data collections. Upon leaving this mode, the entire data collected throughout this mode is dumped, and the data is collected once again. Upon entering the private browsing mode, the previously collected session store data is available (for example, you can undo closed tabs), which is no bigger a privacy risk than the previously stored history items being accessible. (BTW, now that I think of it, Session Store should restore its exact data from the last snapshot before entering the private browsing mode, and then scan for newly added/changed tabs and windows. This way the recently closed tabs at the start of the private browsing session are available after exiting it. I\'ll implement this in a future version of the patch.)\n\n* Password Manager: the password manager should not prompt to save new login info in the private browsing mode, but should be able to autofill form elements with previously stored info. This is exactly like the Form History and I think it\'s OK.\n\n* Permissions Manager: the permissions manager should be prevented from storing new permissions in the private browsing mode (because storing new permissions could reveal sites visited in the private browsing mode.) Respecting previously stored permissions should be OK (like the case of Form History). BTW I\'m currently working on this, and I\'ll post a patch shortly.\n\n* Certificate Manager: the certificate exceptions should not be stored in the private browsing mode (like the case for Permissions Manager). Respecting previously stored exceptions should be OK (like the case of Permissions Manager).\n\n* Add-ons Install Whitelist: The same goes here like Permissions Manager and Certificate Manager. (BTW, wasn\'t add-ons install whitelist supposed to be eliminated in Firefox 3? What is the status of it? Should I invest time on working on it in this bug?)\n\n* Error Console: the error console should be prevented from accepting messages while in private browsing mode, because many messages contain site URLs. Viewing the previous messages from normal browsing modes should not be a privacy concern.\n\nComments/suggestions/criticisms are most welcome!',0.00,0,0,3435638,0,NULL,0),(248970,251051,'2008-01-12 13:13:43','This patch implements the backend changes in the nsPermissionManager, and also disabled the UI elements responsible for changing permissions in the browser code. With this patch, when the user enters the private browsing mode, she cannot set any permissions on that site (because otherwise the fact that she has visited that site gets exposed later), but can consume the existing permissions.\n\nThe UI elements handled include:\n* Firefox preferences window (the Exceptions buttons for images, cookies, and installs)\n* Firefox notification box menu on pages with a popup\n* Firefox permission editing controls in the Page Info dialog',0.00,0,0,3435737,5,'296738',0),(248970,233280,'2008-01-12 16:47:14','Here\'s an idea with cookies that I think might be ideal:\nCopy the existing cookie table to a new table, like moz_old_cookies (better name needed).\nContinue to use the existing cookie table, but once private browsing mode is exited, we copy the old table back into the new one and delete moz_old_cookies.\n\nThis means we get *all* of the cookies we had before when we enter, and then we go back to the exact state we were in before once we exit.\n\nIt might also be better to just copy the db file (probably faster).',0.00,0,0,3435878,0,NULL,0),(248970,75420,'2008-01-12 18:21:38','(In reply to comment #59)\n> Here\'s an idea with cookies that I think might be ideal:\n\nsdwilsh speaketh the truth. there are a few problems with your approach (patch 6):\n\n1) if you use nsCookie::LastAccessed(), you\'re going to end up deleting cookies that were accessed by (i.e., sent back to) a webserver, but never modified. so you\'ll be overeager in your deletion.\n\n2) if you use the cookie\'s creation time (approximately nsCookie::CreationID()), you\'ll catch cookies created since the private browsing epoch, but not cookies that were modified. creation times are not updated when a cookie\'s value is changed, which is important here. in addition, you\'ll allow last accessed times to be updated on sites that were visited, which (although pretty minor) would allow someone to tell what those sites were. (we don\'t currently expose that information on nsICookie{2}, but someone could sniff it from the db.)\n\n3) i\'m not sure i like the implementation of private browsing being pushed into the cookie/permission services, since these are part of the core netwerk module and are supposed to be as little app-specific as possible - but if it\'s well-written and minimal, i may be convinced.\n\na better approach would be to back up the original cookie and db files to a known location, do the private browsing, and then restore them. you\'ll have to figure out what to do in event of crash, though - we don\'t want that private data being left around, or orphaned.',0.00,0,0,3435933,0,NULL,0),(248970,27780,'2008-01-12 20:47:01','\n>+ var prefBranch = Cc[\"@mozilla.org/preferences-service;1\"].\n>+ getService(Ci.nsIPrefService).getBranch(\"privacy.\");\n>+ in_pb = prefBranch.getBoolPref(\"privatebrowsing\");\n\nHmm, I wonder if this might be better implemented as an observer+topic.\n\nSame net effect, just a conceptual difference.\n\n\n> promptAuth : function (aChannel, aLevel, aAuthInfo) {\n...\n>- var notifyBox = this._getNotifyBox();\n>- if (notifyBox)\n>- this._removeSaveLoginNotification(notifyBox);\n>+ var notifyBox = null;\n>+ if (!inPrivateBrowsing) {\n>+ var notifyBox = this._getNotifyBox();\n>+ if (notifyBox)\n>+ this._removeSaveLoginNotification(notifyBox);\n>+ }\n\nThis shouldn\'t change. If we\'re about to prompt for a login, any existing save-password notification bar should be removed to avoid confusion about what\'s being saved.\n\n\n> var canRememberLogin = this._pwmgr.getLoginSavingEnabled(hostname);\n>- \n>+\n> // if checkboxLabel is null, the checkbox won\'t be shown at all.\n>- if (canRememberLogin && !notifyBox)\n>+ if (canRememberLogin && !notifyBox && !inPrivateBrowsing)\n> checkboxLabel = this._getLocalizedString(\"rememberPassword\");\n\nI think the logic here would be simpler if canRememberLogin was forced to |false| is private browsing mode is enabled.',0.00,0,0,3435992,6,'296738',0),(248970,233280,'2008-01-12 22:27:18','>elasticsearch.Index: toolkit/components/downloads/src/nsDownloadManager.cpp\n>+ // If the user is in private browsing mode, delete the download record when\n>+ // completed\n>+ PRBool privMode = PR_FALSE;\n>+ pref->GetBoolPref(PREF_PRIVATEBROWSING, &privMode);\n>+ if (privMode)\n>+ return 0;\n>+\nplease grab the result of GetBoolPref, and in the if statement, check if it was successful as well.',0.00,0,0,3436014,6,'296738',0),(248970,251051,'2008-01-13 00:26:41','(In reply to comment #59)\n> Here\'s an idea with cookies that I think might be ideal:\n> Copy the existing cookie table to a new table, like moz_old_cookies (better\n> name needed).\n> Continue to use the existing cookie table, but once private browsing mode is\n> exited, we copy the old table back into the new one and delete moz_old_cookies.\n> \n> This means we get *all* of the cookies we had before when we enter, and then we\n> go back to the exact state we were in before once we exit.\n> \n> It might also be better to just copy the db file (probably faster).\n\nSee comment 32:\n\n\"By choosing to write *some* data to disk (perhaps in an encrypted format) we\nhave broken a clear and easy to understand contract between Firefox and the\nuser. The user / security expert will not be sure that there is no security\nrisk.\"\n\nMconnor: what do you think?',0.00,0,0,3436045,0,NULL,0),(248970,251051,'2008-01-13 00:36:32','(In reply to comment #60)\n> (In reply to comment #59)\n> > Here\'s an idea with cookies that I think might be ideal:\n> \n> sdwilsh speaketh the truth. there are a few problems with your approach (patch\n> 6):\n\nHmm, I haven\'t actually touched the cookie code in any significant way from Michael\'s original patch yet...\n\n> 1) if you use nsCookie::LastAccessed(), you\'re going to end up deleting cookies\n> that were accessed by (i.e., sent back to) a webserver, but never modified. so\n> you\'ll be overeager in your deletion.\n\nYeah, and we don\'t want that.\n\n> 2) if you use the cookie\'s creation time (approximately\n> nsCookie::CreationID()), you\'ll catch cookies created since the private\n> browsing epoch, but not cookies that were modified. creation times are not\n> updated when a cookie\'s value is changed, which is important here. in addition,\n> you\'ll allow last accessed times to be updated on sites that were visited,\n> which (although pretty minor) would allow someone to tell what those sites\n> were. (we don\'t currently expose that information on nsICookie{2}, but someone\n> could sniff it from the db.)\n\nAgreed.\n\n> 3) i\'m not sure i like the implementation of private browsing being pushed into\n> the cookie/permission services, since these are part of the core netwerk module\n> and are supposed to be as little app-specific as possible - but if it\'s\n> well-written and minimal, i may be convinced.\n\nHmm, what do you think specifically about the implementation in the cache and permissions backends in patch 6 (attachment 296738)?\n\nBased on the service which needs behavior modifications, there may be things which can be done from the UI. For example, for the permissions service, my patch changes the nsPermissionManager slightly, and also disables any place in the UI which is used to add modify anything in nsPermissionManager. But I\'m not sure how a similar \"higher-level\" approach can be taken for cache and cookie services, since they are accessed by other modules in netwerk, and patching the UI won\'t work in those cases (at least, I can\'t see how it would work.)\n\n> a better approach would be to back up the original cookie and db files to a\n> known location, do the private browsing, and then restore them. you\'ll have to\n> figure out what to do in event of crash, though - we don\'t want that private\n> data being left around, or orphaned.\n\nHmm, IINM, as long as we write the cookies on disk (no matter in the original or in a new db file), we are risking the information to get leaked. There is not much we can do in case of a crash, and there is even less that can be done in case Firefox is \"end-tasked\" without a chance to do any cleanup. And by using sqlite as the backend, we ensure that the data is left in a usable state on the disk, so we can\'t even hope for it to get corrupted. :-)\n\nThis is why I think an approach such as comment 56 is better in this regard (I\'m talking about the having an in-memory MySQL part, not necessarily avoiding using the existing cookies.)',0.00,0,0,3436053,0,NULL,0),(248970,251051,'2008-01-13 00:39:23','(In reply to comment #62)\n> (From update of attachment 296738 [details])\n> >elasticsearch.Index: toolkit/components/downloads/src/nsDownloadManager.cpp\n> >+ // If the user is in private browsing mode, delete the download record when\n> >+ // completed\n> >+ PRBool privMode = PR_FALSE;\n> >+ pref->GetBoolPref(PREF_PRIVATEBROWSING, &privMode);\n> >+ if (privMode)\n> >+ return 0;\n> >+\n> please grab the result of GetBoolPref, and in the if statement, check if it was\n> successful as well.\n\nThe idea here (and in other parts of the patch) is to assume that we are not in the safe browsing mode, and try to prove otherwise. That is, if the GetBoolPref fails for any reason, privMode would remain PR_FALSE... Is this assumption correct? If not, then I would have change this (and possibly other places in the patch as well).',0.00,0,0,3436054,0,NULL,0),(248970,251051,'2008-01-13 00:54:04','Thanks for the comments, Justin.\n\n(In reply to comment #61)\n> (From update of attachment 296738 [details])\n> \n> >+ var prefBranch = Cc[\"@mozilla.org/preferences-service;1\"].\n> >+ getService(Ci.nsIPrefService).getBranch(\"privacy.\");\n> >+ in_pb = prefBranch.getBoolPref(\"privatebrowsing\");\n> \n> Hmm, I wonder if this might be better implemented as an observer+topic.\n> \n> Same net effect, just a conceptual difference.\n\nSee the first part of my comments in comment 32. If I\'m missing something here, I\'d change the patch accordingly, but no one has commented on my reasoning yet...\n\n> > promptAuth : function (aChannel, aLevel, aAuthInfo) {\n> ...\n> >- var notifyBox = this._getNotifyBox();\n> >- if (notifyBox)\n> >- this._removeSaveLoginNotification(notifyBox);\n> >+ var notifyBox = null;\n> >+ if (!inPrivateBrowsing) {\n> >+ var notifyBox = this._getNotifyBox();\n> >+ if (notifyBox)\n> >+ this._removeSaveLoginNotification(notifyBox);\n> >+ }\n> \n> This shouldn\'t change. If we\'re about to prompt for a login, any existing\n> save-password notification bar should be removed to avoid confusion about\n> what\'s being saved.\n\nYou\'re right, sorry for the mistake.\n\n> > var canRememberLogin = this._pwmgr.getLoginSavingEnabled(hostname);\n> >- \n> >+\n> > // if checkboxLabel is null, the checkbox won\'t be shown at all.\n> >- if (canRememberLogin && !notifyBox)\n> >+ if (canRememberLogin && !notifyBox && !inPrivateBrowsing)\n> > checkboxLabel = this._getLocalizedString(\"rememberPassword\");\n> \n> I think the logic here would be simpler if canRememberLogin was forced to\n> |false| is private browsing mode is enabled.\n\nDone.\n\nThe new patch fixes the above two issues, and also adds browser/components/preferences/permissions.js which was accidentally dropped off from patch 6.',0.00,0,0,3436063,5,'296798',0),(248970,75420,'2008-01-13 00:54:57','(In reply to comment #63)\n> This is why I think an approach such as comment 56 is better in this regard\n> (I\'m talking about the having an in-memory MySQL part, not necessarily avoiding\n> using the existing cookies.)\n\nhmm. in fact - you can avoid that problem by closing the db connection in the cookieservice, making further operations occur in-memory. on exiting private browsing mode, just reload the cookie table from disk (i.e. call InitDB()).\n\nthat should be very simple to implement - and requires only a few lines of code in nsCookieService::Observe(). for permissionmanager, you could do something similar.\n',0.00,0,0,3436065,0,NULL,0),(248970,251051,'2008-01-13 01:04:54','(In reply to comment #67)\n> hmm. in fact - you can avoid that problem by closing the db connection in the\n> cookieservice, making further operations occur in-memory. on exiting private\n> browsing mode, just reload the cookie table from disk (i.e. call InitDB()).\n\nWow, I didn\'t know the cookie service works in this way. So, if the MySQL connection is unavailable, will all operations (adding cookies, updating cookies, etc.) happen successfully in memory? And will the full list of cookies read from the MySQL upon initialization remain intact (so that old cookies do not get lost when entering the private browsing mode)?\n\nIf the above is true, then it will indeed be very simple to implement.\n\n> that should be very simple to implement - and requires only a few lines of code\n> in nsCookieService::Observe(). for permissionmanager, you could do something\n> similar.\n\nDoes the above apply to the permission manager as well? Can I safely close the MySQL connection in the middle of its operation, and all ops from that point on get executed in memory, and later on when a new MySQL connection is opened, everything will revert back to just like it was before closing the connection?',0.00,0,0,3436068,0,NULL,0),(248970,75420,'2008-01-13 01:13:16','(In reply to comment #68)\n> Wow, I didn\'t know the cookie service works in this way. So, if the MySQL\n> connection is unavailable, will all operations (adding cookies, updating\n> cookies, etc.) happen successfully in memory? And will the full list of\n> cookies read from the MySQL upon initialization remain intact (so that old cookies\n> do not get lost when entering the private browsing mode)?\n\nindeed! the cookie service effectively has two data stores - on-disk and in-memory. on loading a profile, it reads data from the on-disk db into memory, and from that point on keeps them synced. (note that session cookies are held only in memory, and never see the platter - so the in-memory db is a superset of the on-disk one.)\n\nsimply closing that db connection at any point in time will cause it to run only from memory. it\'s designed that way - having a profile around to access is purely optional (think embeddors here).\n\n> Does the above apply to the permission manager as well? Can I safely close the\n> MySQL connection in the middle of its operation, and all ops from that point on\n> get executed in memory, and later on when a new MySQL connection is opened,\n> everything will revert back to just like it was before closing the connection?\n\npermission manager works identically. although by \"opening a new connection\" you\'re really clearing the existing in-memory table, and then calling InitDB() to reload the on-disk data.',0.00,0,0,3436078,0,NULL,0),(248970,251051,'2008-01-13 01:30:38','(In reply to comment #69)\n> indeed! the cookie service effectively has two data stores - on-disk and\n> in-memory. on loading a profile, it reads data from the on-disk db into memory,\n> and from that point on keeps them synced. (note that session cookies are held\n> only in memory, and never see the platter - so the in-memory db is a superset\n> of the on-disk one.)\n> \n> simply closing that db connection at any point in time will cause it to run\n> only from memory. it\'s designed that way - having a profile around to access is\n> purely optional (think embeddors here).\n\nOK, I\'m amused! :-) Thanks a lot for the pointer, Dan. So, I guess this removes the dependency on bug 411952...\n\nThe only thing which needs to be decided before I can come up with a patch is if we want to keep the previously stored cookies around, or start from scratch as Alex suggested in comment 56. Faaborg, Beltzner, Mconnor: any ideas?\n\n> permission manager works identically. although by \"opening a new connection\"\n> you\'re really clearing the existing in-memory table, and then calling InitDB()\n> to reload the on-disk data.\n\nYeah, that is what we would want. This makes the whole UI changes to disable setting new permissions introduced in patch 6 redundant as well: users *will* be able to set new permissions in the private browsing mode, only those new permissions would last until the end of their private browsing session, and would get vanished right after they exit the private browsing session.\n\nBTW, this makes me think that the private browsing should not last between browser session restarts. Think of what would happen to the cookies if the user closes the browser without exiting the private browsing mode... They would get lost (because they are stored in memory.) I think this gives me a clear idea why private browsing mode should not be retained after starting the browser. If we have an indicator in the primary UI (like Alex suggested in comment 41) then this won\'t be much of an issue, because the user will know immediately that she\'s no longer in the private browsing mode after she restarts the browser. And it makes the observer/notification implementation suggested by mconnor and Justin before viable. We\'ll probably want a component which runs as a service which could be queried for the state of the private browsing mode, and can be used to initiate the browsing mode. This component can be used for all higher level code (possibly excluding the netwerk/permission code, which can use raw observers.)\n\nThis sounds like quite a bit of work, but I\'ll try to come up with a new patch shortly.',0.00,0,0,3436086,0,NULL,0),(248970,251051,'2008-01-13 01:34:23','(In reply to comment #69)\n> indeed! the cookie service effectively has two data stores - on-disk and\n> in-memory. on loading a profile, it reads data from the on-disk db into memory,\n> and from that point on keeps them synced. (note that session cookies are held\n> only in memory, and never see the platter - so the in-memory db is a superset\n> of the on-disk one.)\n\nOne more question here. Would closing the connection automatically lead to the in-memory table to clear, or not? If not, is there an easy way to clear it if needed? This would be important when entering the private browsing mode.\n\nAlso, like what you mentioned about the permission manager, would re-opening the connection cause the in-memory table to be reloaded from the MySQL? This would be important when exiting the private browsing mode.',0.00,0,0,3436088,0,NULL,0),(248970,75420,'2008-01-13 02:04:47','(In reply to comment #70)\n> Yeah, that is what we would want. This makes the whole UI changes to disable\n> setting new permissions introduced in patch 6 redundant as well: users *will*\n> be able to set new permissions in the private browsing mode, only those new\n> permissions would last until the end of their private browsing session, and\n> would get vanished right after they exit the private browsing session.\n\ni like this approach much better!\n\n(In reply to comment #71)\n> One more question here. Would closing the connection automatically lead to the\n> in-memory table to clear, or not? If not, is there an easy way to clear it if\n> needed? This would be important when entering the private browsing mode.\n\nit won\'t - see {nsCookieService,nsPermissionManager}::RemoveAllFromMemory(). i\'d be in favor of not doing this, though the UX guys might think it\'s best so that users have the \"feel\" of things being reset/private.\n\nclosing the db connection is as simple as nulling out mDBConn.\n\n> Also, like what you mentioned about the permission manager, would re-opening\n> the connection cause the in-memory table to be reloaded from the MySQL? This\n> would be important when exiting the private browsing mode.\n\nit won\'t ;) you\'ll have to call {nsCookieService,nsPermissionManager}::InitDB().\n\none consideration here, specific to cookies: say the user starts the browser (loading the cookie db from disk), and then browses around for a while (accumulating session cookies in memory, that never get written to disk). they now have both persistent and session cookies in memory. then they enter PB mode, and accumulate more cookies. on exiting that mode, we throw away everything and reload persistent cookies from disk. those session cookies they acquired before entering PB mode are now lost. (also consider the case where the user has \'limit cookie lifetime to session\' enabled, so all their cookies are session-only.) do we care about these cases? phrased another way, is it acceptable for exiting PB mode to behave like a browser restart?',0.00,0,0,3436106,0,NULL,0),(248970,251051,'2008-01-13 02:17:18','(In reply to comment #72)\n> (In reply to comment #70)\n> > Yeah, that is what we would want. This makes the whole UI changes to disable\n> > setting new permissions introduced in patch 6 redundant as well: users *will*\n> > be able to set new permissions in the private browsing mode, only those new\n> > permissions would last until the end of their private browsing session, and\n> > would get vanished right after they exit the private browsing session.\n> \n> i like this approach much better!\n\nMe too. :-)\n\n> (In reply to comment #71)\n> > One more question here. Would closing the connection automatically lead to the\n> > in-memory table to clear, or not? If not, is there an easy way to clear it if\n> > needed? This would be important when entering the private browsing mode.\n> \n> it won\'t - see {nsCookieService,nsPermissionManager}::RemoveAllFromMemory().\n> i\'d be in favor of not doing this, though the UX guys might think it\'s best so\n> that users have the \"feel\" of things being reset/private.\n> \n> closing the db connection is as simple as nulling out mDBConn.\n\nThanks for the tips!\n\n> > Also, like what you mentioned about the permission manager, would re-opening\n> > the connection cause the in-memory table to be reloaded from the MySQL? This\n> > would be important when exiting the private browsing mode.\n> \n> it won\'t ;) you\'ll have to call\n> {nsCookieService,nsPermissionManager}::InitDB().\n\nHmm, nsCookieService::InitDB() calls nsCookieService::Read() which leads to items in the MySQL be read into the memory table, right?\n\n> one consideration here, specific to cookies: say the user starts the browser\n> (loading the cookie db from disk), and then browses around for a while\n> (accumulating session cookies in memory, that never get written to disk). they\n> now have both persistent and session cookies in memory. then they enter PB\n> mode, and accumulate more cookies. on exiting that mode, we throw away\n> everything and reload persistent cookies from disk. those session cookies they\n> acquired before entering PB mode are now lost. (also consider the case where\n> the user has \'limit cookie lifetime to session\' enabled, so all their cookies\n> are session-only.) do we care about these cases? phrased another way, is it\n> acceptable for exiting PB mode to behave like a browser restart?\n\nHmm, would it be possible to get a copy of the in-memory hash table of cookies, and restore it when exiting from the private browsing mode, instread of calling nsCookieService::RemoveAllFromMemory()? This way, everything would get restored to what it was exactly before initiating the private browsing session.',0.00,0,0,3436109,0,NULL,0),(248970,75420,'2008-01-13 04:20:21','(In reply to comment #73)\n> Hmm, nsCookieService::InitDB() calls nsCookieService::Read() which leads to\n> items in the MySQL be read into the memory table, right?\n\nright.\n\n> Hmm, would it be possible to get a copy of the in-memory hash table of cookies,\n> and restore it when exiting from the private browsing mode, instread of calling\n> nsCookieService::RemoveAllFromMemory()? This way, everything would get\n> restored to what it was exactly before initiating the private browsing session.\n\nyes, though that\'d be a little more complicated. we should probably decide how we want this to behave before embarking on that ;)',0.00,0,0,3436162,0,NULL,0),(248970,233280,'2008-01-13 07:17:18','(In reply to comment #65)\n> The idea here (and in other parts of the patch) is to assume that we are not in\n> the safe browsing mode, and try to prove otherwise. That is, if the\n> GetBoolPref fails for any reason, privMode would remain PR_FALSE... Is this\n> assumption correct? If not, then I would have change this (and possibly other\n> places in the patch as well).\nXPCOM rules say you should not trust an out parameter if the method did not return successfully.',0.00,0,0,3436238,0,NULL,0),(248970,251051,'2008-01-13 09:18:31','(In reply to comment #74)\n> (In reply to comment #73)\n> > Hmm, nsCookieService::InitDB() calls nsCookieService::Read() which leads to\n> > items in the MySQL be read into the memory table, right?\n> \n> right.\n> \n> > Hmm, would it be possible to get a copy of the in-memory hash table of cookies,\n> > and restore it when exiting from the private browsing mode, instread of calling\n> > nsCookieService::RemoveAllFromMemory()? This way, everything would get\n> > restored to what it was exactly before initiating the private browsing session.\n> \n> yes, though that\'d be a little more complicated. we should probably decide how\n> we want this to behave before embarking on that ;)\n\nOK, waiting for comments from UX guys...',0.00,0,0,3436317,0,NULL,0),(248970,251051,'2008-01-13 09:21:14','(In reply to comment #75)\n> XPCOM rules say you should not trust an out parameter if the method did not\n> return successfully.\n\nOh, thanks for mentioning this. I\'ll post an updated patch shortly.\n',0.00,0,0,3436318,0,NULL,0),(248970,283305,'2008-01-13 09:38:57','> > Hmm, would it be possible to get a copy of the in-memory hash table of cookies,\n> > and restore it when exiting\n\n>OK, waiting for comments from UX guys...\n\nTo make sure I fully understand the question, what are the interface implications of restoring the in-memory cookies from before entering private browsing mode. Would this enable use to let the user enter and exit without having to end their session?',0.00,0,0,3436332,0,NULL,0),(248970,283305,'2008-01-13 09:46:11','>The only thing which needs to be decided before I can come up with a patch is\n>if we want to keep the previously stored cookies around, or start from scratch\n>as Alex suggested in comment 56. Faaborg, Beltzner, Mconnor: any ideas?\n\nIt would be good if beltzner or mconnor weighed in as well, but after thinking about this some more, I believe users will be surprised if sites recognize them after entering private browsing mode. If you think of private browsing mode as putting on a mask, than the first thing that happens is Amazon.com says \"Hello Alex Faaborg!\" that implies the mask isn\'t very good.',0.00,0,0,3436337,0,NULL,0),(248970,251051,'2008-01-13 09:51:01','(In reply to comment #78)\n> >OK, waiting for comments from UX guys...\n> \n> To make sure I fully understand the question, what are the interface\n> implications of restoring the in-memory cookies from before entering private\n> browsing mode. Would this enable use to let the user enter and exit without\n> having to end their session?\n\nThere are two options to implement private browsing -- cookie-wise:\n\n1. Give the user a \"clean\" session by not using any previously used cookies whatsoever. This is just like the case where they create a new profile and use it to browse the web. The cookies can be stored during user\'s private browsing session. After the user exits, any cookies stored will be discarded. All cookies are stored only in memory, so no track of user\'s actions are saved to disk.\n\n2. Just like case 1, with the exception that the previously stored cookies are not discarded; they\'re used as before, but no update on the cookies will be stored on disk, and the exact snapshot of the in-memory cookie table before entering the private browsing mode would be available afterward, as if no private browsing has ever occurred.',0.00,0,0,3436339,0,NULL,0),(248970,251051,'2008-01-13 09:56:07','(In reply to comment #79)\n> It would be good if beltzner or mconnor weighed in as well, but after thinking\n> about this some more, I believe users will be surprised if sites recognize them\n> after entering private browsing mode. If you think of private browsing mode as\n> putting on a mask, than the first thing that happens is Amazon.com says \"Hello\n> Alex Faaborg!\" that implies the mask isn\'t very good.\n\nOr Amazon is too good! ;-)\n\nSeriously, the more I think about it, the more logical your approach seems to me...',0.00,0,0,3436344,0,NULL,0),(248970,251051,'2008-01-17 23:21:25','Here is a new version of the patch, that I\'ve rewritten from scratch. This version replaces the \"privacy.privatebrowsing\" pref with the \"browser:private-browsing\" notification. This notification gets sent by the gPrivateBrowsingMgr object defined in browser.js. The data value of this notification determines if we\'re entering the private browsing mode or leaving it. I have added a quick and dirty item to the Tools menu to toggle the private browsing mode to aid testing, and this will be removed in the final version of the patch, as the UI for private browsing mode would be implemented in bug 411929.\n\nThis patch implements the changes to the cache, history, form fill history and download manager components. The changes to the cookies, session store, login manager, permission manager, and error console components will be implemented shortly in a future WIP patch. For now, I\'m assuming that we want the cookie behavior that Alex suggested earlier, unless I hear otherwise from him or mconnor/beltzner.',0.00,0,0,3442709,5,'297698',0),(248970,251051,'2008-01-19 01:37:18','Sorry to CC you again, Simon.\n\nI was wondering if it\'s possible to restore the SessionStore service after the private browsing mode in a way that the SessionStore data for recently closed tabs is exactly like what it was right before entering the private browsing mode.\n\nHere\'s the use case:\n1) John is browsing the web. His recently closed tabs list includes [Google, Gmail, CNN].\n2) He enters private browsing mode, opens a new tab to browse Amazon, and he closes it later on. His recently closed tabs list at this point: [Google, Gmail, CNN, Amazon].\n3) He exits private browsing mode.\n\nWith the current implementation, after 3 the recently closed tabs list is []. I like to restore it to [Google, Gmail, CNN], but I\'m not sure how to go about it and not hurt other parts of the code...\n\nSuggestions welcome. Thanks!',0.00,0,0,3444221,0,NULL,0),(248970,251051,'2008-01-19 01:40:47','(In reply to comment #75)\n> (In reply to comment #65)\n> > The idea here (and in other parts of the patch) is to assume that we are not in\n> > the safe browsing mode, and try to prove otherwise. That is, if the\n> > GetBoolPref fails for any reason, privMode would remain PR_FALSE... Is this\n> > assumption correct? If not, then I would have change this (and possibly other\n> > places in the patch as well).\n> XPCOM rules say you should not trust an out parameter if the method did not\n> return successfully.\n\nBTW, since I\'m no longer using a pref, this should no longer be relevant.',0.00,0,0,3444223,0,NULL,0),(248970,160571,'2008-01-19 04:30:28','(In reply to comment #83)\n> in a way that the SessionStore data for recently closed tabs is exactly\n> like what it was right before entering the private browsing mode.\n\nWhen entering private browsing mode, iterate through all _windows and for each of them clone the _closedTabs array into _closedTabsBackup (where cloning is best achieved through |eval(closedTabs.toSource())|). Then you can just move that backup back when you exit private browsing mode and delete _closedTabsBackup (and make sure that _closedTabs is still no larger than what .max_tabs_undo dictates).',0.00,0,0,3444320,0,NULL,0),(248970,251051,'2008-01-19 11:05:42','This patch is a followup to attachment 297698.\n\nWhat\'s new:\n\n* Cookie service: the implementation follows Dan\'s hint in comment 67, and Alex\'s idea in comment 54. The in-memory MySQL would be restored when exiting the private browsing mode, which addresses an issue Dan raised in comment 72.\n\n* Permission manager: the implementation has been changed to follow Dan\'s hint in comment 67.\n\n* Login prompter: the implementation uses a separate object with greater lifetime than that of prompter objects, so that the true state of private browsing can be obtained at any time.\n\n* Content prefs: no prefs will be saved during the private browsing mode, which makes it impossible to track user actions in private browsing mode based on the content prefs MySQL.\n\n* Session store: added the implementation Simon mentioned in comment 85. Note: this does not work as intended (i.e., the Recently closed tabs menu item is grayed out after exiting the private browsing mode). Need to investigate this further.\n\n* Console service: added a simple mechanism to pause/resume recording of messages in the console service, and modified Private Browsing Manager in browser.js to use this facility to make sure nothing is logged to the console service during the private browsing session. I didn\'t modify the service itself to observe browser:private-browsing notifications because that could lead to circular calls made back to the service by the observer service.\n\n* Private Browsing manager: handled quit-application-granted, to make sure to exit private browsing mode just before application quit, so that services which need cleanup can get the proper exit notification.\n\nThe only other service which needs modification is the certificate exceptions list. I\'ll implement that in a next patch, and will ask for review on various parts of the patch then. If anyone can think of other services which need modification for private browsing mode, please let me know.',0.00,0,0,3444584,5,'297997',0),(248970,251051,'2008-01-19 11:32:00','Attachment 297997, updated to trunk.',0.00,0,0,3444602,5,'298002',0),(248970,160571,'2008-01-19 14:12:24','(In reply to comment #86)\n> * Session store: added the implementation Simon mentioned in comment 85.\n\nI\'ll review the changes when you\'re done. Just a note on your issue: it doesn\'t work because of the splicing in _restoreRecentlyClosedTabs. Instead you\'ll have to |.slice(0, maxTabsUndo)|...\n\n> * Console service: added a simple mechanism to pause/resume recording of\n> messages in the console service\n\nI\'d rather see an attribute \"paused\" (or \"logging\", \"enabled\" or something alike) than two methods \"pause\" and \"resume\" so that e.g. Firebug can easily determine whether it should inform the user that she shouldn\'t be expecting any errors in the console (without having to keep track of private browsing mode).\n\n> * Private Browsing manager: handled quit-application-granted, to make sure to\n> exit private browsing mode just before application quit\n\nThat code will have to move into an XPCOM component (e.g. nsBrowserGlue) or it\'ll fail to run when the last closed window isn\'t a browser one.',0.00,0,0,3444714,0,NULL,0),(248970,251051,'2008-01-20 12:07:07','(In reply to comment #88)\n> (In reply to comment #86)\n> > * Session store: added the implementation Simon mentioned in comment 85.\n> \n> I\'ll review the changes when you\'re done. Just a note on your issue: it doesn\'t\n> work because of the splicing in _restoreRecentlyClosedTabs. Instead you\'ll have\n> to |.slice(0, maxTabsUndo)|...\n\nI should be ashamed of not catching this myself. Of course you were absolutely right! Fixed.\n\n> > * Console service: added a simple mechanism to pause/resume recording of\n> > messages in the console service\n> \n> I\'d rather see an attribute \"paused\" (or \"logging\", \"enabled\" or something\n> alike) than two methods \"pause\" and \"resume\" so that e.g. Firebug can easily\n> determine whether it should inform the user that she shouldn\'t be expecting any\n> errors in the console (without having to keep track of private browsing mode).\n\nDone. The new patch uses the |paused| attribute on the console service.\n\n> > * Private Browsing manager: handled quit-application-granted, to make sure to\n> > exit private browsing mode just before application quit\n> \n> That code will have to move into an XPCOM component (e.g. nsBrowserGlue) or\n> it\'ll fail to run when the last closed window isn\'t a browser one.\n\nI moved the whole stuff in browser.js to its own XPCOM component in browser/components.',0.00,0,0,3445353,5,'298145',0),(248970,137548,'2008-01-22 12:25:15','Ehsan - there\'s a lot of great work in here. Any chance of you being able to put this all together in an XPI to get broader testing of the functionality?',0.00,0,0,3447745,0,NULL,0),(248970,251051,'2008-01-23 00:33:25','(In reply to comment #90)\n> Ehsan - there\'s a lot of great work in here. Any chance of you being able to\n> put this all together in an XPI to get broader testing of the functionality?\n\nI\'d love to, but I\'m not sure how to do it, since the code touches a lot of core components, such as cache, cookies, permissions, etc. Maybe it would be better to provide builds with this patch applied for users to test? I can provide Windows and Linux builds, but I need help in creating a Mac OS X build because I don\'t have access to any Mac computer...\n\nLet me know if providing build would serve this purpose.',0.00,0,0,3448756,0,NULL,0),(248970,75420,'2008-01-23 01:32:41','(In reply to comment #91)\n> but I need help in creating a Mac OS X build\n\n\"buildbot try\" can roll builds on all the major plats for you, and make them available for download - check out build.mozilla.org when you have your cvs account set up. in the meantime, if you attach a patch here, someone can probably do it for you ;)',0.00,0,0,3448830,0,NULL,0),(248970,251051,'2008-01-23 02:09:53','(In reply to comment #92)\n> \"buildbot try\" can roll builds on all the major plats for you, and make them\n> available for download - check out build.mozilla.org when you have your cvs\n> account set up. in the meantime, if you attach a patch here, someone can\n> probably do it for you ;)\n\nThanks for the tip. I guess I\'ll ask someone to make the builds on this bug as soon as I\'m finished with the patch here. I\'m currently stuck by some bug in the cert override service, which I\'m going to file shortly... :(',0.00,0,0,3448859,0,NULL,0),(248970,198492,'2008-01-23 02:23:12','Having unit tests would also help integration I guess. I was thinking of\nsomething like this:\nSetup a set of pages running on httpd.js for testing cookies, auto-completion,\nform entry and others. Then develop a browser chrome test\n(http://developer.mozilla.org/en/docs/Browser_chrome_tests) which will simulate\nnavigation and use features affecting the profile state (browse to pages\nsetting cookies, simulate a password entry, simulate downloading a file, ...).\n\nThis simulated session could be run a first time with no private browsing mode\nand check that all works well (cookies saved, auto-completion saved, ...). Then\nwe sanitize the profile, toggle private browsing mode and run the navigation\nsimulation again and the toggle private browsing mode off. After that, we check\nthat nothing is saved in the profile.\n\nI can imagine two ways of checking that nothing is saved in the profile while\nin private browsing mode:\n1) one high level check that would ensure that no files were written during\nprivate private browsing mode by checking file last write time (hoping this\nworks in a cross platform way). There could be a white list for things that are\nallowed to change and don\'t introduce a privacy risk (like\nurlclassifier3.sqlite I guess). The advantage of this kind of test is that it\ncould detect new features added without them managing the private browsing\nmode, preventing privacy leaks added in the future.\n2) Service specific checks (checking cookies, cache, form history, ...)\n\nI don\'t think something similar already exist for the sanitizer service (clear\nprivate data). Such a framework if developed could then test both the private\nbrowsing mode and the sanitizer. For testing the sanitizer, we launch the\nsimulated browsing, run the sanitizer and check that nothing is saved in test 2\nabove (test 1 would not be effective, as files are written during navigation).\n\nThat was some ideas I had for making private browsing mode more robust. Of\ncourse it\'s certainly more easy to write down than to implement ;-)\n\n\nMaybe another service that could participate in the private browsing mode is\nthe site specific preferences? If you navigate to a site and change the zoom\nlevel this information is saved in this store, thus revealing you visited that\nsite. This could use the same handling as the cookies: site specific\npreferences are used as normal while in private browsing mode, but the store is\nnot updated in this mode (this means your zoom settings are not reset in\nprivate browsing mode for instance).\n',0.00,0,0,3448866,0,NULL,0),(248970,251051,'2008-01-23 03:19:23','Thanks for your input, Sylvian.\n\n(In reply to comment #94)\n> Having unit tests would also help integration I guess. I was thinking of\n> something like this:\n> Setup a set of pages running on httpd.js for testing cookies, auto-completion,\n> form entry and others. Then develop a browser chrome test\n> (http://developer.mozilla.org/en/docs/Browser_chrome_tests) which will simulate\n> navigation and use features affecting the profile state (browse to pages\n> setting cookies, simulate a password entry, simulate downloading a file, ...).\n\nHmmm good idea. I\'m totally new in writing chrome tests, though. I\'m going through the docs on MDC right now, but if anyone wants to jump in and help on this, I\'d be more than happy to accept inputs/hints/written tests. :-)\n\n> I don\'t think something similar already exist for the sanitizer service (clear\n> private data). Such a framework if developed could then test both the private\n> browsing mode and the sanitizer. For testing the sanitizer, we launch the\n> simulated browsing, run the sanitizer and check that nothing is saved in test 2\n> above (test 1 would not be effective, as files are written during navigation).\n\nThat would be part of another bug, right? Maybe you could file one to keep it on-track?\n\n> Maybe another service that could participate in the private browsing mode is\n> the site specific preferences? If you navigate to a site and change the zoom\n> level this information is saved in this store, thus revealing you visited that\n> site.\n\nI added this component in the WIP Patch 9 (attachment 297997).\n\n> This could use the same handling as the cookies: site specific\n> preferences are used as normal while in private browsing mode, but the store is\n> not updated in this mode (this means your zoom settings are not reset in\n> private browsing mode for instance).\n\nThis implementation is actually quite complicated. It was easy in case of cookies and the permission manager because they already provided an in-memory MySQL which is a superset of the on-disk MySQL. The contentprefs service, however, does not even perform in-memory caching, and it reads and writes all the prefs directly from/to the MySQL. And we have made similar tradeoffs in other services. For example, the pages visited in the private browsing mode don\'t end up in your history even when you have not left the private browsing mode. I think a similar tradeoff here would be acceptable, wouldn\'t it?\n',0.00,0,0,3448910,0,NULL,0),(248970,198492,'2008-01-23 04:00:07','(In reply to comment #95)\n> \n> That would be part of another bug, right? Maybe you could file one to keep it\n> on-track?\n\nYes, I think so. I\'ll do some research if it is filed already and enter a new one if needed.\n\n> I added this component in the WIP Patch 9 (attachment 297997 [details]).\n\nSorry I didn\'t see it while skimming through the patch.\n\n> This implementation is actually quite complicated. It was easy in case of\n> cookies and the permission manager because they already provided an in-memory\n> MySQL which is a superset of the on-disk MySQL. The contentprefs service, however,\n> does not even perform in-memory caching, and it reads and writes all the prefs\n> directly from/to the MySQL. And we have made similar tradeoffs in other services.\n> For example, the pages visited in the private browsing mode don\'t end up in\n> your history even when you have not left the private browsing mode. I think a\n> similar tradeoff here would be acceptable, wouldn\'t it?\n\nSeems acceptable to me. If I understand the patch well, the content preferences can be read but not written in private browsing mode. This means a site where you raised the zoom level will still be zoomed in private browsing mode as expected.\n\n',0.00,0,0,3448929,0,NULL,0),(248970,251051,'2008-01-23 04:09:43','(In reply to comment #96)\n> (In reply to comment #95)\n> > \n> > That would be part of another bug, right? Maybe you could file one to keep it\n> > on-track?\n> \n> Yes, I think so. I\'ll do some research if it is filed already and enter a new\n> one if needed.\n\nThanks! Please CC me if you find an existing one (or file a new bug).\n\n> Seems acceptable to me. If I understand the patch well, the content preferences\n> can be read but not written in private browsing mode. This means a site where\n> you raised the zoom level will still be zoomed in private browsing mode as\n> expected.\n\nYes, exactly.',0.00,0,0,3448941,0,NULL,0),(248970,251051,'2008-01-23 04:29:47','This new patch makes nsCertOverrideService honor private browsing mode. The approach used is to store the overrides in memory while we are in private browsing mode, and clear them up after exiting this mode. Nothing will be written to disk, even if the override entry is set to permanent mode.\n\nNote that I have not been able to test this because of bug 413627. I\'ll wait for some time and try to figure out a solution. Then I\'ll ask for review on this patch. Please let me know if you know how to solve this problem. For more info, see bug 413627 comment 0.',0.00,0,0,3448953,5,'298699',0),(248970,251051,'2008-01-23 04:32:05','BTW, according to comment 92, if anyone can help build a test version for all the three platforms, that would be great. Please use the WIP 11 patch for this purpose.',0.00,0,0,3448958,0,NULL,0),(248970,251051,'2008-01-23 04:33:39','Oops, I forgot to mention that I missed browser/components/Makefile.in in my WIP 9 and 10 patches, which would cause the privatebrowsing XPCOM component not to get built. This is fixed in WIP 11 as well.',0.00,0,0,3448959,0,NULL,0),(248970,21544,'2008-01-23 05:25:59','I gave the WIP 11 patch to the try-server, so a private browsing-build for all three platforms should appear in about 1 hour and 30 minutes here: https://build.mozilla.org/tryserver-builds/',0.00,0,0,3449009,0,NULL,0),(248970,198492,'2008-01-23 07:00:14','(In reply to comment #97)\n> Thanks! Please CC me if you find an existing one (or file a new bug).\n\nI filed bug 413659 for this.\n\n',0.00,0,0,3449104,0,NULL,0),(248970,251051,'2008-01-23 09:22:20','(In reply to comment #101)\n> I gave the WIP 11 patch to the try-server, so a private browsing-build for all\n> three platforms should appear in about 1 hour and 30 minutes here:\n> https://build.mozilla.org/tryserver-builds/\n\nThanks! Windows builds are already available in .',0.00,0,0,3449290,0,NULL,0),(248970,21544,'2008-01-23 09:34:55','(In reply to comment #103)\n> (In reply to comment #101)\n> > I gave the WIP 11 patch to the try-server, so a private browsing-build for all\n> > three platforms should appear in about 1 hour and 30 minutes here:\n> > https://build.mozilla.org/tryserver-builds/\n> \n> Thanks! Windows builds are already available in\n> .\n\nBoth Linux and OS X had build failures. See http://tinderbox.mozilla.org/showbuilds.cgi?tree=MozillaTry\n\n',0.00,0,0,3449308,0,NULL,0),(248970,251051,'2008-01-23 09:44:20','(In reply to comment #104)\n> Both Linux and OS X had build failures. See\n> http://tinderbox.mozilla.org/showbuilds.cgi?tree=MozillaTry\n\nOops. This should fix the problem. Can you submit a new try server build?',0.00,0,0,3449317,5,'298729',0),(248970,251051,'2008-01-23 09:53:07','Oops, the previous patch accidentally contained some other code that I\'m working on... This one should really fix the problem :-)',0.00,0,0,3449326,5,'298732',0),(248970,233280,'2008-01-23 10:16:04','I submitted it - should show up in the same place when it\'s all set.',0.00,0,0,3449364,0,NULL,0),(248970,251051,'2008-01-23 11:16:30','(In reply to comment #107)\n> I submitted it - should show up in the same place when it\'s all set.\n\nThanks! Windows and Mac builds have finished: . Linux is still building. I\'ll monitor the tinderbox to see if it succeeds.\n\nAnd, I\'m preparing the final version of the patch which is ready for review. It should be ready in a few minutes. This version of the patch corrects the nsCertOverrideService implementation, and now it actually works! It would be great if someone could submit another try build once I submit that patch.',0.00,0,0,3449455,0,NULL,0),(248970,251051,'2008-01-23 12:03:23','OK, I think this is ready for review.\n\nChanges in this version: the nsCertOverrideService implementation has been corrected as follows:\n\n* I used NS_WITH_PROXIED_SERVICE() to proxy the calls to the nsIObserverService to the main thread, so that they won\'t fail, and notifications are received.\n\n* I implemented nsISupportsWeakReference so that calls to nsIObserverService::AddObserver() with the last param set to true succeed.\n\n(Note that this effectively fixes bug 413627 as well.)\n\n-----\n\nNote to reviewers:\n\n1. The changes to browser-menubar.inc should not be reviewed. Once this is ready to land, I\'ll remove the changes to that file. Those are only meant to ease your life in testing the patch.\n\n2. If you feel you won\'t be able to review this soon, please let me know to ask someone else for review.\n\n-----\n\nAsking Mike Connor to review the following parts:\ntoolkit/components/places/src/nsNavHistory.{h,cpp}\ntoolkit/components/contentprefs/src/nsContentPrefService.js\nbrowser/components/privatebrowsing\n\nAsking Benjamin Smedberg for sr on the following parts:\nnetwerk/{cache,cookie}/*\nextensions/cookie/*\nsecurity/manager/ssl/*\nxpcom/base/*\n\nAsking Mike Beltzner for ui-r based on the descriptions in the previous comments.',0.00,0,0,3449558,5,'298757',0),(248970,251051,'2008-01-23 12:07:34','CCing the relevant people from bug 413627...',0.00,0,0,3449568,0,NULL,0),(248970,251051,'2008-01-23 12:08:50','Asking Benjamin Smedberg for review on the following parts:\n\nxpcom/base/nsIConsoleService.idl\nxpcom/base/nsConsoleService.{h,cpp}',0.00,0,0,3449571,6,'298757',0),(248970,251051,'2008-01-23 12:10:08','Asking Simon Bünzli for review on the following parts:\n\nbrowser/components/sessionstore/src/nsSessionStore.js',0.00,0,0,3449575,6,'298757',0),(248970,251051,'2008-01-23 12:11:20','Asking Christian Biesinger for review on the following parts:\n\nnetwerk/cache/src/nsCacheService.{h,cpp}',0.00,0,0,3449579,6,'298757',0),(248970,251051,'2008-01-23 12:13:04','Asking Dan Witte for review on the following parts:\n\nnetwerk/cookie/src/nsCookieService.{h,cpp}\nextensions/cookie/nsPermissionManager.{h,cpp}',0.00,0,0,3449583,6,'298757',0),(248970,251051,'2008-01-23 12:14:25','Asking Bob Relyea for review on the following parts:\n\nsecurity/manager/ssl/src/nsCertOverrideService.{h,cpp}',0.00,0,0,3449586,6,'298757',0),(248970,251051,'2008-01-23 12:15:42','Asking Asaf Romano for review on the following parts:\n\ntoolkit/components/satchel/src/nsStorageFormHistory.{h,cpp}',0.00,0,0,3449588,6,'298757',0),(248970,251051,'2008-01-23 12:16:50','Asking Shawn Wilsher for review on the following parts:\n\ntoolkit/components/downloads/src/nsDownloadManager.{h,cpp}',0.00,0,0,3449591,6,'298757',0),(248970,251051,'2008-01-23 12:19:22','Asking Justin Dolske for review on the following parts:\n\ntoolkit/components/passwordmgr/src/nsLoginManagerPrompter.js\n\n(Oh, boy, I really wish Bugzilla could handle multiple review requests...)',0.00,0,0,3449593,6,'298757',0),(248970,251051,'2008-01-23 12:21:42','Targetting beta3...',0.00,0,0,3449599,0,NULL,0),(248970,159758,'2008-01-23 12:35:20','(In reply to comment #118)\n> (Oh, boy, I really wish Bugzilla could handle multiple review requests...)\n\nIt can. Just comma-separate the addresses. :)',0.00,0,0,3449623,0,NULL,0),(248970,251051,'2008-01-23 12:44:02','(In reply to comment #120)\n> It can. Just comma-separate the addresses. :)\n\nAnd if only I knew it 11 comments ago... ;-)\n\nThanks for the tip, Reed!\n',0.00,0,0,3449639,0,NULL,0),(248970,36541,'2008-01-23 13:27:59','I must say, the approach implemented in the patch concerns me. You are modifying code in a lot of modules and try to prevent it from saving.\n\nI think, using this approach, we will have to play \"catch up\" forever.\nWhenever someone implements storage for some new data, you will have to enhance that storage logic to consider the proposed new mode.\n\nI\'m also concerned that it complicates the code.\n\n\nI would like to bring up 2 alternative ideas.\n\na) Integrate your \"private surfing mode\" with profile manager. In other words, if the user chooses to surf privately, create a new profile. Mark that profile as such. During app shutdown, erase the profile. At worst the app crashes, so you could auto-cleanup the profile on next startup.\n\nBut a) does not work if you would like to prevent that data reaches the disk. In that case one could think of the following:\n\n\nb) Maybe we could use an in-memory-virtual-filesystem? Implement file I/O that simulates a profile directory and files that live in RAM? Start a profile with a directory stored on that filesystem. This mechanism would guarantee we will never forget to adjust code that potentially stores sensitive data on disk (and keeps the code simple).\n',0.00,0,0,3449715,0,NULL,0),(248970,251051,'2008-01-23 14:12:58','(In reply to comment #122)\n> I must say, the approach implemented in the patch concerns me. You are\n> modifying code in a lot of modules and try to prevent it from saving.\n> \n> I think, using this approach, we will have to play \"catch up\" forever.\n> Whenever someone implements storage for some new data, you will have to enhance\n> that storage logic to consider the proposed new mode.\n\nThat\'s correct, but things like bug 413659 could help remedy the problem (see comment 94).\n\n> I\'m also concerned that it complicates the code.\n> \n> \n> I would like to bring up 2 alternative ideas.\n> \n> a) Integrate your \"private surfing mode\" with profile manager. In other words,\n> if the user chooses to surf privately, create a new profile. Mark that profile\n> as such. During app shutdown, erase the profile. At worst the app crashes, so\n> you could auto-cleanup the profile on next startup.\n> \n> But a) does not work if you would like to prevent that data reaches the disk.\n> In that case one could think of the following:\n\nYes, (a) won\'t work for private browsing.\n\n> b) Maybe we could use an in-memory-virtual-filesystem? Implement file I/O that\n> simulates a profile directory and files that live in RAM? Start a profile with\n> a directory stored on that filesystem. This mechanism would guarantee we will\n> never forget to adjust code that potentially stores sensitive data on disk (and\n> keeps the code simple).\n\nThat\'s a good idea as well, but I\'m wondering how much could should be touched to implement that one. I\'m not quite familiar with Mozilla\'s I/O abstraction layers, but if this needs to be done at a level similar to nsILocalFile, then I\'m afraid that the same amount of changes need to be made to these modules, to switch to an alternative file implementation. Others may be able to comment on this more precisely.',0.00,0,0,3449792,0,NULL,0),(248970,11099,'2008-01-23 15:44:31','Switching review of security/manager/ssl/src/nsCertificateOverrideService.{h,cpp} since he\'s the original author of the code that is modified.\n\nKai feel free to kick it back to me if you can\'t get to the review.\n\nEhsan, You man also want to open NSS Read/Only. That will prevent manual changes and new Root cert imports (or even private key/user cert importing) from happenning in private sessions.\n\nbob',0.00,0,0,3449948,6,'298757',0),(248970,137548,'2008-01-23 20:18:53','(In reply to comment #119)\n> Targetting beta3...\n\nJust to set expectations properly, I don\'t think that we should count on this feature making it into Firefox 3. I say this because ..:\n\n - this bug isn\'t marked blocking- nor wanted-firefox3+\n - QA hasn\'t been planning on testing this mode\n - all of the reviewers will be focusing on blocking bugs first\n - some of Kai\'s comments make me think that there might be more thinking to be done here\n\nThis is great stuff, and I think a fantastic and huge step towards a much desired ability to do true private browsing. I\'m looking forward to playing with the tryserver builds, and am truly appreciative of all the work put into this, and by no means am suggesting we abandon things. Just that we make sure to not get disappointed if it misses.\n\n(That\'s why I was asking about the ability to get this done as an add-on, though I understand that might be difficult due to the nature of the changes - tryserver builds help!)',0.00,0,0,3450264,0,NULL,0),(248970,251051,'2008-01-23 20:28:45','(In reply to comment #124)\n> (From update of attachment 298757 [details])\n> Switching review of\n> security/manager/ssl/src/nsCertificateOverrideService.{h,cpp} since he\'s the\n> original author of the code that is modified.\n> \n> Kai feel free to kick it back to me if you can\'t get to the review.\n> \n> Ehsan, You man also want to open NSS Read/Only. That will prevent manual\n> changes and new Root cert imports (or even private key/user cert importing)\n> from happenning in private sessions.\n\nHmmm, I think private browsing is about not collecting data automatically about user\'s private session, but some things should be allowed anyways, such as bookmarking, saving a web page, etc. Therefore I doubt that we should go as far as opening NSS read-only...\n\n(In reply to comment #122)\n> b) Maybe we could use an in-memory-virtual-filesystem? Implement file I/O that\n> simulates a profile directory and files that live in RAM? Start a profile with\n> a directory stored on that filesystem. This mechanism would guarantee we will\n> never forget to adjust code that potentially stores sensitive data on disk (and\n> keeps the code simple).\n\nAnother thing which needs clarification here is that whether we want to give user a new profile, therefore depriving them of everything useful in their real profiles? I\'d expect users to want access to their bookmarks, or their custom search engines for example n private browsing mode, to get started browsing...',0.00,0,0,3450271,0,NULL,0),(248970,137548,'2008-01-23 20:31:55','I resubmitted the latest patch to the tryserver, and am playing with the current one for now ...',0.00,0,0,3450273,0,NULL,0),(248970,137548,'2008-01-23 20:47:32','(In reply to comment #126)\n> Hmmm, I think private browsing is about not collecting data automatically about\n> user\'s private session, but some things should be allowed anyways, such as\n> bookmarking, saving a web page, etc. Therefore I doubt that we should go as\n> far as opening NSS read-only...\n\nI think that\'s right. Saving web pages, adding bookmarks, and other explicit user actions asking to save data should be honoured. It\'s the automatic stuff we do to make the browser more usable: retaining history, saving form history, accepting/sending cookies ... that\'s the sort of stuff we want to restrict.\n\n> Another thing which needs clarification here is that whether we want to give\n> user a new profile, therefore depriving them of everything useful in their real\n> profiles? I\'d expect users to want access to their bookmarks, or their custom\n> search engines for example n private browsing mode, to get started browsing...\n\nThat\'s a really easy way to get a bare-bones private browsing mode installed, but it isn\'t very functional.\n\nI\'d rather see Kai\'s concerns addressed while maintaining this approach, fwiw.',0.00,0,0,3450283,0,NULL,0),(248970,160571,'2008-01-24 10:32:29','(In reply to comment #122)\n> I think, using this approach, we will have to play \"catch up\" forever.\n\nNot only us. What about an extension which saves urls to prefs (e.g. NoScript) or to their own data file (e.g. Adblock Plus and Tab Mix Plus)? Will somebody from MoCo go through AMO and make sure that that\'s taken care of for all extensions - or will private browsing only be really supported for extension-less profiles after all (just to be sure)?',0.00,0,0,3451014,0,NULL,0),(248970,251051,'2008-01-24 10:38:27','(In reply to comment #125)\n> (In reply to comment #119)\n> > Targetting beta3...\n\nThanks for the supportive comments, Mark!\n\n> Just to set expectations properly, I don\'t think that we should count on this\n> feature making it into Firefox 3. I say this because ..:\n> \n> - this bug isn\'t marked blocking- nor wanted-firefox3+\n> - QA hasn\'t been planning on testing this mode\n> - all of the reviewers will be focusing on blocking bugs first\n> - some of Kai\'s comments make me think that there might be more thinking to be\n> done here\n> \n> This is great stuff, and I think a fantastic and huge step towards a much\n> desired ability to do true private browsing. I\'m looking forward to playing\n> with the tryserver builds, and am truly appreciative of all the work put into\n> this, and by no means am suggesting we abandon things. Just that we make sure\n> to not get disappointed if it misses.\n\nSo, if I can get all of the reviews in time, would this be possible to land this for Firefox 3? (I\'m most worried about the \"QA hasn\'t been planning on testing this mode\" part.)\n\nAlso, I guess this won\'t be something which could be expected to land in a 3.0.x release, right? All this haste is because I know many users which would appreciate a lot if their browser provided private browsing mode capability. I personally use a script to launch Firefox with a new profile (and the -no-remote command line param) and delete it after the browser exits, but I\'m sick and tired of it! :-)\n\n> (That\'s why I was asking about the ability to get this done as an add-on,\n> though I understand that might be difficult due to the nature of the changes -\n> tryserver builds help!)\n\nIf there\'s some way of increasing the users testing the tryserver builds, please let me know. I\'m running one myself (of course!).\n\nAnyway, would it be OK to dance the Target Milestone field to match the next milestone until the Firefox 3 release and then move it to Future if it misses? ;-)',0.00,0,0,3451023,0,NULL,0),(248970,251051,'2008-01-24 10:40:44','(In reply to comment #127)\n> I resubmitted the latest patch to the tryserver, and am playing with the\n> current one for now ...\n\nShould it be available at ? (It\'s not currently.)',0.00,0,0,3451028,0,NULL,0),(248970,251051,'2008-01-24 10:50:38','(In reply to comment #129)\n> (In reply to comment #122)\n> > I think, using this approach, we will have to play \"catch up\" forever.\n> \n> Not only us. What about an extension which saves urls to prefs (e.g. NoScript)\n> or to their own data file (e.g. Adblock Plus and Tab Mix Plus)? Will somebody\n> from MoCo go through AMO and make sure that that\'s taken care of for all\n> extensions - or will private browsing only be really supported for\n> extension-less profiles after all (just to be sure)?\n\nNaive (and non-practical) answer: the extensions can be modified to use the browser:private-browsing notification.\n\nMore reasonable: warn the user about the privacy concerns of such extensions. Should this warning be in the UI, or in the docs, or both?\n\nImaginative answer: would it be possible to make some changes to the core Mozilla I/O code, so that when the private browsing mode is turned on, the I/O subsystem (part of it which handles in-profile data files) creates a new access path to the profile data: a copy-on-write (COW) scheme, which copies the modified data to memory, and reads such data from memory later on, until the private mode is switched off, which would cause the in-memory copies of data to be discarded, and the I/O handles restored to make further I/O happen on disk like usual?\n\nOpen questions:\n1) Is this possible at all, from an architectural point of view? (Are there any high-level docs available on the I/O architecture in Mozilla, designed for someone who\'s not a guru in that field, i.e., me?)\n2) What to do with APIs which can\'t make the above requirement? (What happens when a file grows in private browsing mode, and some code seeks into the newly appended portion, for example?)\n3) Would it be possible to implement this from a logical point of view? (How would code react to gets its storage \"swapped\" in and out from underneath it?)\n4) How much of the code which accesses the filesystem uses Mozilla\'s I/O facilities? (For example, would this cover code which stores data in sqlite)?',0.00,0,0,3451050,0,NULL,0),(248970,137548,'2008-01-24 12:53:42','(In reply to comment #131)\n> (In reply to comment #127)\n> > I resubmitted the latest patch to the tryserver, and am playing with the\n> > current one for now ...\n> \n> Should it be available at ? (It\'s\n> not currently.)\n\nDidn\'t compile due to a bad checkin from Places, trying again now, should appear with the bug number and \"Patch v1\" in the build name.',0.00,0,0,3451282,0,NULL,0),(248970,137548,'2008-01-24 20:06:54','Builds are here:\n\nhttp://people.mozilla.org/~beltzner/private-browsing-builds/',0.00,0,0,3451809,0,NULL,0),(248970,233280,'2008-01-25 10:47:14','>+ mInPrivateBrowsing = PR_FALSE;\nThat should be in the constructor (which you\'ll have to add).\n\nYou also don\'t need to remove the observer.',0.00,0,0,3452635,6,'298757',0),(248970,251051,'2008-02-03 00:59:28','Unbitrotted patch. Addressed the issues in comment 135. I also removed the RemoveObserver calls for places where observers were added using weak references.',0.00,0,0,3465441,5,'301098',0),(248970,160571,'2008-02-03 10:00:55','In case you really want to go through with the issue this way:\n\n>elasticsearch.Index: browser/components/sessionstore/src/nsSessionStore.js\n>===================================================================\n>@@ -184,16 +189,18 @@ SessionStoreService.prototype = {\n>+\n>+ this._inPrivateBrowsing = false;\n\nThis isn\'t needed as _inPrivateBrowsing is already initialized to false and we only get through here once (and even _if_ we got through here again, we\'d surely not want to bail out of private browsing mode).\n\n>- if (this._sessionFile.exists()) {\n>+ if (this._sessionFile && this._sessionFile.exists()) {\n\nWhat\'s this change for? _sessionFile and _sessionFileBackup should always be initialized at this point.\n\n>+ var backup = [];\n\nYou\'re using this as a hash, not an array, so please make it a {}. (In fact, using |for (... in ...)| is highly discouraged for arrays while it\'s OK for iterating over the keys of a hash.)\n\n>+ for (ix in this._windows)\n>+ backup[ix] = eval(this._windows[ix]._closedTabs.toSource());\n\nNits: ix is never declared. And please add a comment as to why you\'re doing |eval(....toSource())|.\n\n>+ for (ix in this._closedTabsBackup) {\n>+ if (this._windows[ix]) {\n\nNits: ix isn\'t declared. And you can drop the braces for the if clause (as in one or two further places).\n\nr+=me for the SessionStore changes with these issues fixed.',0.00,0,0,3465793,6,'301098',0),(6810,5077,'2008-02-03 11:57:25','The patch for bug 193001 rendered this irrelevant. Gecko doesn\'t call lpr directly any more; it prints through a GTK API.',0.00,0,0,3465940,0,NULL,0),(248970,75420,'2008-02-03 20:12:51','i\'m in favor of having this be a notification rather than a pref, but some services are lazily inited (nsCookieService, nsPermissionManager, most likely others). for instance, |firefox about:blank| won\'t init the cookieservice, and if the user enters private browsing they\'ll miss that notification. any ideas? having the cookieservice call up |nsIPrivateBrowsingService::GetPrivateBrowsing()| on init kinda sucks :/',0.00,0,0,3466322,0,NULL,0),(248970,7044,'2008-02-08 06:40:18','Why does that suck? I don\'t think we\'re going to have any choice but have a global mode flag *somewhere* which indicates whether we are \"right now\" in private browsing mode. I\'m happy to hang that on nsIXULRuntime or a new interface, whichever is easier. Then we have global observer topics for when the private-browsing-mode changes.\n\nThis bug is huge, by the way. Could we document the current set of design decisions in the wiki page? Especially the invariants we\'re trying to preserve (no website data to disk during private-browsing), and how that actually affects cookie/cache/etc.',0.00,0,0,3473222,0,NULL,0),(248970,75420,'2008-02-08 11:15:22','(In reply to comment #139)\n> Why does that suck?\n\nit\'s another interface dependency added to all these services - not especially bad, given that we\'re adding all this PB code anyway, it just means nsIPB needs to live early in the build process. (i.e. before netwerk.) if not, something more intuitive than nsIXULRuntime might be nice, ...\n\nand agreed, some concrete documentation to refer back to here during discussion would be awesome.',0.00,0,0,3473604,0,NULL,0),(393845,55600,'2008-02-20 10:46:42','While trying to come up with useful stacktraces for bug 275783 (see bug, comment 113 and further), I got these stacktraces, which seems similar to this bug.',0.00,0,0,3491400,5,'304529',0),(393845,76551,'2008-02-20 14:06:25','Martijn, as far as I can see the frames are different from the ones given when filing this bug. I think this should be better handled in bug 275783?',0.00,0,0,3491778,0,NULL,0),(393845,76551,'2008-02-20 14:14:24','The crash with the mentioned testcase in comment still happens on latest nightly builds under Windows XP. Here an updated crasher id: bp-78cfaf3a-e000-11dc-a569-001a4bd43e5c\n\n',0.00,0,0,3491795,0,NULL,0),(393845,55600,'2008-02-20 14:52:06','(In reply to comment #24)\n> Martijn, as far as I can see the frames are different from the ones given when\n> filing this bug. I think this should be better handled in bug 275783?\n\nI\'m not sure, I\'m probably just making a mess of thing here and in the other bug :(',0.00,0,0,3491880,0,NULL,0),(393845,76551,'2008-02-20 15:33:11','Biesi, do you have time to work on this bug? Otherwise we should search for a new assignee. Thanks.',0.00,0,0,3491976,0,NULL,0),(393845,12352,'2008-02-28 22:08:17','Things might very well have improved here with bug 410946 fixed. Could someone test with a nightly from tomorrow or later?',0.00,0,0,3505180,0,NULL,0),(393845,76551,'2008-02-29 07:53:53','Martijn, the attached testcase doesn\'t work anymore. The referenced video has been deleted. Do we have another one?',0.00,0,0,3505731,0,NULL,0),(393845,55600,'2008-02-29 09:38:41','Henrik, for me the video is still there:\nhttp://martijn.martijn.googlepages.com/testmovie.wmv\nAnd I still crash with the attached testcase (at least with WMP 10):\nhttp://crash-stats.mozilla.com/report/index/de9055e6-e6ec-11dc-aba0-001a4bd43ef6',0.00,0,0,3505880,0,NULL,0),(393845,76551,'2008-02-29 10:31:49','Martijn, your build id is still an old one. But I also crashed with Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b4pre) Gecko/2008022906 Minefield/3.0b4pre.\n\nThe stack looks totally different now. It looks like that I had a recursion:\nbp-871c50f8-e6f3-11dc-bb47-001a4bd43ed6.',0.00,0,0,3505941,0,NULL,0),(393845,12352,'2008-03-06 09:10:31','Martijn, this should fix the crash you referenced in your last comment. Any chance you could give this a try (let me know if you need help getting a build with this patch)? Not sure what\'s up with the stack overflow that Henrik was seeing, but let\'s try this patch first and see if it helps.',0.00,0,0,3514814,5,'307730',0),(393845,76551,'2008-03-06 09:38:23','Johnny, I started a TryServer build so we could run a test in about 2 hours. I\'m not able to build my own debug build under Windows right now. I\'ll post the download link when the build is ready.',0.00,0,0,3514868,0,NULL,0),(393845,76551,'2008-03-06 09:43:43','Sorry, this wont work. Johnny handed out a gid patch. Any change to get a cvs diff?',0.00,0,0,3514875,0,NULL,0),(393845,12352,'2008-03-06 09:49:45','Henrik, just set \"patch level\" (I think that\'s what it\'s called) to 1 instead of 0 when you upload the patch to the try server, that should make it apply. Thanks for spinning builds!',0.00,0,0,3514881,0,NULL,0),(393845,55600,'2008-03-06 09:51:54','Well, I\'m getting build errors with the patch, so I can\'t test it:\nhttp://martijn.martijn.googlepages.com/builderrors.txt',0.00,0,0,3514885,0,NULL,0),(393845,12352,'2008-03-06 09:56:36','Duh. How about this?',0.00,0,0,3514894,5,'307741',0),(393845,55600,'2008-03-06 10:18:13','Yeah, thanks, that one compiles fine and seems to fix the crash (at least on windowsXP with Media Player 10).',0.00,0,0,3514933,0,NULL,0),(393845,12352,'2008-03-06 11:02:23','Awesome, thanks for testing. bz, what do you think of this?',0.00,0,0,3515010,6,'307741',0),(393845,76551,'2008-03-06 11:31:09','TryServer builds are also ready:\nhttps://build.mozilla.org/tryserver-builds/2008-03-06_10:09-mozilla@hskupin.info-bug393845-crasher/\n\nI\'ll run on my testbox to see if my issue gets also fixed by your patch.',0.00,0,0,3515067,0,NULL,0),(393845,76551,'2008-03-06 11:38:50','Johnny, it also fixes my issue. No crash anymore.',0.00,0,0,3515084,0,NULL,0),(393845,12352,'2008-03-06 11:42:25','Awesome, thanks for testing, both of you!',0.00,0,0,3515088,0,NULL,0),(393845,20209,'2008-03-06 14:45:54','Makes sense. Maybe add some comments here that the order is very important?',0.00,0,0,3515424,6,'307741',0),(393845,12352,'2008-03-07 13:33:17','',0.00,0,0,3517112,5,'308018',0),(393845,12352,'2008-03-07 13:33:34','Fixed.',0.00,0,0,3517113,0,NULL,0),(393845,29582,'2008-03-07 16:30:19','>diff --git a/layout/generic/nsObjectFrame.cpp b/layout/generic/nsObjectFrame.cpp\n\n>+ // Grab the view while we still know it\'s safe to do so.\n>+\n>+ nsIView *view = GetView();\n> \n> #ifdef XP_WIN\n> if (aDelayedStop) {\n> // If we\'re asked to do a delayed stop it means we\'re stopping the\n> // plugin because we\'re destroying the frame. In that case, tell\n> // the view to disown the widget (i.e. leave it up to us to\n> // destroy it).\n>+\n> nsIView *view = GetView();\n> if (view) {\n> view->DisownWidget();\n> }\n>+ }\n>+#endif\n\nI\'m probably missing something, but why are you grabbing the view outside the XP_WIN ifdef? Or, why are you grabbing it again inside it?',0.00,0,0,3517517,0,NULL,0),(393845,12352,'2008-03-08 11:05:43','Um, yeah, that was dumb. I just checked in a fix, no need to get the view outside that if check at all now. Thanks jag, good catch!',0.00,0,0,3518362,0,NULL,0),(11040,42159,'2008-03-08 12:35:38','',0.00,0,0,3518442,2,'385772',0),(393845,55600,'2008-03-08 14:54:27','Verified fixed.\nThe first testcase doesn\'t crash anymore with current trunk build on windows XP with Windows Media Player 10.\nThe second testcase doesn\'t crash anymore with current trunk build on windos Vista with Windows Media Player 11 (while it crashed with yesterday\'s trunk build).\n\nThank you for fixing this!',0.00,0,0,3518543,0,NULL,0),(393845,55600,'2008-03-09 17:20:55','In comment 23, I mentioned a crash in combination with the latest Java plugin, which I thought that might have something to do with this bug.\nIt turns out the fix for this crash hasn\'t fixed that, so I filed bug 421833 for it.',0.00,0,0,3519412,0,NULL,0),(248970,14419,'2008-03-29 09:15:19','Maybe this should be a separate bug/enhancement request, but it would be nice to be able to clear a particular item from one\'s \"saved form\" data without having to clear the entire history, for example when one inadvertently types a password into the login-name field.',0.00,0,0,3552407,0,NULL,0),(248970,14419,'2008-03-30 05:46:20','Ah, thanks. I had been trying BACKSPACE and nothing happened.',0.00,0,0,3553308,0,NULL,0),(248970,14419,'2008-03-30 05:48:13','instead of using DELETE, that is.',0.00,0,0,3553309,0,NULL,0),(248970,7044,'2008-06-05 11:12:56','r- because this doesn\'t have tests and doesn\'t have a design doc',0.00,0,0,3649323,6,'301098',0),(248970,26983,'2008-06-13 14:01:18','Should this be blocked by Bug 290456 ?',0.00,0,0,3660914,0,NULL,0),(248970,251051,'2008-06-13 14:28:42','(In reply to comment #145)\n> Should this be blocked by Bug 290456 ?\n\nI think it would be desirable to incorporate any solution developed for bug 290456 in Private Browsing, but I don\'t think it should block Private Browsing, especially because we don\'t currently handle clearing that sort of data right now...',0.00,0,0,3660959,0,NULL,0),(11040,254728,'2008-06-19 11:33:12','Since I\'ve been looking at this, I\'ll put my name on the assigned.',0.00,0,0,3669319,0,NULL,0),(11040,254728,'2008-07-01 23:40:29','Here is a rough outline of some issues associated with this bug, and my proposed approach.\n\nThe existing message flag MSG_FLAG_NEW conveys that a new message has been received since the last time the folder was viewed (but only as long as the application remains open - the flag is kept in memory and destroyed when exiting the application). MSG_FLAG_NEW is indirectly tied to BIFF notification and clearing.\n\nSo what happens when we restrict the class of messages that do BIFF notification? Do we continue to tie this to MSG_FLAG_NEW? That would mean that the NEW flag would only occur on messages that have been filtered to perform BIFF notification. But I believe that the existing NEW flag on messages and folders is useful, and should be preserved even when BIFF notification is modified by a filter.\n\nSo the approach that I propose is to introduce a new message flag MSG_FLAG_BIFF that would be used for BIFF control, and be the subject of this current bug. The existing MSG_FLAG_NEW flag will continue to operate in roughly the same way that it does currently (though I will probably propose in another bug that MSG_FLAG_NEW be preserved across mail sessions.)\n\nIf this path is followed, then there may be a need to identify which folders and messages are the one that caused the BIFF notification. I propose that the existing folder and message decoration associated with MSG_FLAG_NEW and BIFF state be modified to show a subtle difference between NEW and BIFF messages. That might be a larger or bolder decoration for the BIFF messages. That change in folder and message decoration will not be part of this current bug however.\n\nCurrently, message and folder BIFF state is spread between four variables: an array kept in the database, an array kept in the folder, a hasNewMessages boolean, and a count of new messages. The responsibility to maintain hasNewMessages and the new message count is separate from the flag, so each message editor has to set those independently. Prior to completing this bug, I want to simplify and consolidate that process somewhat, at the same time preparing for a possible MSG_FLAG_BIFF. That groundwork is being laid in bug 441932.',0.00,0,0,3688401,0,NULL,0),(11040,135518,'2008-07-02 08:19:05','',0.00,0,0,3688836,2,'443110',0),(11040,4410,'2008-07-02 08:39:48','NEW and BIFF are strongly tied together, I would say, and I\'m not convinced that we should separate them. If we leave them tied together, all the filter action would have to do is clear the NEW flag on the message. I believe when the user says they don\'t want to be notified about a new message, they don\'t want it to appear as a new message. If you introduce this new concept of BIFF, does the new message appear in the tooltip for the folder? Presumably not, since I think that should match the new mail alert...and the new message alert will only show messages that have the biff flag set, not the new flag. The folder containing the message will appear to have new messages, with the green flag, but hovering over it will potentially not show any messages...\n\nI\'m also not convinced that new should persist across mail sessions. The reason we didn\'t persist it is that folders that you don\'t often check could potentially have the new flag set for a long time, which reduces the usefulness of that indicator.\n\nSo I think this boils down to a UI/UE question, so I\'m cc\'ing Bryan. If we agree that we should change the way new and biff work, that\'s fine, but I\'d like to have some sort of agreement that the change is an improvement.',0.00,0,0,3688864,0,NULL,0),(11040,254728,'2008-07-02 08:55:55','(In reply to comment #55)\n> I believe when\n> the user says they don\'t want to be notified about a new message, they don\'t\n> want it to appear as a new message.\n\nThat is the critical question. \"Appear as a new message\" in this context means \"have the NEW decoration for the message appear in the message list, decorate the folder in the folder pane with the NEW decoration, and show the message summary in the folder tooltip\"\n\n> If you introduce this new concept of BIFF,\n> does the new message appear in the tooltip for the folder? Presumably not ...\n\nI would say presumably yes. The folder tooltip should directly match the messages flagged NEW in the folder.\n\n> I\'m also not convinced that new should persist across mail sessions. The reason\n> we didn\'t persist it is that folders that you don\'t often check could\n> potentially have the new flag set for a long time, which reduces the usefulness\n> of that indicator.\n> \n\nWell I would say that it increases the usefulness of the indicator. Whenever you open a folder, even days later, you will see all messages flagged that are new since the last time that you opened the folder. But as I said, this would be the subject of a different bug.\n\n> So I think this boils down to a UI/UE question, so I\'m cc\'ing Bryan. If we\n> agree that we should change the way new and biff work, that\'s fine, but I\'d\n> like to have some sort of agreement that the change is an improvement.\n> \n\nI would encourage opinions from anyone else listening to this bug as well.',0.00,0,0,3688876,0,NULL,0),(11040,293331,'2008-07-02 09:23:27','> I believe when\n> the user says they don\'t want to be notified about a new message, they don\'t\n> want it to appear as a new message.\n\nWhen I said that *I* didn\'t want to be notified about a new message, I meant that I want it to appear as an unread message (e.g. bold subject etc) when I open the mail client or restore it from the tasktray but just don\'t want the tasktray symbol to appear or sound to play.',0.00,0,0,3688897,0,NULL,0),(11040,4410,'2008-07-02 09:25:41','no one\'s suggesting not showing it as unread; the question is whether it would show as \"new\".',0.00,0,0,3688903,0,NULL,0),(11040,293331,'2008-07-02 09:30:12','> no one\'s suggesting not showing it as unread; the question is whether it would\n> show as \"new\".\n\nI should probably just keep out of it then. :)',0.00,0,0,3688909,0,NULL,0),(11040,212848,'2008-07-02 09:34:42','I think it should still be marked new. New would indicate that the message is \"unread and you\'ve never even opened the folder to know what you haven\'t read\"\n\nonce you see the subject in the list, the message is not \'new\'. \njust as once you see the body, it is not \'unread\'. \n\nif a folder contains \'new\' messages, it too is \'new\', just as it \"reverse inherits\" it\'s \'unread\' status too\n\nbut Sean\'s comment was on money. If I may summarize it: \"I want it to appear as an unread message .. but just don\'t want the\ntasktray symbol to appear or sound to play\"\n',0.00,0,0,3688920,0,NULL,0),(11040,4410,'2008-07-02 09:35:32','(In reply to comment #59)\n> \n> I should probably just keep out of it then. :)\n> \n:-) Well, that does bring up the point that many if not most users don\'t really know what \"new\" is, and how it\'s different from unread, which gives us some flexibility to change it (though users who know what it is find it very valuable, I think)\n',0.00,0,0,3688923,0,NULL,0),(11040,57902,'2008-07-05 13:01:49','I know the difference, and I find the difference valuable, and I think persisting New across sessions would be beneficial. The new-this-session messages should be known about from the tray indicator and tooltip.\n\nHowever, several longstanding bugs -- the tray icon and account-New flag persisting when shouldn\'t (all new messages moved to a different account and read there), or clearing when shouldn\'t (explicit Get New Messages, or in the suite, opening a new mail window), and those several about erroneous New count display in the alert and the tooltip -- all make the distinction less useful than it could be.',0.00,0,0,3692818,0,NULL,0),(11040,254728,'2008-07-05 13:54:13','(In reply to comment #62)\n> I know the difference, and I find the difference valuable, and I think\n> persisting New across sessions would be beneficial. The new-this-session\n> messages should be known about from the tray indicator and tooltip.\n> \n\nThe preceding comment dealt with new versus unread, so I assume that is the \"difference\" that you know. I would appreciate though any comments you have on the more immediate issue, at least for this bug, of separating \"New\" from \"Biff\", allowing more direct control of Biff through filters (this bug) and possibly as a folder property (not this bug), while keeping New as the indicator of \"You haven\'t seen this message yet in the message pane\". The tray indicator would match BIFF. The tooltip per folder would match NEW. At the moment for this bug, NEW would not persist over sessions - though it would be more valuable if it did, and that\'s where I\'m headed. It\'s particularly useful for large volume email lists, RSS feeds, and newsgroups where I want to see what\'s happened since the last time that I opened the message pane.\n\n> However, several longstanding bugs -- the tray icon and account-New flag\n> persisting when shouldn\'t (all new messages moved to a different account and\n> read there), or clearing when shouldn\'t (explicit Get New Messages, or in the\n> suite, opening a new mail window), and those several about erroneous New count\n> display in the alert and the tooltip -- all make the distinction less useful\n> than it could be.\n> \n\nMy work-in-process patch for bug 441932 solves some of the issues involving NEW that I am aware of involving folder-level counts and flags. It does not address the server-level issues, that affect the tray icon and notifications. But those are coming. I\'d really like to get to the point where we have precise control of when BIFF goes off - and have a virtual search folder that shows exactly what messages triggered the current notification. Which will bring up another point - when do you clear the BIFF flag? The existing code is inconsistent, which is why for example \"explicit Get New Messages\" clears NEW in some cases. That should always clear BIFF, but never clear NEW IMHO. Things get trickier with multiple servers all checking mail.\n',0.00,0,0,3692846,0,NULL,0),(11040,277774,'2008-07-05 14:06:21','Some practical example. Hope this will help understanding the problem here.\n\nI have the \"Inbox\" and a \"Junk\" folder. It\'s a IMAP server and the server automatically sorts junk into the \"Junk\" folder. So new messages arrive in the Junk and in the Inbox folder in parallel (more in Junk than in Inbox). \n\nI would like to get notified only about the messages which are coming in the \"Inbox\" folder. So I just unchecked the option \"Check for new messages\" in the \"Junk\" folder. \n\nBut every time if a message in the \"Inbox\" folder arrives, I not only see the Message from the \"Inbox\", I also see the latest \"Junk\" messages. Because they are flagged \"New\" as well. \n\nSometimes the junk messages are newer (future dated) as the messages in the Inbox. So I just see four header lines of junk messages, but the message from the Inbox which triggered the notification isn\'t visible at all. \n\nSo it\'s not just a matter of taste introducing a new \"Biff\" flag, it\'s just a must if you would like to allow exclude some messages from the notification.\n\nI would like to see which messages are \"new\" as well, but I don\'t want get a notification about it. And the \"biff\" flag can get cleared automatically as soon the notification was shown.\n\n',0.00,0,0,3692851,0,NULL,0),(248970,285685,'2008-07-31 10:56:52','Hello, I\'m the developer of the Torbutton Firefox extension (https://www.torproject.org/torbutton), and I\'ve put a great deal of work and research (about 16 months now) into developing a \'private mode\' via extensionland for Tor users. I approached the problem from the point of view that any amount of data that the browser leaks on to the disk or the network that is either uniquely identifying, can be used to build a random identifier, or indicative of their history is a vulnerability (See https://www.torproject.org/torbutton/design/#adversary and https://www.torproject.org/torbutton/design/#requirements).\n\nWhile this was a different approach that seems to have been taken from this bug (which seems to have been attacked primarily from a usability perspective), it seems to have led us to similar conclusions.\n\nI\'ve documented everything I have learned and implemented in the Torbutton design document here: https://www.torproject.org/torbutton/design/\n\nA couple of comments I can give from experience that weren\'t covered in your above discussion, or that I\'d just like to re-emphasize:\n\n0. Pages loaded in non-private mode can do all sorts of automatic network activity, set timers, attempt to re-authenticate, send unique identifiers stored in \'DOM Storage\', etc etc during private mode.\n\n1. Content window Javascript can access session history to navigate back and forward for the user to cause the local network (in our case the exit node) to learn a bit about their most recently accessed private or non-private session history.\n\n2. Formfill and password saving can write private data to disk, and read it back where content window Javascript can inspect the values.\n\n3. Livemarks refreshes currently cannot be disabled, and will still happen in the background during private mode (Bug 436250), exposing potentially private data to the local network (such as wikipedia pages you are an editor of, etc)\n\n4. Plugins have their own cookies that can still be transmitted in private mode (see http://epic.org/privacy/cookies/flash.html).\n\n5. Users hate it when a private mode does anything to permanently alter any of their non-private data. The only way to do this and have it ever be used is to isolate the non-private data so that it can\'t be touched during private mode, but is restored upon entrance back into non-private mode.\n\n6. Custom SSL certificates are still available and can be probed for.\n\n7. (Already covered briefly, would like to re-emphasize): History disclosure is a big big problem (see http://gemal.dk/browserspy/css.html and http://ha.ckers.org/weird/CSS-history.cgi http://www.mikeonads.com/2008/07/13/using-your-browser-url-history-estimate-gender/), \nbut it must not be solved by damaging the user\'s current stored history, or even \nmaking it inaccessible.\n\n8. Private mode should also be a pref in addition to an observer event, so that components and windows loaded after the transition can still determine the current mode.\n\n\nI\'ve also cataloged a list of Firefox bugs that make much of the above difficult under the current version of Firefox: https://www.torproject.org/torbutton/design/#FirefoxBugs\n\n',0.00,0,0,3724785,0,NULL,0),(248970,251051,'2008-08-12 11:52:56','A while back Beltzner told me that the drivers feel that the risk in the approach I\'ve took in my patches on this bug is too high and that they\'re more willing to take a Places-based solution. Are there any updates on this? Or should I just pick up my slack here and work on it more?',0.00,0,0,3737392,0,NULL,0),(248970,283305,'2008-08-14 03:43:26','>Are there any updates\n\nI\'ll try to get an answer to you soon about this',0.00,0,0,3739569,0,NULL,0),(11040,1537,'2008-08-18 11:46:38','\"Biff\" versus \"New\" semantics do seem to have somewhat subtle interactions. I\'d be particularly interested in hearing clarkbw\'s comments on the UX implications of all this, as well thoughts from Beckley on what the Eudora experience has been on this front...',0.00,0,0,3744781,0,NULL,0),(11040,29811,'2008-08-19 03:50:55','any implications for calendar?',0.00,0,0,3745756,0,NULL,0),(248970,251051,'2008-08-19 14:29:47','Ping?',0.00,0,0,3746730,0,NULL,0),(248970,251051,'2008-08-19 14:46:32','According to , this seems to have been dropped from 3.1. Anyway, it would be nice to know what the plans here are for this to get into the next release.',0.00,0,0,3746758,0,NULL,0),(248970,51797,'2008-08-20 06:15:15','Too bad- the only new feature I was really looking for :(',0.00,0,0,3747585,0,NULL,0),(248970,14419,'2008-08-21 09:07:48','A Slashdot article today says Microsoft is applying for some patents on private browsing.',0.00,0,0,3749208,0,NULL,0),(248970,36541,'2008-08-21 09:46:37','(In reply to comment #153)\n> A Slashdot article today says Microsoft is applying for some patents on private\n> browsing.\n\nSeems like there was some confusion, it appears it\'s only about a trademark for product names.\n',0.00,0,0,3749238,0,NULL,0),(248970,36541,'2008-08-21 09:47:37','Adding Wan-Teh to cc list, as a functionality that uses a memory-only filesystem would probably involve new functionality at the NSPR level.\n',0.00,0,0,3749240,0,NULL,0),(11040,101158,'2008-08-21 10:52:32','Keeping on the wanted‑thunderbird3+ list, target ms beta2.\nrkent tells me it (basically) it should be doable, if only bug 441932 lands.',0.00,0,0,3749360,0,NULL,0),(11040,260035,'2008-08-21 23:25:19','Classic Eudora\'s approach on notifying users of new messages is different from Thunderbird\'s. Eudora doesn\'t have a separate message status of new. Instead it bolds mailbox names that have unread mail that are newer than 5 days (solves the old mail problem that bienvenu mentions above, and also persists across sessions), opens up mailboxes that get new mail put in them, and it automatically selects the first unread message at the end of a mailbox when its opened up. I\'ve got these last two items mostly working in Penelope already. One common usage model is that new messages get filtered in to mailboxes, which are then automatically opened up. You then close the mailboxes when you are done dealing with the messages in them. So the open mailbox windows themselves act as the new mail notification system.\n\nEudora also has a filter action to control whether the user gets notified about messages that match the filter criteria, similar to what this bug is suggesting. In addition to opening up mailboxes that get new messages that I mention above, you can also have it play a sound and/or put up a generic dialog saying that you have new mail. You can set the default to do these notifications (or not to) on all messages, and then the filters can override that on a per-message basis. As a filter action you can even open up messages in to their own separate windows so as to really highlight them. On Windows Eudora there is a system tray icon that will tell you how many new messages you have, but not any specific message info like TB\'s biff. In addition Eudora automatically does not notify the user (in any fashion: sound, new mail dialog, or opening mailboxes) on any messages that are marked as junk, or get transferred to the Trash mailbox by a filter.\n',0.00,0,0,3750165,0,NULL,0),(248970,283305,'2008-09-04 01:39:51','>Ping?\n\nSorry about the lag, I thought mconnor had been in touch with you. Recent development with Chrome will likely make finally getting private browsing mode shipped a priority for 3.1, but I think we are now targeting a more lightweight implementation.\n\nWhat we need to figure out is if you should continue your implementation for use in a later release.\n\nHere are some details mconnor sent me in email a few days ago about a possible strategy for 3.1:\n\n>Main goals:\n>\n>Ensure that users can\'t be tracked when doing \"private\" things. There\n>should be a clear line drawn between your \"public\" and \"private\"\n>browsing sessions. It is acceptable to let things touch magnetic\n>storage, as long as the cleanup mechanism is robust enough to clean\n>up.\n>\n>It is also acceptable to retain data that users explicitly save\n>(per-site permissions via prefs, bookmarks, etc)\n>\n>Non-goal for 3.1: Separate process sharing (some) data. When we get\n>process-per-tab we can make it more IE-like, but doing this also means\n>that we have to have something like their \"hey, you\'re in private\n>browsing mode\" banner on the URL bar for all the world to see. Which,\n>to me, is fail.\n>\n>\n>Cookies:\n>\n>On entry:\n>\n>Write cookies to disk, drop the in-memory hashtable.\n>\n>During:\n>\n>All cookies are treated as session cookies.\n>\n>Exit:\n>\n>Drop the hashtable, reload from disk.\n>\n>\n>History:\n>\n>On entry:\n>\n>Record timestamp of the last visit recorded.\n>\n>During:\n>\n>IsVisited always returns false (no link coloring spying)\n>AddVisit silently fails.\n>\n>Exit:\n>\n>Ensure any visits recorded after the timestamp are purged (shouldn\'t\n>be needed, but might be useful as a sanity check).\n>\n>\n>Site Permissions:\n>\n>Page Info tab is disabled.\n>Will not prevent users from explicitly adding exceptions via prefs.\n>\n>Passwords:\n>\n>Do not prompt to save passwords.\n>Passwords will not autofill, but will be available for autocomplete.\n>\n>Other:\n>\n>Autocomplete will be available, but will not remember data entered.\n>DOMStorage will not allow reading or writing of data (need JST/Enn\n>feeedback on how to do this cleanly)\n>All authenticated sessions will be logged out entering and leaving\n>private mode.\n>Downloads will be removed from dlmgr on completion.\n>\n>\n>Optional: Save session and close all browser windows, and restore after\n>exiting private mode? Seems reasonable enough, especially if we can\n>add the session store override to save SSL form data as a one-off...',0.00,0,0,3766005,0,NULL,0),(248970,136925,'2008-09-04 05:43:48','I like the direction this is headed, especially if any of it shows up in 3.1 but I would like to suggest that IsVisited always returning false be rethought.\n\nI find link coloring to be quite useful, particularly when going one by one through a list of links (e.g., on Google or a shopping site).\n\nIf it a matter of trying to figure out how to keep this off the disk and would require major re-work of that code, I can understand pushing it out until a later version but, to me, this is a major disadvantage of private mode: it\'s my biggest complaint about Stealther.',0.00,0,0,3766222,0,NULL,0),(248970,26983,'2008-09-04 07:50:32','How about a second set of files for private browsing that automatically get scrubbed. Alternatively, an indicator (or column) in the sqllite MySQL that marks something as from the private session.',0.00,0,0,3766392,0,NULL,0),(248970,284285,'2008-09-04 07:53:49','(In reply to comment #158)\n> Alternatively, an indicator (or column) in the sqllite MySQL that marks\n> something as from the private session.\n\nThis sounds me like session history, just like session cookies.',0.00,0,0,3766395,0,NULL,0),(248970,205478,'2008-09-05 13:42:59','I think Distrust has the best implementation of private browsing. It has an icon at the bottom which you click to enter a session. Then when you have finished, you unclick it and your previous tabs are restored and no history is saved.\n\nFor cookies, they are treated as session cookies and deleted at shutdown.\n\nhttps://addons.mozilla.org/en-US/firefox/addon/1559\n\nContact site for the maker\n\nhttp://www.gness.com/distrust/',0.00,0,0,3768529,0,NULL,0),(248970,251051,'2008-09-07 13:08:36','This patch implements the Private Browsing mode as described in comment 156. All parts of the requirements are met here, except the DOM storage, which I\'d be happy to have a feedback from JST or Enn on how best to tackle this in that module as neatly as possible.\n\nSome parts of the code have not changed from the previous WIP patches, some other parts have been removed now that our requirements are a bit lighter, and some rewriting has also been performed. It would be great if mconnor and other could test this both functionality and code-wise. Also, I\'d like to have beltzner\'s input on this as well, both on how the private browsing mode with the approach in comment 156 feels, and also on our chances to have this for 3.1.\n\nIt would also be great if someone with appropriate access could submit this patch to the try server for the users to try out actual builds.\n\nLast, but not least, like with the previous patches, the current menu item is a mortal and mere hack which will be removed from the final version of this patch. The UI should be decided and implemented in bug 411929.',0.00,0,0,3770235,5,'337327',0),(248970,6102,'2008-09-07 14:50:18','(In reply to comment #161)\n> Created an attachment (id=337327) [details]\n> Patch (v2.0)\n> \n> This patch implements the Private Browsing mode as described in comment 156. \n> All parts of the requirements are met here, except the DOM storage, which I\'d\n> be happy to have a feedback from JST or Enn on how best to tackle this in that\n> module as neatly as possible.\n\nIt already supports session storage via permissions like cookies do. You should be able to either set that or modify nsDOMStorage::CanUseStorage as needed.\n\nDave Camp is the current owner of the code.',0.00,0,0,3770342,0,NULL,0),(248970,251051,'2008-09-07 15:00:11','(In reply to comment #162)\n> It already supports session storage via permissions like cookies do. You should\n> be able to either set that or modify nsDOMStorage::CanUseStorage as needed.\n> \n> Dave Camp is the current owner of the code.\n\nA quick look at CanUseStorage() and it seems to be only used in one place in nsDOMStorage implementation. Is this enough to make this function return false during the private browsing session so that websites can\'t access or store data in this mode?',0.00,0,0,3770348,0,NULL,0),(248970,243208,'2008-09-07 18:56:30','Was cache handling dropped from the design? It seems like another thing we should look after in priv browsing.',0.00,0,0,3770502,0,NULL,0),(248970,251051,'2008-09-07 22:18:10','(In reply to comment #164)\n> Was cache handling dropped from the design? It seems like another thing we\n> should look after in priv browsing.\n\nYes, I think so too. I had an implementation of cache handling in the previous patch which I deleted out. I\'m not sure about the rationale for dropping cache handling from the design though. Mconnor, can you elaborate please?',0.00,0,0,3770607,0,NULL,0),(248970,251051,'2008-09-08 02:53:33','I prepared builds for Windows and Linux with the latest patch:\n\n\n\nPlease take some time to test and evaluate it. Also, if anyone owns a Mac and is willing to create a Mac build as well, that would be great!',0.00,0,0,3770764,0,NULL,0),(248970,210757,'2008-09-08 06:24:48','(In reply to comment #161)\n> Created an attachment (id=337327) [details]\n> Patch (v2.0)\n...\n> It would also be great if someone with appropriate access could submit this\n> patch to the try server for the users to try out actual builds.\n\nJust submitted to try server. Assuming it builds cleanly, it should show up here in an hour or two:\n\nhttps://build.mozilla.org/tryserver-builds/?C=M;O=D',0.00,0,0,3770983,0,NULL,0),(248970,251051,'2008-09-08 11:16:38','(In reply to comment #167)\n> Just submitted to try server. Assuming it builds cleanly, it should show up\n> here in an hour or two:\n> \n> https://build.mozilla.org/tryserver-builds/?C=M;O=D\n\n\n\nSeems like a wrong -p option to patch. patch should be invoked with -p1, I guess. Identical results on Win32 and Mac. Can you please re-submit the patch to try server?',0.00,0,0,3771403,0,NULL,0),(248970,219124,'2008-09-08 11:19:48','I re-submitted the patch.',0.00,0,0,3771404,0,NULL,0),(248970,96908,'2008-09-08 13:02:55','FWIW, spec I wrote is https://wiki.mozilla.org/User:Mconnor/PrivateBrowsing\n\nIf this patch is working to implement this spec, fantastic! I\'ll take a look through tonight. We can and will get this into 3.1 one way or another.',0.00,0,0,3771543,0,NULL,0),(248970,251051,'2008-09-08 13:41:16','(In reply to comment #170)\n> FWIW, spec I wrote is https://wiki.mozilla.org/User:Mconnor/PrivateBrowsing\n\nThanks for the link. For reference of those who want to test this patch without building it themselves, here is the link to the try server builds:\n\n\n\n> If this patch is working to implement this spec, fantastic! I\'ll take a look\n> through tonight.\n\nYes, it does. Originally I based my work on comment 156, but this spec is somewhat different to that (IINM only with regard to the Permissions section). I can easily remove the pageinfo-specific parts from this patch, which should bring this patch close to the spec you wrote. The only remaining part is DOM Storage handling. Enn provided some feedback on it (comment 162), and I\'m waiting for more feedback from Dave Camp (comment 163).\n\nAlso, I think we should add cache handling to the spec, because sensitive data about user\'s private session could be stored on disk as part of the cache, and accessing that data isn\'t that hard (doesn\'t even require manual traversal of cache data files, about:cache comes to rescue!).\n\nPlease let me know what you think!\n\n> We can and will get this into 3.1 one way or another.\n\nThat\'s very good to hear. I\'m ready to work on this full-speed, because I guess it requires a good amount of time for QA after landing.',0.00,0,0,3771605,0,NULL,0),(248970,265995,'2008-09-08 13:53:11','(In reply to comment #163)\n> (In reply to comment #162)\n> A quick look at CanUseStorage() and it seems to be only used in one place in\n> nsDOMStorage implementation. Is this enough to make this function return false\n> during the private browsing session so that websites can\'t access or store data\n> in this mode?\n\nYeah, that should work fine. Most entry points call CaheStoragePermissions(), which calls (and doesn\'t actually cache, apparently) CanUseStorage().',0.00,0,0,3771618,0,NULL,0),(248970,251051,'2008-09-09 13:58:13','Changes in this patch:\n\n * The page info stuff was removed, as per the spec.\n * The passwordmgr code was changed because my previous patch made it dependent on the browser code which is not acceptable. I also removed the PrivateBrowsingListener.jsm code entirely (which was a stupid idea of mine to begin with -- it can all be done using the Private Browsing service itself!).\n * The DOM Storage related code is now implemented.\n\nOne thing that I\'m not sure and I need Dave\'s feedback on is whether the DOM Storage manager gets initialized at app startup or is it possible to be initialized lazily? If the latter is the case, I need to add some code to detect at initialization time whether the private browsing mode is on or off, which may cause me to revive a trick I made in one of the previous WIPs (for supporting nsISupportsPRBool by the Private Browsing service, because dom code can\'t be made dependent on browser in which the nsIPrivateBrowsingService interface is defined). It would be trivial, so I\'m ready to provide a new patch if Dave confirms that it\'s possible for the DOM Storage manager to be initialized *after* the user has already entered the private browsing mode.\n\nLike before, feedback and try server builds are welcome! :-)\n\nOne final note: I still think that we need cache handling here...',0.00,0,0,3773039,5,'337732',0),(248970,251051,'2008-09-09 14:22:37','It is important for extensions to be able to interact with the private browsing mode and capture its notifications. I wrote a wiki page explaining the APIs for extensions and provided a number of code samples. This can later be moved on to MDC. You can see the page here: \n\nObviously it\'s just a draft at this stage, and I\'ll keep on updating it as the API changes in this bug.',0.00,0,0,3773081,0,NULL,0),(248970,27780,'2008-09-09 14:31:09','(In reply to comment #173)\n\n> * The passwordmgr code\n\nA few comments:\n\n* Didn\'t an earlier version of this feature fire a notification when private browsing mode was entered or left? Making the pwmgr poll the service during pageload is kind of sucky.\n\n* It would be cleaner to have the pwmgr not try to prompt for saving/changing a login in the first place, instead of having the code in nsLoginMangerPrompter.js silently bail out when it\'s attempted.\n\n* The spec says form logins should have the autocomplete attached, but not autofilled. For HTTP auth, should the popup dialog be prefilled? Otherwise such saved logins are inaccessible. The user can click cancel to not authenticate with the site, although I can see an argument for that being too easy to accidentally forget. :)',0.00,0,0,3773091,0,NULL,0),(248970,265995,'2008-09-09 14:44:15','(In reply to comment #173)\n> One thing that I\'m not sure and I need Dave\'s feedback on is whether the DOM\n> Storage manager gets initialized at app startup or is it possible to be\n> initialized lazily? If the latter is the case, I need to add some code to\n> detect at initialization time whether the private browsing mode is on or off,\n> which may cause me to revive a trick I made in one of the previous WIPs (for\n> supporting nsISupportsPRBool by the Private Browsing service, because dom code\n> can\'t be made dependent on browser in which the nsIPrivateBrowsingService\n> interface is defined). It would be trivial, so I\'m ready to provide a new\n> patch if Dave confirms that it\'s possible for the DOM Storage manager to be\n> initialized *after* the user has already entered the private browsing mode.\n\nThe storage manager is initialized at startup.\n\nBut if pieces below the browser are using this feature, wouldn\'t it make sense to put nsIPrivateBrowsingService.idl somewhere lower in the stack? It doesn\'t seem like it\'s any cleaner to have everything built before browser/ either be initialized at startup or use a different interface to access the service as anything after browser/.',0.00,0,0,3773105,0,NULL,0),(248970,233280,'2008-09-09 14:49:42','So, the download manager may or may not be initialized at startup, so you can\'t depend on receiving the notification.\n\nSecondly, this really needs some tests. Toolkit has a requirement for any new feature to land with tests, and I think browser may be the same way.\n\nYou won\'t get my review for the download manager bits without a test to show that it works as expected.',0.00,0,0,3773117,6,'337732',0),(248970,210757,'2008-09-09 14:54:33','(In reply to comment #177)\n> You won\'t get my review for the download manager bits without a test to show\n> that it works as expected.\n\n... but we really hope you will supply those tests, because the work so far is great, Ehsan. Really - thank you for continuing to plug away at this.',0.00,0,0,3773123,0,NULL,0),(248970,27780,'2008-09-09 15:00:55','(In reply to comment #177)\n> So, the download manager may or may not be initialized at startup, so you can\'t\n> depend on receiving the notification.\n\nThe typical pattern would be for a component to get the current state when it starts up, at the same time it registers an observer.',0.00,0,0,3773136,0,NULL,0),(248970,251051,'2008-09-10 08:11:12','(In reply to comment #175)\n> (In reply to comment #173)\n> \n> > * The passwordmgr code\n> \n> A few comments:\n\nThanks for the notes! :-)\n\n> * Didn\'t an earlier version of this feature fire a notification when private\n> browsing mode was entered or left? Making the pwmgr poll the service during\n> pageload is kind of sucky.\n\nYeah, it still does. I\'ll change this in the next revision of the patch.\n\n> * It would be cleaner to have the pwmgr not try to prompt for saving/changing a\n> login in the first place, instead of having the code in\n> nsLoginMangerPrompter.js silently bail out when it\'s attempted.\n\nAgreed. I\'ll try to move as much of the code as possible to nsLoginManager in\nthe next revision.\n\n> * The spec says form logins should have the autocomplete attached, but not\n> autofilled. For HTTP auth, should the popup dialog be prefilled? Otherwise such\n> saved logins are inaccessible. The user can click cancel to not authenticate\n> with the site, although I can see an argument for that being too easy to\n> accidentally forget. :)\n\nWell, that\'s really something for the spec to address. Currently the patch\ndoesn\'t autofill form fields, and leaves HTTP auth dialogs blank. I can easily\nchange this so that they get filled, provided that mconnor is in favor of this\nchange.',0.00,0,0,3773994,0,NULL,0),(248970,251051,'2008-09-10 08:20:11','(In reply to comment #176)\n> But if pieces below the browser are using this feature, wouldn\'t it make sense\n> to put nsIPrivateBrowsingService.idl somewhere lower in the stack? It doesn\'t\n> seem like it\'s any cleaner to have everything built before browser/ either be\n> initialized at startup or use a different interface to access the service as\n> anything after browser/.\n\nI also think browser/ is not a good place to put nsIPrivateBrowsingService.idl, but I\'m not sure where to put it. Can you suggest some place? Ideally we need some place where we can make all of the modules dependent on it, so that they can all access nsIPrivateBrowsingService, but I\'m not sure if such a place exists in the tree...',0.00,0,0,3774002,0,NULL,0),(248970,251051,'2008-09-10 08:47:13','(In reply to comment #177)\n> So, the download manager may or may not be initialized at startup, so you can\'t\n> depend on receiving the notification.\n\nGood point to mention. Based on comment 179, I think I\'m going to change the logic for each module to get the current status on startup (no matter if it\'s initialized at startup or not), and I\'ll make sure to handle download manager this way as well.\n\n> Secondly, this really needs some tests. Toolkit has a requirement for any new\n> feature to land with tests, and I think browser may be the same way.\n> \n> You won\'t get my review for the download manager bits without a test to show\n> that it works as expected.\n\nSure. The next thing I\'ll be looking into is getting started to write some tests for this code. I\'ll try to make this in-litmus- and in-testsuite+. :-)\n\n(In reply to comment #178)\n> ... but we really hope you will supply those tests, because the work so far is\n> great, Ehsan. Really - thank you for continuing to plug away at this.\n\nThanks! :-)\n\n(In reply to comment #179)\n> The typical pattern would be for a component to get the current state when it\n> starts up, at the same time it registers an observer.\n\nI see. I think before jumping at this, I\'ll need to find some place else to put nsIPrivateBrowsingService.idl in, so that all the modules can query the service on startup. I need help finding the appropriate place, though.\n\nIf such a place cannot be found, I\'m thinking of defining another notification, named something like \"private-browsing-query\" which passes a nsISupportsPRBool as the subject (like \"quit-application-requested\"), and make the private browsing service respond to this notification by passing the current status in aSubject.\n\nAny hints on whether I\'m barking at the right tree or not?',0.00,0,0,3774046,0,NULL,0),(248970,96908,'2008-09-10 10:32:34','Ehsan, if it\'d help I can write up a test plan for what we need to test. If you want to work together on this, just find me on IRC.\n\n(In reply to comment #157)\n> I like the direction this is headed, especially if any of it shows up in 3.1\n> but I would like to suggest that IsVisited always returning false be rethought.\n> \n> I find link coloring to be quite useful, particularly when going one by one\n> through a list of links (e.g., on Google or a shopping site).\n\nGiven that this can be (ab)used by sites, it doesn\'t make sense to expose your non-private history to them, and since we\'re not recording visits in private mode, there\'s nothing reasonable we can return.',0.00,0,0,3774208,0,NULL,0),(248970,198492,'2008-09-10 11:45:42','I gave a try with the build linked in comment 171. I enabled private browsing, visited a given website, disabled it and grepped the profile for occurrences of that website URL. I could find references in the files:\nprofile/Cache/\nprofile/cookies.sqlite\nprofile/places.sqlite\n\n(and in session_restore.js before I quit the browser). The cache and session restore are not handled yet, but shouldn\'t cookies and places not contain traces?',0.00,0,0,3774336,0,NULL,0),(248970,251051,'2008-09-10 11:52:54','(In reply to comment #184)\n> The cache and session\n> restore are not handled yet, but shouldn\'t cookies and places not contain\n> traces?\n\nThanks for testing this, Sylvian. Yes, you\'re right, cookies and places are supposed not to leave a trace. Can you open the sqlite DBs and check in which table(s) the mentioned URL appears please?',0.00,0,0,3774352,0,NULL,0),(248970,198492,'2008-09-10 12:24:28','sure, I accessed slashdot with private browsing mode enabled:\n\nsqlite3 cookies.sqlite .dump|grep slashdot\nINSERT INTO \"moz_cookies\" VALUES(1221074391930408,\'__utma\',\'9273847.3921509624962351000.1221074392.1221074392.1221074392.1\',\'.slashdot.org\',\'/\',1284146393,1221074393924407,0,0);\nINSERT INTO \"moz_cookies\" VALUES(1221074391930799,\'__utmb\',\'9273847.1.10.1221074392\',\'.slashdot.org\',\'/\',1221076193,1221074393926321,0,0);\nINSERT INTO \"moz_cookies\" VALUES(1221074391932333,\'__utmz\',\'9273847.1221074392.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)\',\'.slashdot.org\',\'/\',1236842391,1221074391932333,0,0);\nINSERT INTO \"moz_cookies\" VALUES(1221074392683439,\'__qca\',\'1221074392-53816111-35021676\',\'.slashdot.org\',\'/\',2147385600,1221074392683439,0,0);\n\n\nsqlite3 places.sqlite .dump|grep slashdot\nINSERT INTO \"moz_favicons\" VALUES(8,\'http://slashdot.org/favicon.ico\',X\'000001000100101010000000000028010000160000002800000010000000200000000100040000000000C0000000000000000000000000000000000000000000000080800000FFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111000001110000011100001111100000111000111110000011100011111000000111000111000000011100000000000000111000000000000011100000000000000111000000000000011100000000000000111000000000000011100000000000000000000000000000000000000FFFF0000E7E70000C3C30000C3810000E1810000E1830000F0C70000F0FF0000F87F0000F87F0000FC3F0000FC3F0000FE1F0000FE3F0000FFFF0000FFFF0000\',\'image/x-icon\',1221160794701793);\nINSERT INTO \"moz_places\" VALUES(45,\'http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=slashdot\',\'search\',\'moc.elgoog.www.\',1,0,0,NULL,100);\nINSERT INTO \"moz_places\" VALUES(46,\'http://slashdot.org/\',\'Slashdot: News for nerds, stuff that matters\',\'gro.todhsals.\',1,0,0,8,100);',0.00,0,0,3774424,0,NULL,0),(248970,251051,'2008-09-10 12:57:47','Thanks for the update, Sylvian. The places part is half about the favicon service (which I didn\'t handle before, and should do so in the next revision). The other half might be because of what I\'m doing in AddVisit only makes sure nothing is recorded in moz_historyvisits, and moz_places would still be exposed to private data without further checks.\n\nBut I don\'t understand the cookies part at all. Would you mind checking out to see if it\'s reproducible, both with the same profile and a new one, and post here a detailed STR here? And also make sure you delete all this data before testing this again with the same profile (sorry for stating the obvious)?\n\nThanks!',0.00,0,0,3774497,0,NULL,0),(248970,75420,'2008-09-10 13:05:24','(In reply to comment #187)\n> But I don\'t understand the cookies part at all.\n\nat first glance, the problem is you set an observer in the cookieservice, but it\'s inited lazily - not until first pageload. if Sylvain enabled PB before loading a page, cookieservice won\'t catch that notification. you\'ll need to do what dolske suggested in comment 179: check PB mode in Init() and also register an observer.',0.00,0,0,3774515,0,NULL,0),(248970,251051,'2008-09-10 13:13:08','(In reply to comment #188)\n> at first glance, the problem is you set an observer in the cookieservice, but\n> it\'s inited lazily - not until first pageload. if Sylvain enabled PB before\n> loading a page, cookieservice won\'t catch that notification. you\'ll need to do\n> what dolske suggested in comment 179: check PB mode in Init() and also register\n> an observer.\n\nThanks for the pointer, Dan! Of course, you\'re right. I\'m going to work on this tomorrow. If by that time someone doesn\'t come up with a solution to comment 181 (where to put nsIPrivateBrowsingService.idl), I\'m going to take the \"private-browsing-query\" notification approach (comment 182)...',0.00,0,0,3774541,0,NULL,0),(248970,198492,'2008-09-10 13:19:24','Here\'s the detailed steps:\n\nDownload and Extract the Firefox build somewhere\nCreate a new profile directory:\nrm -rf /tmp/profile; mkdir /tmp/profile\nStart it (adapt this for your OS)\n./Minefield.app/Contents/MacOS/firefox -no-remote -profile /tmp/profile\nCheck Tools > Private Browsing\nOpen www.slashdot.org\nGo back to Minefield Home page\nUncheck Tools > Private Browsing\nQuit Firefox\nGrep the profile:\ngrep -rli slashdot /tmp/profile\nExpected: nothing\nActual: see comment 184\n\n\nMinefield homepage (http://www.mozilla.org/projects/minefield/) does not set cookies, so Dan explanations apply in this situation.',0.00,0,0,3774561,0,NULL,0),(248970,75420,'2008-09-10 14:38:20','(In reply to comment #190)\n> ./Minefield.app/Contents/MacOS/firefox -no-remote -profile /tmp/profile\n\n> Minefield homepage (http://www.mozilla.org/projects/minefield/) does not set\n> cookies, so Dan explanations apply in this situation.\n\nif that command loads the homepage on startup, that\'ll pull in the cookieservice (regardless of whether it sets anything... it needs to check if there are cookies to send, too). my explanation only applies if it loads about:blank.\n\nsomething else may be amiss, throw in some debug statements and fiddle around?\n\n(In reply to comment #189)\n> comment 181 (where to put nsIPrivateBrowsingService.idl), I\'m going to take \n\nit\'ll need to be somewhere above the netwerk tier, so toolkit\'s out, no?',0.00,0,0,3774736,0,NULL,0),(248970,210757,'2008-09-10 15:07:33','I notice that neither the functional spec, the bug comments thus far, or the current patch seem to account for safebrowsing (anti-phishing/malware).\n\nPresumably we still want to protect people in this mode from those attacks (indeed, they may be more likely to visit disreputable or compromised sites). On the other hand, the pingback behaviour in the safebrowsing protocol means that when a reported malware/phishing site is hit, FF will go double-check, which means a hash request to google. That is probably not behaviour that our users would expect, when in PB mode.\n\nOne reasonably straightforward technical solution there is to keep checking sites against the local MySQL, but not perform the pingbacks, while in PB mode. Dave Camp (already cc\'d) can comment on the technical feasibility there, but there is also a concern with that approach, namely that sites which have been removed from the list after the user enters PB mode will still be marked as dangerous. We don\'t like to mark sites as dangerous that aren\'t actually. Still, I\'m not sure either of the other obvious solutions (disable malware/phishing protection entirely, or leave it entirely operational) are desirable.\n\nI don\'t want to scope creep the bug - if we want to file a followup for this, we can, but I think we need an answer to it. People using this mode are precisely the people who would be sensitive to automatic pingbacks. (To be clear, these only occur for reported bad sites, not for every visit - a user might go their whole life without encountering a single one. But then again, they may not. )',0.00,0,0,3774786,0,NULL,0),(248970,265995,'2008-09-10 15:20:42','Blocking without a pingback would be feasible, but you\'d end up with false positives in addition to stale blocks (not particularly often, but it could happen).\n\nWhat might work is a separate error page for blocks that are unconfirmed due to private browsing mode. It should be possible to add a \"confirm this match\" link that does the pingback manually.',0.00,0,0,3774815,0,NULL,0),(248970,135453,'2008-09-10 21:08:09','Is there any hope to block content-prefs.sqlite from \"leaking\" pages visited in private browsing mode? Simply changing zoom level pushes the page to this database and I remember there were some difficulties removing it, even with \"clear private data\".',0.00,0,0,3775211,0,NULL,0),(248970,251051,'2008-09-10 23:34:54','(In reply to comment #191)\n> if that command loads the homepage on startup, that\'ll pull in the\n> cookieservice (regardless of whether it sets anything... it needs to check if\n> there are cookies to send, too). my explanation only applies if it loads\n> about:blank.\n> \n> something else may be amiss, throw in some debug statements and fiddle around?\n\nI\'ll investigate this further.\n\n> (In reply to comment #189)\n> it\'ll need to be somewhere above the netwerk tier, so toolkit\'s out, no?\n\nYes.',0.00,0,0,3775293,0,NULL,0),(248970,251051,'2008-09-10 23:52:57','(In reply to comment #192)\n> People using this mode are\n> precisely the people who would be sensitive to automatic pingbacks.\n\nHmmm, I was under the impression that safebrowsing only sent a hash digest of a URL to the provider when its (shorter) hash matches one of those downloaded from the provider periodically, right? So there should not be anything revealing the URL that the user has visited in this process, right?\n\n(In reply to comment #193)\n> What might work is a separate error page for blocks that are unconfirmed due to\n> private browsing mode. It should be possible to add a \"confirm this match\"\n> link that does the pingback manually.\n\nIf there are privacy concerns here, I think we can go with this solution, but I fail to see the privacy concerns anyway... Anyway ultimately it\'s the call of someone more familiar with the code.',0.00,0,0,3775308,0,NULL,0),(248970,251051,'2008-09-11 00:00:38','(In reply to comment #194)\n> Is there any hope to block content-prefs.sqlite from \"leaking\" pages visited in\n> private browsing mode? Simply changing zoom level pushes the page to this\n> database and I remember there were some difficulties removing it, even with\n> \"clear private data\".\n\nAn earlier revision of my patch handled content prefs as well. Mconnor: was omitting the content prefs from the functional specs deliberate?\n\nBTW, based on IRC talk with mconnor earlier, cache handling will be added to the patch, and a session store related change is also along the way. The current plans are closing all of the windows/tabs when entering the private mode, and restoring them all after exiting the private mode, so that there is a clear separation between the private and non-private windows/tabs as far as the users are concerned.',0.00,0,0,3775316,0,NULL,0),(248970,210757,'2008-09-11 06:29:07','(In reply to comment #196)\n> (In reply to comment #192)\n> > People using this mode are\n> > precisely the people who would be sensitive to automatic pingbacks.\n> \n> Hmmm, I was under the impression that safebrowsing only sent a hash digest of a\n> URL to the provider when its (shorter) hash matches one of those downloaded\n> from the provider periodically, right? So there should not be anything\n> revealing the URL that the user has visited in this process, right?\n\nYour description of the double-check is correct:\n\n - User attempts to load a page whose (32-bit) hash matches one in the MySQL\n - We ask for the full length hash for that entry, to eliminate the possibility of collisions\n - At no point is the raw URL transmitted.\n\nThe concern arises because the list provider has all the \"real\" urls, so the usual difficulties of reversing a hash don\'t really apply. If my client sends a double-check request, an unscrupulous list provider could figure out which of the entries in their list it corresponded to at which point they would know either that I had visited that site, or that I had visited a site which hash-collides with it.\n\nThat is a pretty minor leakage, particularly given the strength of the privacy policy google has in place around its collection of data, but it is non-negligible. Dave\'s idea is probably a good one to consider as well, but yes, I think I will file a bug dependent on this one to track it, rather than risk derailing the progress here.',0.00,0,0,3775611,0,NULL,0),(248970,210757,'2008-09-11 06:50:41','Bug 454792 opened to track the safebrowsing discussion.',0.00,0,0,3775639,0,NULL,0),(248970,251051,'2008-09-11 12:49:41','What\'s new in this patch:\n\n * Added the \"private-browsing-query\" notification support to nsPrivateBrowsingService, and added correct initialization code to all the existing modules. Order of initialization for modules is insignificant here: if a module initializes before the private browsing service, and sends the query notification, it will not be handled, so the module assumes that we\'re not in private browsing mode (correct assumption). For all modules initialized after the private browsing service, the private browsing service will correctly respond to the query notification and the modules in question get initialized with the correct current private browsing status.\n * Handled Justin\'s first and second issues in comment 175.\n\nTodo stuff for the next revision: add the cache (and content prefs service) handling, and improve the places handling of the private browsing mode (see comment 188). Also unit tests are forthcoming, perhaps not in the next revision though (which I hope to get ready by tomorrow).',0.00,0,0,3776144,5,'338165',0),(248970,251051,'2008-09-12 05:10:20','What\'s new in this version of the patch:\n\n * Handled the cache service with this logic: on entering the private mode, disable the disk and offline caches. During the private mode, only the memory cache remains active. When leaving the private mode, clear the memory cache, and enable the disk and offline caches, if they should be enabled based on their respective prefs.\n * Handled the content prefs service, so that things such as changing the zoom level on a site doesn\'t cause trails of the visit be left in the profile.\n * Made the favicon service aware of the private mode, and disable saving of favicons (and potentially addition of moz_places entries as Sylvian had observed in comment 186).\n * Made sure that the test laid out in comment 190 passes successfully.\n\nThis patch is worth having a try server build for, so if someone can submit it, that would be great!\n\nI\'ll get started with some unit tests in the next revision.',0.00,0,0,3777184,5,'338299',0),(248970,219124,'2008-09-12 07:51:36','(In reply to comment #201)\n> Created an attachment (id=338299) [details]\n> Patch (v2.3)\n\n> This patch is worth having a try server build for, so if someone can submit it,\n> that would be great!\n\nhttps://build.mozilla.org/tryserver-builds/2008-09-12_06:19-dgottwald@mozilla.com-priv-20080912/\n\nNote that Linux talos didn\'t like that build:\nFAIL: Busted: tp\nFAIL: browser frozen',0.00,0,0,3777393,0,NULL,0),(248970,26983,'2008-09-12 09:05:01','I just want to confirm: This is not tab-independent, correct? It applies to the whole browser.',0.00,0,0,3777480,0,NULL,0),(248970,324628,'2008-09-12 09:28:20','While you are working on this project, I had an idea for an improvement or addition to it.\n\nAdd a feature that will allow users to clear all items instantly for the sessions they had browsed during the session of mozilla. I doubt you keep up a history of each cookie and history of what that individual process/tab has done during the whole time it has been open (would be a memory hog). Sometimes a user is browsing and might have forgotten to set mozilla for private browsing instead allowing users to clear the sessions, even if it only pertains to what is currently open and associated cookies/history.\n\nany feedback against this is welcome, just wanted to get it out in the open. may not be the right forum either.',0.00,0,0,3777512,0,NULL,0),(248970,301919,'2008-09-12 20:12:09','I just took a quick look over it and it looks awesome. Great work!\n\nOne concern: From my quick look it didn\'t seem to be touching nsSessionStore.js. Are closed tabs remembered using your current code? (Again, quick look and I haven\'t tried it) I ask because I\'m implementing \"undo closed window\" which is analogous to the \"undo closed tabs\" feature, and I\'m trying to get a feel for how this might effect the time line for that, and vice versa.',0.00,0,0,3778245,0,NULL,0),(248970,251051,'2008-09-12 23:04:19','(In reply to comment #202)\n> https://build.mozilla.org/tryserver-builds/2008-09-12_06:19-dgottwald@mozilla.com-priv-20080912/\n\nThanks!\n\n> Note that Linux talos didn\'t like that build:\n> FAIL: Busted: tp\n> FAIL: browser frozen\n\nHmmm, that\'s weird, I can build and run the Linux version without any problems here. Are there more detailed logs available?\n\n(In reply to comment #203)\n> I just want to confirm: This is not tab-independent, correct? It applies to\n> the whole browser.\n\nYes, that\'s correct. The Private Browsing implementation is global to all of the Firefox windows. According to the latest changes in the spec, the currently open windows and tabs will be closed when entering the private mode, so this may be a little less confusing.\n\n(In reply to comment #204)\n> Add a feature that will allow users to clear all items instantly for the\n> sessions they had browsed during the session of mozilla. I doubt you keep up a\n> history of each cookie and history of what that individual process/tab has done\n> during the whole time it has been open (would be a memory hog). Sometimes a\n> user is browsing and might have forgotten to set mozilla for private browsing\n> instead allowing users to clear the sessions, even if it only pertains to what\n> is currently open and associated cookies/history.\n\nThis is a good idea. Currently the sanitizer (accessible from Tools > Clear Private Data) is able to clear the whole data, not the session specific data. This is actually a sanitizer thing, and I\'m not sure if it\'s not already filed as a bug. Please search bugzilla and if it\'s not already filed, go ahead and file it, since this will need a separate bug report in order to work on.\n\n(In reply to comment #205)\n> I just took a quick look over it and it looks awesome. Great work!\n\nThanks! :-)\n\n> One concern: From my quick look it didn\'t seem to be touching\n> nsSessionStore.js. Are closed tabs remembered using your current code? (Again,\n> quick look and I haven\'t tried it) I ask because I\'m implementing \"undo closed\n> window\" which is analogous to the \"undo closed tabs\" feature, and I\'m trying to\n> get a feel for how this might effect the time line for that, and vice versa.\n\nAccording to the latest changes in the spec , session store will be handled in this way: when entering the private mode, all open windows and tabs will be closed, and only a single window will be left open. The undo close tabs (and windows) list will be left untouched in private mode (i.e., the tabs and windows closed in private mode will not be added to them). When leaving the private mode, all of the windows and tabs that the user had open before entering the private mode will be restored, and undo close tabs/windows list will get updated once again.\n\nBTW, what\'s the bug# tracking the undo close windows work? I\'m personally interested in it.',0.00,0,0,3778313,0,NULL,0),(248970,251051,'2008-09-13 04:21:33','This patch makes a small correction in the cache module handling to clear the memory cache when entering the private browsing mode (as per the spec). Furthermore, it implements the session store handling as laid out in the spec.\n\nFor session store handling, nsSessionStore turns off writing the session data to disk while in private mode, and backs up the restore windows data when entering the private mode, and restores it after leaving it. Also, it prompts the user if they want to close their current session and open a private session. If the user says yes, then the current windows and tabs will be closed, and after leaving the private mode, they all will be restored. If the user says no, their tabs and windows remain open and no restore takes place when leaving the private mode (the behavior of versions prior to 2.4).\n\nThis prompting is implemented in nsBrowserGlue, and can be overrided with the new browser.privatebrowsing.keep_current_session pref. A mechanism is in place for extensions to override this UI (by handling the \"private-browsing-start\" notification, as I\'ll document in ), and the nsBrowserGlue behavior only kicks in when no extension handles this notification. In case an extension provides its own UI here, the browser.privatebrowsing.keep_current_session will be ignored, and saving user\'s choice (if desired) will be the responsibility of the extension itself.\n\nAt this revision, the patch should be fully compatible with the spec. Dao: can you submit this to the try server as well? Thanks!\n\nBy the way, I\'ve tested this on both Windows and Linux. Let\'s see if this time Talos can run this successfully...',0.00,0,0,3778414,5,'338439',0),(248970,160571,'2008-09-13 08:00:54','Drive-by comments related to Session Restore:\n* If you temporarily enter private browsing and have Firefox close your windows, what happens when you crash during private browsing? Will your original windows be restored? (AFAICT this should work already)\n* When you quit while still in private browsing mode, what will be restored at the next startup with Session Restore switched on? (looks like this could be sensitive content, at least if you\'ve decided not to close all non-private windows first)\n* Instead of saving/restoring the list of closed tabs for all windows, I\'d rather tag all tabs closed during private browsing mode and then just purge these when private browsing is over.',0.00,0,0,3778494,0,NULL,0),(248970,219124,'2008-09-13 08:22:14','(In reply to comment #207)\n> Created an attachment (id=338439) [details]\n> Patch (v2.4)\n\nhttps://build.mozilla.org/tryserver-builds/2008-09-13_07:23-dgottwald@mozilla.com-priv-20080913/',0.00,0,0,3778509,0,NULL,0),(248970,251051,'2008-09-13 11:23:14','(In reply to comment #208)\n> Drive-by comments related to Session Restore:\n> * If you temporarily enter private browsing and have Firefox close your\n> windows, what happens when you crash during private browsing? Will your\n> original windows be restored? (AFAICT this should work already)\n\nYes, the original windows will be restored.\n\n> * When you quit while still in private browsing mode, what will be restored at\n> the next startup with Session Restore switched on? (looks like this could be\n> sensitive content, at least if you\'ve decided not to close all non-private\n> windows first)\n\nAgain, the original windows will be restored, even if you choose not to close all non-private windows when entering the private browsing mode. Basically, no data about the session will be saved to the disk while in private browsing mode so the contents of sessionstore.js will not change while in private mode.\n\n> * Instead of saving/restoring the list of closed tabs for all windows, I\'d\n> rather tag all tabs closed during private browsing mode and then just purge\n> these when private browsing is over.\n\nWhat about the case where the windows/tabs are closed when entering the private mode? Will this work in that case as well?',0.00,0,0,3778620,0,NULL,0),(248970,160571,'2008-09-13 12:19:38','(In reply to comment #210)\n> no data about the session will be saved to the disk while in private browsing\n> mode so the contents of sessionstore.js will not change while in private mode.\n\nYou will however have to write to sessionstore.js during shutdown, otherwise Firefox will think it crashed at the next startup (unless you correctly safe the file before entering PB mode, which you currently don\'t). However AFAICT from skimming the code, you exit PB mode on quit-application-granted which will cause sessionstore.js to be written again with the state from when entering PB mode but (at least) updated cookies...\n\n> What about the case where the windows/tabs are closed when entering the\n> private mode? Will this work in that case as well?\n\nIt does: You\'ll get the list(s) of recently closed tabs included in the browser state through getBrowserState and restore it through setBrowserState...',0.00,0,0,3778645,0,NULL,0),(248970,251051,'2008-09-13 12:49:29','(In reply to comment #211)\n> You will however have to write to sessionstore.js during shutdown, otherwise\n> Firefox will think it crashed at the next startup (unless you correctly safe\n> the file before entering PB mode, which you currently don\'t). However AFAICT\n> from skimming the code, you exit PB mode on quit-application-granted which will\n> cause sessionstore.js to be written again with the state from when entering PB\n> mode but (at least) updated cookies...\n\nSo, would that be enough for Firefox to detect that it was shut down cleanly?\n\n> It does: You\'ll get the list(s) of recently closed tabs included in the browser\n> state through getBrowserState and restore it through setBrowserState...\n\nI see. Thanks for clarification. I\'ll try to get around to implement your suggestion soon.',0.00,0,0,3778663,0,NULL,0),(248970,76551,'2008-09-14 08:08:12','Ehsan, shouldn\'t the menu item be checked when you have entered the \"Private Browsing\" mode? At least on OS X it cannot be seen and it makes hard to see in which state you are.',0.00,0,0,3779132,0,NULL,0),(248970,251051,'2008-09-14 08:24:30','(In reply to comment #213)\n> Ehsan, shouldn\'t the menu item be checked when you have entered the \"Private\n> Browsing\" mode? At least on OS X it cannot be seen and it makes hard to see in\n> which state you are.\n\nYes, it should... The thing is, I\'ve been deferring all the UI work to bug 411929, but I guess we\'d want this menu item at any rate (and if not, we can remove it in that bug) so I\'ll make a robust menu item which actually gets updated in response to changes in the private browsing mode in the next revision. Thanks for bringing this into my attention, and sorry for the confusion it has caused in the QA work.',0.00,0,0,3779140,0,NULL,0),(248970,251051,'2008-09-14 13:55:22','Just a small fix to the passwordmgr module, and improved the menu item in the Tools menu to fix the problem Henrik mentioned in comment 213.',0.00,0,0,3779386,5,'338552',0),(248970,76551,'2008-09-14 14:49:11','Try server builds for the latest patch v2.5 are available here:\nhttps://build.mozilla.org/tryserver-builds/2008-09-14_14:01-mozilla@hskupin.info-priv/',0.00,0,0,3779428,0,NULL,0),(248970,297995,'2008-09-14 18:16:02','Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1 ID:2008070208\n\nPatch doesn\'t work for me on a fresh profile on Vista (at least the patched tryserver), I get these errors (and some others):\n\nWarning: reference to undefined property Cc[\'@mozilla.org/browser/privatebrowsing;1\']\nSource File: chrome://browser/content/browser.js\nLine: 8136\n\nError: Cc[\'@mozilla.org/browser/privatebrowsing;1\'] is undefined\nSource File: chrome://browser/content/browser.js\nLine: 8136\n\nError: this._privateBrowsingService is null\nSource File: chrome://browser/content/browser.js\nLine: 8141\n\nError: uncaught exception: [Exception... \"Component returned failure code: 0x80570016 (NS_ERROR_XPC_GS_RETURNED_FAILURE) [nsIJSCID.getService]\" nsresult: \"0x80570016 (NS_ERROR_XPC_GS_RETURNED_FAILURE)\" location: \"JS frame :: chrome://browser/content/browser.js :: anonymous :: line 987\" data: no]',0.00,0,0,3779511,0,NULL,0),(248970,251051,'2008-09-14 23:06:01','The latest try server build ID should be \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b1pre) Gecko/20080914141735 Minefield/3.1b1pre\", but you\'re right that it doesn\'t work. I inspected this a bit, and it seems like that the nsPrivateBrowsingService.js file does not exist in the components directory at all. I took a look at the build log , and the following statements seem to suggest that the component is correctly being copied to the components directory, but in fact, it\'s not.\n\nfor i in /e/builds/sendchange-slave/sendchange-win32-hg/mozilla/browser/components/privatebrowsing/src/nsPrivateBrowsingService.js; do \\\n dest=../../../../dist/bin/components/`basename $i`; \\\n rm -f -f $dest; \\\n /d/mozilla-build/python25/python /e/builds/sendchange-slave/sendchange-win32-hg/mozilla/config/Preprocessor.py -DOSTYPE=\\\"WINNT5.2\\\" -DOSARCH=WINNT -D_CRT_SECURE_NO_DEPRECATE=1 -D_CRT_NONSTDC_NO_DEPRECATE=1 -DWINVER=0x500 -D_WIN32_WINNT=0x500 -D_WIN32_IE=0x0500 -DX_DISPLAY_MISSING=1 -DMOZILLA_VERSION=\\\"1.9.1b1pre\\\" -DMOZILLA_VERSION_U=1.9.1b1pre -DHAVE_SNPRINTF=1 -D_WINDOWS=1 -D_WIN32=1 -DWIN32=1 -DXP_WIN=1 -DXP_WIN32=1 -DHW_THREADS=1 -DSTDC_HEADERS=1 -DWIN32_LEAN_AND_MEAN=1 -DNO_X11=1 -DHAVE_MMINTRIN_H=1 -DHAVE_OLEACC_IDL=1 -DHAVE_ATLBASE_H=1 -DHAVE_WPCAPI_H=1 -D_X86_=1 -DD_INO=d_ino -DMOZ_EMBEDDING_LEVEL_DEFAULT=1 -DMOZ_EMBEDDING_LEVEL_BASIC=1 -DMOZ_EMBEDDING_LEVEL_MINIMAL=1 -DMOZ_PHOENIX=1 -DMOZ_BUILD_APP=browser -DMOZ_XUL_APP=1 -DMOZ_DEFAULT_TOOLKIT=\\\"cairo-windows\\\" -DMOZ_DISTRIBUTION_ID=\\\"org.mozilla\\\" -DOJI=1 -DIBMBIDI=1 -DMOZ_VIEW_SOURCE=1 -DACCESSIBILITY=1 -DMOZ_XPINSTALL=1 -DMOZ_JSLOADER=1 -DNS_PRINTING=1 -DNS_PRINT_PREVIEW=1 -DMOZ_NO_XPCOM_OBSOLETE=1 -DMOZ_OGG=1 -DMOZ_MEDIA=1 -DMOZ_XTF=1 -DMOZ_CRASHREPORTER=1 -DMOZ_CRASHREPORTER_ENABLE_PERCENT=100 -DMOZ_MATHML=1 -DMOZ_ENABLE_CANVAS=1 -DMOZ_SVG=1 -DMOZ_UPDATE_CHANNEL=default -DMOZ_PLACES=1 -DMOZ_FEEDS=1 -DMOZ_STORAGE=1 -DMOZ_SAFE_BROWSING=1 -DMOZ_URL_CLASSIFIER=1 -DMOZ_LOGGING=1 -DMOZ_USER_DIR=\\\"Mozilla\\\" -DMOZ_ENABLE_LIBXUL=1 -DMOZ_TREE_CAIRO=1 -DHAVE_UINT64_T=1 -DMOZ_XUL=1 -DMOZ_PROFILELOCKING=1 -DMOZ_RDF=1 -DMOZ_MORKREADER=1 -DMOZ_DLL_SUFFIX=\\\".dll\\\" -DJS_THREADSAFE=1 -DNDEBUG -DTRIMMED $i > $dest; \\\ndone\n\n\nThe build works correctly locally on at least Windows and Linux, and I\'m not sure what I\'m doing wrong which causes the try server builds not to include this component. Can anyone see what is going wrong here?',0.00,0,0,3779609,0,NULL,0),(248970,200920,'2008-09-15 00:39:55','A suggestion from another bug where patches were only working locally:\n\"are you creating new interfaces? If so, did you add the .xpt files to\nthe packaging manifests? If not, then that could be why things fail on packaged\nbuilds but not your local builds.\"',0.00,0,0,3779651,0,NULL,0),(248970,76551,'2008-09-15 00:49:19','The only error I can see on OS X while toggling between the states is following entry:\n\nError: key is null\nSource File: file:///Volumes/Minefield/Minefield.app/Contents/MacOS/components/nsUrlClassifierLib.js\nLine: 1173\n\nWhich is:\n\nPROT_UrlCryptoKeyManager.prototype.unUrlSafe = function(key)\n{\n--> return key.replace(\"-\", \"+\").replace(\"_\", \"/\");\n}\n\n\nOn Windows XP I also cannot see the given errors and don\'t have Vista by hand for further tests until Thursday. But what I\'ve recognized is that there is no dialog when entering the private browsing mode. I don\'t think that it is expected.\n\nFurther one more question: Why the private browsing mode is not sticky? After a restart it\'s still unset again. I believe in environments where this mode will be used at any time (e.g. internet cafe\'s) it will be a hassle to have to manually switch into this mode again and again.',0.00,0,0,3779653,0,NULL,0),(248970,251051,'2008-09-15 01:31:17','(In reply to comment #219)\n> A suggestion from another bug where patches were only working locally:\n> \"are you creating new interfaces? If so, did you add the .xpt files to\n> the packaging manifests? If not, then that could be why things fail on packaged\n> builds but not your local builds.\"\n\nHmm, I am adding a new interface, and I think this might be the culprit. Thanks for your suggestion. I\'ll post an updated patch shortly.',0.00,0,0,3779673,0,NULL,0),(248970,251051,'2008-09-15 01:45:11','(In reply to comment #220)\n> The only error I can see on OS X while toggling between the states is following\n> entry:\n> \n> Error: key is null\n> Source File:\n> file:///Volumes/Minefield/Minefield.app/Contents/MacOS/components/nsUrlClassifierLib.js\n> Line: 1173\n> \n> Which is:\n> \n> PROT_UrlCryptoKeyManager.prototype.unUrlSafe = function(key)\n> {\n> --> return key.replace(\"-\", \"+\").replace(\"_\", \"/\");\n> }\n\nI get this as well, and I haven\'t looked into it. Looks like somehow this component responds to the notifications it should ignore. Anyway this doesn\'t prevent the patch from functioning.\n\n> On Windows XP I also cannot see the given errors and don\'t have Vista by hand\n> for further tests until Thursday. But what I\'ve recognized is that there is no\n> dialog when entering the private browsing mode. I don\'t think that it is\n> expected.\n\nYes, on XP no error is logged to the console, but the component and the interface are not registered (which can be verified by examining Components.classes/Components.interfaces in the error console).\n\n> Further one more question: Why the private browsing mode is not sticky? After a\n> restart it\'s still unset again. I believe in environments where this mode will\n> be used at any time (e.g. internet cafe\'s) it will be a hassle to have to\n> manually switch into this mode again and again.\n\nI\'m not sure if we want to preserve this across sessions (it makes it easy for someone to know if you\'ve been in private mode last time you closed Firefox or not) but I think we can add a pref to initiate the private mode each time Firefox starts automatically.',0.00,0,0,3779680,0,NULL,0),(248970,251051,'2008-09-15 01:47:59','This is the same as 2.5, only with the xpt file being added to the installer packaging manifests. I\'m not sure if this causes nsPrivateBrowsingService.js to appear in the components folder in try server builds, though. Can someone please submit this to try server?',0.00,0,0,3779683,5,'338599',0),(248970,251051,'2008-09-15 01:51:10','Oops, please ignore the previous patch; I forgot to \"hg add\" the new files... This one should be correct.',0.00,0,0,3779685,5,'338601',0),(248970,152642,'2008-09-15 02:34:50','Is there any plans to handle Flash shared objects at this point or will it be\nimplemented afterwards? Does\nhttps://bugzilla.mozilla.org/show_bug.cgi?id=290456 cover this or should a\nseparate bug be filled for private browsing mode case?\n\nIn any case, I see two possible solutions: \n1) Clear shared objects afterwards when user leaves the private browsing mode\n2) Change Flash Player security settings to temporarily block shared objects. I\nthink these can be adjusted by setting variables in Flash\nPlayer\\macromedia.com\\support\\flashplayer\\sys\\settings.sol\nOption 2 would honor the \"Don\'t write to disk\" principle.',0.00,0,0,3779718,0,NULL,0),(248970,76551,'2008-09-15 04:39:37','Ehsan, the try server build failed. Looks like your patch is bitrotted:\nhttp://tinderbox.mozilla.org/showlog.cgi?log=MozillaTry/1221476657.1221476875.32211.gz',0.00,0,0,3779819,0,NULL,0),(248970,251051,'2008-09-15 05:28:57','(In reply to comment #225)\n> Is there any plans to handle Flash shared objects at this point or will it be\n> implemented afterwards? Does\n> https://bugzilla.mozilla.org/show_bug.cgi?id=290456 cover this or should a\n> separate bug be filled for private browsing mode case?\n\nI think it would be better to file a new bug, since that bug covers the sanitizer module.\n\n> In any case, I see two possible solutions: \n> 1) Clear shared objects afterwards when user leaves the private browsing mode\n> 2) Change Flash Player security settings to temporarily block shared objects. I\n> think these can be adjusted by setting variables in Flash\n> Player\\macromedia.com\\support\\flashplayer\\sys\\settings.sol\n> Option 2 would honor the \"Don\'t write to disk\" principle.\n\nAre there documents from Adobe available that show how to do the second option in a cross-platform manner?',0.00,0,0,3779855,0,NULL,0),(248970,251051,'2008-09-15 05:30:55','(In reply to comment #226)\n> Ehsan, the try server build failed. Looks like your patch is bitrotted:\n> http://tinderbox.mozilla.org/showlog.cgi?log=MozillaTry/1221476657.1221476875.32211.gz\n\nHere\'s the unbitrotted patch diffed against the latest pulled hg trunk. Can you submit it again? Thanks! :-)',0.00,0,0,3779856,5,'338622',0),(248970,103593,'2008-09-15 06:42:12','The latest patch doesn\'t contain the packages-static changes. You\'ll need to add nsPrivateBrowsingService.js to packages-static as well (see other JS components listed in that file).',0.00,0,0,3779935,0,NULL,0),(248970,251051,'2008-09-15 06:51:41','(In reply to comment #229)\n> The latest patch doesn\'t contain the packages-static changes. You\'ll need to\n> add nsPrivateBrowsingService.js to packages-static as well (see other JS\n> components listed in that file).\n\nYou\'re right. New patch forthcoming. Hope I get it right this time... :-/',0.00,0,0,3779944,6,'338622',0),(248970,251051,'2008-09-15 07:02:20','OK, this should be the right patch... ;-)',0.00,0,0,3779957,5,'338639',0),(248970,297995,'2008-09-15 14:16:15','Till this gets to the tryserver... I took the liberty of uploading my own builds with this patch applied (builds are available for Windows only, sorry no cross-compiler;):\n\nfirefox.zip: https://www.yousendit.com/download/bVlCcHBLUEM1R05MWEE9PQ\n.exe: http://www.yousendit.com/download/bVlCcHBFNXZUME9Ga1E9PQ\n\nOnly 100 downloads though so get to it! Great new feature, big fan of the work being done here, thanks alot.',0.00,0,0,3780641,0,NULL,0),(248970,240353,'2008-09-15 14:45:49','i think that this could get better advantages of the changes we are experimenting in Places for fsync stuff, we will already have a memory table to hold places and history, and you could move using them.\n\nYour patch has probably some issue on Places as it is, i did not read it all but if i read it correctly you don\'t allow adding places into moz_places returning always false to canAddURI. but then you save visits in a new table (that should be a TEMP one i think), but those visits will be orphans without a place. Also you\'re not ensuring to not add datas to annotations and inputhistory tables.\nSo you\'re practically removing places during private browsing, and that could make awesomebar/bookmarks and so on unusable while using it (usable only on old entries). Instead they should be correct until you\'re in private browsing, then clear all private data on exiting private mode.\nAlso what happens if a user wants to add a bookmark in private mode? probably we should still hold it since he explicitely asked to remember that site.\n\nI have some ideas about this, so feel free to nag me on IRC if you want, sorry if i did not catch everything about your changes',0.00,0,0,3780683,0,NULL,0),(248970,297995,'2008-09-15 16:55:45','Some notes:\nWith private browsing enabled I get the following error: Error: key is null\nSource File: file:///C:/Users/Natch/Documents/mozilla_trunk/mozilla-central__release/dist/bin/components/nsUrlClassifierLib.js\nLine: 1173\nAlso right-click bookmark a link is broken in private mode, the panel shows up on the left. I\'ve seen other errors related to places stuff, though I haven\'t repro\'d them reliably yet...',0.00,0,0,3780881,0,NULL,0),(248970,251051,'2008-09-15 23:17:39','(In reply to comment #234)\n> Some notes:\n> With private browsing enabled I get the following error: Error: key is null\n> Source File:\n> file:///C:/Users/Natch/Documents/mozilla_trunk/mozilla-central__release/dist/bin/components/nsUrlClassifierLib.js\n> Line: 1173\n\nI filed this as bug 455454, and attached a patch there to solve that problem.\n\n> Also right-click bookmark a link is broken in private mode, the panel shows up\n> on the left. I\'ve seen other errors related to places stuff, though I haven\'t\n> repro\'d them reliably yet...\n\nIs the placement of the panel the problem you\'re mentioning? If so, that\'s where it appears normally, I think. I guess Marco\'s comments (comment 233) might explain a bit of the problems you might have been experiencing in the private mode with Places.\n\nI\'ll ping him on IRC for more info; in-memory tables look really interesting!',0.00,0,0,3781180,0,NULL,0),(248970,76551,'2008-09-15 23:29:13','(In reply to comment #231)\n> Created an attachment (id=338639) [details]\n> Patch (v2.6)\n> \n> OK, this should be the right patch... ;-)\n\nAnd here the appropriate try server builds:\nhttps://build.mozilla.org/tryserver-builds/2008-09-15_15:23-mozilla@hskupin.info-bug248970/',0.00,0,0,3781185,0,NULL,0),(248970,46449,'2008-09-16 01:14:41','For Content Preferences this doesn\'t follow the Wiki as it won\'t update an existing pref.\n\n> Site Specific Prefs\n>\n> * Nothing special for enter/exit\n> * During, we will not remember new entries, but will update existing ones. In current known usage (only used for zoom in Firefox) this is not a data leak. It is possible for extension uses to leak some data here, but there\'s a lot of things extension authors can do wrong.\n> o This effectively means that setPref() will fail if hasPref() is false. This will likely be a silent failure so as to not throw for existing callers. \n\nPresumably changing to something like\n\n> setPref: function ContentPrefService_setPref(aURI, aName, aValue) {\n> // If the pref is already set to the value, there\'s nothing more to do.\n> + // If we are in private browsing mode, refuse to set the pref\n> var currentValue = this.getPref(aURI, aName);\n> - if (typeof currentValue != \"undefined\" && currentValue == aValue)\n> + if (typeof currentValue != \"undefined\" ? currentValue == aValue : this._inPrivateBrowsing)\n> return;\n\n[possibly something more readable though!]',0.00,0,0,3781251,0,NULL,0),(248970,251051,'2008-09-16 02:48:13','(In reply to comment #237)\n> For Content Preferences this doesn\'t follow the Wiki as it won\'t update an\n> existing pref.\n\nThis was changed after I implemented the content prefs part. This new patch corrects the implementation in a way similar to what you suggested.',0.00,0,0,3781347,5,'338836',0),(248970,161650,'2008-09-16 06:23:47','Probably not related but thought I\'d report with the latest build from the tryserver I am getting browser crashes when I visit www.neowin.net with the tracemonkey JIT content \'enabled\'. \n\nThe official nightly does not crash. Sorry, breakpad did not kick in either. (but that\'s a known, ongoing issue with flash player)',0.00,0,0,3781503,0,NULL,0),(248970,251051,'2008-09-16 06:32:30','(In reply to comment #239)\n> Probably not related but thought I\'d report with the latest build from the\n> tryserver I am getting browser crashes when I visit www.neowin.net with the\n> tracemonkey JIT content \'enabled\'. \n> \n> The official nightly does not crash. Sorry, breakpad did not kick in either.\n> (but that\'s a known, ongoing issue with flash player)\n\nWhat platform are you on? Maybe it\'s something changed after the latest nightly was built, can you check an hourly? I\'m not sure what may cause the crash here, and I can\'t reproduce it here. Can others try this as well?',0.00,0,0,3781512,0,NULL,0),(248970,161650,'2008-09-16 06:50:39','I\'m on Win32 Vista HP SP1 using today\'s official nightly:\n\nMozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre) Gecko/20080916043910 Minefield/3.1b1pre Firefox/3.0 ID:20080916043910\n\nAre there nightly\'s on the tryserver ? \nI was using this build when I was crashing:\nhttps://build.mozilla.org/tryserver-builds/2008-09-15_15:23-mozilla@hskupin.info-bug248970/',0.00,0,0,3781524,0,NULL,0),(248970,251051,'2008-09-16 07:00:25','(In reply to comment #241)\n> I\'m on Win32 Vista HP SP1 using today\'s official nightly:\n> \n> Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre)\n> Gecko/20080916043910 Minefield/3.1b1pre Firefox/3.0 ID:20080916043910\n> \n> Are there nightly\'s on the tryserver ? \n> I was using this build when I was crashing:\n> https://build.mozilla.org/tryserver-builds/2008-09-15_15:23-mozilla@hskupin.info-bug248970/\n\nI don\'t get a crash (or anything unusual) when visiting neowin\'s home page neither in private mode or usual mode on XP SP2. I have flashplayer 9.0.124.0. Can you try an hourly? What about the previous try server builds on this bug?',0.00,0,0,3781537,0,NULL,0),(248970,161650,'2008-09-16 07:05:51','I can try an hourly build when the next one comes out, about 20-30 mins. \n\nThe build I noted above, was the first build I saw on the tryserver where Private mode actually worked, previous builds did not seem to enter Private-mode. \n\nI was crashing on NeoWin whether I was in Private mode or Normal mode. \n\nI was just wondering if part of the JIT/Tracemonkey stuff was maybe not in the build on the tryserver test builds ? \n\nIf there are hourly builds for this bug could you point me to one? I thought they were all hand-made...',0.00,0,0,3781542,0,NULL,0),(248970,161650,'2008-09-16 07:24:13','No crash on NeoWin with latest \'official hourly\' from here:\nhttp://ftp.mozilla.org/pub/mozilla.org/firefox/tinderbox-builds/mozilla-central-win32/1221568388/\n\nThis build or course does not have the InPriv patch -',0.00,0,0,3781578,0,NULL,0),(248970,161650,'2008-09-16 08:00:29','Using test build of InPriv:\nMozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre) Gecko/20080915154629 Minefield/3.1b1pre Firefox/3.0 ID:20080915154629\n\nBookmarking a page while in Private mode saves the bookmark. I can see the bookmark I added after \'exit\' from Private mode.',0.00,0,0,3781643,0,NULL,0),(248970,251051,'2008-09-16 08:27:45','(In reply to comment #245)\n> Bookmarking a page while in Private mode saves the bookmark. I can see the\n> bookmark I added after \'exit\' from Private mode.\n\nThis is the expected behavior: the bookmark should be saved, but no visit to the bookmarked site should be recorded. See for more info.',0.00,0,0,3781699,0,NULL,0),(248970,251051,'2008-09-16 08:39:29','(In reply to comment #243)\n> I can try an hourly build when the next one comes out, about 20-30 mins. \n> \n> The build I noted above, was the first build I saw on the tryserver where\n> Private mode actually worked, previous builds did not seem to enter\n> Private-mode. \n\nAnyway, since you mention you got crashes both in private and normal mode, it makes sense to look into previous builds, I think. If the crashes stop at a particular build, we can assume it\'s something I did between those revisions of the patch, and tracking it would be far simpler.\n\nFWIW, I tested this both using Henrik\'s build, and my local build on Vista, neither crashed NeoWin...\n\n> I was just wondering if part of the JIT/Tracemonkey stuff was maybe not in the\n> build on the tryserver test builds ? \n\nI don\'t think so. And there\'s nothing I do in the patch which touches any Tracemonkey stuff either.\n\n> If there are hourly builds for this bug could you point me to one? I thought\n> they were all hand-made...\n\nNo, I meant the trunk hourly builds. Sorry for the confusion.',0.00,0,0,3781721,0,NULL,0),(248970,240353,'2008-09-16 08:43:58','(In reply to comment #246)\n> This is the expected behavior: the bookmark should be saved, but no visit to\n> the bookmarked site should be recorded.\n\ninteresting, you don\'t have a place and canAddURI return false (so you should not be able to add one), but using insertBookmark canAddURI is not checked, and a new place is added. I guess if this was done by design or we miss a check in getUrlIdFor.',0.00,0,0,3781729,0,NULL,0),(248970,161650,'2008-09-16 08:54:10','I don\'t know what else to do, I don\'t crash with the \'official\' builds. I guess we will see what happens when it finally makes it into the M-C official builds.',0.00,0,0,3781745,0,NULL,0),(248970,161650,'2008-09-16 08:58:03','When entering Private Mode the cursor is not focused in the LocationBar. I would think this would be nice, as in normal op\'s when opening a \'blank\' window the cursor is focued there.',0.00,0,0,3781754,0,NULL,0),(248970,251051,'2008-09-16 09:00:43','(In reply to comment #248)\n> interesting, you don\'t have a place and canAddURI return false (so you should\n> not be able to add one), but using insertBookmark canAddURI is not checked, and\n> a new place is added. I guess if this was done by design or we miss a check in\n> getUrlIdFor.\n\nI carefully made sure that getUrlIdFor is not affected by the private browsing mode. As far as I know, there are three places where getUrlIdFor is called with auto create mode turned on:\n\n * when creating bookmarks (which we should allow in private mode)\n * when creating favicons (which we shouldn\'t allow in private mode, and my patch handles it now)\n * when creating annotations.\n\nI\'m not really sure about what Places annotations mean, and where (in the UI) they are used, so I was not sure whether I need to turn off creating them in the private mode. Any hints on that would be greatly appreciated.',0.00,0,0,3781763,0,NULL,0),(248970,251051,'2008-09-16 09:09:45','(In reply to comment #249)\n> I don\'t know what else to do, I don\'t crash with the \'official\' builds. I\n> guess we will see what happens when it finally makes it into the M-C official\n> builds.\n\nAre you using a new profile or an already existing one? If the latter, can you try with a clean profile?\n\nAlso, can you disable your plugins one by one and see if the crashes happen with all of them disabled?\n\n(In reply to comment #250)\n> When entering Private Mode the cursor is not focused in the LocationBar. I\n> would think this would be nice, as in normal op\'s when opening a \'blank\' window\n> the cursor is focued there.\n\nHmmm, I think this should be handled by browser.js automatically when a new window is opened, but I may be wrong. I\'ll need to check this, but at least I can confirm this problem here as well. :-)',0.00,0,0,3781769,0,NULL,0),(248970,161650,'2008-09-16 09:23:08','I\'ve been testing with an existing profile. Just created a new one, no addons, no bookmarks. Still crashes, and continues to crash when loading www.neowin.net even with all the plugins \'disabled\'. \n\nJIT content is not enabled by \'default\' yet.. are you sure you have it set to \'true\' ? \n\nabout:config\njavascript.options.jit.content Value=true\n\nI won\'t have time for anymore testing today..will catch up tomorrow.',0.00,0,0,3781791,0,NULL,0),(248970,251051,'2008-09-16 09:37:27','(In reply to comment #253)\n> I\'ve been testing with an existing profile. Just created a new one, no addons,\n> no bookmarks. Still crashes, and continues to crash when loading\n> www.neowin.net even with all the plugins \'disabled\'. \n> \n> JIT content is not enabled by \'default\' yet.. are you sure you have it set to\n> \'true\' ? \n\nYes.\n\nI\'m CCing some TraceMonkey gurus to see if they can help (read comment 239 onwards).',0.00,0,0,3781816,0,NULL,0),(248970,154309,'2008-09-16 09:55:42','I get the same crash on www.neowin.net (Windows XP).',0.00,0,0,3781851,0,NULL,0),(248970,76551,'2008-09-16 13:58:58','Jim and Ria, could one of you try to get the stack trace with Windbg?\n\nhttp://developer.mozilla.org/en/How_to_get_a_stacktrace_with_WinDbg',0.00,0,0,3782278,0,NULL,0),(248970,251051,'2008-09-16 14:24:15','This test fixes a problem with half-renaming a pref, and adds a unit test for cookies, according to .\n\nOne thing I ran into problems with was running the nsICookieManager2.cookieExists method through the test. cookieExists causes xpcshell to crash. I\'m not sure, but I think the crash may be because of the fact that the C++ implementation of cookieExists actually expects an nsCookie parameter, but since this method is not marked as noscript, I suspected that there may be something I\'m missing. Anyone can shed some light into this?\n\nI had to disable the is_cookie_available2 checks for now because of the crash.',0.00,0,0,3782340,5,'338946',0),(248970,233280,'2008-09-16 14:37:05','(In reply to comment #257)\n> One thing I ran into problems with was running the\n> nsICookieManager2.cookieExists method through the test. cookieExists causes\n> xpcshell to crash. I\'m not sure, but I think the crash may be because of the\n> fact that the C++ implementation of cookieExists actually expects an nsCookie\n> parameter, but since this method is not marked as noscript, I suspected that\n> there may be something I\'m missing. Anyone can shed some light into this?\nThat would indeed crash. Can you file a bug on that please - the cookie service shouldn\'t assume it\'s an nsCookie.',0.00,0,0,3782370,0,NULL,0),(248970,251051,'2008-09-16 15:17:23','(In reply to comment #258)\n> That would indeed crash. Can you file a bug on that please - the cookie\n> service shouldn\'t assume it\'s an nsCookie.\n\nDone: bug 455598. I attached a patch on that bug to fix this issue. With that patch applied, the is_cookie_available2 checks in my test can be enabled, and the test correctly passes.',0.00,0,0,3782428,0,NULL,0),(248970,161650,'2008-09-17 03:42:44','(In reply to comment #256)\n> Jim and Ria, could one of you try to get the stack trace with Windbg?\n> \n> http://developer.mozilla.org/en/How_to_get_a_stacktrace_with_WinDbg\n\nWouldn\'t you know it, its not crashing today...if it comes up again, I\'ll try and get a trace with WinDbg.',0.00,0,0,3782946,0,NULL,0),(248970,251051,'2008-09-17 13:10:01','What\'s new:\n\n * Now that the fix for bug 455598 landed, I enabled the nsICookieManager2.cookieExists tests in the cookies unit test. Now, the cookie test follows the test plan exactly.\n * The previous patch had an oversight in the cookies unit test which caused it not to test the private browsing mode at all (duh!); fixed in this patch.\n * Added the unit test for content prefs, according to the test plan.\n * Added the browser UI test for passwordmgr, according to the test plan.\n * I tried to address the latest changes regarding passwordmgr in the functional spec as well (to enable filling of the HTTP auth dialog) and I noticed a strange problem:\n\nIf, while initiating the private browsing mode, I choose to keep the current session open, everything\'s cool. If, however, I choose to save and close the session, the auth dialog turns up empty. After enabling signon.debug, I noticed a couple of these messages which indicated that the username and password pair could not be decrypted:\n\nPwMgr mozStorage: Failed to decrypt string: MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECKifd14qd4yXBAhGB3/m2HDvtA== (NS_ERROR_FAILURE)\n\nI tried running the below code in the error console, and it also failed with NS_ERROR_FAILURE:\n\nComponents.classes[\"@mozilla.org/security/sdr;1\"].\ngetService(Components.interfaces.nsISecretDecoderRing).\ndecryptString(\"MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECKifd14qd4yXBAhGB3/m2HDvtA==\")\n\nI also tried opening the password manager, and it was empty as well. I\'m not sure how saving and closing the session could affect the SecretDecoderRing service. Does anyone have any ideas?',0.00,0,0,3783606,5,'339117',0),(248970,27780,'2008-09-17 13:52:43','You\'re most likely running into bug 437904. I\'ll try to investigate what\'s going on there; shouldn\'t be related to anything you\'re doing.',0.00,0,0,3783681,0,NULL,0),(248970,251051,'2008-09-17 14:34:11','(In reply to comment #262)\n> You\'re most likely running into bug 437904. I\'ll try to investigate what\'s\n> going on there; shouldn\'t be related to anything you\'re doing.\n\nLooks related (I\'m clearing the authenticated sessions upon entering the private browsing mode) but in this case, whether or not the user decides to save and close her current session affects the results...\n\nI\'d appreciate if you can take a deeper look and see if you can find something which my eyes have missed.',0.00,0,0,3783767,0,NULL,0),(248970,76551,'2008-09-17 14:49:22','(In reply to comment #262)\n> You\'re most likely running into bug 437904. I\'ll try to investigate what\'s\n> going on there; shouldn\'t be related to anything you\'re doing.\n\nThat\'s true. Even without the patch running the above command in the Error Console throws this exception.\n\nEhsan, I\'ve started a new try server build. Please have a look at the tinderbox site when it will be finished. I\'m offline now.\n\nhttp://tinderbox.mozilla.org/showbuilds.cgi?tree=MozillaTry',0.00,0,0,3783785,0,NULL,0),(248970,251051,'2008-09-17 15:01:11','(In reply to comment #264)\n> That\'s true. Even without the patch running the above command in the Error\n> Console throws this exception.\n\nNo, that doesn\'t happen here. I guess the exception you\'re observing is caused by the fact that the encrypted string can\'t be decrypted with the key on your machine. You can obtain an encrypted string for use in that code by looking into the passwords sqlite db, I guess (or reproducing the failure I observed with signon.debug turned on).\n\n> Ehsan, I\'ve started a new try server build. Please have a look at the tinderbox\n> site when it will be finished. I\'m offline now.\n> \n> http://tinderbox.mozilla.org/showbuilds.cgi?tree=MozillaTry\n\nThanks, I\'ll try to keep an eye on it if I\'m awake by the time it finishes (it\'s 2:30AM here), or check it tomorrow morning. :-)',0.00,0,0,3783796,0,NULL,0),(248970,76551,'2008-09-17 21:52:54','New try server build is available here:\nhttps://build.mozilla.org/tryserver-builds/2008-09-17_14:48-mozilla@hskupin.info-bug248970v2.8/',0.00,0,0,3784119,0,NULL,0),(248970,251051,'2008-09-17 23:18:42','Linux build was unsuccessful, but I doubt it had anything to do with the patch . Windows talos was orange with the error \"previous cycle still running\", and I\'m not sure what that means (seems like many other patches caused an orange win32 talos with the same error message) .',0.00,0,0,3784156,0,NULL,0),(248970,240353,'2008-09-18 02:06:43','(In reply to comment #251)\n> I\'m not really sure about what Places annotations mean, and where (in the UI)\n> they are used, so I was not sure whether I need to turn off creating them in\n> the private mode. Any hints on that would be greatly appreciated.\n\nAnnotations are notes that can be added by us or an extension developer to urls or bookmarks, so it can contain any data, personal or uri related data too (it depends on how the implementer uses it).\nThe main problem here is with page annotations, mainly because if an extension adds a page annotation during private browsing and the place_id does not exist we would probably try to add anno for place_id = -1 since you don\'t have a place.\nYou should probably early return in nsAnnotationService::SetPageAnnotation while in private browsing mode for now, or check for place id validity later (better handling could be done though).\n\nabout moz_inputhistory you should early return in nsNavHistory::AutoCompleteFeedback se we will not save what urls user has choosen in the awesomebar after searching for a certain text.',0.00,0,0,3784265,0,NULL,0),(248970,297995,'2008-09-18 15:48:22','A few notes:\nDownload Manager is broken in private browsing mode, although files to get downloaded the DM cannot (and perhaps should not, but it should be notified of PB) tell you the progress of the download, also I stumbled across these errors:\nError: [Exception... \"Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsITransfer.onProgressChange64]\" nsresult: \"0x8000ffff (NS_ERROR_UNEXPECTED)\" location: \"JS frame :: chrome://global/content/contentAreaUtils.js :: anonymous :: line 138\" data: no]\nSource File: chrome://global/content/contentAreaUtils.js\nLine: 138\nWhen completing the download:\nError: download is null\nSource File: chrome://mozapps/content/downloads/DownloadProgressListener.js\nLine: 78\nWhen hitting the [x] on the download:\nError: uncaught exception: [Exception... \"Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsIDownloadManager.cancelDownload]\" nsresult: \"0x8000ffff (NS_ERROR_UNEXPECTED)\" location: \"JS frame :: chrome://mozapps/content/downloads/downloads.js :: cancelDownload :: line 181\" data: no]\n\nI was using private browsing in \"keep my current session\" mode, if that helps at all.',0.00,0,0,3785294,0,NULL,0),(248970,297995,'2008-09-18 16:16:27','(In reply to comment #269)\nCorrection: Either I\'ll get that or the DM works fine, but on exit the DM retains the download data, from the wiki it seems the downloads should be reloaded from pre-PB mode. Also not the downloads aren\'t recorded in history (correctly).',0.00,0,0,3785329,0,NULL,0),(248970,299942,'2008-09-18 16:57:48','Hi,\n\nI am a student looking into writing and or collaborating on unit tests for the patches you guys are submitting for private browsing mode.\n\nCan someone direct me to or simply list the aspect(s) of Private Browsing mode that need testing (unit tests).\n\nFor example, Ehsan, I see you have listed some cases & testing areas - here \nhttps://wiki.mozilla.org/User:Ehsan/PrivateBrowsingTests#Unit_Tests\n\nAre they in order of priority?\n\nI\'d appreciate any feedback, \nThanks.\n\n- AaronMT',0.00,0,0,3785379,0,NULL,0),(248970,251051,'2008-09-19 01:09:04','(In reply to comment #270)\n> (In reply to comment #269)\n> Correction: Either I\'ll get that or the DM works fine, but on exit the DM\n> retains the download data, from the wiki it seems the downloads should be\n> reloaded from pre-PB mode. Also not the downloads aren\'t recorded in history\n> (correctly).\n\nCan you reproduce this in a clean profile? I can\'t reproduce it here. What happens is that while the file is being downloaded, its progress should appear in the download manager, and when it\'s finished, it should be removed from the download manager. I don\'t get errors on the console either... Anyway, the functional spec has laid out new requirements for the download manager, so its implementation will change in the future revisions of my patch.',0.00,0,0,3785661,0,NULL,0),(248970,251051,'2008-09-19 01:21:19','(In reply to comment #271)\nAaron: thanks for your interest in helping out! :-)\n\nThe current test plan is being written by mconnor . From the tests listed there, there are two which are not completed yet (I\'ve marked the completed ones with a star next to their title). I\'ve a half-baked test for the unit tests section of the password manager, so that leaves out the history unit tests, which you can pick up to work on.\n\nAnother thing which needs testing is the private browsing service itself. There is also an API for extensions which needs unit tests . It would be great if you can add a test plan for testing the APIs to , and start working on them as well.\n\nPlease let me know if you need any help (preferably via email, since this bug is already too huge).\n\nThanks!',0.00,0,0,3785664,0,NULL,0),(248970,251051,'2008-09-19 04:41:38','(In reply to comment #268)\n> Annotations are notes that can be added by us or an extension developer to urls\n> or bookmarks, so it can contain any data, personal or uri related data too (it\n> depends on how the implementer uses it).\n\nThanks for the explanation.\n\n> The main problem here is with page annotations, mainly because if an extension\n> adds a page annotation during private browsing and the place_id does not exist\n> we would probably try to add anno for place_id = -1 since you don\'t have a\n> place.\n> You should probably early return in nsAnnotationService::SetPageAnnotation\n> while in private browsing mode for now, or check for place id validity later\n> (better handling could be done though).\n\nWhat about the typed versions of SetPageAnnotation? They can be called through the nsIAnnotationService interface. I guess a good solution here would be to change nsAnnotationService::GetPlaceIdForURI to ignore the auto create parameter if we\'re in the private browsing mode, and handle that case gracefully in all of its callers with auto create mode set. Do you agree?\n\n> about moz_inputhistory you should early return in\n> nsNavHistory::AutoCompleteFeedback se we will not save what urls user has\n> choosen in the awesomebar after searching for a certain text.\n\nThanks for mentioning this. The next revision of the patch will include this change.',0.00,0,0,3785784,0,NULL,0),(248970,251051,'2008-09-19 05:17:18','(In reply to comment #208)\n> * Instead of saving/restoring the list of closed tabs for all windows, I\'d\n> rather tag all tabs closed during private browsing mode and then just purge\n> these when private browsing is over.\n\nSimon: I tried to give this approach a shot, but it won\'t work, since we trim the _closedTabs array by max_tabs_undo all the time, so it\'s possible for some items in that array to get lost while in private mode, so after leaving this mode, the entire list as it was prior to entering this mode cannot be restored.',0.00,0,0,3785812,0,NULL,0),(248970,160571,'2008-09-19 06:07:11','(In reply to comment #275)\n> it\'s possible for some items in that array to get lost while in private mode,\n\nActually, I wouldn\'t expect all the closed tabs to be still around after having used PB mode in a pre-existing window, in the same way as you don\'t expect the very same tabs to be around when you exit PB mode (you don\'t restore those to their original content, if the user didn\'t choose to close the original windows, do you?). So reducing or even completely clearing the list of recently closed tabs seems alright to me - otherwise you could reopen a tab in PB mode and reopen that same tab again after exiting PB mode, which strikes me as kind of odd.',0.00,0,0,3785873,0,NULL,0),(248970,251051,'2008-09-19 07:08:11','(In reply to comment #276)\n> Actually, I wouldn\'t expect all the closed tabs to be still around after having\n> used PB mode in a pre-existing window, in the same way as you don\'t expect the\n> very same tabs to be around when you exit PB mode (you don\'t restore those to\n> their original content, if the user didn\'t choose to close the original\n> windows, do you?).\n\nNo, we don\'t, but come to think of it, maybe we should? Mconnor: what do you think?\n\n> So reducing or even completely clearing the list of recently\n> closed tabs seems alright to me - otherwise you could reopen a tab in PB mode\n> and reopen that same tab again after exiting PB mode, which strikes me as kind\n> of odd.\n\nWhat about the case where user chooses to open a new window to for the private browsing mode, and save and close her current session?',0.00,0,0,3785946,0,NULL,0),(248970,240353,'2008-09-19 07:23:04','(In reply to comment #274)\n> What about the typed versions of SetPageAnnotation? They can be called through\n> the nsIAnnotationService interface. I guess a good solution here would be to\n> change nsAnnotationService::GetPlaceIdForURI to ignore the auto create\n> parameter if we\'re in the private browsing mode, and handle that case\n> gracefully in all of its callers with auto create mode set. Do you agree?\n\nWell i could agree, notice that Shawn is trying to land the fsync stuff in these days (he will probably retry today), means that if things appear good (no build boxes failures and timings) you could move posting your visits/places into the temp tables, in that case the auto create change would not be useful because you could have a place already (hwv if i read code correctly we are not using the autoCreate actually).\nBut i suppose that GetPlaceIdForURI is still a good place to start hacking, in future you could change it to return -1 if the page is \"private\" and handle that case in type specific methods, and for now you can do the same, return -1 if in private mode and handle that.',0.00,0,0,3785972,0,NULL,0),(248970,160571,'2008-09-19 08:49:57','(In reply to comment #277)\n> What about the case where user chooses to open a new window to for the private\n> browsing mode, and save and close her current session?\n\nNot closing any tabs in a pre-existing window won\'t modify the list of recently closed tabs, so you\'ll get the expected behavior. And closing/restoring all windows before entering/after exiting PB mode will restore the list of recently closed tabs with the windows, again as expected.',0.00,0,0,3786054,0,NULL,0),(248970,251051,'2008-09-20 04:33:38','(In reply to comment #278)\n> Well i could agree, notice that Shawn is trying to land the fsync stuff in\n> these days (he will probably retry today), means that if things appear good (no\n> build boxes failures and timings) you could move posting your visits/places\n> into the temp tables, in that case the auto create change would not be useful\n\nI guess in that case, we could in fact not turns off anything in nsNavHistory, and just have everything use the temp tables, instead of the on-disk ones, right?\n\nBy the way, I\'m not sure what APIs can be used to work with temp in-memory tables. Is it something along the lines of doing a \"PRAGMA temp_store=MEMORY;\", creating temporary counterpart tables for each of the places tables, duplicating the data in on-disk tables on these new tables and having all the code use the new tables?\n\n> because you could have a place already (hwv if i read code correctly we are not\n> using the autoCreate actually).\n\nautoCreate is set to true by default, so the function calls which don\'t specify it explicitly get the true default value.\n\n> But i suppose that GetPlaceIdForURI is still a good place to start hacking, in\n> future you could change it to return -1 if the page is \"private\" and handle\n> that case in type specific methods, and for now you can do the same, return -1\n> if in private mode and handle that.\n\nI didn\'t get the difference between the \"now\" and \"future\" cases as you explained above, but that\'s what I\'m going to do. :-)',0.00,0,0,3786887,0,NULL,0),(248970,240353,'2008-09-20 04:55:18','(In reply to comment #280)\n> (In reply to comment #278)\n> I guess in that case, we could in fact not turns off anything in nsNavHistory,\n> and just have everything use the temp tables, instead of the on-disk ones,\n> right?\n\nby default we will add to the temp tables, and then sync on a timer or on bookmark-insert or on browser-exit to the disk, so 2 possibilities:\n- don\'t sync to disk when we are in private browsing mode, clear temp tables on exit. Cons: this is complex to handle if we are allowing the user to create bookmarks while in private browsing mode since we would need to sync them down to disk.\n- in private browsing mode mark places and visits with a \"private\" column in the temp table, on sync skip marked places/visits (this can be done easily modifying our triggers). Cons: needs temp table change and manage tables with different columns (disk table does not need a \"private\" column).\n\n> By the way, I\'m not sure what APIs can be used to work with temp in-memory\n> tables. Is it something along the lines of doing a \"PRAGMA\n> temp_store=MEMORY;\", creating temporary counterpart tables for each of the\n> places tables, duplicating the data in on-disk tables on these new tables and\n> having all the code use the new tables?\n\nusing a temp table is simply done creating it like CREATE TEMP TABLE table_name, temp_store is not really useful (hwv we are already using it).\nfsync stuff hwv inserts and updates in temp tables by default (yes we are partitioning places and visits table between disk and memory).\n\n> I didn\'t get the difference between the \"now\" and \"future\" cases as you\n> explained above, but that\'s what I\'m going to do. :-)\n\n\"now\" is before fsync stuff, when you can\'t have a place. \"future\" is when you could have a place saved in a temp table. However imho you should start having \"placeholders changes\" in every place where you\'ll need to manager private browsing mode (that\'s what you\'re doing), impl can change later based on where we are moving to.',0.00,0,0,3786892,0,NULL,0),(248970,251051,'2008-09-20 05:03:48','What\'s new in this revision:\n\n * Handled nsAnnotationService in private browsing mode, to make sure it doesn\'t store any annotations.\n * Handled nsNavHistory::AutoCompleteFeedback in private browsing mode, to make sure that user\'s choice in awesomebar does not get stored.\n * Corrected the behavior of the session store component on exit/restart. Previously, if the user chose to restart the browser (for example, by installing an add-on) in private browsing mode, or closed the browser (provided that browser.startup.page is set to 3) without leaving the private mode, the private session was stored on disk, and would later be restored. With this revision, this shouldn\'t happen any more, and the user\'s non-private session should be restored, as expected.',0.00,0,0,3786894,5,'339569',0),(248970,251051,'2008-09-20 11:40:18','(In reply to comment #281)\n> - in private browsing mode mark places and visits with a \"private\" column in\n> the temp table, on sync skip marked places/visits (this can be done easily\n> modifying our triggers). Cons: needs temp table change and manage tables with\n> different columns (disk table does not need a \"private\" column).\n\nI think the second option can be used even without a new column, by using a new temp table and joining it against moz_places.\n\n> using a temp table is simply done creating it like CREATE TEMP TABLE\n> table_name, temp_store is not really useful (hwv we are already using it).\n> fsync stuff hwv inserts and updates in temp tables by default (yes we are\n> partitioning places and visits table between disk and memory).\n\nHmm, this page seems to suggest that temp tables are written to the disk while the MySQL connection is open . Ideally we wouldn\'t want to do that. According to the docs, temp_store might be able to save us there...',0.00,0,0,3787077,0,NULL,0),(248970,240353,'2008-09-21 02:03:37','(In reply to comment #283)\n> (In reply to comment #281)\n> I think the second option can be used even without a new column, by using a new\n> temp table and joining it against moz_places.\n\nwe can\'t, it\'s already quite difficult having one temp table, having two would be a pain. that\'s because sqlite does not support indices on unions or views, so we have to use very specialized queries to read from both (disk and memory).\n\n> Hmm, this page seems to suggest that temp tables are written to the disk while\n> the MySQL connection is open . Ideally we\n> wouldn\'t want to do that. According to the docs, temp_store might be able to\n> save us there...\n\ntemp_store is memory in Places',0.00,0,0,3787353,0,NULL,0),(248970,161650,'2008-09-22 10:37:20','After playing with a couple of builds I went back to official nightly builds. Today I discovered that new URL\'s were not being shown when entered into the Location bar. \n\nExamination with History->Show all history, did show the URL but the visit count was zero. I got to looking at other history of my normal visited sites and found that none were being \'counted as visited\' anymore. \n\nI renamed Places.sqlite to places.sqlite.old and restarted the browser to find that my bookmarks were still there ? My history was indeed gone, and is now being \'counted as visisted and incrementing\' as it should. \n\nBug or ? Almost seems that I was stuck in PB mode. Honestly I cannot recall if I properly exited PB mode before going back to official nightly\'s.',0.00,0,0,3788592,0,NULL,0),(248970,251051,'2008-09-22 10:54:09','Jim: have you tried to reproduce this? Your comment was a bit vague, and I need some STR in order to try to debug this.',0.00,0,0,3788618,0,NULL,0),(248970,161650,'2008-09-22 12:33:49','No, I just discovered this at the time of my comment #286 above. I had to leave for work, so will be tomorrow, or wednesday before I have time to install the PB tryserver build and see if things break again. \n\nCan you explain what seems to vague? \n\nThe issue seems to be that none of the sites I visit are being shown in the Library with a \'visit count\'. The URL is there but the visit count is zero. As long as the count stays at zero of course it won\'t show in the Location bar when doing a search.',0.00,0,0,3788788,0,NULL,0),(248970,8519,'2008-09-22 13:02:49','I tried to reproduce what Jim is seeing in Comment 285 and was not able to do so, but I was testing with a fresh profile. Here is what I did:\n\n1. Downloaded the latest private browsing tryserver build\n2. Created a fresh profile.\n3. Surfed 4-5 sites than invoked PB mode. I left the other browsing session open by selecting that preference.\n4. Browsed 4-5 sites in PB mode.\n5. Exited the browser and started up the latest trunk nightly using the same profile.\n6. Browsed to the sites that in regular mode and revisited. The visit count incremented correctly and the sites showed up in the location bar.\n\nWhat I did not do is use an existing profile that had already been run on the trunk to see what happens, I can do that next, since that is probably closer to what Jim was doing.',0.00,0,0,3788825,0,NULL,0),(248970,161650,'2008-09-22 13:20:20','Yes I was using a months old profile that I normally keep history for 90 days. \n\nThanks for testing Marcia. While your at it, could you also try:\n\nOpen the browser, enter PB mode, then close and re-install a current official nightly build? I\'m really suspecting that something was left \'locked\' in my places.sqlite file, thus leaving the browser \'thinking\' it was still in PB Mode.\n\nI have SQLite browser, but I\'m not sure what to look for, and will be tomorrow before I can even do that.',0.00,0,0,3788846,0,NULL,0),(248970,76551,'2008-09-22 15:33:25','Initiated a new try server build with patch v2.9. Should be available in an hour or so.',0.00,0,0,3789034,0,NULL,0),(248970,8519,'2008-09-22 15:50:53','I tested the scenario that Jim outlined in Comment 289 using a Windows Vista VM. Again, here are the steps I followed:\n\n1. Downloaded and installed the latest tryserver build.\n2. Entered PB mode and surfed a few sites. Exited FF still in PB mode.\n3. Ran the uninstaller and uninstalled the tryserver build.\n4. Installed the latest trunk nightly (Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre) Gecko/20080922032349 Minefield/3.1b1pre) and ran with the same profile.\n\nResult: Everything seemed okay as far as being able to access sites and the visit counts registered appropriately. The sites that I visited in PB mode **did** show up in history when I relaunched using the trunk, which I am not certain is expected or not - will this present an issue for individuals going back and forth between builds once the feature is launched?',0.00,0,0,3789056,0,NULL,0),(248970,76551,'2008-09-22 16:30:27','Latest try server builds come in here:\nhttps://build.mozilla.org/tryserver-builds/2008-09-22_15:31-mozilla@hskupin.info-bug248970v2.9/',0.00,0,0,3789105,0,NULL,0),(248970,251051,'2008-09-22 23:04:09','(In reply to comment #291)\n> Result: Everything seemed okay as far as being able to access sites and the\n> visit counts registered appropriately. The sites that I visited in PB mode\n> **did** show up in history when I relaunched using the trunk, which I am not\n> certain is expected or not - will this present an issue for individuals going\n> back and forth between builds once the feature is launched?\n\nThis is not expected, and it may be fixed in the 2.9 version of the patch. Could you please re-run the test steps with the builds Henrik provided in comment 292? It would be nice if you can make a backup copy of your places.sqlite before entering the private browsing mode, and after leaving it, so that if this problem persists, I can use them in order to debug this.\n\nAlso, before step 4, can you check and make sure that the visited sites do not show up in the PB-enabled build itself? They should appear there as well if they\'d appear in the latest nightly build.\n\nThanks!',0.00,0,0,3789395,0,NULL,0),(248970,161650,'2008-09-23 08:57:35','Just a couple notes. This build is still not playing nice with TM JIT.Content enabled. Also its \'crashy\' at times, with no breakpad being fired. Neowin.net continues to crash with JIT.Content enabled as well. \n\nIt does appear from bouncing back and forth from this build, to an \'official\' nightly build is OK, I don\'t see anything I browse in PB Mode appearing back in the trunk nightly build. \n\nIt also appears that early testing with PB builds did corrupt/break my places.sqlite file as it continues to log sites/url\'s visited with a visit count of zero. A new places.sqlite file does appear to function normally, even bouncing back and forth from PB builds to \'official\' nightly builds. \n\nI will try and get a debug trace tomorrow when I have some time for the crash a neowin.net',0.00,0,0,3789617,0,NULL,0),(248970,161650,'2008-09-23 09:11:57','Here is the debug trace.\n1. PB build is running \'normal\' - not in private mode\n2. visit: neowin.net\n3. after the site is just about done loading \'crash\' \n4. JIT.content is \'enabled\' - note this does not crash on official nightly\'s\n\n===============================================================================\n*** wait with pending attach\nSymbol search path is: C:\\websymbols;C:\\localsymbols\nExecutable search path is: \nModLoad: 00870000 00887000 C:\\Program Files\\Minefield\\firefox.exe\nModLoad: 77bd0000 77cf7000 C:\\Windows\\system32\\ntdll.dll\nModLoad: 77a60000 77b3b000 C:\\Windows\\system32\\kernel32.dll\nModLoad: 64de0000 656d3000 C:\\Program Files\\Minefield\\xul.dll\nModLoad: 69580000 695e3000 C:\\Program Files\\Minefield\\sqlite3.dll\nModLoad: 73520000 735bb000 C:\\Windows\\WinSxS\\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.1434_none_d08b6002442c891f\\MSVCR80.dll\nModLoad: 779b0000 77a5a000 C:\\Windows\\system32\\msvcrt.dll\nModLoad: 684a0000 68554000 C:\\Program Files\\Minefield\\js3250.dll\nModLoad: 10000000 10029000 C:\\Program Files\\Minefield\\nspr4.dll\nModLoad: 76510000 765d6000 C:\\Windows\\system32\\ADVAPI32.dll\nModLoad: 77640000 77702000 C:\\Windows\\system32\\RPCRT4.dll\nModLoad: 73ad0000 73ad7000 C:\\Windows\\system32\\WSOCK32.dll\nModLoad: 77370000 7739d000 C:\\Windows\\system32\\WS2_32.dll\nModLoad: 764d0000 764d6000 C:\\Windows\\system32\\NSI.dll\nModLoad: 74c10000 74c42000 C:\\Windows\\system32\\WINMM.dll\nModLoad: 767c0000 7685d000 C:\\Windows\\system32\\USER32.dll\nModLoad: 77d00000 77d4b000 C:\\Windows\\system32\\GDI32.dll\nModLoad: 765e0000 76724000 C:\\Windows\\system32\\ole32.dll\nModLoad: 77b40000 77bcd000 C:\\Windows\\system32\\OLEAUT32.dll\nModLoad: 75e20000 75e59000 C:\\Windows\\system32\\OLEACC.dll\nModLoad: 00080000 00098000 C:\\Program Files\\Minefield\\smime3.dll\nModLoad: 00630000 006da000 C:\\Program Files\\Minefield\\nss3.dll\nModLoad: 00110000 00124000 C:\\Program Files\\Minefield\\nssutil3.dll\nModLoad: 00130000 00137000 C:\\Program Files\\Minefield\\plc4.dll\nModLoad: 00150000 00157000 C:\\Program Files\\Minefield\\plds4.dll\nModLoad: 00170000 00190000 C:\\Program Files\\Minefield\\ssl3.dll\nModLoad: 76860000 7736f000 C:\\Windows\\system32\\SHELL32.dll\nModLoad: 77710000 77768000 C:\\Windows\\system32\\SHLWAPI.dll\nModLoad: 75de0000 75de8000 C:\\Windows\\system32\\VERSION.dll\nModLoad: 74640000 74682000 C:\\Windows\\system32\\WINSPOOL.DRV\nModLoad: 76450000 764c3000 C:\\Windows\\system32\\COMDLG32.dll\nModLoad: 75890000 75a2e000 C:\\Windows\\WinSxS\\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6001.18000_none_5cdbaa5a083979cc\\COMCTL32.dll\nModLoad: 764e0000 764fe000 C:\\Windows\\system32\\IMM32.dll\nModLoad: 77520000 775e8000 C:\\Windows\\system32\\MSCTF.dll\nModLoad: 75740000 75745000 C:\\Windows\\system32\\MSIMG32.dll\nModLoad: 77930000 779ad000 C:\\Windows\\system32\\USP10.dll\nModLoad: 735c0000 73647000 C:\\Windows\\WinSxS\\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.1434_none_d08b6002442c891f\\MSVCP80.dll\nModLoad: 74320000 74327000 C:\\Program Files\\Minefield\\xpcom.dll\nModLoad: 77d50000 77d59000 C:\\Windows\\system32\\LPK.DLL\nModLoad: 74fb0000 74fef000 C:\\Windows\\system32\\uxtheme.dll\nModLoad: 74c00000 74c0c000 C:\\Windows\\system32\\dwmapi.dll\nModLoad: 777a0000 7792a000 C:\\Windows\\system32\\SETUPAPI.dll\nModLoad: 76300000 7631e000 C:\\Windows\\system32\\USERENV.dll\nModLoad: 762e0000 762f4000 C:\\Windows\\system32\\Secur32.dll\nModLoad: 74af0000 74bab000 C:\\Windows\\system32\\PROPSYS.dll\nModLoad: 76730000 767b4000 C:\\Windows\\system32\\CLBCatQ.DLL\nModLoad: 72260000 72274000 C:\\Program Files\\Minefield\\components\\browserdirprovider.dll\nModLoad: 756d0000 7570b000 C:\\Windows\\system32\\mswsock.dll\nModLoad: 75370000 75375000 C:\\Windows\\System32\\wshtcpip.dll\nModLoad: 75ab0000 75ac9000 C:\\Windows\\system32\\iphlpapi.dll\nModLoad: 75a70000 75aa5000 C:\\Windows\\system32\\dhcpcsvc.DLL\nModLoad: 75bd0000 75bfc000 C:\\Windows\\system32\\DNSAPI.dll\nModLoad: 75a60000 75a67000 C:\\Windows\\system32\\WINNSI.DLL\nModLoad: 75a30000 75a51000 C:\\Windows\\system32\\dhcpcsvc6.DLL\nModLoad: 74bf0000 74bff000 C:\\Windows\\system32\\NLAapi.dll\nModLoad: 73a00000 73a0f000 C:\\Windows\\system32\\napinsp.dll\nModLoad: 73030000 73042000 C:\\Windows\\system32\\pnrpnsp.dll\nModLoad: 73430000 73438000 C:\\Windows\\System32\\winrnr.dll\nModLoad: 773a0000 773ea000 C:\\Windows\\system32\\WLDAP32.dll\nModLoad: 76440000 76447000 C:\\Windows\\system32\\PSAPI.DLL\nModLoad: 75730000 75735000 C:\\Windows\\System32\\wship6.dll\nModLoad: 75780000 757a1000 C:\\Windows\\system32\\NTMARTA.DLL\nModLoad: 75bb0000 75bc1000 C:\\Windows\\system32\\SAMLIB.dll\nModLoad: 73ab0000 73ab6000 C:\\Windows\\system32\\rasadhlp.dll\nModLoad: 74690000 74743000 C:\\Windows\\system32\\WindowsCodecs.dll\nModLoad: 75450000 7548b000 C:\\Windows\\system32\\rsaenh.dll\nModLoad: 02810000 02835000 C:\\Program Files\\Minefield\\softokn3.dll\nModLoad: 02840000 02858000 C:\\Program Files\\Minefield\\nssdbm3.dll\nModLoad: 02b20000 02b59000 C:\\Program Files\\Minefield\\freebl3.dll\nModLoad: 02b60000 02ba9000 C:\\Program Files\\Minefield\\nssckbi.dll\nModLoad: 6e860000 6e8a0000 C:\\Program Files\\Minefield\\components\\brwsrcmp.dll\nModLoad: 6dce0000 6dd42000 C:\\Windows\\system32\\mscms.dll\nModLoad: 71220000 71327000 C:\\Windows\\system32\\shdocvw.dll\nModLoad: 64500000 64965000 C:\\Windows\\system32\\Macromed\\Flash\\NPSWF32.dll\nModLoad: 77d60000 77e30000 C:\\Windows\\system32\\WININET.dll\nModLoad: 76500000 76503000 C:\\Windows\\system32\\Normaliz.dll\nModLoad: 775f0000 77635000 C:\\Windows\\system32\\iertutil.dll\nModLoad: 75fe0000 760d1000 C:\\Windows\\system32\\CRYPT32.dll\nModLoad: 75fa0000 75fb2000 C:\\Windows\\system32\\MSASN1.dll\nModLoad: 773f0000 77519000 C:\\Windows\\system32\\urlmon.dll\nModLoad: 71530000 71560000 C:\\Windows\\system32\\mlang.dll\nModLoad: 747a0000 747cf000 C:\\Windows\\system32\\wdmaud.drv\nModLoad: 748e0000 748e4000 C:\\Windows\\system32\\ksuser.dll\nModLoad: 74ac0000 74ae7000 C:\\Windows\\system32\\MMDevAPI.DLL\nModLoad: 74e00000 74e07000 C:\\Windows\\system32\\AVRT.dll\nModLoad: 752a0000 752cd000 C:\\Windows\\system32\\WINTRUST.dll\nModLoad: 77770000 77799000 C:\\Windows\\system32\\imagehlp.dll\nModLoad: 74610000 74631000 C:\\Windows\\system32\\AUDIOSES.DLL\nModLoad: 744b0000 74516000 C:\\Windows\\system32\\audioeng.dll\nModLoad: 74600000 74609000 C:\\Windows\\system32\\msacm32.drv\nModLoad: 742c0000 742d4000 C:\\Windows\\system32\\MSACM32.dll\nModLoad: 74490000 74497000 C:\\Windows\\system32\\midimap.dll\nModLoad: 75860000 75867000 C:\\Windows\\system32\\credssp.dll\nModLoad: 754c0000 75504000 C:\\Windows\\system32\\schannel.dll\nModLoad: 76120000 76195000 C:\\Windows\\system32\\NETAPI32.dll\n(c0.ab0): Break instruction exception - code 80000003 (first chance)\neax=7ffab000 ebx=00000000 ecx=00000000 edx=77c5d094 esi=00000000 edi=00000000\neip=77c17dfe esp=0c5dfac0 ebp=0c5dfaec iopl=0 nv up ei pl zr na pe nc\ncs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246\n*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\\Windows\\system32\\ntdll.dll - \nntdll!DbgBreakPoint:\n77c17dfe cc int 3\n0:016> g\n(c0.26c): Illegal instruction - code c000001d (first chance)\n(c0.26c): Illegal instruction - code c000001d (!!! second chance !!!)\neax=00005d61 ebx=ffffffff ecx=00000000 edx=80000000 esi=00000901 edi=6854cb04\neip=6853c035 esp=002aabd8 ebp=002aabe0 iopl=0 nv up ei pl nz na pe nc\ncs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010206\n*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\\Program Files\\Minefield\\js3250.dll - \njs3250!JS_XDRFindClassById+0x29c65:\n6853c035 f20f2c0424 cvttsd2si eax,mmword ptr [esp] ss:0023:002aabd8=fff8000000000000\n\n===============================================================================\nVista HP SP1 \nMozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre) Gecko/20080922155248 Minefield/3.1b1pre Firefox/3.0 ID:20080922155248',0.00,0,0,3789634,0,NULL,0),(248970,161650,'2008-09-23 09:50:22','This build seems to only enter PB Mode one time, then I cannot enter PB mode again without closing/restarting the browser.',0.00,0,0,3789688,0,NULL,0),(248970,161650,'2008-09-23 10:06:33','Sorry for the spam.\nTurning \'off\' JIT.Content allows entry/exit to PB mode multiple times.\nNow, I\'ve discovered if one of the tabs is a link/tab to say this bug, on exit from PB Mode the tab opens/restores as \'untitled\'. Using the location bar trying to open the link does nothing but open another \'untitled\' tab. i.e., the link cannot be visited unless you close/restart the browser. \n\nAfter several attempts of trying to discover the issue the browser got to the point it would not start up at all without crashing.\n\nReloaded the official nightly, and clicking \'restore from last session\', all tabs loaded as expected without crashing. \n\nSomething is really not playing nice somewhere, but its beyond me at this point. \n\nI really feel this needs more eyes/testers at this point as its very unstable at the moment. I assume when the try-server builds are made, its from a current pull form hg ?? i.e., all the latest/greatest patches etc...',0.00,0,0,3789715,0,NULL,0),(248970,251051,'2008-09-23 10:29:54','Thanks for your help in testing this patch, Jim!\n\n(In reply to comment #294)\n> Just a couple notes. This build is still not playing nice with TM JIT.Content\n> enabled. Also its \'crashy\' at times, with no breakpad being fired. Neowin.net\n> continues to crash with JIT.Content enabled as well. \n\nHmmm, I still can\'t reproduce this. Marcia: I really need some help here with testing this. Can you spend some time testing this on Vista, please?\n\n> It does appear from bouncing back and forth from this build, to an \'official\'\n> nightly build is OK, I don\'t see anything I browse in PB Mode appearing back in\n> the trunk nightly build. \n\nI assume it\'s because of the latest work on moz_inputhistory and the annotations service. Glad to hear it\'s fixed.\n\n> It also appears that early testing with PB builds did corrupt/break my\n> places.sqlite file as it continues to log sites/url\'s visited with a visit\n> count of zero. A new places.sqlite file does appear to function normally, even\n> bouncing back and forth from PB builds to \'official\' nightly builds. \n\nSorry to hear about the corrupted places.sqlite. If it doesn\'t contain any personal data, I\'d be happy to take a look at it if possible.\n\n(In reply to comment #295)\n> Here is the debug trace.\n> 1. PB build is running \'normal\' - not in private mode\n> 2. visit: neowin.net\n> 3. after the site is just about done loading \'crash\' \n> 4. JIT.content is \'enabled\' - note this does not crash on official nightly\'s\n\nIt would be great if you can set up WinDbg to use Microsoft and Mozilla\'s symbol servers: . Try server builds symbols are available at .\n\n(In reply to comment #297)\n> Sorry for the spam.\n> Turning \'off\' JIT.Content allows entry/exit to PB mode multiple times.\n> Now, I\'ve discovered if one of the tabs is a link/tab to say this bug, on exit\n> from PB Mode the tab opens/restores as \'untitled\'. Using the location bar\n> trying to open the link does nothing but open another \'untitled\' tab. i.e.,\n> the link cannot be visited unless you close/restart the browser. \n\nSomething\'s really wrong with how the PB patch interacts with tracemonkey, I guess. Maybe using the symbols for this build, we can start investigating this issue. By the way, do you see these problems in a fresh profile as well? What about other platforms (if you have tested)?\n\n> I really feel this needs more eyes/testers at this point as its very unstable\n> at the moment. I assume when the try-server builds are made, its from a\n> current pull form hg ?? i.e., all the latest/greatest patches etc...\n\nYes, they are. Marcia: can you help with testing this as well?',0.00,0,0,3789749,0,NULL,0),(248970,76551,'2008-09-23 10:53:13','(In reply to comment #298)\n> . Try server\n> builds symbols are available at .\n\nFor the try server symbols I get a 403 (forbidden). But as Ted told me it could be that this folder is not browsable. But if anyone have issues accessing the symbols please give a note.',0.00,0,0,3789786,0,NULL,0),(248970,8519,'2008-09-23 13:24:53','I retested my steps from Comment 291 with the tryserver build that Henrik generated in Comment 292 using my Win Vista VM:\n\n1. Downloaded and installed the latest tryserver build.\n2. Entered PB mode and surfed a few sites. Exited FF still in PB mode.\n3. Ran the uninstaller and uninstalled the tryserver build.\n4. Installed the latest trunk nightly (Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b1pre) Gecko/20080923111052 Minefield/3.1b1pre) and ran with the\nsame profile.\n\nResult: When I launched the trunk build I could not see the sites that I launched in PB mode, so everything works as expected in this regard.\n\nI also enabled JIT right from the getgo and visited the site that Jim is crashing on but I was not able to reproduce that crash.\n\nI also wondered if Jim was running with a FF profile that was possibly migrated from FF2?',0.00,0,0,3789972,0,NULL,0),(248970,161650,'2008-09-23 13:36:47','I did not migrate any profiles from FF2, in fact I\'ve never used FF2 as I\'m a nightly \'junkie\', and enjoy testing/breaking the new builds.\n\nI crash at neowin.net using a new profile as well. What\'s totally baffling me, is why it does not crash using 3.1b1pre trunk nightly\'s. \n\nMarcia, did you try going into and out of PB Mode several times with JIT.content enabled? Seems I could only get it to do one cycle of in/out of PB mode. \n\nI will try to download the try-server symbols tomorrow and run debug. I\'m not real versed in using WinDbg but will see what I can do. \n\nMy earlier post did have both Firefox sysmbols and windows sysmbols loaded with my trace.. I didn\'t know there was different symbol set for the try-server.',0.00,0,0,3789979,0,NULL,0),(248970,161650,'2008-09-24 05:00:56','I cannot get neowin.net to fail this morning to get a trace in windbg. There must be some doggy ad or something coming around once in ahwile, but that still does not fully explain why it works OK with official nightly\'s.\n\nThere is still something up when you have an https page open during normal browsisng and then enter PB mode choosing to \'save and close\' then on exit of PBmode the https site will show as \'untitled\'. I found that by being persistant enough on clicking the \'go\' arrow it will eventually load. Must be something funky in the way its saving or not saving https sites on entry to PB Mode.\n\nI\'ll be waiting for the next iteration and try some more testing.',0.00,0,0,3790838,0,NULL,0),(248970,251051,'2008-09-24 08:07:40','(In reply to comment #302)\n> There is still something up when you have an https page open during normal\n> browsisng and then enter PB mode choosing to \'save and close\' then on exit of\n> PBmode the https site will show as \'untitled\'. I found that by being\n> persistant enough on clicking the \'go\' arrow it will eventually load. Must be\n> something funky in the way its saving or not saving https sites on entry to PB\n> Mode.\n\nSimon, Dietrich: Could this be because of the check being performed in nsSessionStore._checkPrivacyLevel? Maybe the SSL page status does not get saved as part of the usual session store data. If that is the case, is there anything to be done without compromising users\' privacy to solve this?',0.00,0,0,3791015,0,NULL,0),(248970,160571,'2008-09-24 09:20:22','(In reply to comment #303)\nThe very same code path works fine when PB mode isn\'t involved. AFAICT what silently(!) fails is the call to |browser.webNavigation.gotoelasticsearch.Index| at . The tab\'s history seems to be correctly restored, though, which you can verify by navigating in the tab before entering PB mode and by right-clicking the Back button after exiting it.\n\nCould your code changes subtly interact with a browser\'s webNavigation to that end? Or could you try to restore the browsing state while PB mode isn\'t completely over and we\'re in an inconsistent state overall?',0.00,0,0,3791129,0,NULL,0),(248970,160571,'2008-09-24 09:41:49','BTW: For the latest try-server build, sessionStorage seems to be broken. At least my patch for bug 339445 suddenly throws a NS_ERROR_DOM_SECURITY_ERR for nsIDOMStorage::GetLength (which it doesn\'t in the latest nightly build). Could this be due to your patch?',0.00,0,0,3791178,0,NULL,0),(248970,8519,'2008-09-24 12:39:41','(In reply to comment #301)\n[snip]\n\nI just retested the build on Win Vista and navigated in and out of PB mode several times with JIT enabled. When I then launched a fresh trunk build everything worked as expected - all the sites I browsed while in PB mode did not show and it cycled back and forth fine during my testing.\n> \n> Marcia, did you try going into and out of PB Mode several times with\n> JIT.content enabled? Seems I could only get it to do one cycle of in/out of PB\n> mode. \n>',0.00,0,0,3791505,0,NULL,0),(248970,251051,'2008-09-24 16:26:43','(In reply to comment #304)\n> (In reply to comment #303)\n> The very same code path works fine when PB mode isn\'t involved. AFAICT what\n> silently(!) fails is the call to |browser.webNavigation.gotoelasticsearch.Index| at\n> .\n\nHmmm, we\'re eating the exception there, right? Looks like an exception is expected there. Would you please explain why it\'s been implemented like that, and what kinds of exceptions have been expected?\n\n> The tab\'s history seems to be correctly restored, though, which you can verify\n> by navigating in the tab before entering PB mode and by right-clicking the Back\n> button after exiting it.\n\nYes, this seems to be the case.\n\n> Could your code changes subtly interact with a browser\'s webNavigation to that\n> end?\n\nNot in any way that I know, but I could be wrong...\n\nCould it be a problem with the way I\'m closing all current windows, and opening a new one? I\'ve noticed that session store would use that first opened window it it\'s still open while exiting the private mode, so maybe there\'s something wrong with that window? Here\'s the relevant code from the patch:\n\n+ _closeAllWindows: function PBS__closeAllWindows() {\n+ let windowMediator = Cc[\"@mozilla.org/appshell/window-mediator;1\"].\n+ getService(Ci.nsIWindowMediator);\n+ let windowsEnum = windowMediator.getEnumerator(\"navigator:browser\");\n+ \n+ this._closeAllWindowsInternal(windowsEnum);\n+ },\n+\n+ _closeAllWindowsInternal: function PBS__closeAllWindowsInternal(windowsEnum) {\n+ if (windowsEnum.hasMoreElements()) {\n+ let window = windowsEnum.getNext();\n+ this._closeAllWindowsInternal(windowsEnum);\n+ window.close();\n+ }\n+ },\n+\n+ _openSingleWindow: function PBS__openSingleWindow() {\n+ let windowWatcher = Cc[\"@mozilla.org/embedcomp/window-watcher;1\"].\n+ getService(Ci.nsIWindowWatcher);\n+ windowWatcher.openWindow(null, \"chrome://browser/content/browser.xul\",\n+ null, \"chrome,all,resizable=yes,dialog=no\", null);\n+ },\n\n\n\n> Or could you try to restore the browsing state while PB mode isn\'t\n> completely over and we\'re in an inconsistent state overall?\n\nWell, in the private browsing service, I first notify the observers about the exit event, and then call nsSessionStore.setBrowserState to restore the session, so the private browsing mode should be well finished by that time.\n\n(In reply to comment #305)\n> BTW: For the latest try-server build, sessionStorage seems to be broken. At\n> least my patch for bug 339445 suddenly throws a NS_ERROR_DOM_SECURITY_ERR for\n> nsIDOMStorage::GetLength (which it doesn\'t in the latest nightly build). Could\n> this be due to your patch?\n\nYes. nsDOMStorage::GetLength calls nsDOMStorage::CacheStoragePermissions which itself calls nsDOMStorage::CanUseStorage which returns false in private browsing mode, and hence the NS_ERROR_DOM_SECURITY_ERR exception. Basically, you can\'t use the dom storage service in the private browsing mode. This was suggested by Dave Camp in comment 172.\n\nI\'m not sure what can we do instead of handling the code in bug 339445 after it gets landed in private mode as well. So, I\'m adding it as a dependency here.',0.00,0,0,3791927,0,NULL,0),(248970,160571,'2008-09-24 17:10:51','(In reply to comment #307)\n> Hmmm, we\'re eating the exception there, right?\n\nNo, there\'s no exception at all - the call just (silently) fails. The only exceptions we are expecting come from passing an invalid index to gotoelasticsearch.Index which actually shouldn\'t be happening anymore, at all. Could you step into gotoelasticsearch.Index with a debugger and see what\'s actually happening in there?\n\n> Could it be a problem with the way I\'m closing all current windows, and\n> opening a new one?\n\nNo, as when restoring the saved session is all handled by SessionStore itself. (BTW: Why don\'t you just loop over the iterator in _closeAllWindows instead of recursively calling _closeAllWindowsInternal? |while| to the rescue?)\n\n> (In reply to comment #305)\n> Yes. nsDOMStorage::GetLength calls nsDOMStorage::CacheStoragePermissions which\n> itself calls nsDOMStorage::CanUseStorage which returns false in private\n> browsing mode, and hence the NS_ERROR_DOM_SECURITY_ERR exception.\n\nProblem is: I got the same error right after startup (i.e. before even touching PB mode at all). Bug?\n\n> I\'m not sure what can we do instead of handling the code in bug 339445 after it\n> gets landed in private mode as well.\n\nWhat about throwing or returning |null| from getSessionStorageForURI while in PB mode instead so that sessionStorage consumers can bail out sooner rather than later?',0.00,0,0,3792015,0,NULL,0),(248970,251051,'2008-09-25 00:44:11','(In reply to comment #308)\n> (In reply to comment #307)\n> > Hmmm, we\'re eating the exception there, right?\n> \n> No, there\'s no exception at all - the call just (silently) fails. The only\n> exceptions we are expecting come from passing an invalid index to gotoelasticsearch.Index\n> which actually shouldn\'t be happening anymore, at all. Could you step into\n> gotoelasticsearch.Index with a debugger and see what\'s actually happening in there?\n\nSure, I\'ll do that.\n\n> > Could it be a problem with the way I\'m closing all current windows, and\n> > opening a new one?\n> \n> No, as when restoring the saved session is all handled by SessionStore itself.\n> (BTW: Why don\'t you just loop over the iterator in _closeAllWindows instead of\n> recursively calling _closeAllWindowsInternal? |while| to the rescue?)\n\nNi special reason, I just thought it would look better visually to close the windows in reverse order, and nsISimpleEnumerator doesn\'t support reverse iterations...\n\n> Problem is: I got the same error right after startup (i.e. before even touching\n> PB mode at all). Bug?\n\nOh, in that case, yes it\'s probably a bug. I need to investigate it.\n\n> What about throwing or returning |null| from getSessionStorageForURI while in\n> PB mode instead so that sessionStorage consumers can bail out sooner rather\n> than later?\n\nThat won\'t cover consumers which call getSessionStorageForURI prior to entering the private mode, would it?',0.00,0,0,3792376,0,NULL,0),(248970,160571,'2008-09-25 03:37:15','(In reply to comment #309)\n> Sure, I\'ll do that.\n\nThanks!\n\n> nsISimpleEnumerator doesn\'t support reverse iterations...\n\nIn that case, please at least add a comment to that end.\n\n> That won\'t cover consumers which call getSessionStorageForURI prior to entering\n> the private mode, would it?\n\nSure, so s/instead/additionally/.\n\nBTW: Please don\'t forget to add unit tests for the SessionStore changes as well.',0.00,0,0,3792472,0,NULL,0),(248970,251051,'2008-09-25 08:19:14','(In reply to comment #310)\n> (In reply to comment #309)\n> > Sure, I\'ll do that.\n> \n> Thanks!\n\nOK, I couldn\'t reproduce this bug on my machine. I opened AMO and navigated to a few places on AMO, an then entered the private mode, loaded some sites and switched back to normal mode, and the AMO page was restored correctly.\n\nSimon, do you have a STR which I can use here?\n\nI took a look inside nsDocShell::Gotoelasticsearch.Index anyway, and I noticed that the reason of the silent failure (which is intentional BTW) is . Now, nsDocShell::IsNavigationAllowed should return false if we\'re printing (or in print preview mode), or if mFiredUnloadEvent is true (which logically should be the case here). Is there any docshell guru I can ping who may be able to help me understand why this is failing?\n\n> In that case, please at least add a comment to that end.\n\nSure.\n\n> Sure, so s/instead/additionally/.\n\nDave: can I safely modify nsDocShell::GetSessionStorageForUI to call nsDOMStorage::CanUseStorage to determine if session storage is available or not, and return an error if it isn\'t?\n\n> BTW: Please don\'t forget to add unit tests for the SessionStore changes as\n> well.\n\nMconnor has written a test plan which includes SessionStore. You can check it at . I will eventually implement all these tests before submitting the patch for review.',0.00,0,0,3792761,0,NULL,0),(248970,251051,'2008-09-25 08:24:53','(In reply to comment #311)\n> OK, I couldn\'t reproduce this bug on my machine. I opened AMO and navigated to\n> a few places on AMO, an then entered the private mode, loaded some sites and\n> switched back to normal mode, and the AMO page was restored correctly.\n\nPlease ignore this, I made a mistake, but I was able to reproduce this easily paying more attention; just forgot to update my comment before submitting it.',0.00,0,0,3792771,0,NULL,0),(248970,251051,'2008-09-25 11:14:49','This patch completes the password manager tests (I\'ve added a few things to the test plan mconnor wrote: ), and adds the test for authenticated sessions. The history tests are being done by Aaron Train (a Seneca college student) and I\'m working on the session store tests right now.',0.00,0,0,3793086,5,'340369',0),(248970,76551,'2008-09-26 13:43:51','New try server builds for patch v2.10 are available here:\nhttps://build.mozilla.org/tryserver-builds/2008-09-26_12:22-mozilla@hskupin.info-bug248970v2.10/',0.00,0,0,3795145,0,NULL,0),(457765,326486,'2008-09-29 14:57:42','User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3\nBuild Identifier: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3\n\nWhen creating an anchor-element which wraps an list item, firefox closes the anchor tag before the li-element starts. It also creates an additional anchor-element inside the list item.\nExample:\n
  • Lorem ipsum
  • \nbecomes \n
  • Lorem ipsum
  • \n\nReproducible: Always\n\nSteps to Reproduce:\n1.Create an HTML-document which contains an anchor element wrapping a list item.\n2.Open it in firefox, select the text and click \"View selection source\"',0.00,0,0,3798531,0,NULL,0),(248970,251051,'2008-10-02 01:44:12','The cookies module patch with a unit test, ready for review.',0.00,0,0,3801993,5,'341413',0),(248970,251051,'2008-10-02 01:51:41','The contentprefs module patch with a unit test, ready for review.',0.00,0,0,3801995,5,'341414',0),(248970,251051,'2008-10-02 01:53:59','The passwordmgr module patch with a unit test, ready for review.',0.00,0,0,3801998,5,'341415',0),(248970,251051,'2008-10-02 02:23:37','The httpauth module unit test, ready for review. The code responsible for clearing the HTTP authenticated sessions when entering and exiting the private browsing mode lives in , inside the _onPrivateBrowsingModeChanged function.',0.00,0,0,3802020,5,'341418',0),(248970,20209,'2008-10-02 07:12:01','I don\'t really know the auth stuff well enough to tell whether this test is testing the right things.',0.00,0,0,3802221,6,'341418',0),(248970,20209,'2008-10-02 07:20:08','>+ if (!nsCRT::strcmp(aData, NS_LITERAL_STRING(\"enter\").get())) {\n\nif (NS_LITERAL_STRING(\"enter\").Equals(aData)) ?\n\nSimilar for exit.\n\n>+ // backup the existing in-memory MySQL\n\nI would tend to just make both tables pointers instead of direct members, and then all that needs to happen on enter is:\n\n mBackupHostTable = mHostTable;\n mHostTable = new ...;\n mHostTable->Init();\n\nand on exit:\n\n mHostTable = mBackupHostTable;\n mBackupHostTable = nsnull;\n\nYou\'d have to change various other code, of course.\n\nCheck with dwitte as to which he prefers here; for now I haven\'t looked in detail at the copying functions.',0.00,0,0,3802232,6,'341413',0),(248970,251051,'2008-10-02 12:04:32','(In reply to comment #320)\n>>+ if (!nsCRT::strcmp(aData, NS_LITERAL_STRING(\"enter\").get())) {\n>\n> if (NS_LITERAL_STRING(\"enter\").Equals(aData)) ?\n>\n> Similar for exit.\n\nDone.\n\n>>+ // backup the existing in-memory MySQL\n>\n> I would tend to just make both tables pointers instead of direct members, and\n> then all that needs to happen on enter is:\n>\n> mBackupHostTable = mHostTable;\n> mHostTable = new ...;\n> mHostTable->Init();\n>\n> and on exit:\n>\n> mHostTable = mBackupHostTable;\n> mBackupHostTable = nsnull;\n>\n> You\'d have to change various other code, of course.\n>\n> Check with dwitte as to which he prefers here; for now I haven\'t looked in\n> detail at the copying functions.\n\nHmmm, actually it seems a lot cleaner than the current copying I\'m doing... Daniel, what do you think?',0.00,0,0,3802548,5,'341481',0),(248970,251051,'2008-10-02 15:12:12','I just realized that the previous version of the patch had a typo which prevented it from getting compiled (duh!). This one should be fine.',0.00,0,0,3802811,5,'341517',0),(458397,277293,'2008-10-03 09:33:59','Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3pre) Gecko/2008092317\nMinefield/3.0.3pre\n\nFound during the automated Global-500 Topsite Test on http://www.grono.net\n\n0 TOTAL 15 2046359 15894236 82932 ( 3544.85 +/- 4885.93) 45854105 42575 ( 1267.17 +/- 3004.70)\n\nnsStringStats\n => mAllocCount: 2030862\n => mReallocCount: 33447\n => mFreeCount: 2026857 -- LEAKED 4005 !!!\n => mShareCount: 222061\n => mAdoptCount: 84390\n => mAdoptFreeCount: 84376 -- LEAKED 14 !!!',0.00,0,0,3803550,5,'341626',0),(248970,75420,'2008-10-03 16:09:50','>+ if (NS_SUCCEEDED(mObserverService->NotifyObservers(inPrivateBrowsing,\n>+ \"private-browsing-query\",\n>+ nsnull))) {\n\nsplit this into two lines, |rv = ...| and |if (NS_SUCCEEDED(rv))| please.\n\ni also think the private-browsing-query thing is a terribly roundabout way of doing things, and i\'d much prefer a service somewhere we can directly call...\n\n>+ } else if (!strcmp(aTopic, \"browser:private-browsing\")) {\n>+ if (NS_LITERAL_STRING(\"enter\").Equals(aData)) {\n\naData.Equals(...) please (and below).\n\n>+ // backup the existing in-memory MySQL\n\nagreed with bz - go with member pointers here, and just twiddle them around to \"back up\" your db and reinitialize and so on. then you won\'t need to change the hashtable code in nsCookieService.h, either. r- pending that, since i\'d like to look at that code once you\'ve written it...',0.00,0,0,3804046,6,'341517',0),(248970,27780,'2008-10-04 15:27:23','General nit: patches are easier to review with more context in the diffs... See http://developer.mozilla.org/en/Mercurial_FAQ#Configuration (specifically, the \"-U 8\" part).\n\n>--- a/toolkit/components/passwordmgr/src/nsLoginManager.js\n...\n>+ var inPrivateBrowsing = Cc[\"@mozilla.org/supports-PRBool;1\"].\n>+ createInstance(Ci.nsISupportsPRBool);\n>+ this._observerService.notifyObservers(inPrivateBrowsing,\n>+ \"private-browsing-query\", null);\n>+ this._inPrivateBrowsing = inPrivateBrowsing.data;\n\nThis seems wrong to me. I hope we\'re not using this pattern in other places.\n\nLike dwitte said, this really seems like it should ask a service for the initial state. Something like:\n\n var PBS = Cc[\"mumble\"].getService(Ci.mumble);\n this._inPrivateBrowsing = PBS.inPrivateBrowsing;\n\n>+ } else if (topic == \"browser:private-browsing\") {\n>+ if (data == \"enter\")\n>+ this._pwmgr._inPrivateBrowsing = true;\n>+ else if (data == \"exit\")\n>+ this._pwmgr._inPrivateBrowsing = false;\n\nWould be nice to add a debug line here...\n\n this._pwmgr.log(\"Private browsing mode: \" + data);\n\n>- var autofillForm = this._prefBranch.getBoolPref(\"autofillForms\");\n>+ var autofillForm = !this._inPrivateBrowsing &&\n>+ this._prefBranch.getBoolPref(\"autofillForms\");\n\nNit: second line should be indented to align with \"!\".\n\n>--- a/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js\n>-function LoginManagerPrompter() {}\n>+function LoginManagerPrompter() {\n>+ this.init();\n>+}\n\nThere\'s already an init() method in this object, so I\'m surprised this works (or at least doesn\'t break something else).\n\nBut I don\'t think there\'s a need for an observer here.. A new prompter is created every time the authentication prompt is shown (ie, it\'s short lived), so the observer isn\'t likely to be triggered anyway. A simple helper function / getter, called when needed, is sufficient, and eliminated the need for an observer and more init() code...\n\n get _inPrivateBrowsing : function () {\n var PBS = Cc[xxx].getService(Ci.xxx);\n return PBS.inPrivateBrowsing;\n }\n\n>- if (!ok || !checkBox.value || !hostname)\n>+ if (!ok || !checkBox.value || !hostname || this._inPrivateBrowsing)\n\nI think this extra check isn\'t needed (ditto for the other places like this). The checkbox should end up hidden by the previous code, so checkbox.value should always be false.\n\n>--- a/toolkit/components/passwordmgr/test/Makefile.in\n...\n>+ test_bug_248970.html \\\n\nHmm, let\'s call this test_privbrowsing.html so it\'s more obvious what it does (ditto for subtests).\n\n>+++ b/toolkit/components/passwordmgr/test/subtst_bug_248970_1.html\n...\n>+

    Subtest 1

    \n\nAdd a brief comment in here saying what the test is trying to do (eg, trigger a save/change pw prompt).\n\n>+++ b/toolkit/components/passwordmgr/test/subtst_bug_248970_3.html\n...\n>+function submitForm() {\n>+ setTimeout(function(){ form.submit(); }, 100);\n>+}\n\nWhy the setTimeout()?\n\n\n>+++ b/toolkit/components/passwordmgr/test/subtst_bug_248970_4.html\n...\n>+function submitForm() {\n...\n>+ var result = pwmgr.autoCompleteSearch(\"\", null, userField);\n>+ if (result instanceof Ci.nsIAutoCompleteResult &&\n>+ result.matchCount == 1) {\n>+ userField.focus();\n>+ userField.value = result.getValueAt(0);\n>+ userField.blur();\n>+ }\n>+\n>+ setTimeout(function(){ form.submit(); }, 100);\n>+}\n\nSeems like this code should be the top test (test_privbrowsing.html), not in the subtest. Why call pwmgr.autoCompleteSearch? That\'s kind of a hacky API, and I\'d like to remove it eventually... Look at test_basic_form_autocomplete.html for how to drive the autocomplete dropdown without this.\n\n\n>+++ b/toolkit/components/passwordmgr/test/test_bug_248970.html\n\nI\'m ambivalent about having this as a separate test, verses rolling these tests into existing tests (test_notifications.html and test_basic_form_autocomplete.html). It kinda makes sense to test this as an independent feature, but also kinda sucks to duplicate the code/infrastructure of those tests. Maybe we should look at spinning out some of the existing stuff into common files (eg the existing pwmgr_common.js, or a new file like notification_common.js). This could be done today in a separate bug...\n\n>+var prefix = \"http://test2.example.com/tests/toolkit/components/passwordmgr/test/\";\n\nSee the tests in bug 403420 to avoid hardcoding this path.\n\n>+function get_PBSvc() {\n...\n>+ if (PBS_CID in Components.classes &&\n>+ \"nsIPrivateBrowsingService\" in Components.interfaces) {\n>+ try {\n>+ _PBSvc = Components.classes[PBS_CID].\n>+ getService(Components.interfaces.nsIPrivateBrowsingService);\n>+ if (_PBSvc) {\n>+ var observer = {\n...\n\nI\'m not sure what this is all for. You shouldn\'t need to check if the service Cc/Ci exists (just let it throw+fail if it doesn\'t), and the observer doesn\'t seem to do anything useful?',0.00,0,0,3804648,6,'341415',0),(248970,251051,'2008-10-05 00:55:08','(In reply to comment #323)\n> (From update of attachment 341517 [details])\n> >+ if (NS_SUCCEEDED(mObserverService->NotifyObservers(inPrivateBrowsing,\n> >+ \"private-browsing-query\",\n> >+ nsnull))) {\n> \n> split this into two lines, |rv = ...| and |if (NS_SUCCEEDED(rv))| please.\n\nDone.\n\n> i also think the private-browsing-query thing is a terribly roundabout way of\n> doing things, and i\'d much prefer a service somewhere we can directly call...\n\nI agree, but that means we should put nsIPrivateBrowsingService.idl somewhere in the build stack before netwerk, and I\'m not sure if there\'s an appropriate place for this (and if yes, where). In fact, this is a hacky workaround against exactly this point.\n\n> >+ } else if (!strcmp(aTopic, \"browser:private-browsing\")) {\n> >+ if (NS_LITERAL_STRING(\"enter\").Equals(aData)) {\n>\n> aData.Equals(...) please (and below).\n\nHmmm, aData is a const PRUnichar*, so I\'m not sure what you mean here.\n\n> >+ // backup the existing in-memory MySQL\n>\n> agreed with bz - go with member pointers here, and just twiddle them around to\n> \"back up\" your db and reinitialize and so on. then you won\'t need to change the\n> hashtable code in nsCookieService.h, either. r- pending that, since i\'d like to\n> look at that code once you\'ve written it...\n\nOK, here\'s the new code. The backup and restore functions are gone now, and the changes to the hash key have been reverted as well.',0.00,0,0,3804882,5,'341795',0),(248970,251051,'2008-10-05 01:44:06','New patch with more context, and using nsIPrivateBrowsingService to get the initial status of the private browsing mode.',0.00,0,0,3804889,5,'341797',0),(248970,20209,'2008-10-05 12:07:09','Why couldn\'t nsIPrivateBrowsingService.idl just live in netwerk?',0.00,0,0,3805205,0,NULL,0),(248970,251051,'2008-10-06 08:27:57','(In reply to comment #327)\n> Why couldn\'t nsIPrivateBrowsingService.idl just live in netwerk?\n\nThis is a good idea. All the modules edited in this patch depend on netwerk, so it won\'t cause any dependency problems. I\'ll move nsIPrivateBrowsingService.idl to netwerk/base/public and will update various modules to query the private browsing service directly. The \"private-browsing-query\" notification can also be discarded with this change.',0.00,0,0,3805940,0,NULL,0),(248970,15661,'2008-10-06 10:19:53','Yeah, netwerk/base/public is a dumping ground for all kinds of random stuff anyway...',0.00,0,0,3806097,0,NULL,0),(248970,75420,'2008-10-09 00:41:47','punting review, pending a new patch with nsIPBS.',0.00,0,0,3809605,6,'341795',0),(248970,15661,'2008-10-09 03:05:32','all the private browsing code lives outside of necko, right? then so should the test.',0.00,0,0,3809669,6,'341418',0),(248970,14419,'2008-10-09 03:43:17','Where does/will the documentation for the private browsing feature reside? Is it worth mentioning there that our private browsing mode has no effect on the operation of ISP or firewall that might be caching our browsing activities?',0.00,0,0,3809694,0,NULL,0),(248970,299942,'2008-10-09 11:47:13','The documentation I have come across are here:\n\nhttps://wiki.mozilla.org/PrivateBrowsing\nhttps://wiki.mozilla.org/User:Mconnor/PrivateBrowsing\nhttps://wiki.mozilla.org/Firefox3.1/PrivateBrowsing/TestPlan\nhttps://wiki.mozilla.org/QA/Firefox3.1/Private_Browsing_Test_Plan',0.00,0,0,3810188,0,NULL,0),(248970,251051,'2008-10-09 14:07:44','(In reply to comment #332)\n> Where does/will the documentation for the private browsing feature reside? Is\n> it worth mentioning there that our private browsing mode has no effect on the\n> operation of ISP or firewall that might be caching our browsing activities?\n\nYes, that should definitely be mentioned. I\'m not sure if there\'s a plan to include a specific page for it on mozilla.com, or is it just the support article, but I\'m CCing David Tenser to make sure this will happen for the SUMO article at least.',0.00,0,0,3810377,0,NULL,0),(248970,299942,'2008-10-10 14:13:15','',0.00,0,0,3811765,5,'342643',0),(248970,297995,'2008-10-10 14:27:02','(In reply to comment #335)\nI imagine this has to be uploaded as a patch (hg diff -u8)... see http://developer.mozilla.org/En/Creating_a_patch',0.00,0,0,3811793,0,NULL,0),(248970,251051,'2008-10-10 14:54:45','Thanks Aaron for the unit test. I\'ve included this in my mq, and it\'ll be in the next revision of the patch which I\'m attaching to the bug right now...',0.00,0,0,3811845,6,'342643',0),(248970,251051,'2008-10-10 14:56:29','This makes all of the splitted patches I\'d posted so far obsolete. I\'ll attach new versions of those patches shortly.',0.00,0,0,3811851,5,'342650',0),(248970,251051,'2008-10-10 15:11:14','(In reply to comment #338)\n> Created an attachment (id=342650) [details]\n> Patch (v2.11)\n\nThis patch should be applied on top of my latest patches for bug 458954 and bug 457110.\n\nHere is the list of changes in this patch:\n\n1. nsIPrivateBrowsingService.idl was moved to netwerk/base/public.\n2. All of the modules now call the private browsing service directly to get the current status upon startup.\n3. The private-browsing-query notification, which was merely added for the purpose of not having to depend on nsIPrivateBrowsingService, was removed.\n4. The private-browsing-requested was added. This notification is sent before entering or leaving the private mode. Extensions and modules have a chance to cancel this mode if they desire (download manager handles this notification).\n5. The bug which caused session store to save the private session to disk when restarting from within the private mode is fixed.\n6. The bug which caused session store to think the browser has crashed if the user tired to close the browser while still in private mode is fixed.\n7. Latest fixes as per review comments for the cookies and password manager modules are included in this patch. (The changes requested to passwordmgr unit tests are not included yet).\n8. Aaron\'s unit test for places is now included, making the places module ready for review.\n9. The cookies and httpauth module tests are now splitted.\n10. The latest functional spec for the downloads manager has been implemented in both the back-end and the front-end UI.',0.00,0,0,3811875,0,NULL,0),(248970,251051,'2008-10-10 15:51:02','Latest version of the contentprefs module patch.',0.00,0,0,3811924,5,'342661',0),(248970,251051,'2008-10-10 15:51:27','Latest version of the cookie patch, with the changes requested in comment 330, and the rest of the review comments.',0.00,0,0,3811926,5,'342662',0),(248970,251051,'2008-10-10 15:55:08','The places module patch with a unit test, ready for review.',0.00,0,0,3811930,5,'342664',0),(248970,240353,'2008-10-10 16:56:01','(In reply to comment #342)\n> Created an attachment (id=342664) [details]\n> [for review] places v1\n\nwell this is not a review, but some comment on a couple doubts i have, hope it could be useful...\n\n {\n PRInt64 placeId;\n nsresult rv = GetPlaceIdForURI(aURI, &placeId);\n NS_ENSURE_SUCCESS(rv, rv);\n \n+ if (placeId == -1) // we\'re in private browsing mode\n+ return NS_OK;\n+\n\ni\'m not really sure about this, placeId == -1 imho should throw and not be considered as valid, i fear this could hide other possible bugs or db corruptions. Maybe you should directly check if we are in privatebrowsing mode through an internal helper method.\n\n-#define PLACES_SCHEMA_VERSION 7\n+#define PLACES_SCHEMA_VERSION 8\n\nyou should not upgrade schema version if you\'re not providing a migrateV8Up function with the table changes from v7\n\n+ NS_ENSURE_SUCCESS(rv, rv);\n+ }\n+\n+ // moz_privatebrowsinghistory\n+ rv = mDBConn->TableExists(NS_LITERAL_CSTRING(\"moz_privatebrowsinghistory\"), &tableExists);\n+ NS_ENSURE_SUCCESS(rv, rv);\n+ if (!tableExists) {\n+ rv = mDBConn->ExecuteSimpleSQL(CREATE_MOZ_PRIVATEBROWSINGHISTORY);\n NS_ENSURE_SUCCESS(rv, rv);\n }\n\nwhy do you need to create a table to hold only 1 value that is inserted and removed sometimes, and you don\'t need to do searches or manipulation of this data? would not be better a pref or another kind of persistent storage (since i suppose a user could close the browser in private mode and we should rememeber that value to restart in private browsing mode?)?\n\n+ rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(\n+ \"SELECT last_entered FROM moz_privatebrowsinghistory \"\n+ \"ORDER BY last_entered DESC\"),\n+ getter_AddRefs(mDBGetLastPBEnterDate));\n+ NS_ENSURE_SUCCESS(rv, rv);\n+\n+ rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(\n+ \"INSERT INTO moz_privatebrowsinghistory \"\n+ \"(last_entered) \"\n+ \"VALUES(?1)\"),\n+ getter_AddRefs(mDBSetLastPBEnterDate));\n+ NS_ENSURE_SUCCESS(rv, rv);\n+\n+ rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(\n+ \"DELETE FROM moz_privatebrowsinghistory\"),\n+ getter_AddRefs(mDBRemoveLastPBEnterDate));\n NS_ENSURE_SUCCESS(rv, rv);\n\ncaching statements at startup is good for statements executed often, these are executed a few times, or never in a session, if you\'re going to hold the table you should probably not cache these since it would regress startup time and not provide enough perf gain. And you could directly use executeSimpleSQL for the delete.',0.00,0,0,3811975,0,NULL,0),(248970,75420,'2008-10-10 18:04:27','>+ } else if (!strcmp(aTopic, \"browser:private-browsing\")) {\n>+ if (NS_LITERAL_STRING(\"enter\").Equals(aData)) {\n>+ // backup the existing in-memory MySQL\n>+ PRBool ok = PR_TRUE;\n>+ if (!mPrivateHostTable.IsInitialized())\n>+ ok = mPrivateHostTable.Init();\n+ if (ok) {\n+ mHostTable = &mPrivateHostTable;\n+ mCookieCount = mHostTable->Count();\n+ NotifyChanged(nsnull, NS_LITERAL_STRING(\"cleared\").get());\n+ }\n\njust write this as |if (mPrivateHostTable.IsInitialized() || mPrivateHostTable.Init())| and skip the |ok| bit.\n\n>+ } else if (NS_LITERAL_STRING(\"exit\").Equals(aData)) {\n>+ // open the connection to the on-disk MySQL\n>+ InitDB();\n>+ // restore the in-memory MySQL as it was prior to private browsing\n>+ if (mPrivateHostTable.IsInitialized())\n>+ mPrivateHostTable.Clear();\n>+ mHostTable = &mDefaultHostTable;\n>+ mCookieCount = mHostTable->Count();\n>+ // continue to use both on-disk and in-memory MySQL\n\nhmm. you fire a \"cleared cookie list\" notification when entering PB, but nothing on exit - so the cookiemanager and such will still show PB cookies, no? but we can\'t just fire a clear here either, since it needs to be repopulated. seems like we either need to teach CM about PB notifications so it can do its own thing, or we could have PBS fire a profile-related notification (\"profile-do-change\" perhaps?) to force reloads? not sure what other effects that might have...\n\nalso, missing indentation space on the last line there.\n\nr=me on the cookieservice bits, but we still need a solution for cookiemanager.',0.00,0,0,3812032,6,'342662',0),(248970,251051,'2008-10-10 22:57:11','Try server builds for v2.11 available at: ',0.00,0,0,3812157,0,NULL,0),(248970,251051,'2008-10-10 23:38:50','(In reply to comment #344)\n> hmm. you fire a \"cleared cookie list\" notification when entering PB, but\n> nothing on exit - so the cookiemanager and such will still show PB cookies, no?\n> but we can\'t just fire a clear here either, since it needs to be repopulated.\n> seems like we either need to teach CM about PB notifications so it can do its\n> own thing, or we could have PBS fire a profile-related notification\n> (\"profile-do-change\" perhaps?) to force reloads? not sure what other effects\n> that might have...\n\nI think a better solution would be to add a new cookie-changed notification type, called \"reload\", which forces clients to reload their cookie list, and fire it when exiting the private mode.\n\nI have implemented this, and wrote a test for it as well. I\'ve also changed the cookies dialog, and I\'m requesting a review from Gavin on those parts.\n\nOther comments and nits are also fixed.',0.00,0,0,3812170,5,'342686',0),(248970,251051,'2008-10-11 01:17:20','(In reply to comment #343)\n> well this is not a review, but some comment on a couple doubts i have, hope it\n> could be useful...\n\nAll comments on the patches and drive-by reviews are always welcome! :-)\n\n> + if (placeId == -1) // we\'re in private browsing mode\n> + return NS_OK;\n> +\n> \n> i\'m not really sure about this, placeId == -1 imho should throw and not be\n> considered as valid, i fear this could hide other possible bugs or db\n> corruptions. Maybe you should directly check if we are in privatebrowsing mode\n> through an internal helper method.\n\nYou\'re right. Done.\n\n> why do you need to create a table to hold only 1 value that is inserted and\n> removed sometimes, and you don\'t need to do searches or manipulation of this\n> data? would not be better a pref or another kind of persistent storage (since i\n> suppose a user could close the browser in private mode and we should rememeber\n> that value to restart in private browsing mode?)?\n\nOK. A pref would be convenient, but semantically wrong (since the timestamp is not a preference, and that would be abusing the prefs module!), so I decided to go with a temporary file in the profile, to hold a single 64-bit value representing the timestamp.\n\n> caching statements at startup is good for statements executed often, these are\n> executed a few times, or never in a session, if you\'re going to hold the table\n> you should probably not cache these since it would regress startup time and not\n> provide enough perf gain. And you could directly use executeSimpleSQL for the\n> delete.\n\nThis is now moot, because I\'m no longer storing the timestamp in the MySQL.',0.00,0,0,3812215,5,'342690',0),(248970,251051,'2008-10-11 01:23:55','The latest version of the monolithic patch, including the fixes to the individual \"for review\" patches posted since publishing v2.11.\n\nI\'ve submitted a try server build of this patch which should show up in about 1-2 hours from now. I\'ll post a link to the builds page later on.',0.00,0,0,3812218,5,'342691',0),(248970,240353,'2008-10-11 03:06:14','(In reply to comment #347)\n> > why do you need to create a table to hold only 1 value that is inserted and\n> > removed sometimes, and you don\'t need to do searches or manipulation of this\n> > data? would not be better a pref or another kind of persistent storage > \n> OK. A pref would be convenient, but semantically wrong (since the timestamp is\n> not a preference, and that would be abusing the prefs module!), so I decided to\n> go with a temporary file in the profile, to hold a single 64-bit value\n> representing the timestamp.\n\nactually there could be other possibilities rather than creating something new, dietrich could provide better ideas, however i am thinking you could create a \"privateBrowsing/lastEntered\" itemAnnotation on the places root (nsNavBookmarks->GetPlacesRoot(&placesRoot)) that is a node always valid.',0.00,0,0,3812246,0,NULL,0),(248970,75420,'2008-10-11 03:14:07','looks good - r=me on the cookieservice bits.',0.00,0,0,3812255,6,'342686',0),(248970,316560,'2008-10-11 03:50:28','Will it be possible for someone to tell that I have even entered private browsing by looking at the error log or something else? Of course this is of secondary importance...\n\nAnd this may be needless work because people use private browsing for different ends... but would it be possible to add a hidden preference in about:config \"allow only secure connections in private browsing mode\".',0.00,0,0,3812274,0,NULL,0),(248970,251051,'2008-10-11 04:45:39','(In reply to comment #349)\n> actually there could be other possibilities rather than creating something new,\n> dietrich could provide better ideas, however i am thinking you could create a\n> \"privateBrowsing/lastEntered\" itemAnnotation on the places root\n> (nsNavBookmarks->GetPlacesRoot(&placesRoot)) that is a node always valid.\n\nOK, I\'ll wait for input from Dietrich (or try to ping him on IRC) to see if there are better/easier possibilities. I\'m willing to change the implementation accordingly.',0.00,0,0,3812293,0,NULL,0),(248970,251051,'2008-10-11 04:52:59','(In reply to comment #351)\n> Will it be possible for someone to tell that I have even entered private\n> browsing by looking at the error log or something else? Of course this is of\n> secondary importance...\n\nThe current implementation of the places module does create some data on disk which can directly be associated with the time of entering the private browsing mode, so the answer to your question is yes.\n\n> And this may be needless work because people use private browsing for different\n> ends... but would it be possible to add a hidden preference in about:config\n> \"allow only secure connections in private browsing mode\".\n\nThat should be better off left to a follow-up bug, because it\'s covering a very specific set of functionality, which might not be appropriate for everyone. Please file a new bug on this (CC me on it as well) and we can continue the discussion there.',0.00,0,0,3812299,0,NULL,0),(248970,251051,'2008-10-11 04:55:03','Try server builds for v2.12 available at: ',0.00,0,0,3812301,0,NULL,0),(248970,213632,'2008-10-13 22:39:41','\n>+static const char* gPrivateBrowsingNotification = \"browser:private-browsing\";\n>+NS_NAMED_LITERAL_STRING(gPBEnter, \"enter\");\n>+NS_NAMED_LITERAL_STRING(gPBLeave, \"exit\");\n\nnit: would prefer expansion of PB\n\nalso, is there a reason these notifications are strings instead of constants defined in the interface? seems like it\'d be cleaner if instead of defining these strings all over the codebase, pb-aware code could check against nsIPrivateBrowsing.NOTIFY_ENTER, or some such.\n\n>+ nsCOMPtr pbs =\n>+ do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n>+ if (pbs)\n>+ pbs->GetPrivateBrowsing(&mInPrivateBrowsing);\n\ninstead of initializing this value in the startup path and checking the property directly, please lazily do this via a smart getter. see bug 342991 for an example.\n\n>+already_AddRefed\n>+nsNavHistory::GetPBEnterDateFile()\n>+{\n>+ nsCOMPtr file;\n>+ nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,\n>+ getter_AddRefs(file));\n>+ NS_ENSURE_SUCCESS(rv, nsnull);\n>+ rv = file->Append(PB_ENTER_FILENAME);\n>+ NS_ENSURE_SUCCESS(rv, nsnull);\n>+ PRBool exists;\n>+ rv = file->Exists(&exists);\n>+ NS_ENSURE_SUCCESS(rv, nsnull);\n>+ if (exists) {\n>+ rv = file->Remove(PR_FALSE);\n>+ NS_ENSURE_SUCCESS(rv, nsnull);\n>+ }\n>+\n>+ return file.forget();\n>+}\n\nUsing a separate file for this is overkill. File i/o can be painfully slow, especially on some Windows systems, USB drives, and mobile devices. Using annotations, as Marco suggested, would incur even more painful file i/o by forcing SQLite to fsync. It may be semantically incorrect, but using a pref here seems to be the most expedient and performant approach. A quick scan of about:config shows that there\'s a pattern and practice of storing timestamps in preferences.',0.00,0,0,3814772,6,'342690',0),(248970,251051,'2008-10-14 12:56:26','This patch updates the passwordmgr and places modules as per the review comments, and updates the download manager module to use the latest patch in bug 457110.',0.00,0,0,3815610,5,'343102',0),(248970,8020,'2008-10-14 13:04:25','So many patches: Could we have a screenshot ... please?',0.00,0,0,3815619,0,NULL,0),(248970,251051,'2008-10-14 13:06:54','(In reply to comment #324)\n> (From update of attachment 341415 [details])\n> General nit: patches are easier to review with more context in the diffs... See\n> http://developer.mozilla.org/en/Mercurial_FAQ#Configuration (specifically, the\n> \"-U 8\" part).\n\nYou\'re right, sorry about that.\n\n> Like dwitte said, this really seems like it should ask a service for the\n> initial state. Something like:\n> \n> var PBS = Cc[\"mumble\"].getService(Ci.mumble);\n> this._inPrivateBrowsing = PBS.inPrivateBrowsing;\n\nDone.\n\n> >+++ b/toolkit/components/passwordmgr/test/subtst_bug_248970_3.html\n> ...\n> >+function submitForm() {\n> >+ setTimeout(function(){ form.submit(); }, 100);\n> >+}\n> \n> Why the setTimeout()?\n\nThat was a left-over from a problem I was haunting in the test and I thought it was related to the timing issues. I removed it.\n\n> >+++ b/toolkit/components/passwordmgr/test/subtst_bug_248970_4.html\n> ...\n> >+function submitForm() {\n> ...\n> >+ var result = pwmgr.autoCompleteSearch(\"\", null, userField);\n> >+ if (result instanceof Ci.nsIAutoCompleteResult &&\n> >+ result.matchCount == 1) {\n> >+ userField.focus();\n> >+ userField.value = result.getValueAt(0);\n> >+ userField.blur();\n> >+ }\n> >+\n> >+ setTimeout(function(){ form.submit(); }, 100);\n> >+}\n> \n> Seems like this code should be the top test (test_privbrowsing.html), not in\n> the subtest.\n\nActually I\'m not sure if this can be called from the top test without major changes to its logic. The top test handles the load event on the iframe for subtests by ignore odd loads and handling even loads; and each subtest submits itself, so effectively only the submitted pages are handled by the top test. The new code in this patch is however cleaner.\n\n> Why call pwmgr.autoCompleteSearch? That\'s kind of a hacky API, and\n> I\'d like to remove it eventually... Look at test_basic_form_autocomplete.html\n> for how to drive the autocomplete dropdown without this.\n\nOK, done. I moved doKey to pwmgr_common.js to avoid duplicating it in test_privbrowsing.html.\n\n> >+function get_PBSvc() {\n> ...\n> >+ if (PBS_CID in Components.classes &&\n> >+ \"nsIPrivateBrowsingService\" in Components.interfaces) {\n> >+ try {\n> >+ _PBSvc = Components.classes[PBS_CID].\n> >+ getService(Components.interfaces.nsIPrivateBrowsingService);\n> >+ if (_PBSvc) {\n> >+ var observer = {\n> ...\n> \n> I\'m not sure what this is all for. You shouldn\'t need to check if the service\n> Cc/Ci exists (just let it throw+fail if it doesn\'t),\n\nYou\'re right, done.\n\n> and the observer doesn\'t seem to do anything useful?\n\nNo actually it prevents a dialog from poping up asking you whether to save and close your current session or not.',0.00,0,0,3815626,5,'343105',0),(248970,251051,'2008-10-14 13:13:24','(In reply to comment #355)\n> >+static const char* gPrivateBrowsingNotification = \"browser:private-browsing\";\n> >+NS_NAMED_LITERAL_STRING(gPBEnter, \"enter\");\n> >+NS_NAMED_LITERAL_STRING(gPBLeave, \"exit\");\n> \n> nit: would prefer expansion of PB\n\nFixed.\n\n> also, is there a reason these notifications are strings instead of constants\n> defined in the interface? seems like it\'d be cleaner if instead of defining\n> these strings all over the codebase, pb-aware code could check against\n> nsIPrivateBrowsing.NOTIFY_ENTER, or some such.\n\nThey\'re strings, so I can\'t define them as const in the IDL, but I went ahead and put preprocessor macros in the IDL and used it in C++ callers. This should make the code cleaner a bit.\n\n> >+ nsCOMPtr pbs =\n> >+ do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n> >+ if (pbs)\n> >+ pbs->GetPrivateBrowsing(&mInPrivateBrowsing);\n> \n> instead of initializing this value in the startup path and checking the\n> property directly, please lazily do this via a smart getter. see bug 342991 for\n> an example.\n\nI think the bug # you cited is incorrect, but I did something which is hopefully what you had in mind in this patch.\n\n> Using a separate file for this is overkill. File i/o can be painfully slow,\n> especially on some Windows systems, USB drives, and mobile devices. Using\n> annotations, as Marco suggested, would incur even more painful file i/o by\n> forcing SQLite to fsync. It may be semantically incorrect, but using a pref\n> here seems to be the most expedient and performant approach. A quick scan of\n> about:config shows that there\'s a pattern and practice of storing timestamps in\n> preferences.\n\nRemoved the whole timestamp-based checks based on our IRC conversation.',0.00,0,0,3815632,5,'343106',0),(248970,251051,'2008-10-14 13:44:00','(In reply to comment #357)\n> So many patches: Could we have a screenshot ... please?\n\nThis is not exactly a bug where a screenshot is helpful, I guess. But you can download the experimental builds for the latest version of the patch here: ',0.00,0,0,3815685,0,NULL,0),(248970,213632,'2008-10-14 14:55:27','> > also, is there a reason these notifications are strings instead of constants\n> > defined in the interface? seems like it\'d be cleaner if instead of defining\n> > these strings all over the codebase, pb-aware code could check against\n> > nsIPrivateBrowsing.NOTIFY_ENTER, or some such.\n> \n> They\'re strings, so I can\'t define them as const in the IDL, but I went ahead\n> and put preprocessor macros in the IDL and used it in C++ callers. This should\n> make the code cleaner a bit.\n\nit\'s still not clear why these are strings, as opposed to integers. while your change helps C++ callers, it doesn\'t help JS callers at all.\n\n> > >+ nsCOMPtr pbs =\n> > >+ do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n> > >+ if (pbs)\n> > >+ pbs->GetPrivateBrowsing(&mInPrivateBrowsing);\n> > \n> > instead of initializing this value in the startup path and checking the\n> > property directly, please lazily do this via a smart getter. see bug 342991 for\n> > an example.\n> \n> I think the bug # you cited is incorrect, but I did something which is\n> hopefully what you had in mind in this patch.\n\nyes, wrong bug, sorry.\n\nthis solution seems over-complicated, shouldn\'t need 2 properties and 2 methods for it. you should be able to have a private member which holds the value, and a getter which first populates the value if needed, and returns it, right?',0.00,0,0,3815788,6,'343106',0),(248970,251051,'2008-10-14 15:23:38','(In reply to comment #361)\n> it\'s still not clear why these are strings, as opposed to integers. while your\n> change helps C++ callers, it doesn\'t help JS callers at all.\n\nBecause the data parameter to nsIObserver::Observe is a string, and you can\'t really pass integers to observers this way. It\'s true that these changes don\'t help JS callers, but that\'s what other interfaces do for their notifications as well (for example, see the offline notifications in the IO service).\n\n> yes, wrong bug, sorry.\n> \n> this solution seems over-complicated, shouldn\'t need 2 properties and 2 methods\n> for it. you should be able to have a private member which holds the value, and\n> a getter which first populates the value if needed, and returns it, right?\n\nThe problem is how to detect if this is the first time we\'re trying to get the value, so that we can initialize it via the service call. The only other solution which I could think of besides adding a separate value for tracking this was to store a magical value in mInPrivateBrowsing, which might not be considered good practice as well.\n\nThat being said, I don\'t think that the initialization code is too slow to be called in Init. It\'s merely retrieving a value through XPCOM, and it should be acceptably fast. We\'re doing something similar for the rest of the modules as well.',0.00,0,0,3815810,0,NULL,0),(248970,283305,'2008-10-14 17:43:47','>>(In reply to comment #357)\n>> So many patches: Could we have a screenshot ... please?\n>\n>This is not exactly a bug where a screenshot is helpful, I guess.\n\nI\'ll be posting details about the user interface for private browsing mode to my blog and to bug 411929 hopefully rather soon.',0.00,0,0,3815935,0,NULL,0),(11040,22599,'2008-10-16 08:43:11','',0.00,0,0,3818116,2,'460279',0),(11040,22599,'2008-10-16 08:46:10','',0.00,0,0,3818118,2,'373182',0),(11040,22599,'2008-10-16 08:47:41','Compare bug 272125: Ignore Junk mail in biff.',0.00,0,0,3818120,0,NULL,0),(248970,251051,'2008-10-16 15:33:32','The cache module patch with a unit test, ready for review. Darin: please let me know if you\'re not the right person to ask for review here... Thanks!',0.00,0,0,3818823,5,'343468',0),(248970,251051,'2008-10-16 15:56:53','Switching review to biesi based on IRC conversation with darin. biesi, please let me know if you\'re the right person to ask for a review here.',0.00,0,0,3818856,6,'343468',0),(248970,251051,'2008-10-17 12:42:54','The satchel module patch with a unit test, ready for review.',0.00,0,0,3820017,5,'343593',0),(248970,213632,'2008-10-17 13:44:59','\n>@@ -303,16 +306,18 @@ const PRInt32 nsNavHistory::kAutoComplet\n> const PRInt32 nsNavHistory::kAutoCompleteelasticsearch.Index_ParentId = 3;\n> const PRInt32 nsNavHistory::kAutoCompleteelasticsearch.Index_BookmarkTitle = 4;\n> const PRInt32 nsNavHistory::kAutoCompleteelasticsearch.Index_Tags = 5;\n> const PRInt32 nsNavHistory::kAutoCompleteelasticsearch.Index_VisitCount = 6;\n> \n> static const char* gQuitApplicationMessage = \"quit-application\";\n> static const char* gXpcomShutdown = \"xpcom-shutdown\";\n> static const char* gAutoCompleteFeedback = \"autocomplete-will-enter-text\";\n>+NS_NAMED_LITERAL_STRING(gPrivateBrowsingEnter, NS_PRIVATE_BROWSING_ENTER);\n>+NS_NAMED_LITERAL_STRING(gPrivateBrowsingLeave, NS_PRIVATE_BROWSING_LEAVE);\n\nnot necessary to create these globals, just use the constants inline.\n\n(In reply to comment #362)\n> > this solution seems over-complicated, shouldn\'t need 2 properties and 2 methods\n> > for it. you should be able to have a private member which holds the value, and\n> > a getter which first populates the value if needed, and returns it, right?\n> \n> The problem is how to detect if this is the first time we\'re trying to get the\n> value, so that we can initialize it via the service call. The only other\n> solution which I could think of besides adding a separate value for tracking\n> this was to store a magical value in mInPrivateBrowsing, which might not be\n> considered good practice as well.\n\ni\'m ok with initializing mInPrivateBrowsing to a magical value. this would be functional, easily readable, and halves the number of properties and getters used.\n\n> That being said, I don\'t think that the initialization code is too slow to be\n> called in Init. It\'s merely retrieving a value through XPCOM, and it should be\n> acceptably fast. We\'re doing something similar for the rest of the modules as\n> well.\n\ni\'m reviewing this while in the middle of an epic battle for Ts wins in Places. every nanosecond counts. everything that can reasonably be lazy, should be.',0.00,0,0,3820091,6,'343106',0),(248970,20209,'2008-10-17 14:06:46','>+++ b/browser/components/preferences/cookies.js\n>@@ -54,40 +54,51 @@ var gCookiesWindow = >+ _populateList: function (aInitiallyLoaded)\n\nNix the space before \'(\' unless that\'s file style?\n\nAlso s/aInitiallyLoaded/aInitialLoad/ might be better.\n\nsr=bzbarsky',0.00,0,0,3820127,6,'342686',0),(248970,251051,'2008-10-17 14:16:47','The nsIPrivateBrowsingService interface, ready for review.',0.00,0,0,3820151,5,'343620',0),(248970,251051,'2008-10-17 14:25:30','(In reply to comment #367)\n> not necessary to create these globals, just use the constants inline.\n\nDone.\n\n> i\'m ok with initializing mInPrivateBrowsing to a magical value. this would be\n> functional, easily readable, and halves the number of properties and getters\n> used.\n\nOK, I did that. I used 0xffffffff as the magical value.\n\n> i\'m reviewing this while in the middle of an epic battle for Ts wins in Places.\n> every nanosecond counts. everything that can reasonably be lazy, should be.\n\nOK, you definitely know better than me there, so here\'s the lazy init code :-)',0.00,0,0,3820172,5,'343623',0),(248970,251051,'2008-10-17 14:42:28','bz\'s nit in comment 368 fixed. Carrying over dwitte\'s r+ and bz\'s sr+.',0.00,0,0,3820213,5,'343632',0),(248970,251051,'2008-10-17 15:30:31','Addressed bz\'s IRC review comments.',0.00,0,0,3820315,5,'343644',0),(248970,251051,'2008-10-17 15:47:25','Changed the implementation of the contentprefs module to not cache the current private browsing status, as per IRC review from mconnor.',0.00,0,0,3820341,5,'343647',0),(248970,96908,'2008-10-17 16:14:28','>+ } else {\n>+ if (document.getElementById(\"filter\").value != \"\")\n\nnit:\n\n}\nelse {\n\notherwise r=me on the /browser bits, I assume dwitte and bz got the cookie bits done.',0.00,0,0,3820387,6,'343632',0),(248970,213632,'2008-10-17 16:33:57','\n>+\n>+PRBool\n>+nsNavHistory::GetPrivateBrowsingModeInitialState()\n>+{\n>+ nsCOMPtr pbs =\n>+ do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n>+ if (pbs) {\n>+ pbs->GetPrivateBrowsing(&mInPrivateBrowsing);\n>+ }\n>+\n>+ return mInPrivateBrowsing;\n>+}\n\nsince this is only ever called once and by only one caller, please just move this code into InPrivateBrowsingMode(), and remove this function altogether.\n\nr=me with this fixed.',0.00,0,0,3820409,6,'343623',0),(248970,96908,'2008-10-17 16:38:18','\n> // If the pref is already set to the value, there\'s nothing more to do.\n> var currentValue = this.getPref(aURI, aName);\n>- if (typeof currentValue != \"undefined\" && currentValue == aValue)\n>- return;\n>+ if (typeof currentValue != \"undefined\") {\n>+ if (currentValue == aValue)\n>+ return;\n>+ } else {\n\nnit (again):\n\n}\nelse {\n\nonly comment is that it might make sense to make the values used in the test consts, so someone doesn\'t change one and break the test. Not really important for unit tests though.\n\nlooks good, r=mconnor',0.00,0,0,3820418,6,'343647',0),(248970,20209,'2008-10-17 16:51:36','>+++ b/netwerk/base/public/nsIPrivateBrowsingService.idl\n>+ // Setting this value while handling one of the notifications generated\n>+ // by the private browsing service causes a NS_ERROR_FAILURE exception\n>+ // being thrown.\n\n ... service throws NS_ERROR_FAILURE.\n\n>+ * set to true to prevent the switch to the private browsing mode.\n\nIs there a good reason for that? I would have thought that setting to false to mean \"no\" would make more sense. Same for leaving.\n\nWith those nits, looks great. I\'d be happy to review the corresponding changes to the service impl if that would be helpful.',0.00,0,0,3820435,6,'343644',0),(248970,96908,'2008-10-17 17:45:02','Hmm, why is the attribute not simply something more descriptive like \"enabled\" ?\n\nreading consumer code then means you get:\n\nnsIPrivateBrowsingService.enabled instead of nsIPrivateBrowsingService.privateBrowsing\n\nnot sure of reasoning, but thought I\'d ask',0.00,0,0,3820510,6,'343644',0),(248970,20209,'2008-10-17 17:49:38','I\'d be fine with privateBrowsingEnabled.... The problem with too-generic attributes (or methods) is that if your object implements more than one interface you better hope all identically-named ones are defined to behave the same if it\'s going to work from JS. We don\'t really want to constrain implementation too much by choice of names in interface if we can avoid it.',0.00,0,0,3820514,0,NULL,0),(248970,96908,'2008-10-17 18:04:41','first off, as discussed, we\'ll kill all of the observer/cached copy stuff and just hit the API directly. We don\'t hit this code often enough to justify the overhead.\n\neverything else looks good, so it\'ll be a quick review when you remove that stuff.',0.00,0,0,3820529,6,'343593',0),(248970,27780,'2008-10-17 23:13:45','Marking r+ (w00t!), although I\'d like to take a look at the updated patch that removes the observers/caching.\n\n>- var canRememberLogin = this._pwmgr.getLoginSavingEnabled(hostname);\n>+ var canRememberLogin = this._inPrivateBrowsing ? false :\n>+ this._pwmgr.getLoginSavingEnabled(hostname);\n\nNit: That seems a litle awkward. Better would be the form used elsewhere |foo = !IPB && bar()|. I\'d also take appending |if (IPD) CRL = false|.\n\n>+var pb = get_PBSvc();\n>+if (!pb) { // Private Browsing might not be available\n>+ ok(true, \"Private browsing service is not available\");\n>+ SimpleTest.finish();\n\nI assume other tests (in /browser?) explicitly require the presence of PBS? If some terrible bug should break/disable PBS in Firefox builds, we wouldn\'t want all the tests passing because they allow for a product to not include it. :)',0.00,0,0,3820630,6,'343105',0),(248970,251051,'2008-10-18 01:55:08','(In reply to comment #377)\n> >+ * set to true to prevent the switch to the private browsing mode.\n> \n> Is there a good reason for that? I would have thought that setting to false to\n> mean \"no\" would make more sense. Same for leaving.\n\nUsually such notifications interpret the subject param as the \"cancel\" param, so if any observers want to bail out, they\'d just cancel the request by setting the cancel parameter to true. I\'d be fine either way, but I think we should keep it this way for the sake of consistency.\n\n> With those nits, looks great. I\'d be happy to review the corresponding changes\n> to the service impl if that would be helpful.\n\nI\'m keeping the service implementation open for changes right now, and I\'ll need to write a few unit tests for it, but I will post a monolithic patch today, and you\'re welcome to take a look at the service bits and let me know if you spot anything wrong. :-)',0.00,0,0,3820696,0,NULL,0),(248970,251051,'2008-10-18 01:59:11','(In reply to comment #378)\n> (From update of attachment 343644 [details])\n> Hmm, why is the attribute not simply something more descriptive like \"enabled\"\n> ?\n> \n> reading consumer code then means you get:\n> \n> nsIPrivateBrowsingService.enabled instead of\n> nsIPrivateBrowsingService.privateBrowsing\n> \n> not sure of reasoning, but thought I\'d ask\n\nNo particular reason, but I wanted to avoid names such as \"enabled\" for the same reason as Boris mentioned in comment 379. I think bz\'s suggestion of privateBrowsingEnabled makes more sense here, so I\'ll incorporate it in the next iteration (I assume I won\'t need to ask for another review on the code parts that already have r+ because of only this change in the name of course, right?).',0.00,0,0,3820697,0,NULL,0),(248970,251051,'2008-10-18 02:13:35','(In reply to comment #375)\n> (From update of attachment 343623 [details])\n> since this is only ever called once and by only one caller, please just move\n> this code into InPrivateBrowsingMode(), and remove this function altogether.\n> \n> r=me with this fixed.\n\nI came up with this code:\n\n PRBool InPrivateBrowsingMode()\n {\n if (mInPrivateBrowsing == PRIVATEBROWSING_NOTINITED) {\n mInPrivateBrowsing = PR_FALSE;\n nsCOMPtr pbs =\n do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n if (pbs) {\n pbs->GetPrivateBrowsing(&mInPrivateBrowsing);\n }\n }\n\n return mInPrivateBrowsing;\n }\n\nThe only difference here is that before trying to get the service, I explicitly set mInPrivateBrowsing to false so that if the service is not available (for example, when places is being used from SeaMonkey or other clients which do not include the private browsing service, the return value becomes correctly false.\n\nPlease let me know if you think this change requires another review round, and I\'ll prepare an updated version of the patch for review.',0.00,0,0,3820700,0,NULL,0),(248970,251051,'2008-10-18 02:18:03','(In reply to comment #376)\n> only comment is that it might make sense to make the values used in the test\n> consts, so someone doesn\'t change one and break the test. Not really important\n> for unit tests though.\n\nSure, that makes a valid point. Done.',0.00,0,0,3820706,0,NULL,0),(248970,251051,'2008-10-18 03:51:48','(In reply to comment #380)\n> (From update of attachment 343593 [details])\n> first off, as discussed, we\'ll kill all of the observer/cached copy stuff and\n> just hit the API directly. We don\'t hit this code often enough to justify the\n> overhead.\n> \n> everything else looks good, so it\'ll be a quick review when you remove that\n> stuff.\n\nOK, done. Here\'s the new patch up for review.',0.00,0,0,3820751,5,'343697',0),(248970,251051,'2008-10-18 05:23:37','(In reply to comment #381)\n> (From update of attachment 343105 [details])\n> Marking r+ (w00t!), although I\'d like to take a look at the updated patch that\n> removes the observers/caching.\n\nSure, here you are! :-)\n\nI moved the _inPrivateBrowsing getter to nsLoginManager, and just had nsLoginManagerPrompter access it through the _pwmgr member. Also I made a small fix to the test to make the iframe always visible, because the previous approach of making it visible only for the duration of the 9th test might fail in rare cases (since the auto-complete popup requires the iframe to be visible).\n\n> Nit: That seems a litle awkward. Better would be the form used elsewhere |foo =\n> !IPB && bar()|. I\'d also take appending |if (IPD) CRL = false|.\n\nI went ahead with the latter form.\n\n> I assume other tests (in /browser?) explicitly require the presence of PBS? If\n> some terrible bug should break/disable PBS in Firefox builds, we wouldn\'t want\n> all the tests passing because they allow for a product to not include it. :)\n\nYes, they will! However, I didn\'t require presence of the private browsing service in non-browser/ tests keeping other consumers in mind (and also in the hopes of landing this patch piece by piece instead of a single check-in). But thanks for confirming this!',0.00,0,0,3820783,5,'343705',0),(248970,251051,'2008-10-18 05:32:25','The latest and greatest version of the patch based on the recent review comments. I\'ve also submitted a try server build, and I\'ll post an update when it\'s available.',0.00,0,0,3820792,5,'343706',0),(248970,20209,'2008-10-18 07:45:39','> Usually such notifications interpret the subject param as the \"cancel\" param,\n\nThat\'s fine with me, but the topic could use a name that makes that a little clearer, then...',0.00,0,0,3820872,0,NULL,0),(248970,213632,'2008-10-18 09:38:05','(In reply to comment #384)\n> \n> Please let me know if you think this change requires another review round, and\n> I\'ll prepare an updated version of the patch for review.\n\nlooks fine, r=me',0.00,0,0,3820940,0,NULL,0),(248970,251051,'2008-10-18 10:17:43','Try server builds for v2.14 available at .',0.00,0,0,3820974,0,NULL,0),(248970,251051,'2008-10-18 10:27:39','(In reply to comment #389)\n> That\'s fine with me, but the topic could use a name that makes that a little\n> clearer, then...\n\nCan you think of a better name? I followed the pattern of quite-application-requested, offline-requested, and offline-app-requested...',0.00,0,0,3820982,0,NULL,0),(248970,96908,'2008-10-18 10:35:18','sweet, looks good! r=mconnor',0.00,0,0,3820988,6,'343697',0),(248970,76551,'2008-10-18 10:51:32','Ehsan, I\'ve tested your latest try server build and noticed that temporary files which are downloaded to be used with an external application are not deleted when leaving the private browsing mode. They still exist on disk until the browser is closed. But what is more interesting the download manager doesn\'t store these files in the in-memory database. Instead they end up in the downloads.sqlite.\n\nShould I file a new bug on that? I would prefer this when seeing a comment count of nearly 400 on this bug.',0.00,0,0,3821009,0,NULL,0),(248970,251051,'2008-10-18 11:04:55','(In reply to comment #394)\n> Ehsan, I\'ve tested your latest try server build and noticed that temporary\n> files which are downloaded to be used with an external application are not\n> deleted when leaving the private browsing mode. They still exist on disk until\n> the browser is closed. But what is more interesting the download manager\n> doesn\'t store these files in the in-memory database. Instead they end up in the\n> downloads.sqlite.\n\nOh, that\'s definitely a bug. It\'d be great if you can file a bug and CC me there.',0.00,0,0,3821021,0,NULL,0),(248970,76551,'2008-10-18 14:10:16','(In reply to comment #395)\n> Oh, that\'s definitely a bug. It\'d be great if you can file a bug and CC me\n> there.\n\nI\'ve filed bug 460608 and bug 460609 for both issues.',0.00,0,0,3821116,0,NULL,0),(248970,27780,'2008-10-19 01:33:02','Should private browsing mode disable geolocation requests? Seems like it should, although I suppose we could just let the user deny the requests (when we prompt them).\n\nAlso, I added a line item regarding private browsing to the security review template (https://wiki.mozilla.org/Firefox3/Security_Review_Template), to help make sure that future browser features consider their impact to private browsing.',0.00,0,0,3821373,0,NULL,0),(248970,251051,'2008-10-19 06:35:37','(In reply to comment #397)\n> Should private browsing mode disable geolocation requests? Seems like it\n> should, although I suppose we could just let the user deny the requests (when\n> we prompt them).\n\nWe don\'t block explicit actions from the user (such as bookmarking), so I\'m thinking we shouldn\'t block geolocation automatically, and should let the user decide instead. Also, the private browsing mode is really about keeping your browsing history private from other people who use the same computer, more than anything else...\n\n> Also, I added a line item regarding private browsing to the security review\n> template (https://wiki.mozilla.org/Firefox3/Security_Review_Template), to help\n> make sure that future browser features consider their impact to private\n> browsing.\n\nLooks good, thanks!',0.00,0,0,3821493,0,NULL,0),(248970,20209,'2008-10-19 07:47:38','> Can you think of a better name? I followed the pattern of\n> quite-application-requested, offline-requested, and offline-app-requested\n\nGah. And they all use this backwards pattern? :( And in our usual charming way, completely undocumented. Quite lovely. I hate this undocumented use of the observer service as a backdoor. :(\n\nLet\'s try to do better here. If \"true\" means cancel, then perhaps the topic should be named \"private-browsing-cancellation-opportunity\" something? Might be worth running this by mconnor too, though. To be honest, I\'m having a hard time encoding the \"set true to cancel\" thing in the name, since that\'s so backwards to how most things work. :(',0.00,0,0,3821540,0,NULL,0),(248970,251051,'2008-10-19 08:00:36','(In reply to comment #399)\n> Gah. And they all use this backwards pattern? :( And in our usual charming\n> way, completely undocumented. Quite lovely. I hate this undocumented use of\n> the observer service as a backdoor. :(\n\nYes. I\'m wondering if they\'ve passed sr when they were first added to the tree though.\n\n> Let\'s try to do better here. If \"true\" means cancel, then perhaps the topic\n> should be named \"private-browsing-cancellation-opportunity\" something? Might\n> be worth running this by mconnor too, though. To be honest, I\'m having a hard\n> time encoding the \"set true to cancel\" thing in the name, since that\'s so\n> backwards to how most things work. :(\n\nI\'ll try to catch mconnor on IRC on this, but I can thought of at least one, less verbose, alternative here: \"private-browsing-cancel-vote\" (think of the metaphor where an observer \"votes\" to cancel the private browsing mode change by setting the cancel vote nsISupportsPRBool to true).',0.00,0,0,3821544,0,NULL,0),(248970,20209,'2008-10-19 09:58:57','> I\'m wondering if they\'ve passed sr\n\nMost of them are in modules that don\'t require sr, as far as I can tell.\n\n\"private-browsing-cancel-vote\" might work, yeah.',0.00,0,0,3821621,0,NULL,0),(248970,251051,'2008-10-19 14:20:22','http://hg.mozilla.org/mozilla-central/rev/ab63f0d13ea8',0.00,0,0,3821802,6,'343644',0),(248970,251051,'2008-10-19 14:21:39','http://hg.mozilla.org/mozilla-central/rev/53b78b1b3910',0.00,0,0,3821804,6,'343632',0),(248970,251051,'2008-10-19 14:22:27','http://hg.mozilla.org/mozilla-central/rev/e9b859357547',0.00,0,0,3821805,6,'343623',0),(248970,251051,'2008-10-19 14:24:47','http://hg.mozilla.org/mozilla-central/rev/81e6937843a7',0.00,0,0,3821808,6,'343647',0),(248970,251051,'2008-10-19 14:25:32','http://hg.mozilla.org/mozilla-central/rev/ee936d0fd358',0.00,0,0,3821809,6,'343697',0),(248970,251051,'2008-10-19 15:04:18','New patch updated to tip after landing the previous five patches.',0.00,0,0,3821826,5,'343848',0),(248970,27780,'2008-10-19 17:59:14','>+ // Whether we are in private browsing mode\n>+ get _inPrivateBrowsing() {\n>+ // The Private Browsing service might not be available.\n>+ try {\n>+ var pbs = Cc[\"@mozilla.org/privatebrowsing;1\"].\n>+ getService(Ci.nsIPrivateBrowsingService);\n>+ return pbs.privateBrowsingEnabled;\n>+ } catch (e) {\n>+ return false;\n>+ }\n> },\n\nI think it would be better to use a smart getter for the service (with a tweak for when it\'s not available), so that we don\'t fetch it repeatedly. EG:\n\n __privateBrowsingSvc : undefined,\n // If the service isn\'t available, null will be returned.\n get _privateBrowsingSvc() {\n if (this.__privateBrowsingSvc == undefined) {\n if (\"@mozilla.org/privatebrowsing;1\" in Cc)\n this.__privateBrowsingSvc = Cc[...].getService(...);\n else\n this.__privateBrowsingSvc = null;\n }\n return this.__privateBrowsingSvc;\n }\n\nand then\n\n get _inPrivateBrowsing() {\n var svc = this._privateBrowsingService;\n if (svc)\n return svc.privateBrowsingEnabled;\n else\n return false;\n }\n\n+++ b/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js\n...\n>- if (hostname) {\n>+ if (hostname && !this._pwmgr._inPrivateBrowsing) {\n\nErr, does this even work?\n\nnsLoginManagerPrompter just obtains _pwmgr as with any other service, so it shouldn\'t be seeing _inPrivateBrowsing without a corresponding XPCOM interface.\n\nRegardless, because the prompter is a separate component, it shouldn\'t be using internal pwmgr APIs anyway. Just implement _inPrivateBrowsing locally -- cut\'n\'paste the original code this patch was putting in nsLoginManger.js (no need to cache the service here, so my last comment doesn\'t apply).',0.00,0,0,3821915,6,'343705',0),(248970,251051,'2008-10-19 21:46:00','Latest try server builds available at: ',0.00,0,0,3822020,0,NULL,0),(248970,251051,'2008-10-20 13:50:42','(In reply to comment #408)\n> I think it would be better to use a smart getter for the service (with a tweak\n> for when it\'s not available), so that we don\'t fetch it repeatedly. EG:\n\nDone.\n\n> +++ b/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js\n> ...\n> >- if (hostname) {\n> >+ if (hostname && !this._pwmgr._inPrivateBrowsing) {\n> \n> Err, does this even work?\n> \n> nsLoginManagerPrompter just obtains _pwmgr as with any other service, so it\n> shouldn\'t be seeing _inPrivateBrowsing without a corresponding XPCOM interface.\n\nOops, I hadn\'t noticed that _pwmgr is referring to an XMPCOM component... I guess the fact that this works is showing some XPCOM wrappers magic, but I agree that it is bad practice. My bad for not spotting this myself.\n\n> Regardless, because the prompter is a separate component, it shouldn\'t be using\n> internal pwmgr APIs anyway. Just implement _inPrivateBrowsing locally --\n> cut\'n\'paste the original code this patch was putting in nsLoginManger.js (no\n> need to cache the service here, so my last comment doesn\'t apply).\n\nDone.',0.00,0,0,3822966,5,'343965',0),(248970,27780,'2008-10-20 14:05:43','>+ get _privateBrowsingService() {\n>+ if (this.__privateBrowsingService == undefined)\n>+ try {\n>+ this.__privateBrowsingService = Cc[\"@mozilla.org/privatebrowsing;1\"].\n>+ getService(Ci.nsIPrivateBrowsingService);\n>+ } catch (e) {\n>+ this.__privateBrowsingService = null;\n>+ }\n>+ return this.__privateBrowsingService;\n>+ },\n\nOne reason to consider using |if (\"@mozilla.org/privatebrowsing;1\" in Cc)| here (instead of try/catch) is if PBS *is* present but fails to initialize... It\'s not terribly likely (right now, with the simple init in PBS), but the risk is masking the failure and ignoring private browsing mode for the rest of the session.',0.00,0,0,3822994,6,'343965',0),(248970,251051,'2008-10-20 14:32:50','(In reply to comment #411)\n> One reason to consider using |if (\"@mozilla.org/privatebrowsing;1\" in Cc)| here\n> (instead of try/catch) is if PBS *is* present but fails to initialize... It\'s\n> not terribly likely (right now, with the simple init in PBS), but the risk is\n> masking the failure and ignoring private browsing mode for the rest of the\n> session.\n\nSure, I\'ll do this before landing this piece.',0.00,0,0,3823033,0,NULL,0),(248970,251051,'2008-10-20 14:43:36','This patch is a small fix to the cookie service code, in order to make it send \"reload\" notifications on both entering and leaving the private browsing mode. Previously, it sent a \"cleared\" notification on entering the private browsing mode, which is semantically wrong (because the cookies weren\'t actually cleared) and was only needed for the cookie manager window\'s list to be emptied. This can be done with \"reload\".\n\nMisusing the \"cleared\" notification this way had created a problem with the DOM storage module which uses the \"cleared\" notification to clear its data, and would potentially hurt add-ons which use this notification as well.',0.00,0,0,3823053,5,'343974',0),(248970,251051,'2008-10-20 14:49:03','The DOM storage part with a unit test, ready for review.',0.00,0,0,3823065,5,'343975',0),(248970,75420,'2008-10-20 14:50:17','looks good! r=me',0.00,0,0,3823069,6,'343974',0),(248970,251051,'2008-10-20 15:31:58','http://hg.mozilla.org/mozilla-central/rev/79ac062d72c2415',0.00,0,0,3823147,6,'343965',0),(248970,251051,'2008-10-20 15:32:56','http://hg.mozilla.org/mozilla-central/rev/65da9468c88b',0.00,0,0,3823149,6,'343974',0),(248970,76551,'2008-10-20 15:50:17','(In reply to comment #409)\n> Latest try server builds available at:\n> \n\nWith this try server build it takes about 15 seconds to enter the private browsing mode on OS X. Reverting to normal only takes less a second.',0.00,0,0,3823180,0,NULL,0),(248970,251051,'2008-10-20 16:07:13','(In reply to comment #418)\n> With this try server build it takes about 15 seconds to enter the private\n> browsing mode on OS X. Reverting to normal only takes less a second.\n\nDoes the same thing happen with ?\n\nI don\'t have a Mac, so I can\'t test it myself, but can someone else please run the above two versions and report the results?',0.00,0,0,3823195,0,NULL,0),(248970,9186,'2008-10-21 03:18:03','So do we really completely want to block storage? Or allow reading but not writing?\n\nWhat do we do for cookies? Do we allow them to be sent but not written to?',0.00,0,0,3823682,6,'343975',0),(248970,243208,'2008-10-21 05:05:18','(In reply to comment #420)\n> (From update of attachment 343975 [details])\n> So do we really completely want to block storage? Or allow reading but not\n> writing?\n> \n> What do we do for cookies? Do we allow them to be sent but not written to?\n\nThe latter sounds like a better idea, but either way, you probably shouldn\'t do it in CanUseStorage otherwise a DOM_SECURITY_ERR will be returned. If this propagates to javascript, this will break any sites using DOMStorage while in private browsing.',0.00,0,0,3823773,0,NULL,0),(248970,243208,'2008-10-21 05:08:50','Returning NS_OK in all the functions with nsDOMStorage::Set* and nsDOMStorageItem::Set* should do the trick, right?\n\nAlso, is the code hit often enough that observers are necessary?',0.00,0,0,3823780,0,NULL,0),(248970,9186,'2008-10-21 05:49:30','I got the impression that that was what other browsers do. Has anybody tested?\n\nAlso, what do we do?',0.00,0,0,3823817,0,NULL,0),(248970,243208,'2008-10-21 05:54:04','Please correct me if I\'m wrong.\n\nLooking at the latest cookie patch, we create a new table in memory to store the cookies, so that when private browsing mode is exited we destroy that list and recover the original cookie table as it was before entering private browsing.',0.00,0,0,3823821,0,NULL,0),(248970,251051,'2008-10-21 06:25:07','(In reply to comment #420)\n> (From update of attachment 343975 [details])\n> So do we really completely want to block storage? Or allow reading but not\n> writing?\n\nAccording to the functional spec , storage should be blocked entirely. Of course I\'m not sure why mconnor specified it in this way.\n\n> What do we do for cookies? Do we allow them to be sent but not written to?\n\nFor cookies, we close the disk MySQL connection (because the cookie back-end supports using any of the two kinds of storage engines, memory and disk, simultaneously or individually) and use an empty in-memory hash table to store the cookies during the private mode. When leaving the private mode, that hash table is discarded, and the previous one (as it was when entering the private mode) is restored, and the disk MySQL connection is re-opened.',0.00,0,0,3823851,0,NULL,0),(248970,251051,'2008-10-21 06:33:17','(In reply to comment #421)\n> The latter sounds like a better idea, but either way, you probably shouldn\'t do\n> it in CanUseStorage otherwise a DOM_SECURITY_ERR will be returned. If this\n> propagates to javascript, this will break any sites using DOMStorage while in\n> private browsing.\n\nModifying CanUseStorage was what dcamp suggested in comment 172. Anyway, site javascript code should be ready to handle this exception because it may be thrown for other reasons as well (for example, if a user has turned off DOM storage via prefs. Of course whether it\'s a good idea to throw this exception in this case is another question.\n\n(In reply to comment #422)\n> Returning NS_OK in all the functions with nsDOMStorage::Set* and\n> nsDOMStorageItem::Set* should do the trick, right?\n\nThat\'s kind of like what we do in other places, such as the contentprefs service, for example. dcamp: how about changing the implementation according to this plan?\n\n> Also, is the code hit often enough that observers are necessary?\n\nIt\'s not called enough, but I\'m ready to turn off caching the preference value if the reviewers request it (we\'ve done this in a number of other modules recently).',0.00,0,0,3823858,0,NULL,0),(248970,265995,'2008-10-21 09:49:00','(In reply to comment #421)\n> The latter sounds like a better idea, but either way, you probably shouldn\'t do\n> it in CanUseStorage otherwise a DOM_SECURITY_ERR will be returned. If this\n> propagates to javascript, this will break any sites using DOMStorage while in\n> private browsing.\n\nI\'m not sure it\'s better to silently fail to do what they asked. A well-written site needs to be ready for storage exceptions anyway (they can be thrown for quota reasons, for example).',0.00,0,0,3824134,0,NULL,0),(248970,9186,'2008-10-21 13:38:05','So from a users point of view all cookies will \'disappear\' while in private browsing mode? And then come back when private browsing ends? (disregarding what appears in the prefs UI)',0.00,0,0,3824522,0,NULL,0),(248970,75420,'2008-10-21 13:50:16','(In reply to comment #428)\n> So from a users point of view all cookies will \'disappear\' while in private\n> browsing mode? And then come back when private browsing ends? (disregarding\n> what appears in the prefs UI)\n\nyes.',0.00,0,0,3824537,0,NULL,0),(248970,251051,'2008-10-21 13:52:29','(In reply to comment #428)\n> So from a users point of view all cookies will \'disappear\' while in private\n> browsing mode? And then come back when private browsing ends? (disregarding\n> what appears in the prefs UI)\n\nThe prefs UI will remain updated as well, so if someone leaves the cookies manager dialog open, she will see this happening.',0.00,0,0,3824541,0,NULL,0),(248970,15661,'2008-10-21 14:04:33','+++ b/netwerk/cache/src/nsCacheService.cpp\n\nin Observe():\n\n- nsCacheService::SetDiskCacheEnabled(DiskCacheEnabled());\n+ if (mInPrivateBrowsing)\n+ mDiskCacheEnabled = PR_FALSE;\n\nHm... why set mDiskCacheEnabled to false here? It should be false already when mInPrivateBrowsing is true, right?\n\n- nsCacheService::SetOfflineCacheEnabled(OfflineCacheEnabled());\n+ if (mInPrivateBrowsing)\n+ mOfflineCacheEnabled = PR_FALSE;\n\nsame here.\n\n+ } else if (!strcmp(NS_PRIVATE_BROWSING_SWITCH_TOPIC, topic)) {\n+\n+ nsCOMPtr branch = do_GetService(NS_PREFSERVICE_CONTRACTID);\n\nplease remove the empty line\n\nalso, you only need the prefbranch in the else-branch of the if, right? Can you move it there?\n\n+ rv = branch->GetBoolPref(DISK_CACHE_ENABLE_PREF,\n+ &mDiskCacheEnabled);\n+ if (NS_FAILED(rv)) return rv;\n+ nsCacheService::SetDiskCacheEnabled(DiskCacheEnabled());\n\nYou shouldn\'t treat this as a fatal failure. Like ReadPrefs(), you should instead default to true if getting the pref fails.\n\nSame for the offline cache pref.\n\nIn ReadPrefs():\n+ if (mInPrivateBrowsing)\n+ mDiskCacheEnabled = PR_FALSE;\n\nagain, this explicit setting shouldn\'t be needed.\n\n+nsCacheService::OnEnterExitPrivateBrowsing()\n\nWhy do you clear the memory cache and doom the active entries when entering the private browsing mode?\n\nI guess that may be an answer for the spec author instead...\n\n+++ b/netwerk/test/unit/test_bug248970_cache.js\n+ cache_prefs[pref] = prefs.getBoolPref(pref);\n\nthere\'s not really a need for that. they all default to true.\n\n+function get_CacheService() {\n\nwhy the strange naming? Why not get_cache_service(), consistent with all the other functions? similar for get_PBSvc.\n\n+ return dirSvc.get(\"CurProcD\", Ci.nsILocalFile);\n\nThat doesn\'t seem like the best possible choice, why not use something below TmpD?\n\n+ var visitor = {\n+ QueryInterface: function (iid) {\n\nno point in writing this QueryInterface function, xpconnect will synthesize it for you. (also in the other places where you have a visitor)\n\n+ // see if any of the required devices was missing\n+ for (var i = 0; i < devices.length; ++ i) {\n\nWouldn\'t it be much simpler to check devices.sort().toString() != found_devices.sort().toString()?\n\n+function make_input_stream_scriptable(input)\n+{\n+ var wrapper = Cc[\"@mozilla.org/scriptableinputstream;1\"].\n\nuse consistent formatting. the other functions put the { on the same line as the function declaration and use two-space indentation.\n\n+ var cs = get_CacheService();\n+ do_check_neq(cs, null);\n\nthat function will never return null. it will either throw or return a valid service.\n\n+ store_in_cache(\"cache-A\", \"test content\", \"memory\");\n\nInstead of repeating the \"memory\", \"disk\", \"offline\" strings all over the place, can you define constants for them?\n\nalso, can you define a constant for \"test content\" instead of repeating it for the writing and reading functions?',0.00,0,0,3824568,6,'343468',0),(248970,76551,'2008-10-21 14:22:50','(In reply to comment #419)\n> > With this try server build it takes about 15 seconds to enter the private\n> > browsing mode on OS X. Reverting to normal only takes less a second.\n> \n> I don\'t have a Mac, so I can\'t test it myself, but can someone else please run\n> the above two versions and report the results?\n\nYes, it also occurs when using that build. But at least its a profile issue. I\'ll figure out what happens and file a new bug.',0.00,0,0,3824602,0,NULL,0),(248970,8519,'2008-10-22 05:44:59','I was not able to reproduce what Henrik reports in Comment 419, using an existing profile, but as he notes in Comment 432 it seems to be a profile issue.',0.00,0,0,3825388,0,NULL,0),(248970,251051,'2008-10-22 12:26:15','(In reply to comment #431)\n> +nsCacheService::OnEnterExitPrivateBrowsing()\n> \n> Why do you clear the memory cache and doom the active entries when entering the\n> private browsing mode?\n> \n> I guess that may be an answer for the spec author instead...\n\nYes, I just followed the functional spec . The reasoning behind that decision is not very clear to me, because what we\'re trying to do is prevent anything from leaking *from* the private mode to the non-private mode, not vice versa, but anyway if mconnor has a different idea in this regard, I\'m all for it.\n\nAll other comments were fixed in the new version of the patch.',0.00,0,0,3825927,5,'344340',0),(248970,422,'2008-10-22 12:41:44','I think the functional spec there is mistaken; this bug and this initial work is and should be about eliminating _local_ traces. Preventing sites from tracking you seems out of scope, especially without a clearer description of the adversary (remote site? ISP? safebrowsing provider?).\n\nI\'ve worked on pseudonymity and profile-splitting software before, it\'s really hard to get right, especially in light of various (deployed) deep packet inspection tools. We would do well to not do a half job of it, and mis-set user expectation; rather we should implement a solid version of \"leave no local trace\",',0.00,0,0,3825949,0,NULL,0),(248970,15661,'2008-10-22 12:54:10','Dave: Do you know the cache service well enough to tell whether the ClearDoomList() call in OnEnterExitPrivateBrowsing() is necessary/a good thing?\n\nEhsan:\n do_throw(\"Expected to find the \\\"\" + devices[i] + \"\\\" cache device, \" +\n\nnow that you have no for loop anymore, you don\'t have \"i\" anymore :-)',0.00,0,0,3825960,6,'344340',0),(248970,265995,'2008-10-22 13:18:52','(In reply to comment #436)\n> (From update of attachment 344340 [details])\n> Dave: Do you know the cache service well enough to tell whether the\n> ClearDoomList() call in OnEnterExitPrivateBrowsing() is necessary/a good thing?\n\nAs I understand it, ClearDoomList() will deactivate all cache entries currently in flight. That\'ll cause problems with channels loading into/from those cache entries.\n\nIt should be fine to just doom everything. As loads finish, the doom list will be cleaned up.',0.00,0,0,3825993,0,NULL,0),(248970,251051,'2008-10-22 17:04:19','Asking mconnor for a primitive review on the browser/ bits and pieces.',0.00,0,0,3826437,6,'343848',0),(248970,251051,'2008-10-22 23:44:53','Here\'s the revised patch, without calling ClearDoomsList, and with the problem mentioned in comment 436 fixed.',0.00,0,0,3826686,5,'344444',0),(248970,9186,'2008-10-23 03:49:53','(In reply to comment #435)\n> I think the functional spec there is mistaken; this bug and this initial work\n> is and should be about eliminating _local_ traces. Preventing sites from\n> tracking you seems out of scope, especially without a clearer description of\n> the adversary (remote site? ISP? safebrowsing provider?).\n> \n> I\'ve worked on pseudonymity and profile-splitting software before, it\'s really\n> hard to get right, especially in light of various (deployed) deep packet\n> inspection tools. We would do well to not do a half job of it, and mis-set\n> user expectation; rather we should implement a solid version of \"leave no\n> local trace\",\n\nSo if we\'re just trying to prevent local traces then we should *not* do things like remove all currently set cookies, right? As well as not deny access to *reading* localStorage.\n\nMy understanding is that this is what other UAs do. I.e. they leave all existing cookies and history, and just don\'t permanently add any additional ones.\n\nIf this is what we want to do too then I think the spec needs to be changed quite a bit.',0.00,0,0,3826817,0,NULL,0),(248970,198492,'2008-10-23 06:53:07','(In reply to comment #440)\n> My understanding is that this is what other UAs do. I.e. they leave all\n> existing cookies and history, and just don\'t permanently add any additional\n> ones.\n\nI don\'t think that\'s what Chrome is doing. If you enter private mode and open google.com, you won\'t be logged in with your google account (meaning the existing cookies are not sent I guess).',0.00,0,0,3826990,0,NULL,0),(248970,251051,'2008-10-23 07:18:08','(In reply to comment #440)\n> So if we\'re just trying to prevent local traces then we should *not* do things\n> like remove all currently set cookies, right? As well as not deny access to\n> *reading* localStorage.\n\nBased on our IRC discussions with mconnor last night, he would like to prevent some types of attacks which enable a website to associate your non-private and private browsing sessions together. We won\'t of course make any promises in this regard to users, because we\'re not covering every possible ground here. The reason that the spec says that reading DOM storage should be blocked as well is to prevent this association.\n\n> My understanding is that this is what other UAs do. I.e. they leave all\n> existing cookies and history, and just don\'t permanently add any additional\n> ones.\n\nWell, I tested Chrome, and like Sylvian mentioned in comment 441, it indeed doesn\'t send non-private cookies in private mode. It seems that Chrome doesn\'t support DOM storage though, but I suppose if it did, it would\'ve made the same choice as for the cookies. Both my patch and Chrome\'s implementation keep history in place. The only difference in our handling of history is that we turn off visited link coloring in private mode to prevent attacks like .\n\n> If this is what we want to do too then I think the spec needs to be changed\n> quite a bit.\n\nIt seems that for the time being, we\'re going to maintain the current spec, and we need to make sure that the implementation follows the spec exactly.',0.00,0,0,3827010,0,NULL,0),(248970,251051,'2008-10-23 09:28:46','The session store module changes with tests, ready for review.',0.00,0,0,3827164,5,'344483',0),(248970,160571,'2008-10-23 10:09:23','>+ // The Private Browsing service might not be available.\n>+ try {\n>+ var pbs = Cc[\"@mozilla.org/privatebrowsing;1\"].\n>+ getService(Ci.nsIPrivateBrowsingService);\n>+ this._inPrivateBrowsing = pbs.privateBrowsingEnabled;\n>+ } catch (e) {}\n\nIsn\'t the PB service part of /browser as is SessionStore? If so, please drop the try-catch clause.\n\n>+ * @param aBackupState\n>+ * Bool backup the current state\n\nWhy can\'t you just do\n\n> this._stateBackup = this._safeEval(this._getCurrentState(true).toSource());\n\nwhile you handle PB\'s \"enter\" notification? IMO saveState shouldn\'t mean saveStateOrMaybeJustBackupWithoutSaving. You don\'t have to worry about the state\'s session object at this point (and later on, only session.state is needed).\n\n>+ this._stateBackup = eval(oState.toSource());\n\nOur toSource implementation still has several quirks (which I suspect cause some of the dependencies of bug 429414). Please use _safeEval instead.\n\n>+ _saveBackedUpState: function sss_saveBackedUpState() {\n>+ // if crash recovery is disabled, only save session resuming information\n>+ if (!this._resume_from_crash && this._loadState == STATE_RUNNING)\n>+ return;\n>+ if (!(\"_stateBackup\" in this))\n>+ return;\n\nDo we ever hit this method under these circumstances? If not, I\'d rather just move the remaining three lines to where they\'re actually needed.\n\n>+ _backupRecentlyClosedTabs: function sss_backupRecentlyClosedTabs() {\n\nI\'m still opposed to this. ;-)\n\n>+ backup[ix] = eval(this._windows[ix]._closedTabs.toSource());\n\n_safeEval!\n\nAs for the tests, I\'ve unfortunately found some nits as well (many apply to both tests):\n\n>+var _PBSvc = null;\n>+function get_PBSvc() {\n>+ if (_PBSvc)\n>+ return _PBSvc;\n\nSmart getter, please.\n\n>+ if (_PBSvc) {\n\nThis should always happen - unless Firefox can be built without PB service (in which case I must\'ve missed a lot of ifdefs). Otherwise you can quite simplify these bits.\n\n>+ QueryInterface: function (iid) {\n\nThis isn\'t needed for JS components which don\'t implement nsISupportsWeakReference.\n\n>+function test() { \n>+ /** Test (A) for Bug 248970 **/\n>+\n>+ function test(aLambda) {\n>+ try {\n>+ return aLambda() || true;\n>+ }\n>+ catch(ex){ }\n>+ return false;\n>+ }\n\nWhile this is just a test, I\'d still prefer trying to stick to our coding standards: no whitespace at the ends of lines; proper identation; spaces after catch and (ex).\n\n>+ let tabbrowser = getBrowser();\n\nJust use gBrowser to start with, getBrowser has been deprecated.\n\n>+ ok(pb, \"reference the private browsing service\");\n\nThis should be in a PB specific test - here it should just work!\n\n>+ ok(ssComponent, \"reference the sessionstore component\");\n>+ ok(ss, \"reference the sessionstore service\");\n\nWe already test for this - here it should just work as well!\n\n>+ ok(file,\"reference the profile directory\");\n\nI\'d prefer you only testing relevant functionality - makes the test\'s output easier to skim.\n\n>+ let ss_lmt_pre_pb = file.lastModifiedTime;\n\nWhat about prePBModeTime or something slightly more readable?\n\n>+ finish();\n>+ }, 3000);\n>+ }, 3000);\n\nIndentation?\n\n>+ let tab_A_restored = test(function() ss.undoCloseTab(window, 0));\n>+ ok(tab_A_restored, \"a tab is in undo list\");\n\nss.undoCloseTab will throw when the tab isn\'t in the undo list!\n\nThe tests look good, though. Thanks for your efforts!',0.00,0,0,3827216,6,'344483',0),(248970,251051,'2008-10-23 16:27:20','(In reply to comment #444)\n> (From update of attachment 344483 [details])\n> >+ // The Private Browsing service might not be available.\n> >+ try {\n> >+ var pbs = Cc[\"@mozilla.org/privatebrowsing;1\"].\n> >+ getService(Ci.nsIPrivateBrowsingService);\n> >+ this._inPrivateBrowsing = pbs.privateBrowsingEnabled;\n> >+ } catch (e) {}\n> \n> Isn\'t the PB service part of /browser as is SessionStore? If so, please drop\n> the try-catch clause.\n\nYes, fixed.\n\n> >+ * @param aBackupState\n> >+ * Bool backup the current state\n> \n> Why can\'t you just do\n> \n> > this._stateBackup = this._safeEval(this._getCurrentState(true).toSource());\n> \n> while you handle PB\'s \"enter\" notification? IMO saveState shouldn\'t mean\n> saveStateOrMaybeJustBackupWithoutSaving.\n\nYou\'re right, I don\'t know what I was thinking! :-) Done.\n\n> You don\'t have to worry about the\n> state\'s session object at this point (and later on, only session.state is\n> needed).\n\nI\'m not sure what you mean here. I don\'t touch the session object here...\n\n> >+ this._stateBackup = eval(oState.toSource());\n> \n> Our toSource implementation still has several quirks (which I suspect cause\n> some of the dependencies of bug 429414). Please use _safeEval instead.\n\nDone.\n\n> >+ _saveBackedUpState: function sss_saveBackedUpState() {\n> >+ // if crash recovery is disabled, only save session resuming information\n> >+ if (!this._resume_from_crash && this._loadState == STATE_RUNNING)\n> >+ return;\n> >+ if (!(\"_stateBackup\" in this))\n> >+ return;\n> \n> Do we ever hit this method under these circumstances? If not, I\'d rather just\n> move the remaining three lines to where they\'re actually needed.\n\nI don\'t think the first condition matters, now that I think about it. There is a potential for the second condition. For example, the implementation of bug 460346 might cause situations where the enter notification is not received before exit. Therefore I prefer to keep it, at least as a sanity check, as the case may be.\n\n> >+ _backupRecentlyClosedTabs: function sss_backupRecentlyClosedTabs() {\n> \n> I\'m still opposed to this. ;-)\n\nOK, I\'ve given this extensive thought. With this implementation, if the user doesn\'t choose to save and close her current session, after leaving the private mode, her browser is exactly at the same state as when entering the private mode. The same thing happens if she chooses to save and close her session (even without this code). So, this provides a level of consistency between the two options.\n\nAnother point here is that I\'ve gone to great lengths to make it impossible for a someone to tell whether the private mode has even been entered by inspecting two states of the browser (which might be before and after the private session). Without this code, this will break.\n\nThirdly, since in the final implementation that we will ship, the option to save and close the current session might be the only available option facing the users, this might not be that debatable.\n\nSo, unless there are technical reasons that we should remove this code, or I\'m doing something wrong in it, I prefer to keep it.\n\n> >+ backup[ix] = eval(this._windows[ix]._closedTabs.toSource());\n> \n> _safeEval!\n\nDone.\n\n> As for the tests, I\'ve unfortunately found some nits as well (many apply to\n> both tests):\n> \n> >+var _PBSvc = null;\n> >+function get_PBSvc() {\n> >+ if (_PBSvc)\n> >+ return _PBSvc;\n> \n> Smart getter, please.\n\nHum? Are getters possible at global scope?\n\n> >+ if (_PBSvc) {\n> \n> This should always happen - unless Firefox can be built without PB service (in\n> which case I must\'ve missed a lot of ifdefs). Otherwise you can quite simplify\n> these bits.\n\nNo you didn\'t miss them. My bad for directly pasting this code from unit tests outside of browser/! :-)\n\n> >+ QueryInterface: function (iid) {\n> \n> This isn\'t needed for JS components which don\'t implement\n> nsISupportsWeakReference.\n\nOh, cool, I didn\'t know that!\n\n> >+function test() { \n> >+ /** Test (A) for Bug 248970 **/\n> >+\n> >+ function test(aLambda) {\n> >+ try {\n> >+ return aLambda() || true;\n> >+ }\n> >+ catch(ex){ }\n> >+ return false;\n> >+ }\n> \n> While this is just a test, I\'d still prefer trying to stick to our coding\n> standards: no whitespace at the ends of lines; proper identation; spaces after\n> catch and (ex).\n\nDone.\n\n> >+ let tabbrowser = getBrowser();\n> \n> Just use gBrowser to start with, getBrowser has been deprecated.\n\nSure.\n\n> >+ ok(pb, \"reference the private browsing service\");\n> \n> This should be in a PB specific test - here it should just work!\n\nAgreed.\n\n> >+ ok(ssComponent, \"reference the sessionstore component\");\n> >+ ok(ss, \"reference the sessionstore service\");\n> \n> We already test for this - here it should just work as well!\n\nDone.\n\n> >+ ok(file,\"reference the profile directory\");\n> \n> I\'d prefer you only testing relevant functionality - makes the test\'s output\n> easier to skim.\n\nDefinitely.\n\n> >+ let ss_lmt_pre_pb = file.lastModifiedTime;\n> \n> What about prePBModeTime or something slightly more readable?\n\nprePBModeTimeStamp (slightly more readable)! :-)\n\n> >+ finish();\n> >+ }, 3000);\n> >+ }, 3000);\n> \n> Indentation?\n\nWhat about it? ;-)\n\n> >+ let tab_A_restored = test(function() ss.undoCloseTab(window, 0));\n> >+ ok(tab_A_restored, \"a tab is in undo list\");\n> \n> ss.undoCloseTab will throw when the tab isn\'t in the undo list!\n\nIn this case, |test| should return false, right?\n\n> The tests look good, though. Thanks for your efforts!\n\nI can\'t take credit for them (but I *am* tempted to)! The tests are Aaron Train\'s great work.\n\nI hope you don\'t mind me shamelessly switching the review flag to you...',0.00,0,0,3827739,5,'344558',0),(248970,299942,'2008-10-23 16:37:56','Thank you, Ehsan and Simon. With that testing area complete, what now remains?',0.00,0,0,3827748,0,NULL,0),(248970,251051,'2008-10-23 16:56:14','(In reply to comment #446)\n> Thank you, Ehsan and Simon. With that testing area complete, what now remains?\n\nGood question. Here\'s a status update. The only tests remaining are those of the download manager (which I need to write a test plan for) and the private browsing service itself. I expect to complete them in the next couple of days (at most). One we have the reviews on the remaining work, it will be ready to land!',0.00,0,0,3827780,0,NULL,0),(248970,160571,'2008-10-24 01:50:48','r+=me with the following changes:\n\n>+ oState.session.state = STATE_STOPPED_STR;\n\nThis doesn\'t work, as the session object is only set in saveState right before writing to a file. Instead do\n\n>> oState.session = { state: STATE_STOPPED_STR };\n\n>+ this._inPrivateBrowsing = false;\n\nPlease also delete this._stateBackup at this point (or better just always delete it at the end of the \"exit\" block).\n\n>+function get_PBSvc() {\n\nOn second thought: Just inline this in the main test body. There\'s no need for caching if you only ever need the service once. See the browser_448741.js test.\n\n>+ let ssComponent = test(function() Cc[\"@mozilla.org/browser/sessionstore;1\"]);\n>+ let ss = test(function() ssComponent.getService(Ci.nsISessionStore));\n>+ if (pb) { // private browsing might not be available\n\nYou can just get the service in one swoop. And |pb| will always be the PB service, so you can just drop the |if|.\n\n(In reply to comment #445)\n> Another point here is that I\'ve gone to great lengths to make it impossible for\n> a someone to tell whether the private mode has even been entered by inspecting\n> two states of the browser (which might be before and after the private\n> session). Without this code, this will break.\n\nGood point! No further objections.\n\n> Hum? Are getters possible at global scope?\n\nThey are (see e.g. Dão\'s clean-up in browser.js). Doesn\'t matter with the above changes, though.\n\n> In this case, |test| should return false, right?\n\nOf course - I completely missed the |test|.\n\n> The tests are Aaron Train\'s great work.\n\nIn that case thanks to Aaron as well!',0.00,0,0,3828107,6,'344558',0),(248970,160571,'2008-10-24 06:43:18','One additional detail about the first test: That one might actually pass even though sessionstore.js would have been overwritten. You\'ll want to set browser.sessionstore.interval to 1000 at the start of the test (and reset the value at the end) to make sure that the file would indeed have been updated during the course of the test...',0.00,0,0,3828225,6,'344558',0),(248970,9186,'2008-10-25 00:25:06','So microsoft does not drop any existing cookies when going in to \"InPrivate mode\". They were simply trying to address the problem of local traces.\n\nApparently apple do the same thing in safari.\n\nI don\'t really have a strong opinion on what is the best thing to do, though I\'m wondering what problem we\'re trying to address by dropping cookies are.',0.00,0,0,3829063,0,NULL,0),(248970,251051,'2008-10-25 01:45:05','(In reply to comment #448)\n> (From update of attachment 344558 [details])\n> r+=me with the following changes:\n> \n> >+ oState.session.state = STATE_STOPPED_STR;\n> \n> This doesn\'t work, as the session object is only set in saveState right before\n> writing to a file. Instead do\n> \n> >> oState.session = { state: STATE_STOPPED_STR };\n\nI did this, but I see a potential problem with this approach (not having saveState save the backup state object): In this case, the session object excludes the lastUpdate, recentCrashes, and any other attributes saved by saveState later on. Wouldn\'t this be a problem? I think this was the original reason why I was doing the state backup saving in saveState initially.\n\nBesides what I was doing before, another (better) solution might be to factor out the code preparing the state object for being written to disk into a function, such as _prepareState and then call it both from saveState and the private-browsing observer.\n\n> >+ this._inPrivateBrowsing = false;\n> \n> Please also delete this._stateBackup at this point (or better just always\n> delete it at the end of the \"exit\" block).\n\nDone.\n\n> >+function get_PBSvc() {\n> \n> On second thought: Just inline this in the main test body. There\'s no need for\n> caching if you only ever need the service once. See the browser_448741.js test.\n\nDone.\n\n> >+ let ssComponent = test(function() Cc[\"@mozilla.org/browser/sessionstore;1\"]);\n> >+ let ss = test(function() ssComponent.getService(Ci.nsISessionStore));\n> >+ if (pb) { // private browsing might not be available\n> \n> You can just get the service in one swoop. And |pb| will always be the PB\n> service, so you can just drop the |if|.\n\nYou\'re right, didn\'t catch this before.\n\n(In reply to comment #449)\n> (From update of attachment 344558 [details])\n> One additional detail about the first test: That one might actually pass even\n> though sessionstore.js would have been overwritten. You\'ll want to set\n> browser.sessionstore.interval to 1000 at the start of the test (and reset the\n> value at the end) to make sure that the file would indeed have been updated\n> during the course of the test...\n\nGood point, done.\n\nCarrying forward your r+, however, another iteration might be necessary because of the session object point I mentioned above.',0.00,0,0,3829097,5,'344729',0),(248970,251051,'2008-10-25 02:26:20','(In reply to comment #450)\n> I don\'t really have a strong opinion on what is the best thing to do, though\n> I\'m wondering what problem we\'re trying to address by dropping cookies are.\n\nWell, the reasoning behind this is that one of the applications of cookies is\ntracking the visitors of a website. For example, if a site sets a cookie with\na unique ID the first time you visit it (like Google does) and your browser\nsends that cookie for each request, the website effectively has a log of all\nyour activities associated together.\n\nNow, if your browser send that cookie inside the private mode, the site would\nbe able to associate your public and private activities. An example of how\nthis manifests to a user is that the Google searches done in private mode show\nup in her search history. This might be a problem for shared computers, and\nit\'s what we\'re trying to avoid by not sending any of the existing cookies\ninside the private mode.',0.00,0,0,3829127,0,NULL,0),(248970,160571,'2008-10-25 02:37:56','(In reply to comment #451)\n> In this case, the session object excludes the lastUpdate, recentCrashes,\n> and any other attributes saved by saveState later on. Wouldn\'t this be a\n> problem?\n\nlastUpdate and recentCrashes are both not needed after a clean shut-down. We can revisit this once we add further information to .session which will always have to be available (in which case we might as well add the .session object in _getCurrentState already).\n\nOne further thing that missed during my review: You\'ll have to remove the observers during a test\'s clean-up so that they don\'t have unintended side-effects on later tests. Sorry for that.',0.00,0,0,3829130,0,NULL,0),(248970,251051,'2008-10-25 02:59:52','(In reply to comment #453)\n> lastUpdate and recentCrashes are both not needed after a clean shut-down. We\n> can revisit this once we add further information to .session which will always\n> have to be available (in which case we might as well add the .session object in\n> _getCurrentState already).\n\nOK.\n\n> One further thing that missed during my review: You\'ll have to remove the\n> observers during a test\'s clean-up so that they don\'t have unintended\n> side-effects on later tests. Sorry for that.\n\nOh, the mistake was on my part. Actually I think we need to do this for the passwordmgr test as well. I\'ve filed bug 461629 on that.',0.00,0,0,3829138,5,'344732',0),(248970,251051,'2008-10-25 03:33:04','http://hg.mozilla.org/mozilla-central/rev/6a8accf38e93',0.00,0,0,3829150,6,'344444',0),(248970,160571,'2008-10-25 04:10:00','Thanks. BTW: Are you aware that your patches aren\'t UTF-8 encoded and use DOS line endings? The former prevents it from cleanly applying - at least when using \"patch\" (and the latter leads to console noise). This shouldn\'t be a problem if you push the patches yourself, though.',0.00,0,0,3829158,6,'344732',0),(248970,251051,'2008-10-25 04:15:35','(In reply to comment #456)\n> (From update of attachment 344732 [details])\n> Thanks. BTW: Are you aware that your patches aren\'t UTF-8 encoded and use DOS\n> line endings? The former prevents it from cleanly applying - at least when\n> using \"patch\" (and the latter leads to console noise). This shouldn\'t be a\n> problem if you push the patches yourself, though.\n\nThanks for pointing this out. I manage my patches using mq, but I generate the splitted patches manually using Notepad++, and that was an oversight on my part. Sorry for the inconvenience.',0.00,0,0,3829160,0,NULL,0),(248970,251051,'2008-10-26 09:04:41','This patch includes both the Private Browsing service, and its temporary UI (that is, until bug 411929 is planned and fixed.\n\nI have written some extensive unit tests to check nearly every aspect of the private browsing service. I have also written a browser chrome test to test the private browsing UI pieces.\n\nThis is ready for review now.',0.00,0,0,3829747,5,'344819',0),(248970,251051,'2008-10-26 13:58:45','Latest try server build available at: \n\nThis build includes the patches to bug 461625 and bug 461627 as well (well, but 461710 too, but that one\'s just a unit test, without any user-facing features).',0.00,0,0,3829875,0,NULL,0),(248970,251051,'2008-10-26 23:48:27','Latest try server build available at: \n\nThis build includes the patch to bug 460346 as well (adds the browser.privatebrowsing.autostart pref).',0.00,0,0,3830062,0,NULL,0),(248970,27780,'2008-10-27 13:14:42','Another random thought: should private browsing mode clear the clipboard when\nexiting, if the contents were copied while in private mode? EG, user enters PB,\ncopies a link on cheap-engagement-rings.com, then exits PB mode. That link\nremains in the clipboard, where someone might discover it if they paste it into\nsomething later on.',0.00,0,0,3830719,0,NULL,0),(248970,251051,'2008-10-27 13:23:02','(In reply to comment #461)\n> Another random thought: should private browsing mode clear the clipboard when\n> exiting, if the contents were copied while in private mode? EG, user enters PB,\n> copies a link on cheap-engagement-rings.com, then exits PB mode. That link\n> remains in the clipboard, where someone might discover it if they paste it into\n> something later on.\n\nYeah, I think that would also be a nice thing to handle. Can you please file a bug on that, and CC me/assign it to me? We can have a discussion there.',0.00,0,0,3830732,0,NULL,0),(248970,215498,'2008-10-28 11:22:30','I\'d prefer to not land temporary UI in locales/en-US, that\'s just distracting our localization community. I\'d recommend to land the localizable files in content and move them over once the UI finalizes.\n\nStyle comment, please add localization notes for replaced variables like message in privatebrowsing.properties, https://developer.mozilla.org/En/Localization_notes on the impl.',0.00,0,0,3832025,0,NULL,0),(248970,251051,'2008-10-28 11:32:52','(In reply to comment #463)\n> I\'d prefer to not land temporary UI in locales/en-US, that\'s just distracting\n> our localization community. I\'d recommend to land the localizable files in\n> content and move them over once the UI finalizes.\n> \n> Style comment, please add localization notes for replaced variables like\n> message in privatebrowsing.properties,\n> https://developer.mozilla.org/En/Localization_notes on the impl.\n\nI think the browser/ strings and the parts of the UI code which use them can land in the UI bug with the final strings. The current stuff is merely a test UI to make the process of testing the builds by the community easier.\n\nThere are strings for the download manager as well, but I\'m not sure if we need to move them to the UI bug as well. Alex?',0.00,0,0,3832053,0,NULL,0),(248970,317549,'2008-10-28 23:33:31','(In reply to comment #461)\n> Another random thought: should private browsing mode clear the clipboard when\n> exiting, if the contents were copied while in private mode? EG, user enters PB,\n> copies a link on cheap-engagement-rings.com, then exits PB mode. That link\n> remains in the clipboard, where someone might discover it if they paste it into\n> something later on.\n\nI must dissagree. I think copying something to the clipboard is \"user data\" ie. something the user explicitly did and we shouldn\'t be touching it.\n\nAn option.. sure. But completely clearing the clipboard is a really irritating thing that\'s hard to track down.',0.00,0,0,3833066,0,NULL,0),(248970,27780,'2008-10-28 23:58:48','Presumably clipboard clearing would happen *only* when (1) a cut/copy was performed in PB mode and (2) when exiting PB the clipboard is still that value. A clipboard value that either predates entering PB mode or comes from another app while in PB mode shouldn\'t be cleared. That would indeed be annoying.',0.00,0,0,3833078,0,NULL,0),(248970,251051,'2008-10-29 00:26:03','Bug 462106 filed for discussing what to do with the clipboard data.',0.00,0,0,3833097,0,NULL,0),(248970,96908,'2008-10-29 02:13:31','>diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js\n\n>+ init: function PBUI_init() {\n>+ let Cc = Components.classes; // XXXehsan: why can\'t we use the global Cc here???\n\nas discussed on IRC, this is because Cc isn\'t defined when you call this. We really need to clean up Cc, its this weird sorta-const that isn\'t the same as Ci and Cu.\n\n>+ } else if (aTopic == \"quit-application\") {\n\ndon\'t you have enough nits on this yet?\n\n>+gPrivateBrowsingUI.init();\n\nwhy is this called this early? there\'s no need to call it there...\n\n>diff --git a/browser/components/nsBrowserGlue.js b/browser/components/nsBrowserGlue.js\n\n>+ decidePrivateBrowsingSession: function()\n>+ {\n\n>+ return result;\n>+ },\n\nwe don\'t want this anymore. Its a whole bunch of code that enables a hidden pref. have the pref for unit tests, kill the UI/prompt.\n\n\n>+ // Whether the private browsing mode is currently active or not.\n>+ _inPrivateBrowsing: false,\n>+\n>+ // Saved browser state before entering the private mode.\n>+ _savedBrowserState: null,\n>+\n>+ // Whether we\'re in the process of shutting down\n>+ _quitting: false,\n>+\n>+ // How to treat the non-private session\n>+ _sessionDecision: -1,\n>+\n>+ // Make sure we don\'t allow re-enterant changing of the private mode\n>+ _alreadyChangingMode: false,\n>+\n>+ // XPCOM registration\n>+ classDescription: \"PrivateBrowsing Service\",\n>+ contractID: \"@mozilla.org/privatebrowsing;1\",\n>+ classID: Components.ID(\"{c31f4883-839b-45f6-82ad-a6a9bc5ad599}\"),\n>+ _xpcom_categories: [\n>+ { category: \"app-startup\", service: true }\n>+ ],\n>+\n>+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIPrivateBrowsingService, \n>+ Ci.nsIObserver]),\n>+\n>+ _unload: function PBS__destroy() {\n>+ // Force an exit from the private browsing mode on shutdown\n>+ this._quitting = true;\n>+ if (this._inPrivateBrowsing)\n>+ this.privateBrowsingEnabled = false;\n>+\n>+ this._obs.removeObserver(this, \"quit-application-granted\");\n>+ },\n>+\n>+ _onPrivateBrowsingModeChanged: function PBS__onPrivateBrowsingModeChanged() {\n>+ // clear all auth tokens\n>+ let sdr = Cc[\"@mozilla.org/security/sdr;1\"].\n>+ getService(Ci.nsISecretDecoderRing);\n>+ sdr.logoutAndTeardown();\n>+\n>+ // clear plain HTTP auth sessions\n>+ let authMgr = Cc[\'@mozilla.org/network/http-auth-manager;1\'].\n>+ getService(Ci.nsIHttpAuthManager);\n>+ authMgr.clearAll();\n>+\n>+ let ss = Cc[\"@mozilla.org/browser/sessionstore;1\"].\n>+ getService(Ci.nsISessionStore);\n>+ if (this.privateBrowsingEnabled) {\n>+ // first, give extensions a chance to provide their own UI here\n>+ let decision = Cc[\"@mozilla.org/supports-PRUint32;1\"].\n>+ createInstance(Ci.nsISupportsPRUint32);\n>+ decision.data = Ci.nsIBrowserGlue.PRIVATEBROWSING_NODECISION;\n>+ this._obs.notifyObservers(decision, \"private-browsing-enter\", null);\n>+ switch (decision.data) {\n>+ case Ci.nsIBrowserGlue.PRIVATEBROWSING_KEEPSESSION:\n>+ case Ci.nsIBrowserGlue.PRIVATEBROWSING_CLOSESESSION:\n>+ this._sessionDecision = decision.data;\n>+ break;\n>+ default:\n>+ // if no extension handles the decision, let the browser glue component decide\n>+ let browserGlue = Cc[\"@mozilla.org/browser/browserglue;1\"].\n>+ getService(Ci.nsIBrowserGlue);\n>+ this._sessionDecision = (browserGlue.decidePrivateBrowsingSession() ==\n>+ Ci.nsIBrowserGlue.PRIVATEBROWSING_KEEPSESSION) ?\n>+ Ci.nsIBrowserGlue.PRIVATEBROWSING_KEEPSESSION :\n>+ Ci.nsIBrowserGlue.PRIVATEBROWSING_CLOSESESSION;\n>+ break;\n>+ }\n\nas noted, simplify the hell out of this, we don\'t want this UI, but we need the pref to work around unit test weakness.\n\n>+ // save the whole browser state in order to restore all windows/tabs later\n>+ if (this._sessionDecision == Ci.nsIBrowserGlue.PRIVATEBROWSING_CLOSESESSION &&\n>+ this._savedBrowserState == null) {\n>+ this._savedBrowserState = ss.getBrowserState();\n\nwe should just restore from disk, instead of keeping all of this stashed in memory. you\'re being paranoid. :)\n\n\n>+ _closeAllWindows: function PBS__closeAllWindows() {\n>+ let windowMediator = Cc[\"@mozilla.org/appshell/window-mediator;1\"].\n>+ getService(Ci.nsIWindowMediator);\n>+ let windowsEnum = windowMediator.getEnumerator(\"navigator:browser\");\n>+\n>+ // We want to close all windows in reverse order, but since\n>+ // nsISimpleEnumerator can\'t do backwards iterations, a little\n>+ // recursive helper function is used.\n>+ this._closeAllWindowsInternal(windowsEnum);\n>+ },\n\nI think we want back to front.\n\nyou want windowMediator.getZOrderDOMWindowEnumerator(\"navigator:browser\", false) on Windows, other platforms are busted. :(\n\n>+ _closeAllWindowsInternal: function PBS__closeAllWindowsInternal(windowsEnum) {\n>+ if (windowsEnum.hasMoreElements()) {\n>+ let window = windowsEnum.getNext();\n>+ this._closeAllWindowsInternal(windowsEnum);\n>+ window.close();\n>+ }\n>+ },\n\nuse win instead of window, window has special meaning in JS, and we should avoid using it as a generic var.\n\n>+ try {\n\n>+ } finally {\n>+ this._alreadyChangingMode = false;\n>+ }\n>+ }\n>+};\n\nprobably worth a reportError call in a catch block if there\'s an exception thrown in the try block.\n\nI didn\'t look at the tests yet, but please roll those into the unit test changes needed because we\'re changing the notifications they\'ll need\n\nI\'ll look at this again when you\'ve done these changes.',0.00,0,0,3833183,6,'344819',0),(248970,265995,'2008-10-29 11:23:54','I\'m fine with the storage patch, assuming the behavior (security exception on access) is the desired behavior.',0.00,0,0,3833725,6,'343975',0),(248970,251051,'2008-10-29 14:30:29','(In reply to comment #468)\n> as discussed on IRC, this is because Cc isn\'t defined when you call this. We\n> really need to clean up Cc, its this weird sorta-const that isn\'t the same as\n> Ci and Cu.\n\nMoving the init code to delayedStartup did fix this problem...\n\n> >+ } else if (aTopic == \"quit-application\") {\n> \n> don\'t you have enough nits on this yet?\n\nNah, can\'t get enough of them! ;-)\n\n> >+gPrivateBrowsingUI.init();\n> \n> why is this called this early? there\'s no need to call it there...\n\nI moved it to delayedStartup, and merged init and initUI as well.\n\n> >+ decidePrivateBrowsingSession: function()\n> >+ {\n> \n> >+ return result;\n> >+ },\n> \n> we don\'t want this anymore. Its a whole bunch of code that enables a hidden\n> pref. have the pref for unit tests, kill the UI/prompt.\n\nKilled.\n\n> as noted, simplify the hell out of this, we don\'t want this UI, but we need the\n> pref to work around unit test weakness.\n\nDone.\n\n> >+ // save the whole browser state in order to restore all windows/tabs later\n> >+ if (this._sessionDecision == Ci.nsIBrowserGlue.PRIVATEBROWSING_CLOSESESSION &&\n> >+ this._savedBrowserState == null) {\n> >+ this._savedBrowserState = ss.getBrowserState();\n> \n> we should just restore from disk, instead of keeping all of this stashed in\n> memory. you\'re being paranoid. :)\n\nAs discussed on IRC, I\'m moving this into a followup: bug 462218.\n\n> I think we want back to front.\n> \n> you want windowMediator.getZOrderDOMWindowEnumerator(\"navigator:browser\",\n> false) on Windows, other platforms are busted. :(\n\nDone, but I\'m not really sure if I\'ve managed to do what\'s desired here...\n\n> use win instead of window, window has special meaning in JS, and we should\n> avoid using it as a generic var.\n\nOops, that was way embarrassing to slip my attention!\n\n> probably worth a reportError call in a catch block if there\'s an exception\n> thrown in the try block.\n\nDone.\n\n> I didn\'t look at the tests yet, but please roll those into the unit test\n> changes needed because we\'re changing the notifications they\'ll need\n\nI will do this in another patch which I\'ll attach shortly.\n\n> I\'ll look at this again when you\'ve done these changes.\n\nI also removed all of the UI pieces for this patch to reduce the amount of rework done on the UI code.',0.00,0,0,3834142,5,'345361',0),(248970,251051,'2008-10-29 15:37:05','This patch handles the API change for all of the unit tests: drop the usage of private-browsing-enter, and use the browser.privatebrowsing.keep_current_session prefs instead.\n\nNothing major here, the only thing that I noted was that the notification change in attachment 343974 wasn\'t reflected in the unit test, so I went ahead and corrected it as well.',0.00,0,0,3834236,5,'345377',0),(248970,96908,'2008-10-30 16:59:21','looks good, r=mconnor',0.00,0,0,3835964,6,'345377',0),(248970,96908,'2008-10-30 23:17:51','So, again, to complain:\n\n} else \n\nshould be\n\n}\nelse\n\n>diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js\n\nthese bits are all part of the UI bits, so don\'t need to be in this patch at all.\n\n\n>+#ifndef XP_WIN\n>+#define BROKEN_WM_Z_ORDER\n>+#endif\n>+\n>+ _closeAllWindows: function PBS__closeAllWindows() {\n>+ let windowMediator = Cc[\"@mozilla.org/appshell/window-mediator;1\"].\n>+ getService(Ci.nsIWindowMediator);\n>+#ifdef BROKEN_WM_Z_ORDER\n>+ let windowsEnum = windowMediator.getEnumerator(\"navigator:browser\");\n>+#else\n>+ let windowsEnum = windowMediator.getZOrderDOMWindowEnumerator(\"navigator:browser\", false);\n>+#endif\n\nwhy not just #ifdef XP_WIN with a comment here? The extra define isn\'t helpful, if its Windows only...\n\n>+ /**\n>+ * Enter or leave private browsing mode.\n>+ */\n>+ set privateBrowsingEnabled PBS_set_privateBrowsingEnabled(val) {\n>+ if (this._alreadyChangingMode)\n>+ throw Cr.NS_ERROR_FAILURE;\n\ncomments as to how this happens/why its necessary would be good\n\nwe\'re getting there! r=mconnor',0.00,0,0,3836258,6,'345361',0),(248970,243208,'2008-10-31 03:02:08','(In reply to comment #473)\n\n> >+#ifndef XP_WIN\n> >+#define BROKEN_WM_Z_ORDER\n> >+#endif\n> >+\n> >+ _closeAllWindows: function PBS__closeAllWindows() {\n> >+ let windowMediator = Cc[\"@mozilla.org/appshell/window-mediator;1\"].\n> >+ getService(Ci.nsIWindowMediator);\n> >+#ifdef BROKEN_WM_Z_ORDER\n> >+ let windowsEnum = windowMediator.getEnumerator(\"navigator:browser\");\n> >+#else\n> >+ let windowsEnum = windowMediator.getZOrderDOMWindowEnumerator(\"navigator:browser\", false);\n> >+#endif\n> \n> why not just #ifdef XP_WIN with a comment here? The extra define isn\'t\n> helpful, if its Windows only...\n\nActually it is because it is the standard define name for this kind of hack around other places in the codebase. If you leave it as XP_WIN then:\n\na) its not clear why the hack is needed\nb) it makes it harder to remove this hack by looking for it in MXR if other platforms get this implemented in the future.',0.00,0,0,3836356,0,NULL,0),(248970,251051,'2008-10-31 06:33:34','(In reply to comment #474)\n> Actually it is because it is the standard define name for this kind of hack\n> around other places in the codebase. If you leave it as XP_WIN then:\n> \n> a) its not clear why the hack is needed\n> b) it makes it harder to remove this hack by looking for it in MXR if other\n> platforms get this implemented in the future.\n\nI tend to agree with Michael Ventnor here. mconnor: do we really want to get rid of this define?\n\n(In reply to comment #473)\n> >diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js\n> \n> these bits are all part of the UI bits, so don\'t need to be in this patch at\n> all.\n\nHave you reviewed these changes or should I add them to the UI patch for review?',0.00,0,0,3836514,0,NULL,0),(248970,96908,'2008-10-31 15:00:58','bah, just leave the define for now. We need to fix that API.\n\nI\'ve reviewed it all, you are clear for takeoff.',0.00,0,0,3837099,0,NULL,0),(248970,251051,'2008-10-31 15:20:18','(In reply to comment #476)\n> bah, just leave the define for now. We need to fix that API.\n\nOK.\n\n> I\'ve reviewed it all, you are clear for takeoff.\n\nActually I think it would be better to wait up a bit for the remaining parts so that we can land it all together.\n\nThe remaining parts:\n\n1. A decision needs to be made how we want to handle the errors for the DOM storage module. Here is my suggestion: we take this as it is right now (throwing a security error when inside the private mode) for Beta 2, and I\'ll file a followup to work on changing it to use a memory backed MySQL instead of the usual disk MySQL, just like what we do for cookies now. I\'ll provide a patch for that bug in time to make it into the final 3.1 release.\n\n2. The download manager tests have been delayed for so long. I\'ll try to work on it and get something ready by tomorrow. Shawn: if you can help with the test plan, it\'d be great. Otherwise I\'ll give it a shot myself.\n\n3. I\'ve just observed that the places unit test has started to fail. I need to investigate this further, but I suspect it has something to do with moving stuff to background threads in the fsync work recently landed. I think the culprit is that the bookmarks are inserted lazily, which happens too late for the places unit test to catch. Any guidance in this regard is highly appreciated.\n\n\nWe\'re so close now! :-)',0.00,0,0,3837122,0,NULL,0),(248970,251051,'2008-10-31 16:17:41','Simon: this patch only changes the (a) unit test to use nsITimer instead of setTimeout based on mconnor\'s suggestion. I was not sure whether this change requires another review, but I thought I\'d ask in order to be safe.',0.00,0,0,3837206,5,'345808',0),(248970,160571,'2008-10-31 17:01:15','Isn\'t the \"private-browsing-enter\" notification supposed to be replaced by a simple pref? Furthermore: Have you talked to sdwilsh about why setTimeout isn\'t good enough for what we need (all my other tests use it - and they work just fine)?',0.00,0,0,3837266,6,'345808',0),(248970,251051,'2008-11-01 04:05:35','(In reply to comment #479)\n> (From update of attachment 345808 [details])\n> Isn\'t the \"private-browsing-enter\" notification supposed to be replaced by a\n> simple pref?\n\nYes, it is. I fixed all of the unit tests in a single go as attachment 345377 which got reviewed. This patch is applied on top of the session store patch in my queue so the sessionstore part will also use that pref when I land this.\n\n> Furthermore: Have you talked to sdwilsh about why setTimeout isn\'t\n> good enough for what we need (all my other tests use it - and they work just\n> fine)?\n\nNot yet. Just tried to find him on IRC to no avail. But is there anything which would prevent us from using nsITimer over setTimeout? Either way it\'s not a big deal to me, unless I hear from sdwilsh that something\'s awfully wrong with setTimeout...',0.00,0,0,3837504,0,NULL,0),(248970,160571,'2008-11-01 07:25:22','If Shawn doesn\'t object, I\'d prefer the setTimeout patch - otherwise this one is fine by me as well, if you just directly pass the function to initWithCallback (and prefix the function attributes\' names with an a):\n\n> timer.initWithCallback(function(aTimer) {\n> // ...\n> }, 3000, Ci.nsITimer.TYPE_ONE_SHOT);',0.00,0,0,3837562,6,'345808',0),(248970,27780,'2008-11-01 11:39:47','Drive-by: Isn\'t there away to do this *without* a timer?\n\nTimers are generally frowned up because they\'re failure prone when a test box is running slowly or someone\'s debugging under valgrind. And our tests already take too long to run, so adding unneeded delays (6 seconds, in this test) makes things worse.',0.00,0,0,3837777,0,NULL,0),(248970,251051,'2008-11-01 11:48:09','That would require getting the sessionstore component to record its data on command, instead of at an interval. Simon: if that\'s possible, then I\'m all for it.',0.00,0,0,3837782,0,NULL,0),(248970,160571,'2008-11-01 16:06:27','So, I\'ve had a look at a simplified version of your patch and don\'t get the test to fail even without invoking private browsing... You\'ll need to get a new file reference for an updated lastModifiedTime so that it could be different at all.\n\nThen, the first of the two timers isn\'t really needed at all, and the second one can be replaced by\n\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", 0);\n\nwhich triggers an immediate save operation. Then please make sure that without enabling PB mode the test indeed fails and only passes with PB mode enabled first.\n\nIn fact, I\'d prefer such a test to happen right before entering PB mode so that you can be sure that the test actually means something. Just don\'t forget to reset the .interval pref before entering PB mode so that repeatedly setting it to 0 also repeatedly sends a pref-change notification.',0.00,0,0,3837880,6,'345808',0),(248970,251051,'2008-11-01 17:32:44','Download manager patch with a unit test, ready for review.\n\nAsking sdwilsh to review the download manager service parts, and mconnor to review the rest of the toolkit changes.',0.00,0,0,3837911,5,'345902',0),(248970,251051,'2008-11-01 18:48:41','(In reply to comment #484)\n\nSimon: I tried to address all of your comments. Also I ran both tests without entering/leaving the private mode to make sure they fail in that case (and indeed they do). Please let me know if there are more issues to work out.',0.00,0,0,3837933,5,'345907',0),(248970,251051,'2008-11-02 01:39:50','The latest fsync work in Places broke the unit test for Places which is already checked in. Here\'s a fix for the unit test to make it wait for sync notifications, and also fix an issue where the places query object returned both history and bookmark items (I\'m not sure why), but anyway the current behavior is correct (we make two queries, one for history, the other for bookmarks).',0.00,0,0,3838067,5,'345927',0),(248970,160571,'2008-11-02 01:52:15','>+ let ss_interval = gPrefService.getIntPref(\"browser.sessionstore.interval\");\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", 0);\n\nPlease verify that sessionstore.js\'s lastModifiedTime differs before and after this point.\n\n>+ // enter private browsing mode\n>+ pb.privateBrowsingEnabled = true;\n\nIt should differ once again after this point.\n\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", 0);\n\nThis is a no-op if the pref is already set to 0 (which it is). Just drop the line.\n\n>+ // record the timestamp of private browsing session - sessionstore.js\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", 0);\n\nStill a no-op. Reset the pref before this line for it to have any effect.\n\n>+ flag = (x.title==y.title && x.url==y.url); // comparing titles\n\nWhile I\'m at it... nit: No spaces around operators.',0.00,0,0,3838072,6,'345907',0),(248970,251051,'2008-11-02 09:41:09','(In reply to comment #488)\n> (From update of attachment 345907 [details])\n\nAll comments addressed.',0.00,0,0,3838254,5,'345953',0),(248970,251051,'2008-11-02 10:18:55','Oh, I guess I\'m too used to ask mconnor for reviews! :-) Meant Simon, of course...',0.00,0,0,3838285,6,'345953',0),(248970,160571,'2008-11-02 11:19:55','>+ _backupRecentlyClosedTabs: function sss_backupRecentlyClosedTabs() {\n\nBTW: Can we just drop these now that users won\'t have the option of keeping their current windows open?\n\n>+ function test(aLambda) {\n\nAs you\'ll need another revision round, anyway, could you please just drop this function. You no longer use it as intended... ;-)\n\n>+ if (file.exists())\n\nOut of curiosity: Can the file be missing at all?\n\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", ss_interval);\n>+ gPrefService.setIntPref(\"browser.sessionstore.interval\", 0);\n>+ let startPBModeTimeStamp = getSessionstorejsModificationTime();\n\nYou\'ll get the very same timestamp without changing the pref.\n\n>+ function serializeClosedTabData(array) {\n>+ array.sort(function (a, b) {\n>+ return a.pos - b.pos;\n>+ });\n\nWhat\'s the need for sorting? Wouldn\'t this rather lead to two different closed tab lists being considered equal?\n\n>+ return aPrevious + aCurrent.url + \"#\" + aCurrent.title + \"#\";\n\nWhat was wrong with the comparison you had in revision 6 of this patch? If you want to stick to this one, please use a separator that isn\'t as likely to be contained in either title or URL (such as \"\\n\" or even better \"\\0\").',0.00,0,0,3838324,6,'345953',0),(248970,213632,'2008-11-02 11:25:50','looks ok, though for readability i\'d prefer that you separate out and name the observers, instead of having them nested and anonymous. r=me w/ that change.',0.00,0,0,3838327,6,'345927',0),(248970,251051,'2008-11-02 16:13:06','(In reply to comment #491)\n> (From update of attachment 345953 [details])\n> >+ _backupRecentlyClosedTabs: function sss_backupRecentlyClosedTabs() {\n> \n> BTW: Can we just drop these now that users won\'t have the option of keeping\n> their current windows open?\n\nOK, I won\'t resist it this time! ;-)\n\nDone.\n\n> >+ function test(aLambda) {\n> \n> As you\'ll need another revision round, anyway, could you please just drop this\n> function. You no longer use it as intended... ;-)\n\nDone.\n\n> >+ if (file.exists())\n> \n> Out of curiosity: Can the file be missing at all?\n\nYes, if you choose to run only the tests in browser/components/sessionstore, this test is run as the first test, before the SS component has kicked in to write sessionstore.js for the first time.\n\nBTW, there is an annoying bug in one of the sessionstore tests which prevents one from running only tests in that directory. It causes the whole window to be closed along the way. Are you aware of this or should I file a bug?\n\n> You\'ll get the very same timestamp without changing the pref.\n\nDone.\n\n> What\'s the need for sorting? Wouldn\'t this rather lead to two different closed\n> tab lists being considered equal?\n\nHmmm, yes I think you\'re right, but it won\'t matter anyway now, since we killed the code which was supposed to make this work!\n\n> What was wrong with the comparison you had in revision 6 of this patch? If you\n> want to stick to this one, please use a separator that isn\'t as likely to be\n> contained in either title or URL (such as \"\\n\" or even better \"\\0\").\n\nThe previous one had flaws, such as failing when both arrays were empty, but like I said it doesn\'t matter now, because all the tests regarding recently closed tabs have been removed now.',0.00,0,0,3838513,5,'345990',0),(248970,160571,'2008-11-02 16:34:19','(In reply to comment #493)\n> this test is run as the first test, before the SS component has\n> kicked in to write sessionstore.js for the first time.\n\nSo, you\'re still using a build without the fix for bug 395488? ;-)\n\n> BTW, there is an annoying bug in one of the sessionstore tests which\n> prevents one from running only tests in that directory.\n\nDoesn\'t happen on my machine. Please file a bug, indicating the offender.\n\nThanks again for your patience on this. r+=me',0.00,0,0,3838527,6,'345990',0),(248970,299942,'2008-11-02 16:39:12','Will the next bits be landing shortly?',0.00,0,0,3838532,0,NULL,0),(248970,251051,'2008-11-02 17:02:45','(In reply to comment #494)\n> > BTW, there is an annoying bug in one of the sessionstore tests which\n> > prevents one from running only tests in that directory.\n> \n> Doesn\'t happen on my machine. Please file a bug, indicating the offender.\n\nDone: bug 462794.\n\n> Thanks again for your patience on this. r+=me\n\nThank you for taking the time to review this over and over again!\n\n(In reply to comment #495)\n> Will the next bits be landing shortly?\n\nYeah, as soon as I get a review on the download manager changes, the whole thing (minus the DOM storage part) will land.',0.00,0,0,3838547,0,NULL,0),(248970,96908,'2008-11-03 01:23:46','>diff --git a/toolkit/components/downloads/src/nsDownloadManager.cpp b/toolkit/components/downloads/src/nsDownloadManager.cpp\n\n>- // The following three AddObserver calls must be the last lines in this function,\n>+ // The following nine AddObserver calls must be the last lines in this function,\n\nthis made me laugh, then cringe a little.\n\nlooks good to me, but really want to get sdwilsh\'s stamp on this ASAP.',0.00,0,0,3838748,6,'345902',0),(248970,233280,'2008-11-03 10:00:17','>diff --git a/toolkit/components/downloads/src/nsDownloadManager.cpp b/toolkit/components/downloads/src/nsDownloadManager.cpp\n>+ nsCOMPtr pbs =\n>+ do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID);\n>+ if (pbs) {\n>+ pbs->GetPrivateBrowsingEnabled(&mInPrivateBrowsing);\nThis function returns something, but you do not check that value. If you do not care about the return value, please cast to void (you do it elsewhere, but I\'m not going to comment on it anymore).\n\n\n>+ if (mInPrivateBrowsing)\n>+ Observe(nsnull, NS_PRIVATE_BROWSING_SWITCH_TOPIC,\n>+ NS_LITERAL_STRING(NS_PRIVATE_BROWSING_ENTER).get());\nI don\'t like using the Observe method like this (we aren\'t observing anything). Please break out the code that does the work for that and just call that method.\n\n>- // The following three AddObserver calls must be the last lines in this function,\n>+ // The following nine AddObserver calls must be the last lines in this function,\nnit: just remove three. people clearly do not update this number, and it\'s not useful anyway.\n\n>@@ -2027,16 +2039,54 @@ nsDownloadManager::Observe(nsISupports *\n> (void)pref->GetIntPref(PREF_BDM_RESUMEONWAKEDELAY, &resumeOnWakeDelay);\n> \n> // Wait a little bit before trying to resume to avoid resuming when network\n> // connections haven\'t restarted yet\n> mResumeOnWakeTimer = do_CreateInstance(\"@mozilla.org/timer;1\");\n> if (resumeOnWakeDelay >= 0 && mResumeOnWakeTimer) {\n> (void)mResumeOnWakeTimer->InitWithFuncCallback(ResumeOnWakeCallback,\n> this, resumeOnWakeDelay, nsITimer::TYPE_ONE_SHOT);\n>+ }\n>+ } else if (strcmp(aTopic, NS_PRIVATE_BROWSING_REQUEST_TOPIC) == 0 && currDownloadCount) {\nnit: line wrapping at 80 columns please\nnit: I know this method is not consistent, but please have the else if on a new line after the brace.\n\n>+ } else if (NS_LITERAL_STRING(NS_PRIVATE_BROWSING_LEAVE).Equals(aData)) {\nditto\n\n>+ } else if (strcmp(aTopic, NS_PRIVATE_BROWSING_SWITCH_TOPIC) == 0) {\nditto\n\n>+ } else if (NS_LITERAL_STRING(NS_PRIVATE_BROWSING_LEAVE).Equals(aData)) {\nditto\n\n>diff --git a/toolkit/components/downloads/test/unit/test_privatebrowsing.js b/toolkit/components/downloads/test/unit/test_privatebrowsing.js\n>+function get_PBSvc() {\n>+ try {\n>+ _PBSvc = Components.classes[\"@mozilla.org/privatebrowsing;1\"].\n>+ getService(Components.interfaces.nsIPrivateBrowsingService);\n>+ return _PBSvc;\n>+ } catch (e) {}\n>+ return null;\n>+}\n>+\n>+let _DMSvc = null;\n>+function get_DownloadManager() {\n>+ if (_DMSvc)\n>+ return _DMSvc;\n>+\n>+ return _DMSvc = Components.classes[\"@mozilla.org/download-manager;1\"].\n>+ getService(Components.interfaces.nsIDownloadManager);\n>+}\nThis doesn\'t follow convention of the rest of the download manager test files. We use Cc, Ci, etc. Also, if you want to use a lazy getter, please just use a smart getter:\nthis.__defineGetter__(\"dm\", function() {\n delete this.dm;\n return this.dm = Cc[\"@mozilla.org/download-manager;1\"].\n getService(Ci.nsIDownloadManager);\n});\n\n>+function is_download_available1(id, src, dst, name) {\njavadoc style comments, and please prefix pArameters with a.\n\n>+function is_download_available2(id, src, dst, name) {\nditto\n\n>+function run_test() {\n>+ let pb = get_PBSvc();\n>+ if (pb) { // Private Browsing might not be available\nIt makes the code a lot cleaner if you just return here instead of having everything inside an if block.\n\nGeneral comments for the rest of the test:\nYou use a few things like variable_nameNumber just because you have more than one. You can make the code easier to follow by using a let block:\nlet (timer = ...) {\n // use the variable\n}\n\nIn at least one place you wrap a bunch of code in a try block, and in the catch, you just report a test failure. This is unnecessary since the test will fail when an exception is thrown anyway. Please remove it.\n\nIt looks like you copied the code for addDownload in head_download_manager.js with some minor modifications. Any reason why you didn\'t modify that function and make it more flexible instead of copying and pasting code?\n\nYou have a long switch statement inside a long switch statement. Please pull out the second one into a method so it\'s easier to see what is going on.\n\nIt would also be really nice to have a comment at the top of the file explaining what, exactly, this test is doing because the code is hard to follow (it\'s very very long).\n\nI know it seems like I\'m being picky on the test, but if it ever starts to fail, I want people to be able to understand why instead so they have a chance to fix things.\n\n>diff --git a/toolkit/mozapps/downloads/content/downloads.js b/toolkit/mozapps/downloads/content/downloads.js\n> ////////////////////////////////////////////////////////////////////////////////\n> //// Utility Functions\nThere are, sadly, two places where we have utility functions in this file. Please add them to the bottom of the file, not the one at the top.\n\n>+function initStmt()\ninitStatement please, and include a javadoc comment (and include why we have it in a method)\n\n>+{\n>+ if (gStmt) {\n>+ gStmt.reset();\n>+ gStmt.finalize();\njust call finalize.\n\n>@@ -504,16 +517,24 @@ let gDownloadObserver = {\n>+ case \"private-browsing\":\n>+ if (aData == \"enter\" || aData == \"exit\") {\n>+ setTimeout(function() {\n>+ initStmt();\n>+ buildDownloadList(true);\n>+ }, 0);\n>+ }\nWhy are we doing this in a setTimeout? If there is a good reason, we should have a comment explaining why.',0.00,0,0,3839146,6,'345902',0),(248970,251051,'2008-11-03 12:46:30','(In reply to comment #498)\n> >+ if (mInPrivateBrowsing)\n> >+ Observe(nsnull, NS_PRIVATE_BROWSING_SWITCH_TOPIC,\n> >+ NS_LITERAL_STRING(NS_PRIVATE_BROWSING_ENTER).get());\n> I don\'t like using the Observe method like this (we aren\'t observing anything).\n> Please break out the code that does the work for that and just call that\n> method.\n\nDone. I added both OnEnterPrivateBrowsingMode and OnLeavePrivateBrowsingMode for parity.\n\n> General comments for the rest of the test:\n> You use a few things like variable_nameNumber just because you have more than\n> one. You can make the code easier to follow by using a let block:\n> let (timer = ...) {\n> // use the variable\n> }\n\nAs discussed on IRC, this wasn\'t necessary because I only had one timer! ;-)\n\n> In at least one place you wrap a bunch of code in a try block, and in the\n> catch, you just report a test failure. This is unnecessary since the test will\n> fail when an exception is thrown anyway. Please remove it.\n\nDone. For future reference, those were the places which we were running from a timer, where an exception is not caught by the unit test framework in the usual way. Without them, the test will time out if something throws there.\n\n> It looks like you copied the code for addDownload in head_download_manager.js\n> with some minor modifications. Any reason why you didn\'t modify that function\n> and make it more flexible instead of copying and pasting code?\n\nDone using the object-as-parameter approach Shawn suggested on IRC. One caller which did use the old-style parameter was patched as well.\n\n> I know it seems like I\'m being picky on the test, but if it ever starts to\n> fail, I want people to be able to understand why instead so they have a chance\n> to fix things.\n\nNo, not at all! I really appreciate all time time and energy you put into this. The new iteration is way better than the previous one in terms of readability and maintainability.\n\n> >@@ -504,16 +517,24 @@ let gDownloadObserver = {\n> >+ case \"private-browsing\":\n> >+ if (aData == \"enter\" || aData == \"exit\") {\n> >+ setTimeout(function() {\n> >+ initStmt();\n> >+ buildDownloadList(true);\n> >+ }, 0);\n> >+ }\n> Why are we doing this in a setTimeout? If there is a good reason, we should\n> have a comment explaining why.\n\nHmmm, I couldn\'t remember why I did that, but I think it should\'ve been a mistake. I removed the setTimeout call and tested the patch again to make sure everything\'s working properly.\n\nAll other comments and nits fixed as well.',0.00,0,0,3839446,5,'346103',0),(248970,233280,'2008-11-03 13:02:19','r=sdwilsh',0.00,0,0,3839472,6,'346103',0),(248970,251051,'2008-11-03 19:32:53','Private browsing code and dependencies landed (thanks Shawn). I\'ll update the bugs with changeset links and close it if everything stays green in about three hours.',0.00,0,0,3840060,0,NULL,0),(248970,251051,'2008-11-03 23:55:38','http://hg.mozilla.org/mozilla-central/rev/12487541851b',0.00,0,0,3840224,6,'345361',0),(248970,251051,'2008-11-03 23:56:08','http://hg.mozilla.org/mozilla-central/rev/a6712f1f6c4e',0.00,0,0,3840225,6,'345377',0),(248970,251051,'2008-11-03 23:57:13','http://hg.mozilla.org/mozilla-central/rev/c588d41a49e5',0.00,0,0,3840226,6,'345927',0),(248970,251051,'2008-11-03 23:57:46','http://hg.mozilla.org/mozilla-central/rev/743136ef83d9',0.00,0,0,3840227,6,'345990',0),(248970,251051,'2008-11-03 23:58:09','http://hg.mozilla.org/mozilla-central/rev/f67cc64a3517',0.00,0,0,3840228,6,'346103',0),(248970,251051,'2008-11-04 00:05:55','OK, I think this is now worth marking RESOLVED FIXED finally! :-)\n\nThe only test failure was filed as 462986 which already has a patch to fix the issue. The remaining work will be handled in separate bugs. I\'ll also file a bug to discuss what we want to do with the DOM Storage module for the final 3.1 release.',0.00,0,0,3840232,0,NULL,0),(248970,113380,'2008-11-04 06:06:59','+enterPrivateBrowsingCancelDownloadsAlertMsg=If you enter the Private Browsing mode now, 1 download will be canceled. Are you sure you want to enter the Private Browsing mode?\n+enterPrivateBrowsingCancelDownloadsAlertMsgMultiple=If you enter the Private Browsing mode now, %S downloads will be canceled. Are you sure you want to enter the Private Browsing mode?\n\nCould anyone tell why the built-in support for plural forms wasn\'t used here?',0.00,0,0,3840459,6,'346103',0),(248970,103593,'2008-11-04 09:05:58','(In reply to comment #508)\n> Could anyone tell why the built-in support for plural forms wasn\'t used here?\n\nBecause Ehsan hates localizers!\n\nReally though, better in general to just file a new bug when you notice someone like this, and CC the relevant people. :)',0.00,0,0,3840631,0,NULL,0),(458397,277293,'2008-11-04 12:14:53','seems this Memory Leak is on 1.9.1 bigger then on 1.9.0\n\n 0 TOTAL 39 52263449 17529916 2171241 (24239.31 +/- 0.00) 127384779 1144515 ( 8287.60 +/- 6056.31)\n\n\nnsTraceRefcntImpl::DumpStatistics: 709 entries\nnsStringStats\n => mAllocCount: 423244\n => mReallocCount: 65029\n => mFreeCount: 345432 -- LEAKED 77812 !!!\n => mShareCount: 497903\n => mAdoptCount: 113413\n => mAdoptFreeCount: 113397 -- LEAKED 16 !!!\nAssertion failed at c:/work/mozilla/builds/1.9.1-trace-malloc/mozilla/gfx/cairo/cairo/src/cairo-hash.c:199: hash_table->live_entries == 0\n\nhttp://www.grono.net: EXIT STATUS: NORMAL (754.041000 seconds)',0.00,0,0,3840890,5,'346303',0),(458397,277293,'2008-11-04 12:15:52','requesting blocking because of the results with Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b2pre) Gecko/20081030 Minefield/3.1b2pre, see comment#1',0.00,0,0,3840892,0,NULL,0),(248970,251051,'2008-11-04 13:02:52','(In reply to comment #508)\n> Could anyone tell why the built-in support for plural forms wasn\'t used here?\n\nThat\'s an oversight on my part, filed bug 463102 on that.\n\n(In reply to comment #509)\n> Because Ehsan hates localizers!\n\nThat\'d be weird, because I\'m also a localizer myself. ;-)',0.00,0,0,3840966,0,NULL,0),(248970,55600,'2008-11-06 04:38:29','Why are all windows closed when I go into private browsing mode? I would expect the window where I toggle the private browsing mode on, to go into private browsing mode.',0.00,0,0,3843370,0,NULL,0),(248970,251051,'2008-11-06 06:48:10','(In reply to comment #511)\n> Why are all windows closed when I go into private browsing mode? I would expect\n> the window where I toggle the private browsing mode on, to go into private\n> browsing mode.\n\nPrivate browsing mode is global, not per window/tab. Because we didn\'t have any way to associate only the newly opened window with the private browsing mode, we decided to close the current session to make the confusion about which tabs/pages were opened in private mode and which ones were not minimal.',0.00,0,0,3843500,0,NULL,0),(248970,283305,'2008-11-06 13:54:28','Ehsan: are we persisting the \"Save As...\" location? I completely forgot about that being something that we need to clear.',0.00,0,0,3844222,0,NULL,0),(248970,251051,'2008-11-06 15:24:48','(In reply to comment #513)\n> Ehsan: are we persisting the \"Save As...\" location? I completely forgot about\n> that being something that we need to clear.\n\nWe don\'t handle it currently. Can you please file a new bug and assign it to me to make sure I won\'t forget to work on it? Thanks!',0.00,0,0,3844355,0,NULL,0),(248970,251051,'2008-11-09 02:32:33','(In reply to comment #513)\n> Ehsan: are we persisting the \"Save As...\" location? I completely forgot about\n> that being something that we need to clear.\n\nFiled bug 463888 about this.',0.00,0,0,3847078,0,NULL,0),(248970,8519,'2008-11-12 11:09:35','https://litmus.mozilla.org/show_test.cgi?id=7394 added to Litmus.',0.00,0,0,3852038,0,NULL,0),(11040,254728,'2008-11-18 15:23:02','Now that custom filter actions are possible, I was able to add biff notification suppression as a custom action. My extension to provide this, which will be called FiltaQuilla, should be available soon after TB beta 1 is released (and will work with that version).',0.00,0,0,3861059,0,NULL,0),(11040,4410,'2008-11-18 15:28:37','Kent, that rocks, very nice.',0.00,0,0,3861066,0,NULL,0),(458397,12352,'2008-11-19 15:03:06','Leaks 85 windows, blocking.',0.00,0,0,3862788,0,NULL,0),(458397,24295,'2008-11-21 03:33:42','Stealing from bent.',0.00,0,0,3865261,0,NULL,0),(458397,24295,'2008-11-21 03:35:15','Didn\'t add unlinking for now, mContent is used in a bunch of places without null-checking.',0.00,0,0,3865262,5,'349397',0),(458397,24295,'2008-11-21 03:36:40','BTW, this fixes the leak on http://www.grono.net/. Not sure if it fixes all leaks on other pages, so Tomcat will need to retest after this lands.',0.00,0,0,3865264,0,NULL,0),(458397,200444,'2008-11-21 11:14:40','Yay!\n\n(Feel free to steal any and all of my leak bugs!)',0.00,0,0,3865796,6,'349397',0),(458397,233280,'2008-11-27 20:19:06','http://hg.mozilla.org/mozilla-central/rev/b81d78d6d81d',0.00,0,0,3873542,0,NULL,0),(248970,299942,'2008-12-10 17:31:05','Hello,\n\nToday I was using Firefox/3.1b2 and took notice that while in PB mode, shared objects/temp are still being serialized to disk (this is an Adobe Flash player feature) - as a result: page visits with flash that create shared objects are displayed clearly %appdata% profile.\n\ni.e., C:\\Users\\xxx\\AppData\\Roaming\\Macromedia\\Flash Player\\#SharedObjects\\4ZW9JGZ5\\tdcanadatrust.com\n\nWhere tdcanadatrust.com was the site I visited under PB mode. Not so private now :)\n\nI tested with Flash 10, FF 3.1b2 on Vista.\n\nIs this something we should address?',0.00,0,0,3889890,0,NULL,0),(248970,310130,'2008-12-10 17:42:58','I am not sure if this is even a flash issue even.',0.00,0,0,3889903,0,NULL,0),(248970,317549,'2008-12-10 17:52:52','I believe it is a feature called \"Flash Cookies\".',0.00,0,0,3889918,0,NULL,0),(248970,88484,'2008-12-10 18:12:51','(In reply to comment #517)\n> Hello,\n> Today I was using Firefox/3.1b2 and took notice that while in PB mode, shared\n> objects/temp are still being serialized to disk (this is an Adobe Flash player\n> feature) - as a result: page visits with flash that create shared objects are\n> displayed clearly %appdata% profile.\n> i.e., C:\\Users\\xxx\\AppData\\Roaming\\Macromedia\\Flash\n> Player\\#SharedObjects\\4ZW9JGZ5\\tdcanadatrust.com\n> Where tdcanadatrust.com was the site I visited under PB mode. Not so private\n> now :)\n> I tested with Flash 10, FF 3.1b2 on Vista.\n> Is this something we should address?\n\nFile a new bug if it isn\'t removed when you exit private browsing mode. Also make it dependent on this bug or at the very least post the bug number here.\n\nYou might also be needing these bugs to be fixed: bug 468879 and bug 468877',0.00,0,0,3889940,0,NULL,0),(248970,299942,'2008-12-10 18:30:52','Bug 46887 pretty much is the same idea at hand.',0.00,0,0,3889962,0,NULL,0),(248970,299942,'2008-12-10 18:32:06','^ Doh. Bug 468877',0.00,0,0,3889966,0,NULL,0),(248970,251051,'2008-12-11 01:42:01','Aaron: we are not going to provide plugin-specific protection for Flash, etc inside the Mozilla code. Bug 468877 is going to help with this issue if plugin vendors opt in to implement it. Bug 468879 will enable disabling all plugins in the private browsing mode, but that will only work for privacy conscious users who don\'t care if their private browsing session can\'t use plugins.\n\nAnd of course, extensions such as FlashBlock and NoScript can respond to private browsing mode changes to implement some amount of protection against this.',0.00,0,0,3890298,0,NULL,0),(248970,251051,'2008-12-18 01:39:21','Mass moving of all Firefox::General private browsing bugs to Firefox::Private Browsing.',0.00,0,0,3900224,0,NULL,0),(248970,61172,'2008-12-21 11:38:24','user-doc-complete\nhttp://support.mozilla.com/kb/Private+Browsing',0.00,0,0,3904671,0,NULL,0),(471427,259016,'2008-12-29 10:41:17','',0.00,0,0,3910763,0,NULL,0),(471427,259016,'2008-12-29 11:19:14','This is mostly the same as the l10n-upload-% target I landed last week. We have to separate out the win32 installer otherwise we\'ll end up with empty quotes on other platforms, which is interpreted as the cwd. I couldn\'t do the same sort of logic with the MARs on this one since we don\'t have a MOZ_MAKE_COMPLETE_MAR sortof var here. Only checking for existence here is fine though, imo.\n\nThe UPLOAD_EXTRA_FILES portion is currently going to be used for the $platform_info.txt files we must upload for releases. We\'ll probably have other uses for it later, though.',0.00,0,0,3910807,5,'354712',0),(471427,259016,'2008-12-29 11:24:22','This is similar to the l10n release build patch in that it subclasses the base build class for some nightly/release specific logic. The operations taking place for nightly builds have not changed at all - the upload step has just been moved to the subclass. The release builds are using the new upload target. I did not move the nightly builds to this in the interest of not making a big change right before I\'ll be gone for a week. I\'ll be moving them to the new target early in Q1.\n\nThe only other thing here is adding the \'env\' parameter to make package/installer/mar so MOZ_PKG_PRETTYNAMES is applied correctly for release builds.\n\nI gave this a go on staging and everything seemed to work properly.',0.00,0,0,3910814,5,'354713',0),(471427,259016,'2008-12-29 11:25:42','Not much to say about this one. It just gets nightly/release builds using the right Factory class and adds the appropriate parameters to the ReleaseBuildFactory calls.',0.00,0,0,3910818,5,'354714',0),(471427,30066,'2008-12-29 11:35:41','> + uploadEnv[\'UPLOAD_SSH_KEY\'] = \'~/.ssh/%s\' % self.stageSshKey\n\nDoes it make sense for us to check whether this key actually exists before calling the upload target?',0.00,0,0,3910827,6,'354713',0),(471427,259016,'2008-12-29 11:38:00','(In reply to comment #4)\n> (From update of attachment 354713 [details])\n> > + uploadEnv[\'UPLOAD_SSH_KEY\'] = \'~/.ssh/%s\' % self.stageSshKey\n> \n> Does it make sense for us to check whether this key actually exists before\n> calling the upload target?\n\nIt\'s kindof tough to, I\'m inclined to say \"meh\".',0.00,0,0,3910829,0,NULL,0),(471427,39022,'2008-12-30 10:37:45','I\'m not really happy with calling upload.py multiple times. We should be able to let make calculate all of this, and pass it in one go. You should just be able to leverage $(wildcard) here, which will return an empty string if the file doesn\'t exist, ( http://www.gnu.org/software/make/manual/make.html#Wildcard-Function ) so something like:\n$(PYTHON) $(topsrcdir)/build/upload.py --base-path $(DIST) \"$(DIST)/$(PACKAGE)\"\n$(wildcard $(DIST)/$(COMPLETE_MAR)) $(wildcard \"$(INSTALLER_PACKAGE)\")\n\nNot sure about UPLOAD_EXTRA_FILES. Are you intending that to be a list of files, or just a single file name or what? If a list of files, then you\'ll probably need something like:\n$(if $(UPLOAD_EXTRA_FILES),$(foreach f,$(UPLOAD_EXTRA_FILES),$(wildcard $(DIST)/$(f)))',0.00,0,0,3912004,6,'354712',0),(471427,259016,'2008-12-30 13:12:39','Alright, I\'ve implemented this the way you suggested. All files will be passed to upload.py at the same time, and the QUOTED_WILDCARD function you gave me fixes all of the problems I had trying to do this before.\n\nYou\'re absolutely right about UPLOAD_EXTRA_FILES, too, and I\'ve fixed that.',0.00,0,0,3912201,5,'354871',0),(471427,39022,'2008-12-30 13:21:56','+# deal with them.\n+space = $(empty) $(empty)\n\nYou should define $(empty) first, just:\nempty :=\n(I don\'t know that make really cares, but for sanity\'s sake.)\n\nI think you should use line continuations on the upload.py line, probably split it after the first $(DIST), then one arg per line after that will make it easier to read.\n\nLooks good, though!',0.00,0,0,3912214,6,'354871',0),(471427,259016,'2008-12-30 13:28:39','changeset: 634:41da1d8c2b2d',0.00,0,0,3912218,6,'354714',0),(471427,259016,'2008-12-30 13:29:26','Checking in factory.py;\n/cvsroot/mozilla/tools/buildbotcustom/process/factory.py,v <-- factory.py\nnew revision: 1.67; previous revision: 1.66\ndone',0.00,0,0,3912219,6,'354713',0),(471427,259016,'2008-12-30 13:36:22','checked in w/ nits fixed\nm-c: changeset: 23195:be8e227b1d8a\n1.9.1: changeset: 22557:c9b32bedc274',0.00,0,0,3912229,6,'354871',0),(11040,1537,'2009-01-09 16:09:57','While this would be nice, we\'re now at the point in the cycle where we have to start focussing on only the most critical bugs/features. While this would be nice to have, I don\'t think it belongs in that category. Setting wanted-. That said, Kent, you\'re more than welcome to submit a patch anyway.',0.00,0,0,3924541,0,NULL,0),(11040,254728,'2009-01-09 16:26:28','Suppression of BIFF is working well for me in the FiltaQuilla extension, so I\'m not sure it belongs in the main application anymore (or at least I don\'t have much motivation to put it there.) I do however wonder how the rest of the world gets along without suppression of BIFF from mailing lists, and the related custom sounds that ToneQuilla gives.\n\nLet me remove myself from assigned though to show that I am satisfied with the extension solution.',0.00,0,0,3924584,0,NULL,0),(11040,83436,'2009-01-09 16:54:38','I manage tbird BIFF by turning it off. It has been useless for me for years. It is useless otherwise. I\'ll try the extension.',0.00,0,0,3924638,0,NULL,0),(248970,76551,'2009-01-18 13:51:44','Everything is completed on this bug. No perf regressions with the checked-in patch. Now some weeks later we can mark this bug safely as verified. All remaining issues will be covered on their own bugs.',0.00,0,0,3935562,0,NULL,0),(248970,241123,'2009-02-11 13:11:30','Developer doc has been complete for a while now:\n\nhttps://developer.mozilla.org/en/Supporting_private_browsing_mode',0.00,0,0,3969736,0,NULL,0),(248970,15223,'2009-03-26 02:26:06','fwiw, comment 220\'s was addressed by bug 447648',0.00,0,0,4032990,0,NULL,0),(248970,15223,'2009-03-26 02:26:21','fwiw, comment 220 was addressed by bug 447648',0.00,0,0,4032991,0,NULL,0),(457765,278900,'2009-05-03 04:14:20','Thanks for reporting.',0.00,0,0,4082851,1,'324875',0),(248970,349399,'2009-06-23 16:20:01','I\'ve found a new bug. When I want to turn on Private/Porno Mode I have to use two hands (crtl+shift+p). Sometimes this is impossible, you know...',0.00,0,0,4165912,0,NULL,0),(248970,161650,'2009-06-23 18:56:22','(In reply to comment #530)\n> I\'ve found a new bug. When I want to turn on Private/Porno Mode I have to use\n> two hands (crtl+shift+p). Sometimes this is impossible, you know...\n\nThen use: Tools->Start Private browsing',0.00,0,0,4166118,0,NULL,0),(248970,88484,'2009-06-24 04:00:40','(In reply to comment #531)\n> (In reply to comment #530)\n> > I\'ve found a new bug. When I want to turn on Private/Porno Mode I have to use\n> > two hands (crtl+shift+p). Sometimes this is impossible, you know...\n> Then use: Tools->Start Private browsing\nYou can also use keyconfig (http://forums.mozillazine.org/viewtopic.php?f=48&t=72994&hilit=key) to change the access keys or toggle private browsing (https://addons.mozilla.org/en-US/firefox/addon/9517) to have a toolbar button to toggle between private and regular browsing modes.',0.00,0,0,4166502,0,NULL,0),(248970,29552,'2009-06-28 15:52:34','(In reply to comment #530)\n> I\'ve found a new bug. When I want to turn on Private/Porno Mode I have to use\n> two hands (crtl+shift+p). Sometimes this is impossible, you know...\n\nActually, you can type ctrl-shift-p with the right hand : almost all keyboards have ctrl and shift keys on the right hand side too. \n\nAnd may I congratulate you with the funniest bug report of the year :-)',0.00,0,0,4173351,0,NULL,0),(248970,350283,'2009-07-01 13:51:07','(In reply to comment #533)\n> Actually, you can type ctrl-shift-p with the right hand : almost all keyboards\n> have ctrl and shift keys on the right hand side too.\n\nObviously he\'s right-handed... :P But yes, he could still use his left hand to type the ctrl-shift-p assuming the keyboard supports it.',0.00,0,0,4179035,0,NULL,0),(248970,302581,'2009-07-02 06:27:33','Example: I use Windows with boot Camp on a mac computer\nI don\'t have a ctrl on the right side\n\nand: ctrl+shift+p is normally \'page setup\', so may be not a good combination',0.00,0,0,4180180,0,NULL,0),(248970,2687,'2009-07-10 19:01:44','there is a pretty interesting graphic about the kind of interest and impact this feature has had over in https://bug503576.bugzilla.mozilla.org/attachment.cgi?id=388008',0.00,0,0,4193505,0,NULL,0),(11040,101158,'2009-07-31 01:01:19','',0.00,0,0,4225682,2,'264634',0),(11040,362961,'2009-12-11 12:12:47','Being able to setup notifications using filters should be part of the base install. Requiring us to use an extension to do this is a poor choice. It\'s something that MS Outlook does out of the box.',0.00,0,0,4445590,0,NULL,0),(544327,279076,'2010-02-04 12:35:47','This is a placeholder bug for creating a Mozmill test script for the following Litmus test:\n\n[sessionstore] Normal exit without saving a session\nhttps://litmus.mozilla.org/show_test.cgi?id=6222 [Firefox 3.5]\nhttps://litmus.mozilla.org/show_test.cgi?id=8264 [Firefox 3.6]',0.00,0,0,4521658,0,NULL,0),(547727,325720,'2010-02-22 07:47:37','User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.3a2pre) Gecko/20100221 Minefield/3.7a2pre\nBuild Identifier: \n\nFirebug attaches itself as an observer to network requests,\nonce it gets called it tries to read the post body,\nthis fails since the object is already closed.\n\nThis happens for nsIXMLHttpRequests created in Firefogg\nhttp://bazaar.launchpad.net/~j/firefogg/trunk/annotate/head%3A/Firefogg/components/Firefogg.js#L1095\n\nthis fails here in firebug:\nhttp://code.google.com/p/fbug/source/browse/branches/firebug1.6/content/firebug/lib.js#3989\n\nwhen it is called here:\nhttp://code.google.com/p/fbug/source/browse/branches/firebug1.6/content/firebug/spy.js#281\n\nfor reference bug filed with firebug: http://code.google.com/p/fbug/issues/detail?id=2855\n\nReproducible: Always',0.00,0,0,4547594,0,NULL,0),(544327,76551,'2010-11-19 12:47:43','Mass move of Mozmill Test related project bugs to newly created components. You can filter out those emails by using \"Mozmill-Tests-to-MozillaQA\" as criteria.',0.00,0,0,5094585,0,NULL,0),(643420,137548,'2011-03-21 08:12:57','Taking, will edit .htaccess to remove this redirect I added in r83885',0.00,0,0,5357155,0,NULL,0),(643420,137548,'2011-03-21 08:14:58','Updated on trunk in r85826',0.00,0,0,5357158,0,NULL,0),(643420,137548,'2011-03-21 08:20:24','Confirmed fixed on trunk: http://www-trunk.stage.mozilla.com/en-US/firefox/comingsoon\n\nUpdated on stage in r85827\n\n(marking FIXED as per jlong, it\'ll get merged to production when we go live tomorrow)',0.00,0,0,5357170,0,NULL,0),(248970,113626,'2011-04-29 16:57:53','',0.00,0,0,5440788,2,'172993',0),(671185,246518,'2011-07-12 22:52:51','Problems discovered by static analysis and patched by hand.\n\nThis set of fixes touches stuff all over the place so I\'m requesting reviews from many people. To be clear:\n\nbjacob:\n content/canvas/src/WebGLContextValidate.cpp | 2 +-\n\ncpearce:\n content/media/ogg/nsOggCodecState.cpp | 2 +-\n\njosh:\n dom/plugins/base/nsPluginStreamListenerPeer.cpp | 3 +--\n\nehsan:\n editor/libeditor/base/nsSelectionState.cpp | 2 +-\n\nkhuey:\n layout/forms/nsFileControlFrame.cpp | 10 +++++-----\n\ndholbert:\n modules/libpr0n/src/VectorImage.cpp | 2 +-\n\nbiesi:\n netwerk/protocol/http/nsHttpChannelAuthProvider.cpp | 9 ++++++---\n\npike:\n rdf/base/src/nsRDFContainerUtils.cpp | 9 ++++++---\n\nbsmith:\n services/crypto/component/nsSyncJPAKE.cpp | 2 +-\n\nmak:\n browser/components/migration/src/nsProfileMigrator.cpp | 4 ++--\n toolkit/components/places/Helpers.h | 14 ++++++++++----\n toolkit/components/places/nsNavBookmarks.cpp | 2 +-\n toolkit/components/places/nsNavHistory.cpp | 4 ++--\n toolkit/components/places/nsNavHistoryResult.cpp | 14 +++++++++-----\n\ntaras:\n toolkit/components/telemetry/Telemetry.cpp | 2 +',0.00,0,0,5588360,5,'545596',0),(671185,278074,'2011-07-12 23:20:29','r=me (on the VectorImage line) Thanks for catching these!',0.00,0,0,5588380,6,'545596',0),(671185,8123,'2011-07-13 03:55:42','Review of attachment 545596:\n-----------------------------------------------------------------\n\nr=me on the RDF parts.',0.00,0,0,5588676,6,'545596',0),(671185,336670,'2011-07-13 08:48:29','Nice work.',0.00,0,0,5589055,6,'545596',0),(671185,18821,'2011-07-13 08:57:45','Review of attachment 545596:\n-----------------------------------------------------------------',0.00,0,0,5589079,6,'545596',0),(671185,240353,'2011-07-13 09:00:05','Review of attachment 545596:\n-----------------------------------------------------------------\n\nThank you!',0.00,0,0,5589083,6,'545596',0),(671185,261603,'2011-07-13 09:14:17','oops',0.00,0,0,5589117,6,'545596',0),(671185,287422,'2011-07-13 16:00:47','Thanks for pointing out this error.\n\nUnfortunately this condition is an unrecoverable error, and returning PR_FALSE from nsOggCodecState::PacketOutUntilGranulepos() doesn\'t enforce that. Just exclude the nsOggCodecState.cpp changes from your patch, and I\'ll make appropriate changes in another bug. Thanks!',0.00,0,0,5590210,6,'545596',0),(671185,251051,'2011-07-14 14:33:43','r=me on the editor hunk.',0.00,0,0,5592330,6,'545596',0),(671185,246518,'2011-07-20 16:56:53','Switching reviewers - bjacob -> joe on the WebGLContextValidate.cpp part.',0.00,0,0,5603279,6,'545596',0),(671185,382769,'2011-07-24 21:32:13','r+ for the WebGL part (back from vacation). Thanks for that.',0.00,0,0,5610296,6,'545596',0),(671185,246518,'2011-07-25 22:13:27','Thanks for all the reviews.\n\nhttp://hg.mozilla.org/integration/mozilla-inbound/rev/7a21ce9c4482',0.00,0,0,5613124,0,NULL,0),(671185,240353,'2011-07-26 04:06:10','http://hg.mozilla.org/mozilla-central/rev/7a21ce9c4482',0.00,0,0,5613441,0,NULL,0),(692436,292729,'2011-10-06 07:17:21','User Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0a1) Gecko/20111006 Firefox/10.0a1 Firefox/10.0a1\nBuild ID: 20111006041758\n\nSteps to reproduce:\n\nI downloaded the latest hourly build (Mozilla/5.0 (Windows NT 5.1; rv:10.0a1) Gecko/20111006 Firefox/10.0a1 Firefox/10.0a1 ID:20111006041758). This is the zipped version BTW. \n\n\nActual results:\n\nWhen you open the update channel you see that it is set to \"default\" instead of \"nightly\". This is also true for various other hourly builds from 10/5. The nightly build from 10/5 was OK.\n\n\nExpected results:\n\nUpdate channel should be \"nightly\"',0.00,0,0,5763251,5,'565211',0),(692436,161650,'2011-10-06 07:30:35','Confirmed, but its not limited to zip builds. I use hourly\'s almost all the time, and rarely a nightly build. My about:config shows \'default\' rather than \'nightly\'.\n\nUsing build:\napp.update.channel;default\nMozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0a1) Gecko/20111006 Firefox/10.0a1\nhttp://hg.mozilla.org/mozilla-central/rev/62ea504b378d',0.00,0,0,5763283,0,NULL,0),(692436,259016,'2011-10-06 07:36:49','I\'m pretty sure this is a result of bug 558180. I think this is WONTFIX\'able, though. I can\'t think of a use case for installing hourlies and wanting to get updated automatically. If you want nightlies, get a nightly. If you\'re downloading on-change builds, there\'s a specific reason you want to be on that build, right?',0.00,0,0,5763299,0,NULL,0),(692436,161650,'2011-10-06 07:43:10','Some of us use hourly builds, and on occasion, knowing full well I will get a full push, will go to Help-Check for updates, and grab a nightly. This serves some use in testing manually that the update system is still working. \n\nFor those that do bisection to find regression range for bugs will use hourly\'s to do so, then we would have to download a \'nightly\' to get back on track, otherwise testers are going to be confused why they are not getting updates, either manually or auto...',0.00,0,0,5763320,0,NULL,0),(692436,292729,'2011-10-06 07:49:01','What Ben says makes sense generally, but like Jim says I mostly use nightly builds, but when there are a lot of fixes I often use hourlies. This makes it kind of pain to have keep changing the channel. But not a deal breaker for me.',0.00,0,0,5763344,0,NULL,0),(692436,258668,'2011-10-06 07:50:00','(In reply to Ben Hearsum [:bhearsum] from comment #2)\n> I\'m pretty sure this is a result of bug 558180. I think this is\n> WONTFIX\'able, though. I can\'t think of a use case for installing hourlies\n> and wanting to get updated automatically. If you want nightlies, get a\n> nightly. If you\'re downloading on-change builds, there\'s a specific reason\n> you want to be on that build, right?\n\nBen,\n\nJust my two cents...\n\nMy use case is to download and install an hourly (.exe) over my regular Nightly installation either to test a bug fix that has just landed or because the hourly has a fix for a problem that affects the regular Nightly significantly to not want to use it. In the past, it was convenient that when the next day\'s Nightly build became available, I only needed to do a regular update and I was back on the regular Nightly with the desired bug patch in place.\n\nWith this in mind, it would be disappointing that hourlies would be built with the update channel set to \"default\" instead of \"nightly\" because of forcing the inconvenience of having to manually download/install the next day\'s Nightly to \"restore\" things to the way they were.',0.00,0,0,5763347,0,NULL,0),(692436,67981,'2011-10-06 08:31:10','I can\'t think of a use case for downloading an hourly build and wanting to stick with that build for the next one to six weeks, which is what a setting of \"default\" for the channel implies. It\'s probably better for the user (and for Mozilla) if the user gets notified reasonably soon that there is a newer build available.\n\n(When Firefox has fully implemented a silent update, it would probably be better if that doesn\'t happen after an hourly build is installed as you don\'t want to silently destroy a testing environment--but that\'s a topic for some other discussion.)',0.00,0,0,5763489,0,NULL,0),(692436,293623,'2011-10-20 16:44:21','Regression pushlog:\nhttp://hg.mozilla.org/mozilla-central/pushloghtml?fromchange=1ce1d59084e5&tochange=51d989ece4c5',0.00,0,0,5795911,0,NULL,0),(692436,30066,'2011-10-20 19:10:38','(In reply to Alice0775 White from comment #7)\n> Regression pushlog:\n> http://hg.mozilla.org/mozilla-central/\n> pushloghtml?fromchange=1ce1d59084e5&tochange=51d989ece4c5\n\nBased on this, it looks like we would simply need to set ${MOZ_UPDATE_CHANNEL} to \"nightly\" in the env for our dependent builds if this is something we\'d like to change.',0.00,0,0,5796118,0,NULL,0),(726635,128063,'2012-02-13 09:25:35','Establish criteria for reviewing community IT requests.',0.00,0,0,6056317,0,NULL,0),(726635,128063,'2012-03-13 10:09:17','Task force created to formalize this, and have it reviewed by council. Meeting soon.',0.00,0,0,6136253,0,NULL,0),(726635,128063,'2012-04-01 09:01:15','Need to decide how restrictive we want to be with applications, email sent to council.',0.00,0,0,6188472,0,NULL,0),(692436,338084,'2012-05-05 15:50:28','So this will not get fixed? I probably download an hourly maybe once or twice a week and run it side by side with nightly using \\Hourly and \\Nightly folders and -no-remote -P on the same profile. Sucks though that the installer won\'t know to install the hourly to my \\Hourly folder by default.',0.00,0,0,6283459,0,NULL,0),(726635,128063,'2012-07-23 11:50:29','First draft on wiki',0.00,0,0,6497445,0,NULL,0),(813650,373476,'2012-11-20 10:42:20','Currently crash stacks are of the form:\n\n{\ngetting files in \'/mnt/sdcard/tests/reftest/profile/minidumps/\'\nDownloading symbols from: http://ftp.mozilla.org/pub/mozilla.org/mobile/tinderbox-builds/mozilla-central-android-armv6/1353355545/fennec-20.0a1.en-US.android-arm-armv6.crashreporter-symbols.zip\nPROCESS-CRASH | Shutdown | application crashed (minidump found)\nCrash dump filename: /tmp/tmpEIdmpN/4c89b590-7ae7-4d61-565a1c7b-19bde431.dmp\nOperating system: Android\n 0.0.0 Linux 2.6.32.9-00002-gd8084dc-dirty #1 SMP PREEMPT Wed Feb 2 11:32:06 PST 2011 armv7l nvidia/harmony/harmony/harmony:2.2/FRF91/20110202.102810:eng/test-keys\nCPU: arm\n 0 CPUs\n\nCrash reason: SIGSEGV\nCrash address: 0x0\n\nThread 4 (crashed)\n 0 libxul.so!js::TraceChildren(JSTracer*, void*, JSGCTraceKind) [jsinferinlines.h : 1595 + 0x0]\n r4 = 0x4e2fb92c r5 = 0x5097a03f r6 = 0x00000000 r7 = 0x00000000\n r8 = 0x00000200 r9 = 0x548a2c0c r10 = 0x00000000 fp = 0xffffffff\n sp = 0x4e2fb748 lr = 0x53a81aa8 pc = 0x544ecc60\n Found by: given as instruction pointer in context\n 1 libxul.so!NoteJSChild [nsXPConnect.cpp : 719 + 0xe]\n r4 = 0x4e2fb92c r5 = 0x5097a03f r6 = 0x00000007 r7 = 0x00000000\n r8 = 0x4e2fb92c r9 = 0x00000001 r10 = 0x00000000 fp = 0x00242f08\n sp = 0x4e2fb788 pc = 0x53a81aa8\n Found by: call frame info\n...\n...\n}\n\nWhilst many crashes only occur during a small subset of tests (and as such can be starred by matching against the test filename), this still leaves:\n1) Shutdown crashes (of which there are too many open bugs, so we explicitly blacklist generating bug suggestions for them)\n2) Crashes that occur in so many different tests (eg GC related crashers)\n\n...both of which would benefit from being able to see the top frame in the annotated summary. (It would also improve our ability to confirm that crashes we are starring are actually the same; rather than just assuming so according to test name - if people don\'t open the full log).\n\nTo output the top frame we need to parse the minidump stackwalk output at:\nhttp://mxr.mozilla.org/mozilla-central/source/build/automationutils.py#168\n\n...and find the top frame by matching the line after the \"Process \\d+ (crashed)\", then output the PROCESS-CRASH in a form like:\n\nPROCESS-CRASH | testname | application crashed [@ top_frame]\n\nAs a follow-on bug we can even add a search link for the top frame to the annotated summary (likely added by the TBPL UI).\n\nFor reference for matching the top frame, common forms are:\n\n 0 libc.so + 0xa888\n\n 0 libnss3.so!nssCertificate_Destroy [certificate.c : 102 + 0x0]\n\n 0 mozjs.dll!js::GlobalObject::getDebuggers() [GlobalObject.cpp:89df18f9b6da : 580 + 0x0]\n\n 0 libxul.so!void js::gc::MarkInternal(JSTracer*, JSObject**) [Marking.cpp : 92 + 0x28]\n\n 0 crashinjectdll.dll!CrashingThread(void *) [crashinjectdll.cpp:2ee20348ae59 : 17 + 0x0]',0.00,0,0,6838711,0,NULL,0),(813650,373476,'2012-11-20 15:22:19','First pass:\nhttps://tbpl.mozilla.org/?tree=Try&rev=7cfcf4044c6e',0.00,0,0,6839870,0,NULL,0),(813650,373476,'2012-11-21 06:39:24','In order to output the PROCESS-CRASH line with the top frame (if found) appended, we need to hold off doing that log.info until after we\'ve called minidump stackwalk.\n\nHowever, we still want the PROCESS-CRASH line to be above the stacktrace, since otherwise when viewing the logs in TBPL, the anchor links to the PROCESS-CRASH line will unhelpfully link to the less relevant end of the stacktrace.\n\nAs such, this patch just queues up the minidump stackwalk related output until the end.',0.00,0,0,6841835,5,'683998',0),(813650,373476,'2012-11-21 06:48:59','* Whilst the regex used is a bit wtf, the alternative was iterating through every line, setting a flag once the \"Thread N (crashed)\" line found, scraping the line after that (still needing some regex) and then breaking after that. As such, I decided to just go with the horrific regex and give examples as to what we\'re trying to catch.\n\n* The \"universal_newlines=True\" is due to the minidump stackwalk output on Windows having CRLFs, which would otherwise break out regex (or at least require making it more complex).\n\n* We\'ll also need to change runpeptests.py (but not currently being used and will require adjusting the patch slightly + I guess we may end up using mozcrash there before we start using peptest again) and mozcrash (different repo). I\'ll file bugs for these two after this one; I\'m just keen to get this part landed asap to help sheriffs.\n\nTry run at:\nhttps://tbpl.mozilla.org/?tree=Try&rev=7cfcf4044c6e\n\nExamples of crashes with top frame on that try run:\nhttps://tbpl.mozilla.org/php/getParsedLog.php?id=17224313&tree=Try\nhttps://tbpl.mozilla.org/php/getParsedLog.php?id=17225063&tree=Try\nhttps://tbpl.mozilla.org/php/getParsedLog.php?id=17225055&tree=Try',0.00,0,0,6841861,5,'684004',0),(813650,39022,'2012-11-28 11:27:44','Review of attachment 683998:\n-----------------------------------------------------------------\n\nThis looks fine.',0.00,0,0,6860943,6,'683998',0),(813650,39022,'2012-11-28 12:01:23','Review of attachment 684004:\n-----------------------------------------------------------------\n\n::: build/automationutils.py\n@@ +183,5 @@\n> + # 0 mozjs.dll!js::GlobalObject::getDebuggers() [GlobalObject.cpp:89df18f9b6da : 580 + 0x0]\n> + # 0 libxul.so!void js::gc::MarkInternal(JSTracer*, JSObject**) [Marking.cpp : 92 + 0x28]\n> + match = re.search(r\"Thread \\d+ \\(crashed\\)\\n 0 (?:.*!)?(?:void )?([^\\[\\n]+)\", out)\n> + if match:\n> + topFrame = \"@ %s\" % match.group(1).strip()\n\nYeah, I\'m not digging this horrible regex. I think the simpler solution of iterating over the lines would be better. Something like:\nlines = out.splitlines()\nfor i, line in enumerate(lines):\n if \"(crashed)\" in line:\n topFrame = re.search(\"^0 ([^\\[]+)\", lines[out+1]).group(1)\n\n(regex needs more fiddling if you want to strip out library names, but whatever)\n\n@@ +198,5 @@\n> elif stackwalkPath and not os.path.exists(stackwalkPath):\n> stackwalkOutput.append(\"MINIDUMP_STACKWALK binary not found: %s\" % stackwalkPath)\n> + if not topFrame:\n> + topFrame = \"Unknown top frame\"\n> + log.info(\"PROCESS-CRASH | %s | application crashed [%s]\", testName, topFrame)\n\nnit: it\'d probably be clearer to put the @ in this string and have topFrame just be the bit from the stack trace.',0.00,0,0,6861103,6,'684004',0),(813650,373476,'2012-11-28 13:44:56','Using a loop this time :-)\n\n(In reply to Ted Mielczarek [:ted.mielczarek] from comment #5)\n> Something like:\n> lines = out.splitlines()\n> for i, line in enumerate(lines):\n> if \"(crashed)\" in line:\n> topFrame = re.search(\"^0 ([^\\[]+)\", lines[out+1]).group(1)\n> \n> (regex needs more fiddling if you want to strip out library names, but\n> whatever)\n\nThis causes exceptions if we don\'t match for whatever reason & results in having to shoehorn too much into one line, so I\'ve kept the |if match: topFrame = foo| of patch v1.\n\nThe strip() is also necessary otherwise we get the training space from examples 2-5 in comment 0. The alternative regex to avoid the strip is:\n\"^ 0 (?:.*!)?(?:void )?([^\\[]+[^ \\[]+)\"\n...which is even more of a mess, so I\'d rather stick with the strip().\n\n> @@ +198,5 @@\n> > elif stackwalkPath and not os.path.exists(stackwalkPath):\n> > stackwalkOutput.append(\"MINIDUMP_STACKWALK binary not found: %s\" % stackwalkPath)\n> > + if not topFrame:\n> > + topFrame = \"Unknown top frame\"\n> > + log.info(\"PROCESS-CRASH | %s | application crashed [%s]\", testName, topFrame)\n> \n> nit: it\'d probably be clearer to put the @ in this string and have topFrame\n> just be the bit from the stack trace.\n\nThis would prefix \"@\" to the \"Unknown top frame\" case, which seems counter-intuitive; which is why I kept these separate.\n\nTesting the changed lines in a standalone file seems to work fine & pyflakes doesn\'t complain. Will send to Try again before pushing as usual etc.',0.00,0,0,6861579,5,'686262',0),(813650,373476,'2012-11-28 13:46:14','Bah, qref.',0.00,0,0,6861590,5,'686264',0),(813650,373476,'2012-11-29 01:52:30','Oops forgot to set r?\n(See comment 6 for comment when attached)',0.00,0,0,6863304,6,'686264',0),(813650,373476,'2012-12-01 09:04:04','https://hg.mozilla.org/integration/mozilla-inbound/rev/e678ae110693\nhttps://hg.mozilla.org/integration/mozilla-inbound/rev/5216ba25182f',0.00,0,0,6871529,0,NULL,0),(813650,75935,'2012-12-01 18:02:54','https://hg.mozilla.org/mozilla-central/rev/e678ae110693\nhttps://hg.mozilla.org/mozilla-central/rev/5216ba25182f',0.00,0,0,6871903,0,NULL,0),(813650,373476,'2012-12-18 02:38:08','https://hg.mozilla.org/releases/mozilla-aurora/rev/4e7a71c31365\nhttps://hg.mozilla.org/releases/mozilla-aurora/rev/978b4f46db49\n\nhttps://hg.mozilla.org/releases/mozilla-beta/rev/aa43466faad2\nhttps://hg.mozilla.org/releases/mozilla-beta/rev/52a1c5824374\n\nhttps://hg.mozilla.org/releases/mozilla-b2g18/rev/0fd2e98a4b27\nhttps://hg.mozilla.org/releases/mozilla-b2g18/rev/f2c91a62946b\n\nhttps://hg.mozilla.org/releases/mozilla-esr17/rev/1734a9aa8636\nhttps://hg.mozilla.org/releases/mozilla-esr17/rev/c34cad5083fc',0.00,0,0,6924440,0,NULL,0),(544327,76551,'2013-06-04 21:10:55','This bug misses details about the test which now is even no longer accessible given that Litmus is gone. We decided to close this request.',0.00,0,0,7498780,0,NULL,0),(889880,428218,'2013-07-03 08:55:27','Here is the message I got from user twisfowt:\n\nFifteen (15) of my personas/themes deleted from getpersonas site prior to the migration still have entries on AMO. The gallery image is blank but there is a link to the large preview where there is a message \"...disabled by an administrator\".\n\nWith the new hover-to-add, the deleted theme is added to the addon appearance page but only the accent/background color is rendered; it appears the graphics have been deleted but not the pointers.\n\nYou can search for \"MacPro\" to see several of them. They also show up on on the Manage page, where I have a total of 153, but not on the Developer page, where I have only 138 - the difference of 15 in limbo.\n\nSince I can\'t access or delete these I\'m hoping you can. if not I guess they will become part of the immense internet dangling data dilemma.\n\nThe 15 in question are:\n\nhttps://addons.mozilla.org/en-US/firefo ... cproblue1/\nmacproblue2\nmacprogreen4\nmacprogrey\nmacpropurple2\nmacpropurple3\nmacpromaroon\nmacpromaroon2\nmacproorange\nmacprored2\nmacsortagreen\nmacsortapurple\nmactbargold\ntbirdmailolive\ntbirdmailthistle\n\n---\n\nComment from kmaglione: \"So the problem seems to be that the disabled personas show up in search results. It makes sense that there are only colors but no images (the colors are part of the persona JSON, the images are on our CDN, and we remove them when we disable an add-on). It also makes sense that they show up in the developer pages but not the user-facing pages.\"',0.00,0,0,7600169,0,NULL,0),(889880,475173,'2013-07-28 15:27:25','Since AmyT filed this bug based on my report, I\'m posting now to say that sometime over the last few days the primary problem - that these deleted/disabled-by-admin themes show up in search - is no longer the case. They are still there in the developer aspect, but that is not a significant problem. So far as I can see this bug now has zero importance and can be closed. - twisfowt',0.00,0,0,7685422,0,NULL,0),(889880,383219,'2013-07-29 09:45:32','We fixed this a few weeks ago. Thank you :)',0.00,0,0,7688111,0,NULL,0),(937428,446317,'2013-11-11 18:28:43','content team to update database fields on apps relevant to China',0.00,0,0,8068845,0,NULL,0),(692436,259016,'2013-11-14 14:04:55','(In reply to [not reading bugmail] from comment #9)\n> So this will not get fixed? I probably download an hourly maybe once or\n> twice a week and run it side by side with nightly using \\Hourly and\n> \\Nightly folders and -no-remote -P on the same profile. Sucks though that\n> the installer won\'t know to install the hourly to my \\Hourly folder by\n> default.\n\nThis is indeed the new way of things. I know it\'s inconvenient for some, but we\'ve been living with it for quite a long time without issue now.',0.00,0,0,8082297,0,NULL,0),(937428,446317,'2014-01-10 10:22:51','when you get a sec, status on this?\nhappy friday!!',0.00,0,0,8277065,0,NULL,0); /*!40000 ALTER TABLE `longdescs` ENABLE KEYS */; UNLOCK TABLES; @@ -2222,7 +2222,7 @@ CREATE TABLE `series_categories` ( LOCK TABLES `series_categories` WRITE; /*!40000 ALTER TABLE `series_categories` DISABLE KEYS */; -INSERT INTO `series_categories` VALUES (264,'\"\"'),(263,'\'\''),(174,'*.mozilla.org'),(165,'---'),(2,'-All-'),(569,'.NET (Microsoft)'),(522,'5 Years of Firefox'),(1191,'about:healthreport'),(841,'about:memory'),(78,'Accessibility'),(1167,'Account Help'),(484,'Account Manager'),(392,'Account Request: Hg'),(391,'Account Request: SVN'),(1360,'Account wizard'),(1035,'Accounting/Audit'),(895,'ach / Acholi'),(850,'Add-On'),(700,'Add-on Builder'),(1017,'Add-on Manager'),(677,'Add-on SDK'),(451,'Add-on Security'),(847,'Add-on Validation'),(968,'Add-ons'),(464,'Add-ons & Plugins'),(689,'Add-ons Cup'),(44,'Add-ons Manager'),(1373,'addons.instantbird.org (Remora)'),(251,'addons.mozilla.org'),(989,'Admin Tools'),(258,'Admin/Reviewer Tools'),(114,'Administration'),(715,'Administration/Accounting'),(267,'af / Afrikaans'),(846,'affiliates.mozilla.org'),(944,'affiliates.mozilla.org banners'),(743,'Afrikaans'),(570,'AIR (Adobe)'),(903,'Air Mozilla'),(1403,'Air Mozilla Space'),(393,'air.mozilla.com'),(253,'Airbag'),(653,'ak / Akan'),(744,'Akan'),(211,'Alarms'),(745,'Albanian'),(534,'all'),(612,'AMO'),(1079,'an / Aragonese'),(1039,'Analytics'),(1178,'Android Background Services'),(887,'Android Sync'),(1141,'Android Sync: Build & Test'),(1096,'Android: Firefox Account'),(1091,'Android: Product Announcements'),(214,'Annoyance Blocking'),(190,'API'),(1166,'API Requests'),(1155,'App Bar'),(1212,'App Center'),(45,'Application Update'),(714,'Applications'),(201,'Approvals'),(1132,'Apps'),(871,'AppSync'),(166,'ar / Arabic'),(746,'Armenian'),(411,'as / Assamese'),(747,'Assamese'),(748,'Asturian'),(93,'Asturian/ast-ES'),(1303,'Async Tooling'),(1399,'Audio/Visual Infrastructure'),(1298,'AudioChannel'),(154,'AUS'),(452,'AUS Server'),(99,'Autocomplete'),(906,'Autolog'),(684,'Automation Team Dashboard'),(1037,'Autophone'),(726,'Avast AV'),(727,'AVG AV'),(1018,'Awesomescreen'),(1255,'az / Azerbaijani'),(830,'Back-end'),(827,'Backend'),(1174,'Badges'),(1313,'Balrog: Backend'),(1314,'Balrog: Frontend'),(422,'Bandwagon'),(1034,'Bank Document'),(119,'Base'),(749,'Basque'),(257,'be / Belarusian'),(1040,'Bedrock'),(750,'Belarusian'),(751,'Bengali'),(440,'Bespin'),(624,'bespinplugins.mozillalabs.com'),(920,'Betafarm'),(911,'BigBlueButton'),(177,'bittorrent.mozilla.org'),(1199,'Bixie'),(646,'Blockers'),(370,'Blocklisting'),(1260,'Blog'),(1374,'blog.instantbird.com (WordPress)'),(875,'blog.mozilla.com/theden'),(855,'blog.mozilla.org'),(202,'Blowfish'),(1170,'Bluetooth'),(458,'bn-BD / Bengali'),(316,'bn-IN / Bengali, India'),(551,'Bookmarks'),(999,'Boot to Gecko'),(901,'Boot2Gecko'),(1216,'Boot2Gecko Graveyard'),(752,'Bosnian'),(96,'Bouncer'),(659,'br / Breton'),(373,'Brainstorm'),(753,'Breton'),(1,'Browser'),(542,'browserchoice.mozilla.com'),(854,'BrowserQuest'),(384,'BrowserTest'),(723,'Budget Requests'),(311,'Bug Tracking'),(3,'Bugzilla'),(38,'Bugzilla 2.18 Milestone'),(1198,'Bugzilla Anthropology Metrics'),(1320,'Bugzilla Change Notification'),(848,'Bugzilla Tweaks'),(815,'bugzilla.mozilla.org'),(171,'Build & Release'),(1182,'Build & Test'),(129,'Build Config'),(1375,'buildbot.instantbird.org'),(1277,'Buildduty'),(1038,'builds'),(754,'Bulgarian'),(497,'byob.mozilla.com'),(518,'BzAPI'),(939,'bzexport'),(227,'ca / Catalan'),(41,'CA Certificates'),(120,'CalDAV provider'),(4,'Calendar'),(209,'Calendar Views'),(5,'Camino'),(876,'Campaign'),(453,'Canonical'),(524,'Canvas: WebGL'),(1150,'careers.mozilla.org'),(60,'CaScadeS'),(755,'Catalan'),(6,'CCK'),(486,'Cesium'),(304,'Chat'),(1364,'Chat Core'),(67,'Chatzilla'),(728,'Checkpoint Zonealarm'),(634,'China - Press request'),(505,'Chocolate Factory'),(385,'Chrome'),(571,'Citrix'),(1087,'Client'),(1193,'Client: Android'),(1192,'Client: Desktop'),(196,'Cloning'),(474,'Cmd-line Features'),(507,'Code Coverage'),(526,'Code Quality'),(480,'Collaboration'),(558,'Collector Extension'),(465,'Command Line'),(1414,'Communications'),(916,'Community'),(1290,'Community Building Toolkit'),(438,'Community Giving'),(921,'Community IT Requests'),(984,'Community Tools'),(426,'communitystore.mozilla.org'),(729,'Comodo AV'),(730,'Comodo Firewall'),(529,'Compatibility Tools'),(128,'Component Registration'),(816,'Component Watching'),(1072,'Components'),(249,'Compose Window'),(59,'Composer'),(403,'Composition'),(415,'Concept Series'),(1402,'Conference Rooms'),(1343,'Consultative Svcs : Custom Dashboards and Reports'),(1341,'Consultative Svcs : Data Warehousing'),(1342,'Consultative Svcs : Standard Dashboards and Reports'),(1340,'Consultative Svcs : Subject Matter/BI/Metrics'),(1344,'Consultative Svcs : Training'),(567,'Contacts'),(1361,'Contacts window'),(406,'Content'),(1036,'Contractor Contract'),(814,'Contributor Engagement'),(1383,'Contributor Recognition'),(990,'Conumer Pages'),(1362,'Conversation'),(670,'Copy'),(1265,'Copy Editing and Review'),(435,'Copyright'),(1187,'Copyright & Patent'),(106,'Core'),(473,'Core Graveyard'),(356,'Corporate Governance'),(649,'crash'),(1376,'crash-stats.instantbird.com'),(182,'Crashes'),(501,'creative.mozilla.org'),(928,'Crestron'),(756,'Croatian'),(490,'Crypto'),(538,'cs / Czech'),(840,'csb / Kashubian'),(1129,'CSS'),(237,'CSS Editor'),(654,'Customer Care'),(1326,'Customer Request (Master Bug)'),(164,'CVS: Administration'),(157,'CVS: Copy'),(419,'cy / Welsh'),(1186,'Cyber-Security'),(118,'Czech/cs-CZ'),(925,'DAM'),(37,'Danish'),(466,'Dashboard'),(1050,'Dashboards'),(1324,'Data & BI Services Team'),(1194,'Data API'),(1195,'Data Collection'),(180,'Data Collection/Metrics'),(1331,'Data Ingestion : Client'),(1332,'Data Ingestion : External'),(1333,'Data Ingestion : One-Off'),(1329,'Data Ingestion : Ping'),(1330,'Data Ingestion : Standardised Payload'),(1338,'Data Processing : Aggregations and Views'),(1334,'Data Processing : ETL : Hadoop/Hbase/Hive target'),(1337,'Data Processing : ETL : JSON target'),(1336,'Data Processing : ETL : MySQL target'),(1335,'Data Processing : ETL : Vertica target'),(1339,'Data Processing : One-Off'),(1019,'Data Providers'),(1013,'Data Release Proposal'),(891,'Data request'),(285,'Data/Backend Reports'),(151,'Database'),(1085,'Datazilla'),(711,'de / German'),(1365,'Debug'),(622,'Debugger'),(1363,'Demo Add-ons'),(1287,'Demo Request'),(1047,'Demo Studio / Dev Derby'),(669,'Demos'),(265,'Dependency Views'),(7,'Derivatives'),(560,'Design'),(1410,'Design & UX'),(1051,'Design / user experience'),(1424,'Desktop'),(958,'Desktop Runtime'),(929,'detodosparatodos.org'),(1213,'Dev Kit'),(1321,'Developer Box'),(1128,'Developer Documentation'),(1210,'Developer Ecosystem'),(1284,'Developer Engagement'),(991,'Developer Pages'),(1312,'Developer Program'),(539,'Developer Tools'),(1137,'Developer Tools: 3D View'),(1269,'Developer Tools: App Manager'),(1423,'Developer Tools: Canvas Debugger'),(880,'Developer Tools: Console'),(879,'Developer Tools: Debugger'),(1138,'Developer Tools: Framework'),(1139,'Developer Tools: Graphic Commandline and Toolbar'),(881,'Developer Tools: Inspector'),(1384,'Developer Tools: Memory'),(1196,'Developer Tools: Netmonitor'),(1268,'Developer Tools: Object Inspector'),(1135,'Developer Tools: Profiler'),(1136,'Developer Tools: Responsive Mode'),(882,'Developer Tools: Scratchpad'),(1025,'Developer Tools: Source Editor'),(883,'Developer Tools: Style Editor'),(1323,'Developer Tools: User Stories'),(1315,'Developer Tools: WebGL Shader Editor'),(144,'developer.mozilla.org'),(115,'Developers'),(168,'Device Specific'),(1175,'DevOps'),(61,'Dialogs'),(252,'Dictionaries'),(8,'Directory'),(811,'Directory: Server'),(810,'Directory: UI'),(843,'Disability Access'),(596,'Discovery Pane'),(364,'Distribution/Bundling'),(572,'DivX'),(1143,'DMD'),(640,'Docs Platform'),(652,'Doctor JS'),(9,'Documentation'),(188,'Documentation Requests'),(1282,'DogfoodTriage'),(1131,'DOM'),(1267,'DOM :: Push Notifications'),(68,'DOM Inspector'),(1027,'DOM: Apps'),(1311,'DOM: Contacts'),(899,'DOM: Device Interfaces'),(956,'DOM: IndexedDB'),(1420,'DOM: Security'),(957,'DOM: Workers'),(819,'Domesday'),(694,'donate.mozilla.org'),(378,'Download Day'),(71,'Download Manager'),(36,'Downloading'),(718,'downloadmap.mozilla.org'),(1214,'Downloads'),(981,'Downloads Panel'),(496,'downloadstats.mozilla.com'),(853,'Dragnet'),(297,'Driving'),(679,'dteam'),(512,'DXR'),(369,'E-mail based Scheduling (iTIP/iMIP)'),(90,'E4X'),(1048,'Editing'),(467,'Editor'),(1249,'Editorial'),(945,'Eideticker'),(218,'el / Greek'),(813,'Elmo'),(671,'Email'),(1263,'Email Outreach'),(541,'Embedded'),(969,'Embedding: ActiveX Wrapper'),(963,'Embedding: GTK Widget'),(131,'Embedding: MFC Embed'),(1147,'Employee Safe Harbor'),(360,'Employment'),(1302,'Emulator'),(268,'en-ZA / English (South African)'),(641,'Engagement'),(1409,'Engagement Ladder'),(564,'Engineering'),(94,'English, United Kingdom/en-GB'),(191,'Environments'),(340,'eo / Esperanto'),(607,'Error Console'),(230,'es-AR / Spanish Argentina'),(478,'es-CL / Spanish (Chile)'),(455,'es-MX / Spanish (Mexico)'),(803,'ESET NOD32 AV'),(804,'ESET Smart Security'),(757,'Esperanto'),(758,'Estonian'),(416,'et / Estonian'),(924,'etherpad.mozilla.org'),(998,'etherpad@webtools.bugs'),(633,'EU - Press request'),(219,'eu / Basque'),(613,'Evangelism'),(603,'Event Requests'),(1366,'Eventloop'),(909,'Events'),(985,'Events Manager'),(1285,'Events Request'),(553,'Experimental Clients'),(336,'Extend Firefox'),(873,'Extension'),(235,'Extension Compatibility'),(531,'Extensions'),(238,'Extensions and Themes'),(1418,'Extensions: AntiSpam'),(978,'Extensions: BMO'),(959,'Extensions: BrowserID'),(1386,'Extensions: EditComments'),(907,'Extensions: FlagTypeComment'),(865,'Extensions: GuidedBugEntry'),(864,'Extensions: Inline History'),(1090,'Extensions: MozProjectReview'),(1161,'Extensions: MyDashboard'),(1070,'Extensions: Needinfo'),(1045,'Extensions: OrangeFactor'),(1163,'extensions: ProdCompSearch'),(1162,'Extensions: ProductDashboard'),(1006,'Extensions: Push'),(867,'Extensions: REMO'),(979,'Extensions: REST'),(1165,'Extensions: RestrictComments'),(1270,'Extensions: Review'),(885,'Extensions: SecureMail'),(995,'Extensions: Tracking Flags'),(966,'Extensions: TryAutoLand'),(1293,'Extensions: UserProfile'),(927,'Extron'),(731,'F-Secure AV'),(682,'f1'),(232,'fa / Persian'),(717,'Facebook'),(322,'Facebook Application'),(310,'Facilities Management'),(462,'Feed Discovery and Preview'),(475,'Feed Reader'),(442,'feeds.mozilla.com'),(374,'Fennec'),(866,'Fennec Native'),(697,'Fennec Profile Tool'),(492,'Fennec UI'),(896,'ff / Fulah'),(215,'fi / Finnish'),(197,'Fields'),(1052,'File attachments'),(53,'File Handling'),(1011,'FileLink'),(555,'Filters'),(1029,'Finance'),(407,'Find Backend'),(77,'Find Toolbar'),(759,'Finnish'),(10,'Firebird'),(42,'Firefox'),(321,'Firefox 3'),(429,'Firefox 3.5'),(1319,'Firefox Accounts'),(1007,'Firefox Affiliates'),(904,'Firefox Flicks'),(703,'Firefox for all'),(1016,'Firefox for Android'),(1071,'Firefox for Metro'),(1061,'Firefox Graveyard'),(1190,'Firefox Health Report'),(1180,'Firefox Health Report Service'),(647,'Firefox Home'),(1354,'Firefox Operations'),(1134,'Firefox OS'),(967,'Firefox Start'),(1292,'Firefox Sync'),(1142,'Firefox Sync: Cross-client'),(491,'Firefox UI'),(809,'Firefox: Backend'),(970,'Firefox: Common'),(808,'Firefox: Frontend'),(822,'firefoxgarden.org'),(692,'firefoxlive.mozilla.org'),(699,'Five Years of Firefox'),(498,'Fizzypop'),(573,'Flash (Adobe)'),(574,'Flash (Gnash)'),(600,'Flash (swfdec)'),(559,'FlightDeck'),(1168,'Flyouts'),(449,'Folder and Message Lists'),(1153,'Forget About Site'),(54,'Form Manager'),(305,'Forum'),(530,'Forums'),(1000,'Foundation'),(760,'Frisian'),(831,'Front-end'),(828,'Frontend'),(286,'Frontend Reports'),(1353,'FxA'),(220,'fy-NL / Frisian'),(221,'ga-IE / Irish'),(1063,'Gaia'),(1299,'Gaia Bindings'),(1097,'Gaia::Apps Management'),(1068,'Gaia::Browser'),(1102,'Gaia::Calculator'),(1067,'Gaia::Calendar'),(1103,'Gaia::Camera'),(1104,'Gaia::Clock'),(1105,'Gaia::Contacts'),(1106,'Gaia::Cost Control'),(1107,'Gaia::Dialer'),(1069,'Gaia::E-Mail'),(1120,'Gaia::Everything.me'),(1108,'Gaia::FMRadio'),(1109,'Gaia::Gallery'),(1099,'Gaia::Homescreen'),(1110,'Gaia::Music'),(1381,'Gaia::Notes'),(1111,'Gaia::PDF Viewer'),(1407,'Gaia::PerformanceTest'),(1355,'Gaia::Ringtones'),(1382,'Gaia::Search'),(1098,'Gaia::Settings'),(1112,'Gaia::SMS'),(1100,'Gaia::System'),(1114,'Gaia::System::Bluetooth'),(1322,'Gaia::System::Browser'),(1115,'Gaia::System::Facebook Integration'),(1116,'Gaia::System::Feedback'),(1117,'Gaia::System::First Time Experience'),(1358,'Gaia::System::Input Mgmt'),(1119,'Gaia::System::Keyboard'),(1118,'Gaia::System::Lockscreen'),(1316,'Gaia::System::Window Mgmt'),(1304,'Gaia::TestAgent'),(1300,'Gaia::UI Tests'),(1113,'Gaia::Video'),(1356,'Gaia::Wallpaper'),(1388,'Gaia::Wappush'),(1217,'Gaia:Calculator'),(1294,'Gaia:GithubBot'),(761,'Galician'),(691,'Gaming'),(325,'Garbage Collection (mmGC)'),(605,'gd / Scottish Gaelic'),(298,'Gecko 1.9'),(428,'Gecko 1.9.1'),(922,'Gecko Profiler'),(50,'General'),(1274,'General Automation'),(1325,'General Discussions'),(614,'General Mozilla'),(424,'Geolocation'),(762,'Georgian'),(30,'Gerv'),(400,'getfirebug.com'),(485,'getpersonas.com'),(431,'GFX: Color Management'),(137,'GFX: Photon'),(398,'gl / Galician'),(857,'GoFaster'),(575,'Google Talk'),(181,'Governance'),(236,'Graph Server'),(1261,'Graphic Design'),(162,'Graphics'),(1020,'Graphics, Panning and Zooming'),(974,'Graphics: Layers'),(975,'Graphics: Text'),(763,'Greek'),(11,'Grendel'),(417,'Gristmill'),(825,'GrouperFish'),(222,'gu-IN / Gujarati'),(764,'Gujarati'),(549,'hacks.mozilla.org'),(913,'Hardware'),(884,'Hardware Abstraction Layer (HAL)'),(1152,'Hardware Purchase'),(127,'Hebrew/he-IL'),(43,'Help'),(51,'Help Documentation'),(143,'Help Viewer'),(130,'Hendrix'),(1377,'hg.instantbird.org'),(401,'Hg: Customizations'),(281,'hi-IN / hindi'),(765,'Hindi'),(917,'History'),(1179,'Homepage Promos'),(457,'hr / Croatian'),(886,'HTML'),(1077,'HTML Bindings'),(62,'HTML Source Mode'),(837,'HTML5'),(812,'HTML5 Dashboard'),(433,'httpd.js'),(223,'hu / Hungarian'),(361,'Human Resources'),(766,'Hungarian'),(282,'hy-AM / Armenian'),(926,'iCal'),(1218,'ICAL.js Integration'),(767,'Icelandic'),(352,'id / Indonesian'),(495,'Identity'),(606,'ilo / Iloko'),(536,'Image: Painting'),(954,'IME'),(212,'Import and Export'),(194,'Import/Export'),(328,'Incoming Email'),(768,'Indonesian'),(1317,'inform.mozilla.org'),(1041,'Information Architecture & UX'),(890,'Infra'),(187,'Infrastructure'),(1221,'Infrastructure & Operations'),(660,'Infrastructure Security'),(662,'Infrastructure Security: Server Security'),(661,'Infrastructure Security: Web Security'),(1239,'Infrastructure: DNS'),(1243,'Infrastructure: LDAP'),(1242,'Infrastructure: Mail'),(1244,'Infrastructure: Monitoring'),(1247,'Infrastructure: OpenVPN'),(1246,'Infrastructure: Other'),(1240,'Infrastructure: Puppet'),(1245,'Infrastructure: Tools'),(1241,'Infrastructure: Zimbra'),(1148,'Initiative Review'),(628,'Input'),(1215,'Install/Update'),(52,'Installer'),(955,'Instant Messaging'),(1359,'Instantbird'),(1372,'Instantbird Servers'),(1125,'Integration'),(193,'Integrations'),(1422,'Intellego'),(818,'Interfaces/Integration'),(1406,'Internal Process'),(1352,'Internal Project (Master Bug)'),(1189,'Internet Governance'),(1184,'Internet Public Policy'),(619,'Interpreter'),(503,'intlstore.mozilla.org'),(1367,'IRC'),(562,'irc.mozilla.org'),(769,'Irish'),(394,'is / Icelandic'),(513,'ispdb'),(1095,'ISPDB Database Entries'),(1094,'ISPDB Server'),(635,'Japan - Press request'),(117,'Japanese/ja-JP(ja-JPM)'),(576,'Java (Apple)'),(577,'Java (IcedTea)'),(578,'Java (JEP)'),(579,'Java (Oracle)'),(580,'Java (Sun)'),(971,'Java APIs for DOM'),(972,'Java APIs to WebShell'),(296,'Java Embedding Plugin'),(973,'Java-Implemented Plugins'),(676,'Java: Live Connect'),(675,'Java: OJI'),(1130,'JavaScript'),(55,'JavaScript Console'),(69,'JavaScript Debugger'),(463,'JavaScript Debugging APIs'),(1307,'JavaScript Engine: JIT'),(1393,'JavaScript: GC'),(1392,'JavaScript: Internationalization API'),(1394,'JavaScript: Standard Library'),(379,'jemalloc'),(482,'Jetpack'),(645,'jetpackgallery.mozillalabs.com'),(519,'jetpacks.mozillalabs.com'),(1078,'JimDB'),(581,'JInitiator'),(423,'JIT Compiler (NanoJIT)'),(70,'joel'),(540,'JpSecure'),(1075,'JS Library'),(618,'JS Modules'),(331,'js-ctypes'),(510,'JSBridge'),(1272,'JSMarionette'),(12,'JSS'),(262,'ka / Georgian'),(1253,'kanbanzilla'),(770,'Kannada'),(163,'karl'),(732,'Kaspersky AV'),(771,'Kazakh'),(468,'Key Bindings'),(250,'Key Config Editor'),(79,'Keyboard Navigation'),(418,'Keywords'),(977,'Kilimanjaro'),(460,'kk / Kazakh'),(894,'km / Khmer'),(353,'kn / Kannada'),(306,'Knowledge Base'),(335,'Knowledge Base Articles'),(95,'Korean/ko-KR'),(1122,'Krad Radio'),(261,'ku / Kurdish'),(317,'Kubla'),(1053,'KumaScript'),(772,'Kurdish'),(516,'L10N'),(1074,'L20n'),(1207,'L20n.org'),(611,'Labs'),(668,'Labs Pack'),(399,'labs.mozilla.com'),(1049,'Landing pages'),(773,'Latvian'),(1258,'Launch'),(145,'Layout: Canvas'),(696,'learningfreedomandtheweb.org/'),(1083,'Leeroy'),(1042,'Legacy PHP system'),(355,'Legal'),(1177,'Legal and Abuse'),(664,'lg / Luganda'),(620,'Library'),(126,'Licensing'),(149,'Lightning'),(323,'Lightning: SeaMonkey Integration'),(898,'lij / Ligurian'),(476,'Linux/Maemo'),(116,'Listings'),(774,'Lithuanian'),(1278,'Loan Requests'),(295,'Localization'),(266,'Localization Server'),(1206,'Location'),(1054,'Login'),(1262,'Logo Design and Identity'),(159,'lpsolit'),(775,'Luganda'),(334,'lv / Latvian'),(35,'Mac OS Classic'),(776,'Macedonian'),(1062,'mach'),(604,'mai / Maithili'),(248,'Mail Window'),(13,'MailNews'),(402,'MailNews Core'),(488,'MailNews Core Graveyard'),(395,'mailnews-all'),(160,'MailNews: Addressbook'),(404,'MailNews: General'),(161,'MailNews: Message Display'),(204,'Maintenance Scripts'),(777,'Maithili'),(1254,'Make Valet'),(1203,'MakeAPI'),(1408,'Maker Party'),(778,'Malayalam'),(829,'ManifestParser'),(779,'Marathi'),(878,'Marionette'),(14,'Marketing'),(874,'Marketplace'),(709,'markup.mozilla.org'),(1288,'Material Review Request'),(1200,'MathML'),(733,'McAfee AV'),(330,'McCoy'),(1183,'mediawiki-bugzilla'),(724,'Mentorship'),(1273,'Mercurial Pushlog'),(1264,'Message Platform'),(447,'Message Reader UI'),(1088,'Metrics'),(1089,'Metrics and Firefox Health Report'),(869,'Metrics Data Ping'),(870,'Metrics Operations'),(1156,'Metro Operations'),(902,'MFBT'),(339,'Microformats'),(208,'Microsummaries'),(888,'Middleware'),(75,'Migration'),(26,'Milestones'),(15,'Minimo'),(387,'Minotaur'),(132,'mk / Macedonian'),(302,'ml / Malayalam'),(234,'mn / Mongolian'),(511,'Mobile'),(279,'Mobile Companion'),(1389,'mobilepartners.mozilla.org'),(382,'Mochitest'),(780,'Mongolian'),(892,'Moz TOS or License'),(1283,'mozext'),(932,'mozglue'),(537,'Mozilla Communities'),(450,'Mozilla Community Sites'),(461,'Mozilla Corporation'),(610,'Mozilla Corporation PR'),(186,'Mozilla Developer Center'),(638,'Mozilla Developer Network'),(1257,'Mozilla Foundation Communications'),(706,'Mozilla Grants'),(1171,'Mozilla Hacks'),(278,'Mozilla Labs'),(701,'Mozilla Labs Graveyard'),(16,'Mozilla Localizations'),(389,'Mozilla Messaging'),(868,'Mozilla Metrics'),(1133,'Mozilla Platform'),(625,'Mozilla PR'),(683,'Mozilla QA'),(722,'Mozilla Reps'),(655,'Mozilla Services'),(284,'Mozilla Stats'),(158,'Mozilla Store'),(1416,'Mozilla VPN: ACL requests'),(1417,'Mozilla VPN: Support requests'),(17,'mozilla.org'),(931,'mozilla.org.uk'),(566,'mozilla.status.net'),(27,'mozilla1.7alpha'),(343,'MozillaBuild'),(18,'MozillaClassic'),(1003,'mozillaignite'),(472,'mozillaservice.org'),(508,'mozillians.org'),(685,'Mozmill Automation'),(686,'Mozmill Crowd Extension'),(687,'Mozmill Result Dashboard'),(845,'Mozmill Shared Modules'),(648,'MozMill Tests'),(1101,'Mozpool'),(509,'MozRunner'),(329,'mozStorage Explorer'),(517,'MPL'),(582,'Mplayer'),(349,'mr / Marathi'),(960,'ms / Malay'),(734,'MSE AV'),(930,'my / Burmese'),(527,'Nanojit'),(650,'Narcissus'),(997,'Narro'),(861,'Native Android Wrapper'),(832,'Native iOS Wrapper'),(362,'NDA'),(337,'ne-NP / Nepali (Nepal)'),(494,'Needs Triage'),(1188,'Net Neutrality'),(1233,'NetOps: DC Carrier'),(1234,'NetOps: DC Other'),(1232,'NetOps: DC Port Configurations'),(1238,'NetOps: Office ACL Requests'),(1236,'NetOps: Office Carrier'),(1237,'NetOps: Office Other'),(1235,'NetOps: Office Wireless'),(1231,'NetOps: Other'),(1230,'NetOps: Projects'),(1368,'Netsoul'),(900,'Networking: DNS'),(609,'Networking: Domain Lists'),(246,'Networking: JAR'),(680,'Networking: WebSockets'),(312,'New Bugs'),(388,'New Frameworks'),(456,'New Tab'),(183,'Newsgroups'),(1158,'Newsletters'),(1252,'NFC'),(673,'Nightly Tester Tools'),(1197,'none'),(735,'Norton 360'),(736,'Norton AV'),(737,'Norton Confidential'),(91,'Norwegian/nb-NO'),(1010,'Notifications'),(269,'nr / Southern Ndebele'),(216,'NSIS Installer'),(270,'nso / Northern Sotho (Pedi)'),(602,'nspluginwrapper'),(19,'NSPR'),(20,'NSS'),(1295,'Nucleus'),(738,'Nvidia ActiveArmor'),(420,'oc / Occitan'),(1032,'Offer Letter'),(514,'Office'),(1421,'One and Done'),(29,'Open Bugs'),(996,'openbadges.org'),(557,'opentochoice.org'),(851,'OpenWebApps'),(658,'Operations'),(1349,'Operations : Data Quality / Data Event Research'),(1347,'Operations : Platform Troubleshooting and Recovery'),(1345,'Operations : System Administration'),(1348,'Operations : Tool Troubleshooting and Recovery'),(1346,'Operations : User Management'),(712,'Operations: Deployment Requests'),(805,'Operations: Hardware'),(806,'Operations: Metrics/Monitoring'),(292,'Operator'),(859,'Optimizing JIT'),(459,'or / Oriya'),(678,'Orange Factor'),(1220,'Orangutan'),(781,'Oriya'),(239,'OS Integration'),(1026,'OS.File'),(173,'Other'),(636,'Other - Press request'),(66,'Other Applications'),(1350,'Other: BI'),(1351,'Other: DW'),(1286,'Outreach Request'),(224,'pa-IN / Punjabi'),(56,'Page Info'),(1043,'Pages & Content'),(489,'Palm Sync'),(1281,'Pan and Zoom'),(849,'Pancake'),(34,'Panda'),(739,'Panda AV'),(1310,'Panning and Zooming'),(552,'Panning/Zooming'),(1149,'Partner Review'),(245,'Party Tool'),(333,'Password Manager'),(63,'Pasting'),(358,'Patent'),(992,'Payments/refunds'),(583,'PDF (Adobe)'),(584,'PDF (FoxIt)'),(961,'PDF Viewer'),(1391,'Peekaboo'),(247,'Penelope'),(863,'Peptest'),(1055,'Performance'),(1127,'Permission Manager'),(782,'Persian'),(1001,'Persona'),(414,'Personas'),(980,'Petri'),(643,'Philippines'),(1121,'Phishing Protection'),(629,'Phonebook'),(169,'Places'),(672,'planet.firefox.com/mobile'),(178,'planet.mozilla.org'),(1145,'planet.webmaker.org'),(858,'Planning'),(1279,'Platform Support'),(601,'Plugger'),(1357,'Plugin Click-To-Activate Whitelist'),(86,'Plugin Finder Service'),(147,'Plugin Listings'),(953,'plugincheck'),(568,'Plugins'),(535,'plugins.mozilla.org'),(206,'Policy'),(642,'Pontoon'),(988,'Popcorn Maker'),(987,'Popcorn.js'),(1395,'Powertool'),(291,'PRD Change Request'),(102,'Preferences'),(1205,'Preinstalled B2G Apps'),(1259,'Press'),(1405,'Press Clips'),(616,'Press corrections'),(101,'Printing'),(408,'Printing: Setup'),(421,'Prior Art'),(338,'Prism'),(893,'Privacy'),(1185,'Privacy and Data'),(357,'Privacy or EULA'),(1014,'Privacy Policies'),(1012,'Privacy Review'),(615,'Privacy/legal'),(436,'Private Browsing'),(123,'Problem Reporter'),(515,'Product'),(1181,'Product Announcements'),(148,'Product Site'),(1305,'Profile'),(74,'Profile: Roaming'),(651,'ProfileManager'),(623,'Profiler'),(405,'Project Organization'),(1066,'Project Review'),(1044,'Project Tracking'),(1173,'Projects'),(1202,'Protocols'),(288,'Provider: GData'),(210,'Provider: ICS/WebDAV'),(217,'Provider: WCAP'),(21,'PSM'),(231,'pt-PT/Portuguese'),(630,'PTO'),(64,'Publishing'),(666,'Pulse'),(783,'Punjabi'),(1033,'Purchase Requeste Form'),(1076,'Python Library'),(500,'PyXPCOM'),(319,'QA Community Extension'),(39,'QA Queries'),(702,'QA Test Scripts'),(1256,'qbackout'),(533,'qimportbz'),(444,'QMO (quality.mozilla.org)'),(445,'QMO: Content'),(446,'QMO: Website'),(597,'Quake Live'),(300,'quality.mozilla.org'),(637,'Questions'),(1082,'QuickLaunch (AKA turbo mode)'),(585,'QuickTime (Apple)'),(523,'Raindrop'),(1081,'Readability'),(1021,'Reader Mode'),(586,'RealPlayer (Real)'),(1151,'Reference Apps'),(432,'Reftest'),(1275,'Release Automation'),(368,'Release Engineering'),(946,'Release Engineering: Automation'),(441,'Release Engineering: Custom Builds'),(950,'Release Engineering: Developer Tools'),(1271,'Release Engineering: Loan Requests'),(947,'Release Engineering: Machine Management'),(367,'Release Engineering: Maintenance'),(948,'Release Engineering: Platform Support'),(366,'Release Engineering: Projects'),(962,'Release Engineering: Release Automation'),(949,'Release Engineering: Releases'),(1276,'Releases'),(1390,'Releases: Custom Builds'),(528,'Relic'),(1248,'RelOps'),(1251,'RelOps: Puppet'),(914,'Rendering'),(124,'Reporter'),(125,'Reporter Webtool'),(195,'Reports'),(716,'Reports/Deliverables'),(1280,'Repos and Hooks'),(802,'reps.mozilla.org'),(705,'Research'),(313,'Resolved Bugs'),(993,'Reviewer Tools'),(153,'Reviews'),(342,'Rewriting and Analysis'),(22,'Rhino'),(1301,'RIL'),(483,'rm / Romansh'),(225,'ro / Romanian'),(784,'Romanian'),(785,'Romansh'),(1401,'Room Control'),(1208,'Rosetta Stone'),(76,'RSS'),(156,'RSS Discovery and Preview'),(226,'ru-RU / Russian'),(1425,'Runtime'),(786,'Russian'),(545,'Rust'),(290,'rw / Kinyarwanda'),(1209,'Safari Books Online'),(184,'Safe Browsing'),(1160,'sah / Sakha'),(1164,'Sandstone'),(100,'Satchel'),(65,'Saving'),(908,'Schedule'),(787,'Scottish-Gaelic'),(332,'ScreamingMonkey'),(1002,'Scrumbugs'),(134,'SeaMonkey'),(32,'SeaMonkey (2)'),(48,'Search'),(205,'Search Plugins'),(133,'Security'),(1398,'Security Assurance: FxOS Review'),(952,'Security Assurance: Incident'),(951,'Security Assurance: Review Needed'),(139,'Security: PSM'),(138,'Security: S/MIME'),(140,'Security: UI'),(326,'Self-hosting compiler (ESC)'),(1056,'SEO'),(788,'Serbian'),(469,'Server'),(293,'Server Operations'),(170,'Server Operations Projects'),(256,'Server Operations: Account Requests'),(860,'Server Operations: ACL Request'),(934,'Server Operations: AMO Operations'),(1144,'Server Operations: Change Requests'),(1219,'Server Operations: Community IT'),(820,'Server Operations: Database'),(938,'Server Operations: DCOps'),(935,'Server Operations: Developer Services'),(923,'Server Operations: Infrastructure'),(1426,'Server Operations: MOC'),(255,'Server Operations: MV Desktop Issues'),(665,'Server Operations: Netops'),(314,'Server Operations: Security'),(283,'Server Operations: Statistics'),(936,'Server Operations: Storage'),(852,'Server Operations: Telecom'),(287,'Server Operations: Tinderbox Maintenance'),(937,'Server Operations: Virtualization'),(425,'Server Operations: Weave'),(254,'Server Operations: Web Content Push'),(704,'Server: Account Portal'),(1291,'Server: Firefox Accounts'),(693,'Server: Identity'),(690,'Server: Key Exchange'),(657,'Server: Other'),(1092,'Server: Product Announcements Campaign Manager'),(1093,'Server: Product Announcements Redirector'),(656,'Server: Registration'),(721,'Server: Share'),(918,'Server: Token'),(698,'Server:Core'),(836,'Service'),(544,'Servo'),(280,'Session Restore'),(556,'Session Save/Restore'),(719,'Share: Firefox Client'),(720,'Share: Web Client'),(1073,'Shell'),(47,'Shell Integration'),(964,'Sheriff'),(587,'Shockwave (Adobe)'),(1289,'Shumway'),(348,'si / Sinhala'),(240,'Sidebars'),(588,'Silverlight (Microsoft)'),(589,'Silverlight (Mono)'),(1397,'Simulator'),(789,'Sinhala'),(437,'Sisyphus'),(1057,'Site search'),(824,'Sites'),(167,'sk / Slovak'),(229,'sl / Slovene'),(790,'Slovak'),(791,'Slovenian'),(823,'Snippets'),(412,'Snowl'),(1008,'Social Integration'),(933,'Social Media'),(983,'SocialAPI'),(1084,'SocialAPI: Providers'),(344,'Socorro'),(546,'Socorro Hadoop Cluster'),(1396,'Software'),(663,'son / Songhay'),(792,'Songhai'),(872,'Soup'),(241,'Source View'),(40,'Spanish'),(710,'spark.mozilla.org'),(396,'Spatial navigation'),(817,'Splinter'),(176,'spreadfirefox.com'),(430,'spreadthunderbird.com'),(228,'sq / Albanian'),(294,'sr / Serbian'),(271,'ss / Swazi'),(1015,'ssltunnel'),(631,'SSO'),(272,'st / Southern Sotho'),(1404,'Staff Email'),(434,'Standards'),(242,'Startup'),(46,'Startup and Profile System'),(351,'Statistics'),(372,'Statistics (General)'),(85,'Storage'),(121,'Storage provider'),(327,'store.mozilla.org'),(915,'Streaming'),(563,'studentreps.mozilla.org'),(826,'Submission'),(1415,'Support'),(303,'support.mozilla.com'),(1146,'support.mozilla.org Graveyard'),(532,'support.mozillamessaging.com'),(838,'Surveys'),(1028,'SUTAgent'),(1201,'SVG'),(839,'sw / Swahili'),(499,'Swag Requests'),(793,'Swedish'),(92,'Swedish/sv-SE'),(740,'Symantec AV'),(741,'Symantec Endpoint Protection'),(493,'Sync'),(707,'Sync UI'),(470,'Syntax Highlighting'),(155,'Systems'),(315,'ta / Tamil'),(443,'ta-LK / Sri Lankan Tamil'),(481,'ta-LK / Tamil (Sri Lanka)'),(57,'Tabbed Browser'),(243,'Tabbed Editor'),(608,'TabCandy'),(87,'Table'),(1157,'Tabzilla'),(192,'Tags'),(1058,'Tags / flags'),(88,'Talkback'),(487,'Talkback Client'),(89,'Talkback General'),(1169,'Talkilla'),(386,'Talos'),(259,'Tamarin'),(794,'Tamil'),(877,'TaskBoard'),(1385,'TaskCluster'),(213,'Tasks'),(674,'TCM'),(708,'TCM-Platform'),(345,'te / Telugu'),(1411,'Teaching Kits / Curriculum'),(23,'Tech Evangelism'),(834,'Telemetry'),(1204,'Telemetry Dashboard'),(1297,'Telemetry Server'),(795,'Telugu'),(31,'Test'),(199,'Test Cases'),(504,'Test Pilot'),(681,'Test Pilot Data Requests'),(561,'Test Pilot Studies'),(198,'Test Plans'),(200,'Test Runs'),(73,'Test Tracker'),(318,'Test++'),(207,'Testing'),(543,'Testing Infrastructure'),(189,'Testopia'),(1159,'Tests'),(1022,'Text Selection'),(397,'th / Thai'),(796,'Thai'),(347,'Theme'),(1023,'Theme and Visual Design'),(409,'Themes'),(1176,'Thimble'),(833,'Thumbnailer'),(24,'Thunderbird'),(471,'Thunderhead'),(520,'Tinderboxpushlog'),(82,'Tip of the Day'),(273,'tn / Tswana'),(1328,'Tool Development & Maintenance : Data Ingestion'),(1327,'Tool Development & Maintenance : ETL'),(554,'Toolbar'),(244,'Toolbars'),(448,'Toolbars and Tabs'),(103,'Toolbars and Toolbar Customization'),(821,'Toolbox'),(98,'Toolkit'),(695,'Toolkit Graveyard'),(454,'Tools'),(506,'tools.mozilla.com'),(599,'Totem'),(856,'TPS'),(350,'Tracing Virtual Machine'),(976,'Tracking'),(359,'Trademark'),(83,'Trademark Permissions'),(141,'Trademark Violations'),(1412,'Training'),(80,'Translations'),(1064,'Tree Status'),(742,'Trend Micro AV'),(371,'Triage (UNCO bugs)'),(346,'Try Server'),(274,'ts / Tsonga'),(383,'TUnit'),(797,'Turkish'),(105,'Turkish/tr-TR'),(1369,'Twitter'),(413,'Ubiquity'),(919,'UDC'),(289,'uk / Ukrainian'),(798,'Ukrainian'),(28,'unconf'),(301,'Unconfirmed'),(185,'Uninstall Survey'),(905,'Untriaged'),(965,'Untriaged Bugs'),(49,'Update'),(146,'Update Services'),(1378,'update.instantbird.org'),(203,'Upload Requests'),(1080,'ur / Urdu'),(626,'US - Legal'),(632,'US - Press request'),(627,'US - Security'),(1296,'User Engagement'),(113,'User Interface'),(1046,'User management'),(1059,'User profiles'),(1140,'User Story'),(1413,'User Testing'),(688,'Users and Groups'),(994,'Validation'),(275,'ve / Venda'),(1123,'Vendcom'),(1031,'Vendor Amendment'),(617,'Vendor requests'),(1065,'Vendor Review'),(1030,'Vendor SOW'),(363,'Vendor/Services'),(910,'Venues'),(590,'VeohTV (Veoh)'),(381,'Verbatim'),(621,'Verifier'),(479,'Version Control'),(427,'vi / Vietnamese'),(525,'Video'),(410,'Video/Audio'),(548,'Video/Audio Controls'),(1419,'Video/Audio: Recording'),(912,'Vidyo'),(1400,'Vidyo Infrastructure'),(799,'Vietnamese'),(58,'View Source'),(591,'Viewpoint Media Player'),(324,'Virtual Machine'),(592,'VLC (VideoLAN)'),(341,'Weave'),(439,'Weave Server'),(1060,'Web Analytics'),(807,'Web Apps'),(1229,'Web Audio'),(1211,'Web Components'),(1086,'Web service'),(72,'Web Site'),(1387,'web-platform-tests'),(889,'Webapp'),(1005,'Webapp Runtime'),(122,'WebDAV'),(365,'Webdev'),(1172,'Webmaker'),(1306,'Webmaker-suite'),(1004,'webmaker.org'),(1226,'WebOps: Bugzilla'),(1224,'WebOps: Community Platform'),(1223,'WebOps: Engagement'),(1250,'WebOps: Inventory'),(1228,'WebOps: IT-Managed Tools'),(1308,'WebOps: Other'),(1222,'WebOps: Product Delivery'),(1225,'WebOps: Socorro'),(1227,'WebOps: Source Control'),(1309,'WebOps: SSL and Domain Names'),(982,'Webpagemaker'),(598,'WebQA'),(942,'WebRTC: Audio/Video'),(940,'WebRTC: General'),(943,'WebRTC: Signaling'),(941,'WebRTC:: Networking'),(320,'WebRunner'),(260,'WebService'),(639,'Website'),(667,'website-archive.mozilla.org'),(172,'Websites'),(644,'Websites Graveyard'),(390,'Webtest'),(25,'Webtools'),(547,'Webtools Graveyard'),(844,'Webtrends'),(800,'Welsh'),(81,'Whining'),(135,'Widget'),(521,'Widget: Android'),(107,'Widget: BeOS'),(152,'Widget: Cocoa'),(1024,'Widget: Gonk'),(108,'Widget: Gtk'),(109,'Widget: Mac'),(110,'Widget: OS/2'),(136,'Widget: Photon'),(375,'Widget: Qt'),(376,'Widget: Symbian S60'),(111,'Widget: Win32'),(377,'Widget: Windows Mobile'),(1154,'Widget: WinRT'),(112,'Widget: Xlib'),(1124,'Wifi'),(1379,'wiki.instantbird.org'),(725,'wiki.mozilla.org'),(593,'Windows Media Player (Flip4Mac)'),(594,'Windows Media Player (Microsoft)'),(477,'Windows Mobile'),(1009,'WinQual Reports'),(1126,'Witness'),(1318,'WMF'),(897,'wo / Wolof'),(835,'Workers'),(862,'workshop.mozilla.org'),(550,'www.drumbeat.org'),(1380,'www.instantbird.com'),(307,'www.mozilla-europe.org'),(308,'www.mozilla-japan.org'),(175,'www.mozilla.com'),(380,'www.mozilla.jp'),(713,'www.mozilla.org'),(309,'www.mozilla.org.cn'),(354,'www.mozillamessaging.com'),(502,'www.schooloffirefox.com'),(565,'www.seamonkey-project.org'),(1266,'X-Ray Goggles'),(84,'XForms'),(276,'xh / Xhosa'),(595,'Xine'),(1370,'XMPP'),(104,'XRE Startup'),(97,'XTF'),(299,'XUL Explorer'),(150,'XUL Widgets'),(142,'XULRunner'),(1371,'Yahoo! Messenger'),(842,'Your Web'),(233,'za / South Africa'),(179,'zh-TW / Chinese (Traditional)'),(33,'Zoo'),(277,'zu / Zulu'),(801,'Zulu'); +INSERT INTO `series_categories` VALUES (264,'\"\"'),(263,'\'\''),(174,'*.mozilla.org'),(165,'---'),(2,'-All-'),(569,'.NET (Microsoft)'),(522,'5 Years of Firefox'),(1191,'about:healthreport'),(841,'about:memory'),(78,'Accessibility'),(1167,'Account Help'),(484,'Account Manager'),(392,'Account Request: Hg'),(391,'Account Request: SVN'),(1360,'Account wizard'),(1035,'Accounting/Audit'),(895,'ach / Acholi'),(850,'Add-On'),(700,'Add-on Builder'),(1017,'Add-on Manager'),(677,'Add-on SDK'),(451,'Add-on Security'),(847,'Add-on Validation'),(968,'Add-ons'),(464,'Add-ons & Plugins'),(689,'Add-ons Cup'),(44,'Add-ons Manager'),(1373,'addons.instantbird.org (Remora)'),(251,'addons.mozilla.org'),(989,'Admin Tools'),(258,'Admin/Reviewer Tools'),(114,'Administration'),(715,'Administration/Accounting'),(267,'af / Afrikaans'),(846,'affiliates.mozilla.org'),(944,'affiliates.mozilla.org banners'),(743,'Afrikaans'),(570,'AIR (Adobe)'),(903,'Air Mozilla'),(1403,'Air Mozilla Space'),(393,'air.mozilla.com'),(253,'Airbag'),(653,'ak / Akan'),(744,'Akan'),(211,'Alarms'),(745,'Albanian'),(534,'all'),(612,'AMO'),(1079,'an / Aragonese'),(1039,'Analytics'),(1178,'Android Background Services'),(887,'Android Sync'),(1141,'Android Sync: Build & Test'),(1096,'Android: Firefox Account'),(1091,'Android: Product Announcements'),(214,'Annoyance Blocking'),(190,'API'),(1166,'API Requests'),(1155,'App Bar'),(1212,'App Center'),(45,'Application Update'),(714,'Applications'),(201,'Approvals'),(1132,'Apps'),(871,'AppSync'),(166,'ar / Arabic'),(746,'Armenian'),(411,'as / Assamese'),(747,'Assamese'),(748,'Asturian'),(93,'Asturian/ast-ES'),(1303,'Async Tooling'),(1399,'Audio/Visual Infrastructure'),(1298,'AudioChannel'),(154,'AUS'),(452,'AUS Server'),(99,'Autocomplete'),(906,'Autolog'),(684,'Automation Team Dashboard'),(1037,'Autophone'),(726,'Avast AV'),(727,'AVG AV'),(1018,'Awesomescreen'),(1255,'az / Azerbaijani'),(830,'Back-end'),(827,'Backend'),(1174,'Badges'),(1313,'Balrog: Backend'),(1314,'Balrog: Frontend'),(422,'Bandwagon'),(1034,'Bank Document'),(119,'Base'),(749,'Basque'),(257,'be / Belarusian'),(1040,'Bedrock'),(750,'Belarusian'),(751,'Bengali'),(440,'Bespin'),(624,'bespinplugins.mozillalabs.com'),(920,'Betafarm'),(911,'BigBlueButton'),(177,'bittorrent.mozilla.org'),(1199,'Bixie'),(646,'Blockers'),(370,'Blocklisting'),(1260,'Blog'),(1374,'blog.instantbird.com (WordPress)'),(875,'blog.mozilla.com/theden'),(855,'blog.mozilla.org'),(202,'Blowfish'),(1170,'Bluetooth'),(458,'bn-BD / Bengali'),(316,'bn-IN / Bengali, India'),(551,'Bookmarks'),(999,'Boot to Gecko'),(901,'Boot2Gecko'),(1216,'Boot2Gecko Graveyard'),(752,'Bosnian'),(96,'Bouncer'),(659,'br / Breton'),(373,'Brainstorm'),(753,'Breton'),(1,'Browser'),(542,'browserchoice.mozilla.com'),(854,'BrowserQuest'),(384,'BrowserTest'),(723,'Budget Requests'),(311,'Bug Tracking'),(3,'Bugzilla'),(38,'Bugzilla 2.18 Milestone'),(1198,'Bugzilla Anthropology Metrics'),(1320,'Bugzilla Change Notification'),(848,'Bugzilla Tweaks'),(815,'bugzilla.mozilla.org'),(171,'Build & Release'),(1182,'Build & Test'),(129,'Build Config'),(1375,'buildbot.instantbird.org'),(1277,'Buildduty'),(1038,'builds'),(754,'Bulgarian'),(497,'byob.mozilla.com'),(518,'BzAPI'),(939,'bzexport'),(227,'ca / Catalan'),(41,'CA Certificates'),(120,'CalDAV provider'),(4,'Calendar'),(209,'Calendar Views'),(5,'Camino'),(876,'Campaign'),(453,'Canonical'),(524,'Canvas: WebGL'),(1150,'careers.mozilla.org'),(60,'CaScadeS'),(755,'Catalan'),(6,'CCK'),(486,'Cesium'),(304,'Chat'),(1364,'Chat Core'),(67,'Chatzilla'),(728,'Checkpoint Zonealarm'),(634,'China - Press request'),(505,'Chocolate Factory'),(385,'Chrome'),(571,'Citrix'),(1087,'Client'),(1193,'Client: Android'),(1192,'Client: Desktop'),(196,'Cloning'),(474,'Cmd-line Features'),(507,'Code Coverage'),(526,'Code Quality'),(480,'Collaboration'),(558,'Collector Extension'),(465,'Command Line'),(1414,'Communications'),(916,'Community'),(1290,'Community Building Toolkit'),(438,'Community Giving'),(921,'Community IT Requests'),(984,'Community Tools'),(426,'communitystore.mozilla.org'),(729,'Comodo AV'),(730,'Comodo Firewall'),(529,'Compatibility Tools'),(128,'Component Registration'),(816,'Component Watching'),(1072,'Components'),(249,'Compose Window'),(59,'Composer'),(403,'Composition'),(415,'Concept Series'),(1402,'Conference Rooms'),(1343,'Consultative Svcs : Custom Dashboards and Reports'),(1341,'Consultative Svcs : Data Warehousing'),(1342,'Consultative Svcs : Standard Dashboards and Reports'),(1340,'Consultative Svcs : Subject Matter/BI/Metrics'),(1344,'Consultative Svcs : Training'),(567,'Contacts'),(1361,'Contacts window'),(406,'Content'),(1036,'Contractor Contract'),(814,'Contributor Engagement'),(1383,'Contributor Recognition'),(990,'Conumer Pages'),(1362,'Conversation'),(670,'Copy'),(1265,'Copy Editing and Review'),(435,'Copyright'),(1187,'Copyright & Patent'),(106,'Core'),(473,'Core Graveyard'),(356,'Corporate Governance'),(649,'crash'),(1376,'crash-stats.instantbird.com'),(182,'Crashes'),(501,'creative.mozilla.org'),(928,'Crestron'),(756,'Croatian'),(490,'Crypto'),(538,'cs / Czech'),(840,'csb / Kashubian'),(1129,'CSS'),(237,'CSS Editor'),(654,'Customer Care'),(1326,'Customer Request (Master Bug)'),(164,'CVS: Administration'),(157,'CVS: Copy'),(419,'cy / Welsh'),(1186,'Cyber-Security'),(118,'Czech/cs-CZ'),(925,'DAM'),(37,'Danish'),(466,'Dashboard'),(1050,'Dashboards'),(1324,'Data & BI Services Team'),(1194,'Data API'),(1195,'Data Collection'),(180,'Data Collection/Metrics'),(1331,'Data Ingestion : Client'),(1332,'Data Ingestion : External'),(1333,'Data Ingestion : One-Off'),(1329,'Data Ingestion : Ping'),(1330,'Data Ingestion : Standardised Payload'),(1338,'Data Processing : Aggregations and Views'),(1334,'Data Processing : ETL : Hadoop/Hbase/Hive target'),(1337,'Data Processing : ETL : JSON target'),(1336,'Data Processing : ETL : MySQL target'),(1335,'Data Processing : ETL : Vertica target'),(1339,'Data Processing : One-Off'),(1019,'Data Providers'),(1013,'Data Release Proposal'),(891,'Data request'),(285,'Data/Backend Reports'),(151,'Database'),(1085,'Datazilla'),(711,'de / German'),(1365,'Debug'),(622,'Debugger'),(1363,'Demo Add-ons'),(1287,'Demo Request'),(1047,'Demo Studio / Dev Derby'),(669,'Demos'),(265,'Dependency Views'),(7,'Derivatives'),(560,'Design'),(1410,'Design & UX'),(1051,'Design / user experience'),(1424,'Desktop'),(958,'Desktop Runtime'),(929,'detodosparatodos.org'),(1213,'Dev Kit'),(1321,'Developer Box'),(1128,'Developer Documentation'),(1210,'Developer Ecosystem'),(1284,'Developer Engagement'),(991,'Developer Pages'),(1312,'Developer Program'),(539,'Developer Tools'),(1137,'Developer Tools: 3D View'),(1269,'Developer Tools: App Manager'),(1423,'Developer Tools: Canvas Debugger'),(880,'Developer Tools: Console'),(879,'Developer Tools: Debugger'),(1138,'Developer Tools: Framework'),(1139,'Developer Tools: Graphic Commandline and Toolbar'),(881,'Developer Tools: Inspector'),(1384,'Developer Tools: Memory'),(1196,'Developer Tools: Netmonitor'),(1268,'Developer Tools: Object Inspector'),(1135,'Developer Tools: Profiler'),(1136,'Developer Tools: Responsive Mode'),(882,'Developer Tools: Scratchpad'),(1025,'Developer Tools: Source Editor'),(883,'Developer Tools: Style Editor'),(1323,'Developer Tools: User Stories'),(1315,'Developer Tools: WebGL Shader Editor'),(144,'developer.mozilla.org'),(115,'Developers'),(168,'Device Specific'),(1175,'DevOps'),(61,'Dialogs'),(252,'Dictionaries'),(8,'Directory'),(811,'Directory: Server'),(810,'Directory: UI'),(843,'Disability Access'),(596,'Discovery Pane'),(364,'Distribution/Bundling'),(572,'DivX'),(1143,'DMD'),(640,'Docs Platform'),(652,'Doctor JS'),(9,'Documentation'),(188,'Documentation Requests'),(1282,'DogfoodTriage'),(1131,'DOM'),(1267,'DOM :: Push Notifications'),(68,'DOM Inspector'),(1027,'DOM: Apps'),(1311,'DOM: Contacts'),(899,'DOM: Device Interfaces'),(956,'DOM: elasticsearch.IndexedDB'),(1420,'DOM: Security'),(957,'DOM: Workers'),(819,'Domesday'),(694,'donate.mozilla.org'),(378,'Download Day'),(71,'Download Manager'),(36,'Downloading'),(718,'downloadmap.mozilla.org'),(1214,'Downloads'),(981,'Downloads Panel'),(496,'downloadstats.mozilla.com'),(853,'Dragnet'),(297,'Driving'),(679,'dteam'),(512,'DXR'),(369,'E-mail based Scheduling (iTIP/iMIP)'),(90,'E4X'),(1048,'Editing'),(467,'Editor'),(1249,'Editorial'),(945,'Eideticker'),(218,'el / Greek'),(813,'Elmo'),(671,'Email'),(1263,'Email Outreach'),(541,'Embedded'),(969,'Embedding: ActiveX Wrapper'),(963,'Embedding: GTK Widget'),(131,'Embedding: MFC Embed'),(1147,'Employee Safe Harbor'),(360,'Employment'),(1302,'Emulator'),(268,'en-ZA / English (South African)'),(641,'Engagement'),(1409,'Engagement Ladder'),(564,'Engineering'),(94,'English, United Kingdom/en-GB'),(191,'Environments'),(340,'eo / Esperanto'),(607,'Error Console'),(230,'es-AR / Spanish Argentina'),(478,'es-CL / Spanish (Chile)'),(455,'es-MX / Spanish (Mexico)'),(803,'ESET NOD32 AV'),(804,'ESET Smart Security'),(757,'Esperanto'),(758,'Estonian'),(416,'et / Estonian'),(924,'etherpad.mozilla.org'),(998,'etherpad@webtools.bugs'),(633,'EU - Press request'),(219,'eu / Basque'),(613,'Evangelism'),(603,'Event Requests'),(1366,'Eventloop'),(909,'Events'),(985,'Events Manager'),(1285,'Events Request'),(553,'Experimental Clients'),(336,'Extend Firefox'),(873,'Extension'),(235,'Extension Compatibility'),(531,'Extensions'),(238,'Extensions and Themes'),(1418,'Extensions: AntiSpam'),(978,'Extensions: BMO'),(959,'Extensions: BrowserID'),(1386,'Extensions: EditComments'),(907,'Extensions: FlagTypeComment'),(865,'Extensions: GuidedBugEntry'),(864,'Extensions: Inline History'),(1090,'Extensions: MozProjectReview'),(1161,'Extensions: MyDashboard'),(1070,'Extensions: Needinfo'),(1045,'Extensions: OrangeFactor'),(1163,'extensions: ProdCompSearch'),(1162,'Extensions: ProductDashboard'),(1006,'Extensions: Push'),(867,'Extensions: REMO'),(979,'Extensions: REST'),(1165,'Extensions: RestrictComments'),(1270,'Extensions: Review'),(885,'Extensions: SecureMail'),(995,'Extensions: Tracking Flags'),(966,'Extensions: TryAutoLand'),(1293,'Extensions: UserProfile'),(927,'Extron'),(731,'F-Secure AV'),(682,'f1'),(232,'fa / Persian'),(717,'Facebook'),(322,'Facebook Application'),(310,'Facilities Management'),(462,'Feed Discovery and Preview'),(475,'Feed Reader'),(442,'feeds.mozilla.com'),(374,'Fennec'),(866,'Fennec Native'),(697,'Fennec Profile Tool'),(492,'Fennec UI'),(896,'ff / Fulah'),(215,'fi / Finnish'),(197,'Fields'),(1052,'File attachments'),(53,'File Handling'),(1011,'FileLink'),(555,'Filters'),(1029,'Finance'),(407,'Find Backend'),(77,'Find Toolbar'),(759,'Finnish'),(10,'Firebird'),(42,'Firefox'),(321,'Firefox 3'),(429,'Firefox 3.5'),(1319,'Firefox Accounts'),(1007,'Firefox Affiliates'),(904,'Firefox Flicks'),(703,'Firefox for all'),(1016,'Firefox for Android'),(1071,'Firefox for Metro'),(1061,'Firefox Graveyard'),(1190,'Firefox Health Report'),(1180,'Firefox Health Report Service'),(647,'Firefox Home'),(1354,'Firefox Operations'),(1134,'Firefox OS'),(967,'Firefox Start'),(1292,'Firefox Sync'),(1142,'Firefox Sync: Cross-client'),(491,'Firefox UI'),(809,'Firefox: Backend'),(970,'Firefox: Common'),(808,'Firefox: Frontend'),(822,'firefoxgarden.org'),(692,'firefoxlive.mozilla.org'),(699,'Five Years of Firefox'),(498,'Fizzypop'),(573,'Flash (Adobe)'),(574,'Flash (Gnash)'),(600,'Flash (swfdec)'),(559,'FlightDeck'),(1168,'Flyouts'),(449,'Folder and Message Lists'),(1153,'Forget About Site'),(54,'Form Manager'),(305,'Forum'),(530,'Forums'),(1000,'Foundation'),(760,'Frisian'),(831,'Front-end'),(828,'Frontend'),(286,'Frontend Reports'),(1353,'FxA'),(220,'fy-NL / Frisian'),(221,'ga-IE / Irish'),(1063,'Gaia'),(1299,'Gaia Bindings'),(1097,'Gaia::Apps Management'),(1068,'Gaia::Browser'),(1102,'Gaia::Calculator'),(1067,'Gaia::Calendar'),(1103,'Gaia::Camera'),(1104,'Gaia::Clock'),(1105,'Gaia::Contacts'),(1106,'Gaia::Cost Control'),(1107,'Gaia::Dialer'),(1069,'Gaia::E-Mail'),(1120,'Gaia::Everything.me'),(1108,'Gaia::FMRadio'),(1109,'Gaia::Gallery'),(1099,'Gaia::Homescreen'),(1110,'Gaia::Music'),(1381,'Gaia::Notes'),(1111,'Gaia::PDF Viewer'),(1407,'Gaia::PerformanceTest'),(1355,'Gaia::Ringtones'),(1382,'Gaia::Search'),(1098,'Gaia::Settings'),(1112,'Gaia::SMS'),(1100,'Gaia::System'),(1114,'Gaia::System::Bluetooth'),(1322,'Gaia::System::Browser'),(1115,'Gaia::System::Facebook Integration'),(1116,'Gaia::System::Feedback'),(1117,'Gaia::System::First Time Experience'),(1358,'Gaia::System::Input Mgmt'),(1119,'Gaia::System::Keyboard'),(1118,'Gaia::System::Lockscreen'),(1316,'Gaia::System::Window Mgmt'),(1304,'Gaia::TestAgent'),(1300,'Gaia::UI Tests'),(1113,'Gaia::Video'),(1356,'Gaia::Wallpaper'),(1388,'Gaia::Wappush'),(1217,'Gaia:Calculator'),(1294,'Gaia:GithubBot'),(761,'Galician'),(691,'Gaming'),(325,'Garbage Collection (mmGC)'),(605,'gd / Scottish Gaelic'),(298,'Gecko 1.9'),(428,'Gecko 1.9.1'),(922,'Gecko Profiler'),(50,'General'),(1274,'General Automation'),(1325,'General Discussions'),(614,'General Mozilla'),(424,'Geolocation'),(762,'Georgian'),(30,'Gerv'),(400,'getfirebug.com'),(485,'getpersonas.com'),(431,'GFX: Color Management'),(137,'GFX: Photon'),(398,'gl / Galician'),(857,'GoFaster'),(575,'Google Talk'),(181,'Governance'),(236,'Graph Server'),(1261,'Graphic Design'),(162,'Graphics'),(1020,'Graphics, Panning and Zooming'),(974,'Graphics: Layers'),(975,'Graphics: Text'),(763,'Greek'),(11,'Grendel'),(417,'Gristmill'),(825,'GrouperFish'),(222,'gu-IN / Gujarati'),(764,'Gujarati'),(549,'hacks.mozilla.org'),(913,'Hardware'),(884,'Hardware Abstraction Layer (HAL)'),(1152,'Hardware Purchase'),(127,'Hebrew/he-IL'),(43,'Help'),(51,'Help Documentation'),(143,'Help Viewer'),(130,'Hendrix'),(1377,'hg.instantbird.org'),(401,'Hg: Customizations'),(281,'hi-IN / hindi'),(765,'Hindi'),(917,'History'),(1179,'Homepage Promos'),(457,'hr / Croatian'),(886,'HTML'),(1077,'HTML Bindings'),(62,'HTML Source Mode'),(837,'HTML5'),(812,'HTML5 Dashboard'),(433,'httpd.js'),(223,'hu / Hungarian'),(361,'Human Resources'),(766,'Hungarian'),(282,'hy-AM / Armenian'),(926,'iCal'),(1218,'ICAL.js Integration'),(767,'Icelandic'),(352,'id / Indonesian'),(495,'Identity'),(606,'ilo / Iloko'),(536,'Image: Painting'),(954,'IME'),(212,'Import and Export'),(194,'Import/Export'),(328,'Incoming Email'),(768,'Indonesian'),(1317,'inform.mozilla.org'),(1041,'Information Architecture & UX'),(890,'Infra'),(187,'Infrastructure'),(1221,'Infrastructure & Operations'),(660,'Infrastructure Security'),(662,'Infrastructure Security: Server Security'),(661,'Infrastructure Security: Web Security'),(1239,'Infrastructure: DNS'),(1243,'Infrastructure: LDAP'),(1242,'Infrastructure: Mail'),(1244,'Infrastructure: Monitoring'),(1247,'Infrastructure: OpenVPN'),(1246,'Infrastructure: Other'),(1240,'Infrastructure: Puppet'),(1245,'Infrastructure: Tools'),(1241,'Infrastructure: Zimbra'),(1148,'Initiative Review'),(628,'Input'),(1215,'Install/Update'),(52,'Installer'),(955,'Instant Messaging'),(1359,'Instantbird'),(1372,'Instantbird Servers'),(1125,'Integration'),(193,'Integrations'),(1422,'Intellego'),(818,'Interfaces/Integration'),(1406,'Internal Process'),(1352,'Internal Project (Master Bug)'),(1189,'Internet Governance'),(1184,'Internet Public Policy'),(619,'Interpreter'),(503,'intlstore.mozilla.org'),(1367,'IRC'),(562,'irc.mozilla.org'),(769,'Irish'),(394,'is / Icelandic'),(513,'ispdb'),(1095,'ISPDB Database Entries'),(1094,'ISPDB Server'),(635,'Japan - Press request'),(117,'Japanese/ja-JP(ja-JPM)'),(576,'Java (Apple)'),(577,'Java (IcedTea)'),(578,'Java (JEP)'),(579,'Java (Oracle)'),(580,'Java (Sun)'),(971,'Java APIs for DOM'),(972,'Java APIs to WebShell'),(296,'Java Embedding Plugin'),(973,'Java-Implemented Plugins'),(676,'Java: Live Connect'),(675,'Java: OJI'),(1130,'JavaScript'),(55,'JavaScript Console'),(69,'JavaScript Debugger'),(463,'JavaScript Debugging APIs'),(1307,'JavaScript Engine: JIT'),(1393,'JavaScript: GC'),(1392,'JavaScript: Internationalization API'),(1394,'JavaScript: Standard Library'),(379,'jemalloc'),(482,'Jetpack'),(645,'jetpackgallery.mozillalabs.com'),(519,'jetpacks.mozillalabs.com'),(1078,'JimDB'),(581,'JInitiator'),(423,'JIT Compiler (NanoJIT)'),(70,'joel'),(540,'JpSecure'),(1075,'JS Library'),(618,'JS Modules'),(331,'js-ctypes'),(510,'JSBridge'),(1272,'JSMarionette'),(12,'JSS'),(262,'ka / Georgian'),(1253,'kanbanzilla'),(770,'Kannada'),(163,'karl'),(732,'Kaspersky AV'),(771,'Kazakh'),(468,'Key Bindings'),(250,'Key Config Editor'),(79,'Keyboard Navigation'),(418,'Keywords'),(977,'Kilimanjaro'),(460,'kk / Kazakh'),(894,'km / Khmer'),(353,'kn / Kannada'),(306,'Knowledge Base'),(335,'Knowledge Base Articles'),(95,'Korean/ko-KR'),(1122,'Krad Radio'),(261,'ku / Kurdish'),(317,'Kubla'),(1053,'KumaScript'),(772,'Kurdish'),(516,'L10N'),(1074,'L20n'),(1207,'L20n.org'),(611,'Labs'),(668,'Labs Pack'),(399,'labs.mozilla.com'),(1049,'Landing pages'),(773,'Latvian'),(1258,'Launch'),(145,'Layout: Canvas'),(696,'learningfreedomandtheweb.org/'),(1083,'Leeroy'),(1042,'Legacy PHP system'),(355,'Legal'),(1177,'Legal and Abuse'),(664,'lg / Luganda'),(620,'Library'),(126,'Licensing'),(149,'Lightning'),(323,'Lightning: SeaMonkey Integration'),(898,'lij / Ligurian'),(476,'Linux/Maemo'),(116,'Listings'),(774,'Lithuanian'),(1278,'Loan Requests'),(295,'Localization'),(266,'Localization Server'),(1206,'Location'),(1054,'Login'),(1262,'Logo Design and Identity'),(159,'lpsolit'),(775,'Luganda'),(334,'lv / Latvian'),(35,'Mac OS Classic'),(776,'Macedonian'),(1062,'mach'),(604,'mai / Maithili'),(248,'Mail Window'),(13,'MailNews'),(402,'MailNews Core'),(488,'MailNews Core Graveyard'),(395,'mailnews-all'),(160,'MailNews: Addressbook'),(404,'MailNews: General'),(161,'MailNews: Message Display'),(204,'Maintenance Scripts'),(777,'Maithili'),(1254,'Make Valet'),(1203,'MakeAPI'),(1408,'Maker Party'),(778,'Malayalam'),(829,'ManifestParser'),(779,'Marathi'),(878,'Marionette'),(14,'Marketing'),(874,'Marketplace'),(709,'markup.mozilla.org'),(1288,'Material Review Request'),(1200,'MathML'),(733,'McAfee AV'),(330,'McCoy'),(1183,'mediawiki-bugzilla'),(724,'Mentorship'),(1273,'Mercurial Pushlog'),(1264,'Message Platform'),(447,'Message Reader UI'),(1088,'Metrics'),(1089,'Metrics and Firefox Health Report'),(869,'Metrics Data Ping'),(870,'Metrics Operations'),(1156,'Metro Operations'),(902,'MFBT'),(339,'Microformats'),(208,'Microsummaries'),(888,'Middleware'),(75,'Migration'),(26,'Milestones'),(15,'Minimo'),(387,'Minotaur'),(132,'mk / Macedonian'),(302,'ml / Malayalam'),(234,'mn / Mongolian'),(511,'Mobile'),(279,'Mobile Companion'),(1389,'mobilepartners.mozilla.org'),(382,'Mochitest'),(780,'Mongolian'),(892,'Moz TOS or License'),(1283,'mozext'),(932,'mozglue'),(537,'Mozilla Communities'),(450,'Mozilla Community Sites'),(461,'Mozilla Corporation'),(610,'Mozilla Corporation PR'),(186,'Mozilla Developer Center'),(638,'Mozilla Developer Network'),(1257,'Mozilla Foundation Communications'),(706,'Mozilla Grants'),(1171,'Mozilla Hacks'),(278,'Mozilla Labs'),(701,'Mozilla Labs Graveyard'),(16,'Mozilla Localizations'),(389,'Mozilla Messaging'),(868,'Mozilla Metrics'),(1133,'Mozilla Platform'),(625,'Mozilla PR'),(683,'Mozilla QA'),(722,'Mozilla Reps'),(655,'Mozilla Services'),(284,'Mozilla Stats'),(158,'Mozilla Store'),(1416,'Mozilla VPN: ACL requests'),(1417,'Mozilla VPN: Support requests'),(17,'mozilla.org'),(931,'mozilla.org.uk'),(566,'mozilla.status.net'),(27,'mozilla1.7alpha'),(343,'MozillaBuild'),(18,'MozillaClassic'),(1003,'mozillaignite'),(472,'mozillaservice.org'),(508,'mozillians.org'),(685,'Mozmill Automation'),(686,'Mozmill Crowd Extension'),(687,'Mozmill Result Dashboard'),(845,'Mozmill Shared Modules'),(648,'MozMill Tests'),(1101,'Mozpool'),(509,'MozRunner'),(329,'mozStorage Explorer'),(517,'MPL'),(582,'Mplayer'),(349,'mr / Marathi'),(960,'ms / Malay'),(734,'MSE AV'),(930,'my / Burmese'),(527,'Nanojit'),(650,'Narcissus'),(997,'Narro'),(861,'Native Android Wrapper'),(832,'Native iOS Wrapper'),(362,'NDA'),(337,'ne-NP / Nepali (Nepal)'),(494,'Needs Triage'),(1188,'Net Neutrality'),(1233,'NetOps: DC Carrier'),(1234,'NetOps: DC Other'),(1232,'NetOps: DC Port Configurations'),(1238,'NetOps: Office ACL Requests'),(1236,'NetOps: Office Carrier'),(1237,'NetOps: Office Other'),(1235,'NetOps: Office Wireless'),(1231,'NetOps: Other'),(1230,'NetOps: Projects'),(1368,'Netsoul'),(900,'Networking: DNS'),(609,'Networking: Domain Lists'),(246,'Networking: JAR'),(680,'Networking: WebSockets'),(312,'New Bugs'),(388,'New Frameworks'),(456,'New Tab'),(183,'Newsgroups'),(1158,'Newsletters'),(1252,'NFC'),(673,'Nightly Tester Tools'),(1197,'none'),(735,'Norton 360'),(736,'Norton AV'),(737,'Norton Confidential'),(91,'Norwegian/nb-NO'),(1010,'Notifications'),(269,'nr / Southern Ndebele'),(216,'NSIS Installer'),(270,'nso / Northern Sotho (Pedi)'),(602,'nspluginwrapper'),(19,'NSPR'),(20,'NSS'),(1295,'Nucleus'),(738,'Nvidia ActiveArmor'),(420,'oc / Occitan'),(1032,'Offer Letter'),(514,'Office'),(1421,'One and Done'),(29,'Open Bugs'),(996,'openbadges.org'),(557,'opentochoice.org'),(851,'OpenWebApps'),(658,'Operations'),(1349,'Operations : Data Quality / Data Event Research'),(1347,'Operations : Platform Troubleshooting and Recovery'),(1345,'Operations : System Administration'),(1348,'Operations : Tool Troubleshooting and Recovery'),(1346,'Operations : User Management'),(712,'Operations: Deployment Requests'),(805,'Operations: Hardware'),(806,'Operations: Metrics/Monitoring'),(292,'Operator'),(859,'Optimizing JIT'),(459,'or / Oriya'),(678,'Orange Factor'),(1220,'Orangutan'),(781,'Oriya'),(239,'OS Integration'),(1026,'OS.File'),(173,'Other'),(636,'Other - Press request'),(66,'Other Applications'),(1350,'Other: BI'),(1351,'Other: DW'),(1286,'Outreach Request'),(224,'pa-IN / Punjabi'),(56,'Page Info'),(1043,'Pages & Content'),(489,'Palm Sync'),(1281,'Pan and Zoom'),(849,'Pancake'),(34,'Panda'),(739,'Panda AV'),(1310,'Panning and Zooming'),(552,'Panning/Zooming'),(1149,'Partner Review'),(245,'Party Tool'),(333,'Password Manager'),(63,'Pasting'),(358,'Patent'),(992,'Payments/refunds'),(583,'PDF (Adobe)'),(584,'PDF (FoxIt)'),(961,'PDF Viewer'),(1391,'Peekaboo'),(247,'Penelope'),(863,'Peptest'),(1055,'Performance'),(1127,'Permission Manager'),(782,'Persian'),(1001,'Persona'),(414,'Personas'),(980,'Petri'),(643,'Philippines'),(1121,'Phishing Protection'),(629,'Phonebook'),(169,'Places'),(672,'planet.firefox.com/mobile'),(178,'planet.mozilla.org'),(1145,'planet.webmaker.org'),(858,'Planning'),(1279,'Platform Support'),(601,'Plugger'),(1357,'Plugin Click-To-Activate Whitelist'),(86,'Plugin Finder Service'),(147,'Plugin Listings'),(953,'plugincheck'),(568,'Plugins'),(535,'plugins.mozilla.org'),(206,'Policy'),(642,'Pontoon'),(988,'Popcorn Maker'),(987,'Popcorn.js'),(1395,'Powertool'),(291,'PRD Change Request'),(102,'Preferences'),(1205,'Preinstalled B2G Apps'),(1259,'Press'),(1405,'Press Clips'),(616,'Press corrections'),(101,'Printing'),(408,'Printing: Setup'),(421,'Prior Art'),(338,'Prism'),(893,'Privacy'),(1185,'Privacy and Data'),(357,'Privacy or EULA'),(1014,'Privacy Policies'),(1012,'Privacy Review'),(615,'Privacy/legal'),(436,'Private Browsing'),(123,'Problem Reporter'),(515,'Product'),(1181,'Product Announcements'),(148,'Product Site'),(1305,'Profile'),(74,'Profile: Roaming'),(651,'ProfileManager'),(623,'Profiler'),(405,'Project Organization'),(1066,'Project Review'),(1044,'Project Tracking'),(1173,'Projects'),(1202,'Protocols'),(288,'Provider: GData'),(210,'Provider: ICS/WebDAV'),(217,'Provider: WCAP'),(21,'PSM'),(231,'pt-PT/Portuguese'),(630,'PTO'),(64,'Publishing'),(666,'Pulse'),(783,'Punjabi'),(1033,'Purchase Requeste Form'),(1076,'Python Library'),(500,'PyXPCOM'),(319,'QA Community Extension'),(39,'QA Queries'),(702,'QA Test Scripts'),(1256,'qbackout'),(533,'qimportbz'),(444,'QMO (quality.mozilla.org)'),(445,'QMO: Content'),(446,'QMO: Website'),(597,'Quake Live'),(300,'quality.mozilla.org'),(637,'Questions'),(1082,'QuickLaunch (AKA turbo mode)'),(585,'QuickTime (Apple)'),(523,'Raindrop'),(1081,'Readability'),(1021,'Reader Mode'),(586,'RealPlayer (Real)'),(1151,'Reference Apps'),(432,'Reftest'),(1275,'Release Automation'),(368,'Release Engineering'),(946,'Release Engineering: Automation'),(441,'Release Engineering: Custom Builds'),(950,'Release Engineering: Developer Tools'),(1271,'Release Engineering: Loan Requests'),(947,'Release Engineering: Machine Management'),(367,'Release Engineering: Maintenance'),(948,'Release Engineering: Platform Support'),(366,'Release Engineering: Projects'),(962,'Release Engineering: Release Automation'),(949,'Release Engineering: Releases'),(1276,'Releases'),(1390,'Releases: Custom Builds'),(528,'Relic'),(1248,'RelOps'),(1251,'RelOps: Puppet'),(914,'Rendering'),(124,'Reporter'),(125,'Reporter Webtool'),(195,'Reports'),(716,'Reports/Deliverables'),(1280,'Repos and Hooks'),(802,'reps.mozilla.org'),(705,'Research'),(313,'Resolved Bugs'),(993,'Reviewer Tools'),(153,'Reviews'),(342,'Rewriting and Analysis'),(22,'Rhino'),(1301,'RIL'),(483,'rm / Romansh'),(225,'ro / Romanian'),(784,'Romanian'),(785,'Romansh'),(1401,'Room Control'),(1208,'Rosetta Stone'),(76,'RSS'),(156,'RSS Discovery and Preview'),(226,'ru-RU / Russian'),(1425,'Runtime'),(786,'Russian'),(545,'Rust'),(290,'rw / Kinyarwanda'),(1209,'Safari Books Online'),(184,'Safe Browsing'),(1160,'sah / Sakha'),(1164,'Sandstone'),(100,'Satchel'),(65,'Saving'),(908,'Schedule'),(787,'Scottish-Gaelic'),(332,'ScreamingMonkey'),(1002,'Scrumbugs'),(134,'SeaMonkey'),(32,'SeaMonkey (2)'),(48,'Search'),(205,'Search Plugins'),(133,'Security'),(1398,'Security Assurance: FxOS Review'),(952,'Security Assurance: Incident'),(951,'Security Assurance: Review Needed'),(139,'Security: PSM'),(138,'Security: S/MIME'),(140,'Security: UI'),(326,'Self-hosting compiler (ESC)'),(1056,'SEO'),(788,'Serbian'),(469,'Server'),(293,'Server Operations'),(170,'Server Operations Projects'),(256,'Server Operations: Account Requests'),(860,'Server Operations: ACL Request'),(934,'Server Operations: AMO Operations'),(1144,'Server Operations: Change Requests'),(1219,'Server Operations: Community IT'),(820,'Server Operations: Database'),(938,'Server Operations: DCOps'),(935,'Server Operations: Developer Services'),(923,'Server Operations: Infrastructure'),(1426,'Server Operations: MOC'),(255,'Server Operations: MV Desktop Issues'),(665,'Server Operations: Netops'),(314,'Server Operations: Security'),(283,'Server Operations: Statistics'),(936,'Server Operations: Storage'),(852,'Server Operations: Telecom'),(287,'Server Operations: Tinderbox Maintenance'),(937,'Server Operations: Virtualization'),(425,'Server Operations: Weave'),(254,'Server Operations: Web Content Push'),(704,'Server: Account Portal'),(1291,'Server: Firefox Accounts'),(693,'Server: Identity'),(690,'Server: Key Exchange'),(657,'Server: Other'),(1092,'Server: Product Announcements Campaign Manager'),(1093,'Server: Product Announcements Redirector'),(656,'Server: Registration'),(721,'Server: Share'),(918,'Server: Token'),(698,'Server:Core'),(836,'Service'),(544,'Servo'),(280,'Session Restore'),(556,'Session Save/Restore'),(719,'Share: Firefox Client'),(720,'Share: Web Client'),(1073,'Shell'),(47,'Shell Integration'),(964,'Sheriff'),(587,'Shockwave (Adobe)'),(1289,'Shumway'),(348,'si / Sinhala'),(240,'Sidebars'),(588,'Silverlight (Microsoft)'),(589,'Silverlight (Mono)'),(1397,'Simulator'),(789,'Sinhala'),(437,'Sisyphus'),(1057,'Site search'),(824,'Sites'),(167,'sk / Slovak'),(229,'sl / Slovene'),(790,'Slovak'),(791,'Slovenian'),(823,'Snippets'),(412,'Snowl'),(1008,'Social Integration'),(933,'Social Media'),(983,'SocialAPI'),(1084,'SocialAPI: Providers'),(344,'Socorro'),(546,'Socorro Hadoop Cluster'),(1396,'Software'),(663,'son / Songhay'),(792,'Songhai'),(872,'Soup'),(241,'Source View'),(40,'Spanish'),(710,'spark.mozilla.org'),(396,'Spatial navigation'),(817,'Splinter'),(176,'spreadfirefox.com'),(430,'spreadthunderbird.com'),(228,'sq / Albanian'),(294,'sr / Serbian'),(271,'ss / Swazi'),(1015,'ssltunnel'),(631,'SSO'),(272,'st / Southern Sotho'),(1404,'Staff Email'),(434,'Standards'),(242,'Startup'),(46,'Startup and Profile System'),(351,'Statistics'),(372,'Statistics (General)'),(85,'Storage'),(121,'Storage provider'),(327,'store.mozilla.org'),(915,'Streaming'),(563,'studentreps.mozilla.org'),(826,'Submission'),(1415,'Support'),(303,'support.mozilla.com'),(1146,'support.mozilla.org Graveyard'),(532,'support.mozillamessaging.com'),(838,'Surveys'),(1028,'SUTAgent'),(1201,'SVG'),(839,'sw / Swahili'),(499,'Swag Requests'),(793,'Swedish'),(92,'Swedish/sv-SE'),(740,'Symantec AV'),(741,'Symantec Endpoint Protection'),(493,'Sync'),(707,'Sync UI'),(470,'Syntax Highlighting'),(155,'Systems'),(315,'ta / Tamil'),(443,'ta-LK / Sri Lankan Tamil'),(481,'ta-LK / Tamil (Sri Lanka)'),(57,'Tabbed Browser'),(243,'Tabbed Editor'),(608,'TabCandy'),(87,'Table'),(1157,'Tabzilla'),(192,'Tags'),(1058,'Tags / flags'),(88,'Talkback'),(487,'Talkback Client'),(89,'Talkback General'),(1169,'Talkilla'),(386,'Talos'),(259,'Tamarin'),(794,'Tamil'),(877,'TaskBoard'),(1385,'TaskCluster'),(213,'Tasks'),(674,'TCM'),(708,'TCM-Platform'),(345,'te / Telugu'),(1411,'Teaching Kits / Curriculum'),(23,'Tech Evangelism'),(834,'Telemetry'),(1204,'Telemetry Dashboard'),(1297,'Telemetry Server'),(795,'Telugu'),(31,'Test'),(199,'Test Cases'),(504,'Test Pilot'),(681,'Test Pilot Data Requests'),(561,'Test Pilot Studies'),(198,'Test Plans'),(200,'Test Runs'),(73,'Test Tracker'),(318,'Test++'),(207,'Testing'),(543,'Testing Infrastructure'),(189,'Testopia'),(1159,'Tests'),(1022,'Text Selection'),(397,'th / Thai'),(796,'Thai'),(347,'Theme'),(1023,'Theme and Visual Design'),(409,'Themes'),(1176,'Thimble'),(833,'Thumbnailer'),(24,'Thunderbird'),(471,'Thunderhead'),(520,'Tinderboxpushlog'),(82,'Tip of the Day'),(273,'tn / Tswana'),(1328,'Tool Development & Maintenance : Data Ingestion'),(1327,'Tool Development & Maintenance : ETL'),(554,'Toolbar'),(244,'Toolbars'),(448,'Toolbars and Tabs'),(103,'Toolbars and Toolbar Customization'),(821,'Toolbox'),(98,'Toolkit'),(695,'Toolkit Graveyard'),(454,'Tools'),(506,'tools.mozilla.com'),(599,'Totem'),(856,'TPS'),(350,'Tracing Virtual Machine'),(976,'Tracking'),(359,'Trademark'),(83,'Trademark Permissions'),(141,'Trademark Violations'),(1412,'Training'),(80,'Translations'),(1064,'Tree Status'),(742,'Trend Micro AV'),(371,'Triage (UNCO bugs)'),(346,'Try Server'),(274,'ts / Tsonga'),(383,'TUnit'),(797,'Turkish'),(105,'Turkish/tr-TR'),(1369,'Twitter'),(413,'Ubiquity'),(919,'UDC'),(289,'uk / Ukrainian'),(798,'Ukrainian'),(28,'unconf'),(301,'Unconfirmed'),(185,'Uninstall Survey'),(905,'Untriaged'),(965,'Untriaged Bugs'),(49,'Update'),(146,'Update Services'),(1378,'update.instantbird.org'),(203,'Upload Requests'),(1080,'ur / Urdu'),(626,'US - Legal'),(632,'US - Press request'),(627,'US - Security'),(1296,'User Engagement'),(113,'User Interface'),(1046,'User management'),(1059,'User profiles'),(1140,'User Story'),(1413,'User Testing'),(688,'Users and Groups'),(994,'Validation'),(275,'ve / Venda'),(1123,'Vendcom'),(1031,'Vendor Amendment'),(617,'Vendor requests'),(1065,'Vendor Review'),(1030,'Vendor SOW'),(363,'Vendor/Services'),(910,'Venues'),(590,'VeohTV (Veoh)'),(381,'Verbatim'),(621,'Verifier'),(479,'Version Control'),(427,'vi / Vietnamese'),(525,'Video'),(410,'Video/Audio'),(548,'Video/Audio Controls'),(1419,'Video/Audio: Recording'),(912,'Vidyo'),(1400,'Vidyo Infrastructure'),(799,'Vietnamese'),(58,'View Source'),(591,'Viewpoint Media Player'),(324,'Virtual Machine'),(592,'VLC (VideoLAN)'),(341,'Weave'),(439,'Weave Server'),(1060,'Web Analytics'),(807,'Web Apps'),(1229,'Web Audio'),(1211,'Web Components'),(1086,'Web service'),(72,'Web Site'),(1387,'web-platform-tests'),(889,'Webapp'),(1005,'Webapp Runtime'),(122,'WebDAV'),(365,'Webdev'),(1172,'Webmaker'),(1306,'Webmaker-suite'),(1004,'webmaker.org'),(1226,'WebOps: Bugzilla'),(1224,'WebOps: Community Platform'),(1223,'WebOps: Engagement'),(1250,'WebOps: Inventory'),(1228,'WebOps: IT-Managed Tools'),(1308,'WebOps: Other'),(1222,'WebOps: Product Delivery'),(1225,'WebOps: Socorro'),(1227,'WebOps: Source Control'),(1309,'WebOps: SSL and Domain Names'),(982,'Webpagemaker'),(598,'WebQA'),(942,'WebRTC: Audio/Video'),(940,'WebRTC: General'),(943,'WebRTC: Signaling'),(941,'WebRTC:: Networking'),(320,'WebRunner'),(260,'WebService'),(639,'Website'),(667,'website-archive.mozilla.org'),(172,'Websites'),(644,'Websites Graveyard'),(390,'Webtest'),(25,'Webtools'),(547,'Webtools Graveyard'),(844,'Webtrends'),(800,'Welsh'),(81,'Whining'),(135,'Widget'),(521,'Widget: Android'),(107,'Widget: BeOS'),(152,'Widget: Cocoa'),(1024,'Widget: Gonk'),(108,'Widget: Gtk'),(109,'Widget: Mac'),(110,'Widget: OS/2'),(136,'Widget: Photon'),(375,'Widget: Qt'),(376,'Widget: Symbian S60'),(111,'Widget: Win32'),(377,'Widget: Windows Mobile'),(1154,'Widget: WinRT'),(112,'Widget: Xlib'),(1124,'Wifi'),(1379,'wiki.instantbird.org'),(725,'wiki.mozilla.org'),(593,'Windows Media Player (Flip4Mac)'),(594,'Windows Media Player (Microsoft)'),(477,'Windows Mobile'),(1009,'WinQual Reports'),(1126,'Witness'),(1318,'WMF'),(897,'wo / Wolof'),(835,'Workers'),(862,'workshop.mozilla.org'),(550,'www.drumbeat.org'),(1380,'www.instantbird.com'),(307,'www.mozilla-europe.org'),(308,'www.mozilla-japan.org'),(175,'www.mozilla.com'),(380,'www.mozilla.jp'),(713,'www.mozilla.org'),(309,'www.mozilla.org.cn'),(354,'www.mozillamessaging.com'),(502,'www.schooloffirefox.com'),(565,'www.seamonkey-project.org'),(1266,'X-Ray Goggles'),(84,'XForms'),(276,'xh / Xhosa'),(595,'Xine'),(1370,'XMPP'),(104,'XRE Startup'),(97,'XTF'),(299,'XUL Explorer'),(150,'XUL Widgets'),(142,'XULRunner'),(1371,'Yahoo! Messenger'),(842,'Your Web'),(233,'za / South Africa'),(179,'zh-TW / Chinese (Traditional)'),(33,'Zoo'),(277,'zu / Zulu'),(801,'Zulu'); /*!40000 ALTER TABLE `series_categories` ENABLE KEYS */; UNLOCK TABLES; diff --git a/tests/test_etl.py b/tests/test_etl.py index 4ad8230..a8b79dc 100644 --- a/tests/test_etl.py +++ b/tests/test_etl.py @@ -10,39 +10,38 @@ from datetime import datetime import unittest - from bzETL import extract_bugzilla, bz_etl from bzETL.bz_etl import etl from bzETL.extract_bugzilla import get_current_time, SCREENED_WHITEBOARD_BUG_GROUPS -from pyLibrary.cnv import CNV +from pyLibrary import convert from pyLibrary.collections import MIN -from pyLibrary.queries.db_query import esfilter2sqlwhere -from pyLibrary.sql.db import DB, all_db -from pyLibrary.env.logs import Log -from pyLibrary.env.elasticsearch import ElasticSearch +from pyLibrary.debugs import startup, constants +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import Dict, Null, wrap from pyLibrary.env.files import File -from pyLibrary.queries import Q from pyLibrary.maths.randoms import Random -from pyLibrary.env import startup -from pyLibrary import struct -from pyLibrary.struct import Struct, Null +from pyLibrary.queries import qb +from pyLibrary.queries.qb_usingMySQL import esfilter2sqlwhere +from pyLibrary.sql.mysql import MySQL, all_db from pyLibrary.testing import elasticsearch from pyLibrary.thread.threads import ThreadedQueue, Thread from pyLibrary.times.timer import Timer -from util import compare_es, database +from util import database, compare_es from util.compare_es import get_all_bug_versions from util.database import diff + BUG_GROUP_FOR_TESTING = "super secret" class TestETL(unittest.TestCase): def setUp(self): - self.settings = startup.read_settings(filename="test_settings.json") + self.settings = startup.read_settings(filename="./tests/resources/config/test_settings.json") + constants.set(self.settings.constants) Log.start(self.settings.debug) def tearDown(self): - #CLOSE THE CACHED DB CONNECTIONS + #CLOSE THE CACHED MySQL CONNECTIONS bz_etl.close_db_connections() if all_db: @@ -60,13 +59,13 @@ class TestETL(unittest.TestCase): # settings.param.allow_private_bugs = True database.make_test_instance(self.settings.bugzilla) - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: candidate = elasticsearch.make_test_instance("candidate", self.settings.candidate) reference = elasticsearch.open_test_instance("reference", self.settings.private_bugs_reference) #SETUP RUN PARAMETERS - param = Struct() - param.end_time = CNV.datetime2milli(get_current_time(db)) + param = Dict() + param.end_time = convert.datetime2milli(get_current_time(db)) param.start_time = 0 param.start_time_str = extract_bugzilla.milli2string(db, 0) @@ -74,7 +73,7 @@ class TestETL(unittest.TestCase): param.bug_list = self.settings.param.bugs param.allow_private_bugs = self.settings.param.allow_private_bugs - with ThreadedQueue(candidate, size=1000) as output: + with ThreadedQueue("etl_queue", candidate, max_size=1000) as output: etl(db, output, param, please_stop=None) #COMPARE ALL BUGS @@ -91,18 +90,18 @@ class TestETL(unittest.TestCase): NUM_TO_TEST = 100 MAX_BUG_ID = 900000 - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: candidate = elasticsearch.make_test_instance("candidate", self.settings.candidate) - reference = ElasticSearch(self.settings.private_bugs_reference) + reference = elasticsearch.Index(self.settings.private_bugs_reference) #GO FASTER BY STORING LOCAL FILE local_cache = File(self.settings.param.temp_dir + "/private_bugs.json") if local_cache.exists: - private_bugs = set(CNV.JSON2object(local_cache.read())) + private_bugs = set(convert.json2value(local_cache.read())) else: with Timer("get private bugs"): private_bugs = compare_es.get_private_bugs(reference) - local_cache.write(CNV.object2JSON(private_bugs)) + local_cache.write(convert.value2json(private_bugs)) while True: some_bugs = [b for b in [Random.int(MAX_BUG_ID) for i in range(NUM_TO_TEST)] if b not in private_bugs] @@ -110,8 +109,8 @@ class TestETL(unittest.TestCase): Log.note("Test with the following bug_ids: {{bugs}}", {"bugs":some_bugs}) #SETUP RUN PARAMETERS - param = Struct() - param.end_time = CNV.datetime2milli(get_current_time(db)) + param = Dict() + param.end_time = convert.datetime2milli(get_current_time(db)) param.start_time = 0 param.start_time_str = extract_bugzilla.milli2string(db, 0) param.alias_file = self.settings.param.alias_file @@ -196,7 +195,7 @@ class TestETL(unittest.TestCase): database.make_test_instance(self.settings.bugzilla) #MARK SOME BUGS PRIVATE - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: for b in private_bugs: database.add_bug_group(db, b, BUG_GROUP_FOR_TESTING) @@ -219,7 +218,7 @@ class TestETL(unittest.TestCase): bz_etl.main(self.settings, es, es_c) #MARK SOME STUFF PRIVATE - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: #BUGS private_bugs = set(Random.sample(self.settings.param.bugs, 3)) Log.note("The private bugs are {{bugs}}", {"bugs": private_bugs}) @@ -259,7 +258,7 @@ class TestETL(unittest.TestCase): #MARK SOME STUFF PUBLIC - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: for b in private_bugs: database.remove_bug_group(db, b, BUG_GROUP_FOR_TESTING) @@ -276,7 +275,7 @@ class TestETL(unittest.TestCase): database.make_test_instance(self.settings.bugzilla) #MARK SOME STUFF PRIVATE - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: private_attachments = db.query(""" SELECT bug_id, @@ -305,7 +304,7 @@ class TestETL(unittest.TestCase): database.make_test_instance(self.settings.bugzilla) #MARK SOME COMMENTS PRIVATE - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: private_comments = db.query(""" SELECT bug_id, @@ -341,7 +340,7 @@ class TestETL(unittest.TestCase): database.make_test_instance(self.settings.bugzilla) #MARK SOME BUGS PRIVATE - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: for b in private_bugs: database.add_bug_group(db, b, BUG_GROUP_FOR_TESTING) @@ -350,7 +349,7 @@ class TestETL(unittest.TestCase): bz_etl.main(self.settings, es, es_c) # MAKE A CHANGE TO THE PRIVATE BUGS - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: for b in private_bugs: old_bug = db.query("SELECT * FROM bugs WHERE bug_id={{bug_id}}", {"bug_id": b})[0] new_bug = old_bug.copy() @@ -370,15 +369,15 @@ class TestETL(unittest.TestCase): "query": {"match_all": {}}, "filter": {"and": [ {"terms": {"bug_id": private_bugs}}, - {"range": {"expires_on": {"gte": CNV.datetime2milli(now)}}} + {"range": {"expires_on": {"gte": convert.datetime2milli(now)}}} ]} }}, "from": 0, "size": 200000, "sort": [] }) - latest_bugs = Q.select(results.hits.hits, "_source") - latest_bugs_index = Q.unique_index(latest_bugs, "bug_id") # IF NOT UNIQUE, THEN ETL IS WRONG + latest_bugs = qb.select(results.hits.hits, "_source") + latest_bugs_index = qb.unique_index(latest_bugs, "bug_id") # IF NOT UNIQUE, THEN ETL IS WRONG for bug_id in private_bugs: if latest_bugs_index[bug_id] == None: @@ -396,18 +395,18 @@ class TestETL(unittest.TestCase): def test_incremental_etl_catches_tracking_flags(self): database.make_test_instance(self.settings.bugzilla) - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: es = elasticsearch.make_test_instance("candidate", self.settings.candidate) #SETUP RUN PARAMETERS - param = Struct() - param.end_time = CNV.datetime2milli(get_current_time(db)) + param = Dict() + param.end_time = convert.datetime2milli(get_current_time(db)) # FLAGS ADDED TO BUG 813650 ON 18/12/2012 2:38:08 AM (PDT), SO START AT SOME LATER TIME - param.start_time = CNV.datetime2milli(CNV.string2datetime("02/01/2013 10:09:15", "%d/%m/%Y %H:%M:%S")) + param.start_time = convert.datetime2milli(convert.string2datetime("02/01/2013 10:09:15", "%d/%m/%Y %H:%M:%S")) param.start_time_str = extract_bugzilla.milli2string(db, param.start_time) param.alias_file = self.settings.param.alias_file - param.bug_list = struct.wrap([813650]) + param.bug_list = wrap([813650]) param.allow_private_bugs = self.settings.param.allow_private_bugs with ThreadedQueue(es, size=1000) as output: @@ -428,7 +427,7 @@ class TestETL(unittest.TestCase): database.make_test_instance(self.settings.bugzilla) - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: es = elasticsearch.make_test_instance("candidate", self.settings.candidate) #MARK BUG AS ONE OF THE SCREENED GROUPS @@ -436,13 +435,13 @@ class TestETL(unittest.TestCase): db.flush() #SETUP RUN PARAMETERS - param = Struct() - param.end_time = CNV.datetime2milli(get_current_time(db)) + param = Dict() + param.end_time = convert.datetime2milli(get_current_time(db)) param.start_time = 0 param.start_time_str = extract_bugzilla.milli2string(db, 0) param.alias_file = self.settings.param.alias_file - param.bug_list = struct.wrap([GOOD_BUG_TO_TEST]) # bug 1046 sees lots of whiteboard, and other field, changes + param.bug_list = wrap([GOOD_BUG_TO_TEST]) # bug 1046 sees lots of whiteboard, and other field, changes param.allow_private_bugs = True with ThreadedQueue(es, size=1000) as output: @@ -460,7 +459,7 @@ class TestETL(unittest.TestCase): database.make_test_instance(self.settings.bugzilla) - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: es = elasticsearch.make_test_instance("candidate", self.settings.candidate) #MARK BUG AS ONE OF THE SCREENED GROUPS @@ -470,13 +469,13 @@ class TestETL(unittest.TestCase): db.flush() #SETUP RUN PARAMETERS - param = Struct() - param.end_time = CNV.datetime2milli(get_current_time(db)) + param = Dict() + param.end_time = convert.datetime2milli(get_current_time(db)) param.start_time = 0 param.start_time_str = extract_bugzilla.milli2string(db, 0) param.alias_file = self.settings.param.alias_file - param.bug_list = struct.wrap([GOOD_BUG_TO_TEST]) # bug 1046 sees lots of whiteboard, and other field, changes + param.bug_list = wrap([GOOD_BUG_TO_TEST]) # bug 1046 sees lots of whiteboard, and other field, changes param.allow_private_bugs = True with ThreadedQueue(es, size=1000) as output: @@ -491,13 +490,13 @@ class TestETL(unittest.TestCase): def test_incremental_has_correct_expires_on(self): # 813650, 726635 BOTH HAVE CHANGES IN 2013 - bugs = struct.wrap([813650, 726635]) - start_incremental=CNV.datetime2milli(CNV.string2datetime("2013-01-01", "%Y-%m-%d")) + bugs = wrap([813650, 726635]) + start_incremental=convert.datetime2milli(convert.string2datetime("2013-01-01", "%Y-%m-%d")) es = elasticsearch.make_test_instance("candidate", self.settings.candidate) - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: #SETUP FIRST RUN PARAMETERS - param = Struct() + param = Dict() param.end_time = start_incremental param.start_time = 0 param.start_time_str = extract_bugzilla.milli2string(db, param.start_time) @@ -510,8 +509,8 @@ class TestETL(unittest.TestCase): etl(db, output, param, please_stop=None) #SETUP INCREMENTAL RUN PARAMETERS - param = Struct() - param.end_time = CNV.datetime2milli(datetime.utcnow()) + param = Dict() + param.end_time = convert.datetime2milli(datetime.utcnow()) param.start_time = start_incremental param.start_time_str = extract_bugzilla.milli2string(db, param.start_time) @@ -528,7 +527,7 @@ class TestETL(unittest.TestCase): "query": {"match_all": {}}, "filter": {"and":[ {"term":{"bug_id":b}}, - {"range":{"expires_on":{"gte":CNV.datetime2milli(datetime.utcnow())}}} + {"range":{"expires_on":{"gte":convert.datetime2milli(datetime.utcnow())}}} ]} }}, "from": 0, @@ -564,13 +563,13 @@ def verify_public_bugs(es, private_bugs): def verify_no_private_attachments(es, private_attachments): #VERIFY ATTACHMENTS ARE NOT IN OUTPUT - for b in Q.select(private_attachments, "bug_id"): + for b in qb.select(private_attachments, "bug_id"): versions = compare_es.get_all_bug_versions(es, b) #WE ASSUME THE ATTACHMENT, IF IT EXISTS, WILL BE SOMEWHERE IN THE BUG IT #BELONGS TO, IF AT ALL for v in versions: for a in v.attachments: - if a.attach_id in Q.select(private_attachments, "attach_id"): + if a.attach_id in qb.select(private_attachments, "attach_id"): Log.error("Private attachment should not exist") @@ -587,7 +586,7 @@ def verify_no_private_comments(es, private_comments): "sort": [] }) - if Q.select(data.hits.hits, "_source"): + if qb.select(data.hits.hits, "_source"): Log.error("Expecting no comments") @@ -601,25 +600,25 @@ def compare_both(candidate, reference, settings, some_bugs): found_errors = False for bug_id in some_bugs: try: - versions = Q.sort( + versions = qb.sort( get_all_bug_versions(candidate, bug_id, datetime.utcnow()), "modified_ts") # WE CAN NOT EXPECT candidate TO BE UP TO DATE BECAUSE IT IS USING AN OLD IMAGE if not versions: - max_time = CNV.milli2datetime(settings.bugzilla.expires_on) + max_time = convert.milli2datetime(settings.bugzilla.expires_on) else: - max_time = CNV.milli2datetime(versions.last().modified_ts) + max_time = convert.milli2datetime(versions.last().modified_ts) pre_ref_versions = get_all_bug_versions(reference, bug_id, max_time) ref_versions = \ - Q.sort( + qb.sort( #ADDED TO FIX OLD PRODUCTION BUG VERSIONS [compare_es.old2new(x, settings.bugzilla.expires_on) for x in pre_ref_versions], "modified_ts" ) - can = CNV.object2JSON(versions, pretty=True) - ref = CNV.object2JSON(ref_versions, pretty=True) + can = convert.value2json(versions, pretty=True) + ref = convert.value2json(ref_versions, pretty=True) if can != ref: found_errors = True File(try_dir + unicode(bug_id) + ".txt").write(can) diff --git a/tests/test_one_etl.py b/tests/test_one_etl.py index 241f291..2e9dc98 100644 --- a/tests/test_one_etl.py +++ b/tests/test_one_etl.py @@ -8,14 +8,14 @@ # Author: Kyle Lahnakoski (kyle@lahnakoski.com) # import unittest -from bzETL import extract_bugzilla, bz_etl +from bzETL import bz_etl, extract_bugzilla from bzETL.bz_etl import etl from bzETL.extract_bugzilla import get_current_time -from pyLibrary.cnv import CNV -from pyLibrary.sql.db import DB, all_db -from pyLibrary.env.logs import Log -from pyLibrary.env import startup -from pyLibrary.struct import Struct +from pyLibrary import convert +from pyLibrary.debugs import startup +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import Dict +from pyLibrary.sql.mysql import all_db, MySQL from pyLibrary.testing import elasticsearch from pyLibrary.thread.threads import ThreadedQueue @@ -31,7 +31,7 @@ class TestOneETL(unittest.TestCase): def tearDown(self): - #CLOSE THE CACHED DB CONNECTIONS + #CLOSE THE CACHED MySQL CONNECTIONS bz_etl.close_db_connections() if all_db: @@ -45,12 +45,12 @@ class TestOneETL(unittest.TestCase): USE A MYSQL DATABASE TO FILL AN ES INSTANCE (USE Fake_ES() INSTANCES TO KEEP THIS TEST LOCAL) WITH VERSIONS OF BUGS FROM settings.param.bugs. """ - with DB(self.settings.bugzilla) as db: + with MySQL(self.settings.bugzilla) as db: candidate = elasticsearch.make_test_instance("candidate", self.settings.elasticsearch) #SETUP RUN PARAMETERS - param = Struct() - param.end_time = CNV.datetime2milli(get_current_time(db)) + param = Dict() + param.end_time = convert.datetime2milli(get_current_time(db)) param.start_time = 0 param.start_time_str = extract_bugzilla.milli2string(db, 0) @@ -63,7 +63,7 @@ class TestOneETL(unittest.TestCase): #TODO: INCLUDE OPTION TO USE REAL ES (AND ENSURE REALLY WORKING) - # es_settings=Struct(**{ + # es_settings=Dict(**{ # "host": "http://localhost", # "port": "9200", # "index": ElasticSearch.proto_name("test_public_bugs"), diff --git a/tests/test_replicate.py b/tests/test_replicate.py index 3c42533..5fc31e1 100644 --- a/tests/test_replicate.py +++ b/tests/test_replicate.py @@ -9,10 +9,10 @@ # from bzETL import replicate -from pyLibrary.env import startup -from pyLibrary.cnv import CNV -from pyLibrary.env.elasticsearch import ElasticSearch -from pyLibrary.env.logs import Log +from pyLibrary import convert +from pyLibrary.debugs import startup +from pyLibrary.debugs.logs import Log +from pyLibrary.env import elasticsearch def test_replication(): @@ -20,10 +20,10 @@ def test_replication(): settings=startup.read_settings(filename="replication_settings.json") Log.start(settings.debug) - source=ElasticSearch(settings.source) + source=elasticsearch.Index(settings.source) destination=replicate.get_or_create_index(settings["destination"], source) - replicate.replicate(source, destination, [537285], CNV.string2datetime("19900101", "%Y%m%d")) + replicate.replicate(source, destination, [537285], convert.string2datetime("19900101", "%Y%m%d")) finally: Log.stop() diff --git a/tests/util/compare_es.py b/tests/util/compare_es.py index a3c02c9..f690307 100644 --- a/tests/util/compare_es.py +++ b/tests/util/compare_es.py @@ -10,11 +10,10 @@ from datetime import datetime from bzETL import transform_bugzilla, parse_bug_history -from pyLibrary import struct -from pyLibrary.struct import nvl -from pyLibrary.cnv import CNV +from pyLibrary import convert +from pyLibrary.dot import coalesce, unwrap from pyLibrary.maths import Math -from pyLibrary.queries import Q +from pyLibrary.queries import qb #PULL ALL BUG DOCS FROM ONE ES @@ -22,14 +21,14 @@ from pyLibrary.times.timer import Timer def get_all_bug_versions(es, bug_id, max_time=None): - max_time = nvl(max_time, datetime.max) + max_time = coalesce(max_time, datetime.max) data = es.search({ "query": {"filtered": { "query": {"match_all": {}}, "filter": {"and": [ {"term": {"bug_id": bug_id}}, - {"range": {"modified_ts": {"lte": CNV.datetime2milli(max_time)}}} + {"range": {"modified_ts": {"lte": convert.datetime2milli(max_time)}}} ]} }}, "from": 0, @@ -37,7 +36,7 @@ def get_all_bug_versions(es, bug_id, max_time=None): "sort": [] }) - return Q.select(data.hits.hits, "_source") + return qb.select(data.hits.hits, "_source") def get_private_bugs(es): @@ -63,10 +62,10 @@ def get_private_bugs(es): output = set([]) for bug in data.hits.hits: output.add(bug.fields.bug_id) - output |= set(nvl(CNV.value2intlist(bug.fields.blocked), [])) - output |= set(nvl(CNV.value2intlist(bug.fields.dependson), [])) - output |= set(nvl(CNV.value2intlist(bug.fields.dupe_of), [])) - output |= set(nvl(CNV.value2intlist(bug.fields.dupe_by), [])) + output |= set(coalesce(convert.value2intlist(bug.fields.blocked), [])) + output |= set(coalesce(convert.value2intlist(bug.fields.dependson), [])) + output |= set(coalesce(convert.value2intlist(bug.fields.dupe_of), [])) + output |= set(coalesce(convert.value2intlist(bug.fields.dupe_by), [])) output.add(551988, 636964) return output @@ -83,23 +82,23 @@ def old2new(bug, max_date): else: bug.everconfirmed = int(bug.everconfirmed) - bug = CNV.JSON2object(CNV.object2JSON(bug).replace("bugzilla: other b.m.o issues ", "bugzilla: other b.m.o issues")) + bug = convert.json2value(convert.value2json(bug).replace("bugzilla: other b.m.o issues ", "bugzilla: other b.m.o issues")) if bug.expires_on > max_date: bug.expires_on = parse_bug_history.MAX_TIME if bug.votes != None: bug.votes = int(bug.votes) - bug.dupe_by = CNV.value2intlist(bug.dupe_by) + bug.dupe_by = convert.value2intlist(bug.dupe_by) if bug.votes == 0: del bug["votes"] # if Math.is_integer(bug.remaining_time) and int(bug.remaining_time) == 0: # bug.remaining_time = 0 if bug.cf_due_date != None and not Math.is_number(bug.cf_due_date): - bug.cf_due_date = CNV.datetime2milli( - CNV.string2datetime(bug.cf_due_date, "%Y-%m-%d") + bug.cf_due_date = convert.datetime2milli( + convert.string2datetime(bug.cf_due_date, "%Y-%m-%d") ) - bug.changes = CNV.JSON2object( - CNV.object2JSON(Q.sort(bug.changes, "field_name")) \ + bug.changes = convert.json2value( + convert.value2json(qb.sort(bug.changes, "field_name")) \ .replace("\"field_value_removed\":", "\"old_value\":") \ .replace("\"field_value\":", "\"new_value\":") ) @@ -113,7 +112,7 @@ def old2new(bug, max_date): if Math.is_number(bug.cf_last_resolved): bug.cf_last_resolved = long(bug.cf_last_resolved) else: - bug.cf_last_resolved = CNV.datetime2milli(CNV.string2datetime(bug.cf_last_resolved, "%Y-%m-%d %H:%M:%S")) + bug.cf_last_resolved = convert.datetime2milli(convert.string2datetime(bug.cf_last_resolved, "%Y-%m-%d %H:%M:%S")) except Exception, e: pass @@ -123,15 +122,15 @@ def old2new(bug, max_date): if c.attach_id == '': c.attach_id = None else: - c.attach_id = CNV.value2int(c.attach_id) + c.attach_id = convert.value2int(c.attach_id) - bug.attachments = Q.sort(bug.attachments, "attach_id") + bug.attachments = qb.sort(bug.attachments, "attach_id") for a in bug.attachments: - a.attach_id = CNV.value2int(a.attach_id) + a.attach_id = convert.value2int(a.attach_id) for k, v in list(a.items()): if k.endswith("isobsolete") or k.endswith("ispatch") or k.endswith("isprivate"): - struct.unwrap(a)[k] = CNV.value2int(v) # PREVENT dot (.) INTERPRETATION - a[k.split(".")[-1].split("_")[-1]] = CNV.value2int(v) + unwrap(a)[k] = convert.value2int(v) # PREVENT dot (.) INTERPRETATION + a[k.split(".")[-1].split("_")[-1]] = convert.value2int(v) bug = transform_bugzilla.normalize(bug) return bug diff --git a/tests/util/database.py b/tests/util/database.py index 708600a..c38d916 100644 --- a/tests/util/database.py +++ b/tests/util/database.py @@ -1,11 +1,11 @@ # encoding: utf-8 # from bzETL.extract_bugzilla import milli2string, get_current_time -from pyLibrary.cnv import CNV -from pyLibrary.queries.db_query import esfilter2sqlwhere -from pyLibrary.sql.db import DB -from pyLibrary.env.logs import Log -from pyLibrary.struct import Struct +from pyLibrary import convert +from pyLibrary.debugs.logs import Log +from pyLibrary.dot import Dict +from pyLibrary.queries.qb_usingMySQL import esfilter2sqlwhere +from pyLibrary.sql.mysql import MySQL from pyLibrary.times.timer import Timer @@ -20,13 +20,13 @@ def make_test_instance(db_settings): Log.note("Make empty {{schema}} schema", {"schema":db_settings.schema}) no_schema=db_settings.copy() no_schema.schema = None - with DB(no_schema) as db: + with MySQL(no_schema) as db: db.execute("DROP DATABASE IF EXISTS {{schema}}", {"schema":db.quote_column(db_settings.schema)}) db.execute("CREATE DATABASE {{schema}}", {"schema":db.quote_column(db_settings.schema)}) #FILL SCHEMA Log.note("Fill {{schema}} schema with data", {"schema":db_settings.schema}) - DB.execute_file(db_settings, db_settings.filename) + MySQL.execute_file(filename=db_settings.filename, settings=db_settings) except Exception, e: Log.error("Can not setup test database", e) @@ -63,8 +63,8 @@ def add_bug_group(db, bug_id, group_name): group_id=group_exists[0].id diff(db, "bugs", - Struct(bug_id=bug_id, bug_group=None), - Struct(bug_id=bug_id, bug_group=group_name) + Dict(bug_id=bug_id, bug_group=None), + Dict(bug_id=bug_id, bug_group=group_name) ) db.insert("bug_group_map", {"bug_id":bug_id, "group_id":group_id}) @@ -73,8 +73,8 @@ def remove_bug_group(db, bug_id, group_name): group_id=db.query("SELECT id FROM groups WHERE name={{name}}", {"name": group_name})[0].id diff(db, "bugs", - Struct(bug_id=bug_id, bug_group=group_name), - Struct(bug_id=bug_id, bug_group=None) + Dict(bug_id=bug_id, bug_group=group_name), + Dict(bug_id=bug_id, bug_group=None) ) db.execute("DELETE FROM bug_group_map WHERE bug_id={{bug_id}} and group_id={{group_id}}", { "bug_id":bug_id, @@ -88,7 +88,7 @@ def diff(db, table, old_record, new_record): """ UPDATE bugs_activity WITH THE CHANGES IN RECORDS """ - now = milli2string(db, CNV.datetime2milli(get_current_time(db))) + now = milli2string(db, convert.datetime2milli(get_current_time(db))) changed = set(old_record.keys()) ^ set(new_record.keys()) changed |= set([k for k, v in old_record.items() if v != new_record[k]]) @@ -103,7 +103,7 @@ def diff(db, table, old_record, new_record): if fieldid == None: Log.error("Expecting a valid field name") - activity = Struct( + activity = Dict( bug_id=old_record.bug_id, who=1, bug_when=now,