about:config - merge with trunk
authorDaniel Brooks <db48x@db48x.net>
Fri, 29 Oct 2010 14:18:58 -0500
changeset 58867 98ba0272986dc4d6229cb5da562905cd606d7d54
parent 58866 2ba79a29163e8c2463a9335d5c8d65fd87da164b (current diff)
parent 56693 4a093a3d6299662b1775e11e567122902f285e7f (diff)
child 58868 5bc82216672f67f86b754a5a10fa0e5667e75b7f
push id17440
push userdb48x@yahoo.com
push dateWed, 08 Dec 2010 04:15:54 +0000
treeherdermozilla-central@a89f24bf1798 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone2.0b8pre
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
about:config - merge with trunk
browser/base/content/browser.js
browser/components/search/test/browser_415700.js
browser/locales/en-US/chrome/browser/history/history.dtd
browser/locales/jar.mn
content/canvas/src/DocumentRendererNativeIDChild.cpp
content/canvas/src/DocumentRendererNativeIDParent.cpp
content/canvas/src/DocumentRendererShmemChild.cpp
content/canvas/src/DocumentRendererShmemParent.cpp
dom/ipc/PDocumentRendererNativeID.ipdl
dom/ipc/PDocumentRendererShmem.ipdl
js/src/methodjit/BytecodeAnalyzer.cpp
js/src/methodjit/BytecodeAnalyzer.h
js/src/tests/js1_8_1/trace/browser.js
js/src/tests/js1_8_1/trace/jstests.list
js/src/tests/js1_8_1/trace/math-trace-tests.js
js/src/tests/js1_8_1/trace/regress-451673.js
js/src/tests/js1_8_1/trace/regress-451974-01.js
js/src/tests/js1_8_1/trace/regress-451974-02.js
js/src/tests/js1_8_1/trace/regress-452498-01.js
js/src/tests/js1_8_1/trace/regress-458838.js
js/src/tests/js1_8_1/trace/regress-462459-01.js
js/src/tests/js1_8_1/trace/regress-462459-02.js
js/src/tests/js1_8_1/trace/regress-462459-03.js
js/src/tests/js1_8_1/trace/regress-462459-04.js
js/src/tests/js1_8_1/trace/regress-462459-05.js
js/src/tests/js1_8_1/trace/regress-462459-06.js
js/src/tests/js1_8_1/trace/regress-462459-07.js
js/src/tests/js1_8_1/trace/regress-462459-08.js
js/src/tests/js1_8_1/trace/regress-462459-09.js
js/src/tests/js1_8_1/trace/regress-462459-10.js
js/src/tests/js1_8_1/trace/regress-462459-11.js
js/src/tests/js1_8_1/trace/regress-462459-12.js
js/src/tests/js1_8_1/trace/regress-469927.js
js/src/tests/js1_8_1/trace/regress-470739.js
js/src/tests/js1_8_1/trace/regress-471635.js
js/src/tests/js1_8_1/trace/regress-489682.js
js/src/tests/js1_8_1/trace/shell.js
js/src/tests/js1_8_1/trace/testDeepBailFromNonNative.js
js/src/trace-test/README
js/src/trace-test/lib/andTestHelper.js
js/src/trace-test/lib/array-compare.js
js/src/trace-test/lib/mandelbrot-results.js
js/src/trace-test/lib/orTestHelper.js
js/src/trace-test/lib/prolog.js
js/src/trace-test/lib/range.js
js/src/trace-test/progressbar.py
js/src/trace-test/tests/arguments/args-createontrace.js
js/src/trace-test/tests/arguments/args-mochi-2.js
js/src/trace-test/tests/arguments/args-mochi-2a.js
js/src/trace-test/tests/arguments/args-mochi.js
js/src/trace-test/tests/arguments/args-mutate-length-1.js
js/src/trace-test/tests/arguments/args-mutate-length-2.js
js/src/trace-test/tests/arguments/args-range-2.js
js/src/trace-test/tests/arguments/args-range-const.js
js/src/trace-test/tests/arguments/args-range.js
js/src/trace-test/tests/arguments/args-redefine-length-1.js
js/src/trace-test/tests/arguments/args-redefine-length-2.js
js/src/trace-test/tests/arguments/args-sum.js
js/src/trace-test/tests/arguments/args-vargc.js
js/src/trace-test/tests/arguments/args1.js
js/src/trace-test/tests/arguments/args10.js
js/src/trace-test/tests/arguments/args11.js
js/src/trace-test/tests/arguments/args2.js
js/src/trace-test/tests/arguments/args2a.js
js/src/trace-test/tests/arguments/args2b.js
js/src/trace-test/tests/arguments/args2c.js
js/src/trace-test/tests/arguments/args2d.js
js/src/trace-test/tests/arguments/args3.js
js/src/trace-test/tests/arguments/args4.js
js/src/trace-test/tests/arguments/args5.js
js/src/trace-test/tests/arguments/args6.js
js/src/trace-test/tests/arguments/args6a.js
js/src/trace-test/tests/arguments/args7.js
js/src/trace-test/tests/arguments/args8.js
js/src/trace-test/tests/arguments/args9.js
js/src/trace-test/tests/arguments/argsub.js
js/src/trace-test/tests/arguments/argsx-1.js
js/src/trace-test/tests/arguments/argsx-2.js
js/src/trace-test/tests/arguments/argsx-3.js
js/src/trace-test/tests/arguments/argsx-3a.js
js/src/trace-test/tests/arguments/argsx-4.js
js/src/trace-test/tests/arguments/bug503772.js
js/src/trace-test/tests/arguments/bug508178.js
js/src/trace-test/tests/arguments/bug554670-1.js
js/src/trace-test/tests/arguments/bug554670-2.js
js/src/trace-test/tests/arguments/nonstrict-args.js
js/src/trace-test/tests/arguments/nonstrict-assign-element-get-parameter.js
js/src/trace-test/tests/arguments/nonstrict-assign-parameter-get-element.js
js/src/trace-test/tests/arguments/nonstrict-assign.js
js/src/trace-test/tests/arguments/nonstrict-later-assign.js
js/src/trace-test/tests/arguments/nonstrict-noargs.js
js/src/trace-test/tests/arguments/strict-args.js
js/src/trace-test/tests/arguments/strict-assign-after.js
js/src/trace-test/tests/arguments/strict-assign-arguments-element.js
js/src/trace-test/tests/arguments/strict-assign-outer-param-psych.js
js/src/trace-test/tests/arguments/strict-assign-outer-param.js
js/src/trace-test/tests/arguments/strict-assign-parameter-get-element.js
js/src/trace-test/tests/arguments/strict-assign.js
js/src/trace-test/tests/arguments/strict-eval-mutation.js
js/src/trace-test/tests/arguments/strict-eval.js
js/src/trace-test/tests/arguments/strict-maybe-assign-outer.js
js/src/trace-test/tests/arguments/strict-maybe-nested-eval.js
js/src/trace-test/tests/arguments/strict-nested-assign-shadow-function-call.js
js/src/trace-test/tests/arguments/strict-nested-assign-shadow-function-name.js
js/src/trace-test/tests/arguments/strict-nested-assign-shadow-function.js
js/src/trace-test/tests/arguments/strict-nested-assign-shadowed-catch-call.js
js/src/trace-test/tests/arguments/strict-nested-assign-shadowed-catch.js
js/src/trace-test/tests/arguments/strict-nested-assign-shadowed-var.js
js/src/trace-test/tests/arguments/strict-nested-eval.js
js/src/trace-test/tests/arguments/strict-nested-shadow-eval.js
js/src/trace-test/tests/arguments/strict-nested-shadow-maybe-eval.js
js/src/trace-test/tests/arguments/strict-noargs.js
js/src/trace-test/tests/arguments/testDelArg1.js
js/src/trace-test/tests/arguments/testDelArg2.js
js/src/trace-test/tests/basic/FPQuadCmp.js
js/src/trace-test/tests/basic/argumentsPassedToBuiltin.js
js/src/trace-test/tests/basic/arith.js
js/src/trace-test/tests/basic/arityMismatchExtraArg.js
js/src/trace-test/tests/basic/arityMismatchMissingArg.js
js/src/trace-test/tests/basic/bigLoadStoreDisp.js
js/src/trace-test/tests/basic/bitwiseAnd.js
js/src/trace-test/tests/basic/bitwiseGlobal.js
js/src/trace-test/tests/basic/bug464403.js
js/src/trace-test/tests/basic/bug465902.js
js/src/trace-test/tests/basic/bug489098.js
js/src/trace-test/tests/basic/bug504587-1.js
js/src/trace-test/tests/basic/bug507180.js
js/src/trace-test/tests/basic/bug509639.js
js/src/trace-test/tests/basic/bug509982.js
js/src/trace-test/tests/basic/bug510434.js
js/src/trace-test/tests/basic/bug510437-2.js
js/src/trace-test/tests/basic/bug510437.js
js/src/trace-test/tests/basic/bug510642.js
js/src/trace-test/tests/basic/bug510655.js
js/src/trace-test/tests/basic/bug511214.js
js/src/trace-test/tests/basic/bug511241.js
js/src/trace-test/tests/basic/bug513038.js
js/src/trace-test/tests/basic/bug516009.js
js/src/trace-test/tests/basic/bug517721.js
js/src/trace-test/tests/basic/bug519129.js
js/src/trace-test/tests/basic/bug520498.js
js/src/trace-test/tests/basic/bug522136.js
js/src/trace-test/tests/basic/bug522817.js
js/src/trace-test/tests/basic/bug524826-2.js
js/src/trace-test/tests/basic/bug524826.js
js/src/trace-test/tests/basic/bug525028.js
js/src/trace-test/tests/basic/bug527288.js
js/src/trace-test/tests/basic/bug528116.js
js/src/trace-test/tests/basic/bug528644.js
js/src/trace-test/tests/basic/bug529130.js
js/src/trace-test/tests/basic/bug532568-2.js
js/src/trace-test/tests/basic/bug532568.js
js/src/trace-test/tests/basic/bug532823.js
js/src/trace-test/tests/basic/bug535474.js
js/src/trace-test/tests/basic/bug535760.js
js/src/trace-test/tests/basic/bug535930.js
js/src/trace-test/tests/basic/bug536445.js
js/src/trace-test/tests/basic/bug536748.js
js/src/trace-test/tests/basic/bug539379.js
js/src/trace-test/tests/basic/bug539553-2.js
js/src/trace-test/tests/basic/bug539553-3.js
js/src/trace-test/tests/basic/bug539553.js
js/src/trace-test/tests/basic/bug541191-1.js
js/src/trace-test/tests/basic/bug541191-2.js
js/src/trace-test/tests/basic/bug541191-3.js
js/src/trace-test/tests/basic/bug541191-4.js
js/src/trace-test/tests/basic/bug541191-5.js
js/src/trace-test/tests/basic/bug547911-1.js
js/src/trace-test/tests/basic/bug547911-2.js
js/src/trace-test/tests/basic/bug551705.js
js/src/trace-test/tests/basic/bug552196.js
js/src/trace-test/tests/basic/bug557168-1.js
js/src/trace-test/tests/basic/bug557168-2.js
js/src/trace-test/tests/basic/bug557168-3.js
js/src/trace-test/tests/basic/bug557168.js
js/src/trace-test/tests/basic/bug557841.js
js/src/trace-test/tests/basic/bug558530.js
js/src/trace-test/tests/basic/bug558814.js
js/src/trace-test/tests/basic/bug560234.js
js/src/trace-test/tests/basic/bug560234b.js
js/src/trace-test/tests/basic/bug561279.js
js/src/trace-test/tests/basic/bug566637.js
js/src/trace-test/tests/basic/bug569651.js
js/src/trace-test/tests/basic/bug569843.js
js/src/trace-test/tests/basic/bug569849.js
js/src/trace-test/tests/basic/bug570663-1.js
js/src/trace-test/tests/basic/bug570663-2.js
js/src/trace-test/tests/basic/bug572229.js
js/src/trace-test/tests/basic/bug574280.js
js/src/trace-test/tests/basic/bug576823-regexp.js
js/src/trace-test/tests/basic/bug578041.js
js/src/trace-test/tests/basic/bug579740.js
js/src/trace-test/tests/basic/bug582479.js
js/src/trace-test/tests/basic/bug583615.js
js/src/trace-test/tests/basic/bug583757.js
js/src/trace-test/tests/basic/bug584499-1.js
js/src/trace-test/tests/basic/bug584499-2.js
js/src/trace-test/tests/basic/bug584565.js
js/src/trace-test/tests/basic/bug586499-regexp.js
js/src/trace-test/tests/basic/bug586917.js
js/src/trace-test/tests/basic/bug587346-regexp-01.js
js/src/trace-test/tests/basic/bug587366.js
js/src/trace-test/tests/basic/bug589318.js
js/src/trace-test/tests/basic/bug590006.js
js/src/trace-test/tests/basic/bug592927.js
js/src/trace-test/tests/basic/bug593663-regexp.js
js/src/trace-test/tests/basic/bug594108.js
js/src/trace-test/tests/basic/bug594205.js
js/src/trace-test/tests/basic/bug595963-1.js
js/src/trace-test/tests/basic/bug595963-2.js
js/src/trace-test/tests/basic/bug596502-version.js
js/src/trace-test/tests/basic/bug601395.js
js/src/trace-test/tests/basic/bug601398.js
js/src/trace-test/tests/basic/bug601401.js
js/src/trace-test/tests/basic/bug601402.js
js/src/trace-test/tests/basic/bug601428.js
js/src/trace-test/tests/basic/bug602088.js
js/src/trace-test/tests/basic/call.js
js/src/trace-test/tests/basic/call2.js
js/src/trace-test/tests/basic/createMandelSet.js
js/src/trace-test/tests/basic/deep2.js
js/src/trace-test/tests/basic/deepForInLoop.js
js/src/trace-test/tests/basic/delete-array-elements.js
js/src/trace-test/tests/basic/delete-indexed-names.js
js/src/trace-test/tests/basic/delete-named-names.js
js/src/trace-test/tests/basic/delete-non-config.js
js/src/trace-test/tests/basic/dependentStrings.js
js/src/trace-test/tests/basic/doMath.js
js/src/trace-test/tests/basic/equalInt.js
js/src/trace-test/tests/basic/fannkuch.js
js/src/trace-test/tests/basic/firstSlotConflict.js
js/src/trace-test/tests/basic/forVarInWith.js
js/src/trace-test/tests/basic/function-bind.js
js/src/trace-test/tests/basic/getelem.js
js/src/trace-test/tests/basic/getprop.js
js/src/trace-test/tests/basic/globalGet.js
js/src/trace-test/tests/basic/globalOptimize-1.js
js/src/trace-test/tests/basic/globalSet.js
js/src/trace-test/tests/basic/ifInsideLoop.js
js/src/trace-test/tests/basic/inArrayTest.js
js/src/trace-test/tests/basic/inObjectTest.js
js/src/trace-test/tests/basic/innerLoopIntOuterDouble.js
js/src/trace-test/tests/basic/inner_double_outer_int.js
js/src/trace-test/tests/basic/jitstatsArchFlags.js
js/src/trace-test/tests/basic/joinTest.js
js/src/trace-test/tests/basic/matchInLoop.js
js/src/trace-test/tests/basic/math-trace-tests.js
js/src/trace-test/tests/basic/merge_type_maps.js
js/src/trace-test/tests/basic/missingArgTest.js
js/src/trace-test/tests/basic/missingArgTest2.js
js/src/trace-test/tests/basic/mod.js
js/src/trace-test/tests/basic/name-inactive-del.js
js/src/trace-test/tests/basic/name-inactive-eval-del.js
js/src/trace-test/tests/basic/name-inactive-inferflags.js
js/src/trace-test/tests/basic/name-inactive.js
js/src/trace-test/tests/basic/name.js
js/src/trace-test/tests/basic/nestedExit2.js
js/src/trace-test/tests/basic/nestedExitLoop.js
js/src/trace-test/tests/basic/newArrayTest.js
js/src/trace-test/tests/basic/newTest.js
js/src/trace-test/tests/basic/nonEmptyStack1.js
js/src/trace-test/tests/basic/nonEmptyStack2.js
js/src/trace-test/tests/basic/orNaNTest1.js
js/src/trace-test/tests/basic/orNaNTest2.js
js/src/trace-test/tests/basic/outerline.js
js/src/trace-test/tests/basic/parseIntTests.js
js/src/trace-test/tests/basic/parsingNumbers.js
js/src/trace-test/tests/basic/perf-smoketest.js
js/src/trace-test/tests/basic/putargsNoReturn.js
js/src/trace-test/tests/basic/putargsReturn.js
js/src/trace-test/tests/basic/regexpLastIndex.js
js/src/trace-test/tests/basic/setArgumentsLength.js
js/src/trace-test/tests/basic/setArgumentsLength2.js
js/src/trace-test/tests/basic/setCall.js
js/src/trace-test/tests/basic/setCallEvalMiddle.js
js/src/trace-test/tests/basic/setCallEvalMiddle2.js
js/src/trace-test/tests/basic/setCallGlobal.js
js/src/trace-test/tests/basic/setelem.js
js/src/trace-test/tests/basic/setprop.js
js/src/trace-test/tests/basic/shapelessCalleeTest.js
js/src/trace-test/tests/basic/strictParseIntOctal.js
js/src/trace-test/tests/basic/stringConvert.js
js/src/trace-test/tests/basic/stringSplitIntoArrayTest.js
js/src/trace-test/tests/basic/stringSplitTest.js
js/src/trace-test/tests/basic/strings.js
js/src/trace-test/tests/basic/test586387.js
js/src/trace-test/tests/basic/testAbortedImacroDecompilation.js
js/src/trace-test/tests/basic/testAccessCanonicalArgInGetElem.js
js/src/trace-test/tests/basic/testAddAnyInconvertibleObject.js
js/src/trace-test/tests/basic/testAddInconvertibleObjectAny.js
js/src/trace-test/tests/basic/testAddInconvertibleObjectInconvertibleObject.js
js/src/trace-test/tests/basic/testAddNull.js
js/src/trace-test/tests/basic/testAddUndefined.js
js/src/trace-test/tests/basic/testApply.js
js/src/trace-test/tests/basic/testApplyCall.js
js/src/trace-test/tests/basic/testApplyUnbox.js
js/src/trace-test/tests/basic/testArrayComp1.js
js/src/trace-test/tests/basic/testArrayComp2.js
js/src/trace-test/tests/basic/testArrayDensityChange.js
js/src/trace-test/tests/basic/testArrayNaNIndex.js
js/src/trace-test/tests/basic/testArrayNamedProp.js
js/src/trace-test/tests/basic/testArrayPushPop.js
js/src/trace-test/tests/basic/testAssignmentThatIgnoresSetterRetval.js
js/src/trace-test/tests/basic/testAtomize.js
js/src/trace-test/tests/basic/testBitOrAnyInconvertibleObject.js
js/src/trace-test/tests/basic/testBitOrInconvertibleObjectAny.js
js/src/trace-test/tests/basic/testBitOrInconvertibleObjectInconvertibleObject.js
js/src/trace-test/tests/basic/testBitwise.js
js/src/trace-test/tests/basic/testBoolToString.js
js/src/trace-test/tests/basic/testBoxDoubleWithDoubleSizedInt.js
js/src/trace-test/tests/basic/testBranchCse.js
js/src/trace-test/tests/basic/testBranchingLoop.js
js/src/trace-test/tests/basic/testBranchingUnstableLoop.js
js/src/trace-test/tests/basic/testBranchingUnstableLoopCounter.js
js/src/trace-test/tests/basic/testBranchingUnstableObject.js
js/src/trace-test/tests/basic/testBrandedVsGeneric.js
js/src/trace-test/tests/basic/testBreak.js
js/src/trace-test/tests/basic/testBug458838.js
js/src/trace-test/tests/basic/testBug462388.js
js/src/trace-test/tests/basic/testBug462407.js
js/src/trace-test/tests/basic/testBug463490.js
js/src/trace-test/tests/basic/testBug465261.js
js/src/trace-test/tests/basic/testBug465272.js
js/src/trace-test/tests/basic/testBug465483.js
js/src/trace-test/tests/basic/testBug465688.js
js/src/trace-test/tests/basic/testBug466128.js
js/src/trace-test/tests/basic/testBug466262.js
js/src/trace-test/tests/basic/testBug474769.js
js/src/trace-test/tests/basic/testBug501690.js
js/src/trace-test/tests/basic/testBug502914.js
js/src/trace-test/tests/basic/testBug504520.js
js/src/trace-test/tests/basic/testBug504520Harder.js
js/src/trace-test/tests/basic/testBug507425.js
js/src/trace-test/tests/basic/testBug520503-1.js
js/src/trace-test/tests/basic/testBug520503-2.js
js/src/trace-test/tests/basic/testBug520503-3.js
js/src/trace-test/tests/basic/testBug529147.js
js/src/trace-test/tests/basic/testBug547791.js
js/src/trace-test/tests/basic/testBug550210.js
js/src/trace-test/tests/basic/testBug552248.js
js/src/trace-test/tests/basic/testBug554043.js
js/src/trace-test/tests/basic/testBug555484.js
js/src/trace-test/tests/basic/testBug558446.js
js/src/trace-test/tests/basic/testBug560098.js
js/src/trace-test/tests/basic/testBug566556.js
js/src/trace-test/tests/basic/testBug578044.js
js/src/trace-test/tests/basic/testBug579602.js
js/src/trace-test/tests/basic/testBug579646.js
js/src/trace-test/tests/basic/testBug579647.js
js/src/trace-test/tests/basic/testBug582766.js
js/src/trace-test/tests/basic/testBug584650.js
js/src/trace-test/tests/basic/testBug595916.js
js/src/trace-test/tests/basic/testBug597736.js
js/src/trace-test/tests/basic/testBug604210.js
js/src/trace-test/tests/basic/testCallElem.js
js/src/trace-test/tests/basic/testCallNull.js
js/src/trace-test/tests/basic/testCallPick.js
js/src/trace-test/tests/basic/testCallProtoMethod.js
js/src/trace-test/tests/basic/testCaseAbort.js
js/src/trace-test/tests/basic/testCaseTypeMismatchBadness.js
js/src/trace-test/tests/basic/testChangingObjectWithLength.js
js/src/trace-test/tests/basic/testClosingRecursion.js
js/src/trace-test/tests/basic/testClosureIncrSideExit.js
js/src/trace-test/tests/basic/testClosures.js
js/src/trace-test/tests/basic/testComparisons.js
js/src/trace-test/tests/basic/testConcatNWithSideEffects.js
js/src/trace-test/tests/basic/testConstIf.js
js/src/trace-test/tests/basic/testConstSwitch.js
js/src/trace-test/tests/basic/testConstSwitch2.js
js/src/trace-test/tests/basic/testConstantBooleanExpr.js
js/src/trace-test/tests/basic/testConstructorBail.js
js/src/trace-test/tests/basic/testContinue.js
js/src/trace-test/tests/basic/testContinueWithLabel.js
js/src/trace-test/tests/basic/testContinueWithLabel2.js
js/src/trace-test/tests/basic/testContinueWithLabel3.js
js/src/trace-test/tests/basic/testContinueWithLabel4.js
js/src/trace-test/tests/basic/testConvertibleObjectEqUndefined.js
js/src/trace-test/tests/basic/testCustomIterator.js
js/src/trace-test/tests/basic/testDateNow.js
js/src/trace-test/tests/basic/testDecElem1.js
js/src/trace-test/tests/basic/testDecElem2.js
js/src/trace-test/tests/basic/testDecayingInnerLoop.js
js/src/trace-test/tests/basic/testDeepBail1.js
js/src/trace-test/tests/basic/testDeepBailFromHasInstance.js
js/src/trace-test/tests/basic/testDeepBailWhileRecording.js
js/src/trace-test/tests/basic/testDeepPropertyShadowing.js
js/src/trace-test/tests/basic/testDefinePropertyAcrossCompartment.js
js/src/trace-test/tests/basic/testDenseArrayProp.js
js/src/trace-test/tests/basic/testDestructuring.js
js/src/trace-test/tests/basic/testDifferingArgc.js
js/src/trace-test/tests/basic/testDivOverflow.js
js/src/trace-test/tests/basic/testDivision.js
js/src/trace-test/tests/basic/testDivisionFloat.js
js/src/trace-test/tests/basic/testDivisionWithNegative1.js
js/src/trace-test/tests/basic/testDoubleComparison.js
js/src/trace-test/tests/basic/testDoubleToStr.js
js/src/trace-test/tests/basic/testDoubleZeroInSwitch1.js
js/src/trace-test/tests/basic/testDoubleZeroInSwitch2.js
js/src/trace-test/tests/basic/testElemDec1.js
js/src/trace-test/tests/basic/testElemDec2.js
js/src/trace-test/tests/basic/testElemInc1.js
js/src/trace-test/tests/basic/testElemInc2.js
js/src/trace-test/tests/basic/testEliminatedGuardWithinAnchor.js
js/src/trace-test/tests/basic/testEqFalseEmptyString.js
js/src/trace-test/tests/basic/testErrorReportIn_getPrototypeOf.js
js/src/trace-test/tests/basic/testEvalCalledFromWatchOverSetter.js
js/src/trace-test/tests/basic/testEvalInFunctionCallee.js
js/src/trace-test/tests/basic/testExistingPropToJoinedMethodAttempt.js
js/src/trace-test/tests/basic/testFewerGlobalsInInnerTree.js
js/src/trace-test/tests/basic/testFloatArrayIndex.js
js/src/trace-test/tests/basic/testForEach.js
js/src/trace-test/tests/basic/testForInLoopChangeIteratorType.js
js/src/trace-test/tests/basic/testFunctionIdentityChange.js
js/src/trace-test/tests/basic/testGCWhileRecording.js
js/src/trace-test/tests/basic/testGeneratorDeepBail.js
js/src/trace-test/tests/basic/testGetCallObj.js
js/src/trace-test/tests/basic/testGetThis.js
js/src/trace-test/tests/basic/testGlobalAsProto.js
js/src/trace-test/tests/basic/testGlobalMultitrees1.js
js/src/trace-test/tests/basic/testGlobalOptimize-2.js
js/src/trace-test/tests/basic/testGlobalOptimize-3.js
js/src/trace-test/tests/basic/testGlobalOptimize-4.js
js/src/trace-test/tests/basic/testGlobalOptimize-5.js
js/src/trace-test/tests/basic/testGlobalOptimize-6.js
js/src/trace-test/tests/basic/testGlobalProtoAccess.js
js/src/trace-test/tests/basic/testGlobalShapeChangeAfterDeepBail.js
js/src/trace-test/tests/basic/testGroupAssignment.js
js/src/trace-test/tests/basic/testGrowDenseArray.js
js/src/trace-test/tests/basic/testGuardCalleeSneakAttack.js
js/src/trace-test/tests/basic/testGuardCalleeSneakAttack2.js
js/src/trace-test/tests/basic/testHOTLOOPCorrectness.js
js/src/trace-test/tests/basic/testHOTLOOPSize.js
js/src/trace-test/tests/basic/testHeavy.js
js/src/trace-test/tests/basic/testHeavy2.js
js/src/trace-test/tests/basic/testHoleInDenseArray.js
js/src/trace-test/tests/basic/testHolePushing.js
js/src/trace-test/tests/basic/testINITELEM.js
js/src/trace-test/tests/basic/testIn.js
js/src/trace-test/tests/basic/testIncDec.js
js/src/trace-test/tests/basic/testIncElem1.js
js/src/trace-test/tests/basic/testIncElem2.js
js/src/trace-test/tests/basic/testInitMethod.js
js/src/trace-test/tests/basic/testInitelemWithFloatIndex.js
js/src/trace-test/tests/basic/testInitelemWithSetter.js
js/src/trace-test/tests/basic/testInnerMissingArgs.js
js/src/trace-test/tests/basic/testInnerSwitchBreak.js
js/src/trace-test/tests/basic/testInt32ToId.js
js/src/trace-test/tests/basic/testIntFloor.js
js/src/trace-test/tests/basic/testIntOverflow.js
js/src/trace-test/tests/basic/testIntUnderflow.js
js/src/trace-test/tests/basic/testInterpreterReentery8.js
js/src/trace-test/tests/basic/testInterpreterReentry.js
js/src/trace-test/tests/basic/testInterpreterReentry2.js
js/src/trace-test/tests/basic/testInterpreterReentry3.js
js/src/trace-test/tests/basic/testInterpreterReentry4.js
js/src/trace-test/tests/basic/testInterpreterReentry5.js
js/src/trace-test/tests/basic/testInterpreterReentry6.js
js/src/trace-test/tests/basic/testInterpreterReentry7.js
js/src/trace-test/tests/basic/testInvalidCharCodeAt.js
js/src/trace-test/tests/basic/testInvertNullAfterNegateNull.js
js/src/trace-test/tests/basic/testIteratorReification.js
js/src/trace-test/tests/basic/testLambdaCtor.js
js/src/trace-test/tests/basic/testLambdaInitedVar.js
js/src/trace-test/tests/basic/testLengthInString.js
js/src/trace-test/tests/basic/testLengthOnNonNativeProto.js
js/src/trace-test/tests/basic/testLetWithUnstableGlobal.js
js/src/trace-test/tests/basic/testLirBufOOM.js
js/src/trace-test/tests/basic/testLogicalNotNaN.js
js/src/trace-test/tests/basic/testLongNumToString.js
js/src/trace-test/tests/basic/testLoopWithUndefined1.js
js/src/trace-test/tests/basic/testLoopWithUndefined2.js
js/src/trace-test/tests/basic/testLoopingAccumulator.js
js/src/trace-test/tests/basic/testMatchAsCondition.js
js/src/trace-test/tests/basic/testMatchStringObject.js
js/src/trace-test/tests/basic/testMethodInc.js
js/src/trace-test/tests/basic/testMethodInit.js
js/src/trace-test/tests/basic/testMethodInitDeref.js
js/src/trace-test/tests/basic/testMethodInitSafety.js
js/src/trace-test/tests/basic/testMethodInitUneval.js
js/src/trace-test/tests/basic/testMethodOverride.js
js/src/trace-test/tests/basic/testMethodSet.js
js/src/trace-test/tests/basic/testMissingMethod.js
js/src/trace-test/tests/basic/testMissingMethod2.js
js/src/trace-test/tests/basic/testModuloWithNegative1.js
js/src/trace-test/tests/basic/testModuloWithNegative2.js
js/src/trace-test/tests/basic/testMoreArgcThanNargs.js
js/src/trace-test/tests/basic/testMoreClosures.js
js/src/trace-test/tests/basic/testMulOverflow.js
js/src/trace-test/tests/basic/testMultipleArgumentsObjects.js
js/src/trace-test/tests/basic/testNEWINIT.js
js/src/trace-test/tests/basic/testNEWINIT_DOUBLE.js
js/src/trace-test/tests/basic/testNativeArgsRooting.js
js/src/trace-test/tests/basic/testNativeLog.js
js/src/trace-test/tests/basic/testNativeMax.js
js/src/trace-test/tests/basic/testNativeSetter.js
js/src/trace-test/tests/basic/testNegZero1.js
js/src/trace-test/tests/basic/testNegativeArrayLength.js
js/src/trace-test/tests/basic/testNegativeGETELEMIndex.js
js/src/trace-test/tests/basic/testNestedClosures.js
js/src/trace-test/tests/basic/testNestedDeepBail.js
js/src/trace-test/tests/basic/testNestedEscapingLambdas.js
js/src/trace-test/tests/basic/testNestedExitStackOuter.js
js/src/trace-test/tests/basic/testNestedForIn.js
js/src/trace-test/tests/basic/testNewArrayCount.js
js/src/trace-test/tests/basic/testNewArrayCount2.js
js/src/trace-test/tests/basic/testNewDate.js
js/src/trace-test/tests/basic/testNewObject.js
js/src/trace-test/tests/basic/testNewString.js
js/src/trace-test/tests/basic/testNewWithNonNativeProto.js
js/src/trace-test/tests/basic/testNonStubGetter.js
js/src/trace-test/tests/basic/testNot.js
js/src/trace-test/tests/basic/testNullCallee.js
js/src/trace-test/tests/basic/testNullRelCmp.js
js/src/trace-test/tests/basic/testNullToString.js
js/src/trace-test/tests/basic/testNumToString.js
js/src/trace-test/tests/basic/testNumberToString.js
js/src/trace-test/tests/basic/testObjectConstructorReturningObject.js
js/src/trace-test/tests/basic/testObjectLength.js
js/src/trace-test/tests/basic/testObjectOrderedCmp.js
js/src/trace-test/tests/basic/testObjectOrderedCmp2.js
js/src/trace-test/tests/basic/testObjectToNumber.js
js/src/trace-test/tests/basic/testObjectToString.js
js/src/trace-test/tests/basic/testObjectVsPrototype.js
js/src/trace-test/tests/basic/testOwnPropertyWithInOperator.js
js/src/trace-test/tests/basic/testPartialFlatClosure.js
js/src/trace-test/tests/basic/testPrimitiveConstructorPrototype.js
js/src/trace-test/tests/basic/testPropagatedFunArgs.js
js/src/trace-test/tests/basic/testProxyConstructors.js
js/src/trace-test/tests/basic/testProxyDefinePropertyWithMissingSetter.js
js/src/trace-test/tests/basic/testPutOnEmptyArgsObject.js
js/src/trace-test/tests/basic/testRUNLOOPCorrectness.js
js/src/trace-test/tests/basic/testReallyDeepNestedExit.js
js/src/trace-test/tests/basic/testRebranding.js
js/src/trace-test/tests/basic/testRebranding2.js
js/src/trace-test/tests/basic/testReconstructImacroPCStack.js
js/src/trace-test/tests/basic/testRegExpLiteral.js
js/src/trace-test/tests/basic/testRegExpTest.js
js/src/trace-test/tests/basic/testRegexpGet.js
js/src/trace-test/tests/basic/testReplace2.js
js/src/trace-test/tests/basic/testResumeOp.js
js/src/trace-test/tests/basic/testReverseArgTypes.js
js/src/trace-test/tests/basic/testScriptGetter_JSOP_CALLPROP-2.js
js/src/trace-test/tests/basic/testScriptGetter_JSOP_CALLPROP.js
js/src/trace-test/tests/basic/testScriptGetter_JSOP_GETARGPROP.js
js/src/trace-test/tests/basic/testScriptGetter_JSOP_GETLOCALPROP.js
js/src/trace-test/tests/basic/testScriptGetter_JSOP_GETPROP.js
js/src/trace-test/tests/basic/testScriptGetter_JSOP_GETTHISPROP.js
js/src/trace-test/tests/basic/testSetGetterOnlyProperty.js
js/src/trace-test/tests/basic/testSetMethod.js
js/src/trace-test/tests/basic/testSetPropNeitherMissNorHit.js
js/src/trace-test/tests/basic/testSetPropertyFail.js
js/src/trace-test/tests/basic/testSetProtoRegeneratesObjectShape.js
js/src/trace-test/tests/basic/testSetelemWithFloatIndex.js
js/src/trace-test/tests/basic/testSettingWatchPointOnReadOnlyProp.js
js/src/trace-test/tests/basic/testShiftLeft.js
js/src/trace-test/tests/basic/testShiftRightArithmetic.js
js/src/trace-test/tests/basic/testShiftRightLogical.js
js/src/trace-test/tests/basic/testSideExitInConstructor.js
js/src/trace-test/tests/basic/testSlowArrayLength.js
js/src/trace-test/tests/basic/testSlowArrayPop.js
js/src/trace-test/tests/basic/testSlowArrayPopMultiFrame.js
js/src/trace-test/tests/basic/testSlowArrayPopNestedTrees.js
js/src/trace-test/tests/basic/testSlowNativeBail.js
js/src/trace-test/tests/basic/testSlowNativeCtor.js
js/src/trace-test/tests/basic/testSlowNativeWithNullThis.js
js/src/trace-test/tests/basic/testStackQuotaExhausted.js
js/src/trace-test/tests/basic/testStaticsInRegExp.js
js/src/trace-test/tests/basic/testStrict.js
js/src/trace-test/tests/basic/testString.js
js/src/trace-test/tests/basic/testStringConstructorWithExtraArg.js
js/src/trace-test/tests/basic/testStringLengthNoTinyId.js
js/src/trace-test/tests/basic/testStringObjectLength.js
js/src/trace-test/tests/basic/testStringResolve.js
js/src/trace-test/tests/basic/testStringToInt32.js
js/src/trace-test/tests/basic/testStringToNumber.js
js/src/trace-test/tests/basic/testStringify.js
js/src/trace-test/tests/basic/testSubstring.js
js/src/trace-test/tests/basic/testSuppressDeletedProperty.js
js/src/trace-test/tests/basic/testSwitch.js
js/src/trace-test/tests/basic/testSwitchString.js
js/src/trace-test/tests/basic/testSwitchUndefined.js
js/src/trace-test/tests/basic/testTableSwitch1.js
js/src/trace-test/tests/basic/testTableSwitch2.js
js/src/trace-test/tests/basic/testThinForEach.js
js/src/trace-test/tests/basic/testThinLoopDemote.js
js/src/trace-test/tests/basic/testThrowingObjectEqUndefined.js
js/src/trace-test/tests/basic/testToStringBeforeValueOf.js
js/src/trace-test/tests/basic/testToUpperToLower.js
js/src/trace-test/tests/basic/testTrueShiftTrue.js
js/src/trace-test/tests/basic/testTypeUnstableForIn.js
js/src/trace-test/tests/basic/testTypedArrayPunning.js
js/src/trace-test/tests/basic/testTypedArrays.js
js/src/trace-test/tests/basic/testTypeofHole.js
js/src/trace-test/tests/basic/testUnaryImacros.js
js/src/trace-test/tests/basic/testUndefinedBooleanCmp.js
js/src/trace-test/tests/basic/testUndefinedCmp.js
js/src/trace-test/tests/basic/testUndefinedPropertyAccess.js
js/src/trace-test/tests/basic/testUndemotableBinaryOp.js
js/src/trace-test/tests/basic/testUndemoteLateGlobalSlots.js
js/src/trace-test/tests/basic/testWeirdDateParse.js
js/src/trace-test/tests/basic/testWhileObjectOrNull.js
js/src/trace-test/tests/basic/testWithAndShadowing.js
js/src/trace-test/tests/basic/testXMLPropertyNames.js
js/src/trace-test/tests/basic/test_JSOP_ARGCNT.js
js/src/trace-test/tests/basic/test_JSOP_ARGSUB.js
js/src/trace-test/tests/basic/testif.js
js/src/trace-test/tests/basic/testincops.js
js/src/trace-test/tests/basic/trees.js
js/src/trace-test/tests/basic/truthies.js
js/src/trace-test/tests/basic/typeofTest.js
js/src/trace-test/tests/basic/unboxint.js
js/src/trace-test/tests/basic/wrap-primitive-this.js
js/src/trace-test/tests/basic/xprop.js
js/src/trace-test/tests/closures/bug496922.js
js/src/trace-test/tests/closures/bug496987.js
js/src/trace-test/tests/closures/bug497015-1.js
js/src/trace-test/tests/closures/bug497015-2.js
js/src/trace-test/tests/closures/bug540131-2.js
js/src/trace-test/tests/closures/bug540131-3.js
js/src/trace-test/tests/closures/bug540131.js
js/src/trace-test/tests/closures/bug540133.js
js/src/trace-test/tests/closures/bug540136.js
js/src/trace-test/tests/closures/bug540242.js
js/src/trace-test/tests/closures/bug540243.js
js/src/trace-test/tests/closures/bug540348.js
js/src/trace-test/tests/closures/bug540528.js
js/src/trace-test/tests/closures/bug541239.js
js/src/trace-test/tests/closures/bug543565.js
js/src/trace-test/tests/closures/closure-pluseq.js
js/src/trace-test/tests/closures/closure-pluseq2.js
js/src/trace-test/tests/closures/closure-plusplus.js
js/src/trace-test/tests/closures/closure-tests.js
js/src/trace-test/tests/closures/flat-closure-1.js
js/src/trace-test/tests/closures/flat-closure-2.js
js/src/trace-test/tests/closures/flat-closure-3.js
js/src/trace-test/tests/closures/flat-closure-4.js
js/src/trace-test/tests/closures/flat-closure-5.js
js/src/trace-test/tests/closures/flat-closure-6.js
js/src/trace-test/tests/closures/flat-closure-7.js
js/src/trace-test/tests/closures/flat-closure-8.js
js/src/trace-test/tests/closures/incr-exit-2.js
js/src/trace-test/tests/closures/incr-exit-3.js
js/src/trace-test/tests/closures/incr-exit.js
js/src/trace-test/tests/closures/lambda-inner-heavy.js
js/src/trace-test/tests/closures/lambda-light-returned.js
js/src/trace-test/tests/closures/lambda-light.js
js/src/trace-test/tests/closures/lambda.js
js/src/trace-test/tests/closures/lambdafc.js
js/src/trace-test/tests/closures/name-both-hvy.js
js/src/trace-test/tests/closures/name-inactive-missing.js
js/src/trace-test/tests/closures/name.js
js/src/trace-test/tests/closures/name2.js
js/src/trace-test/tests/closures/name2a.js
js/src/trace-test/tests/closures/name2b.js
js/src/trace-test/tests/closures/name3.js
js/src/trace-test/tests/closures/name4.js
js/src/trace-test/tests/closures/namedLambda.js
js/src/trace-test/tests/closures/nameinc-loop-2.js
js/src/trace-test/tests/closures/nameinc-loop-3.js
js/src/trace-test/tests/closures/nameinc-loop-missing-2.js
js/src/trace-test/tests/closures/nameinc-loop-missing.js
js/src/trace-test/tests/closures/nameinc-loop.js
js/src/trace-test/tests/closures/nameinc.js
js/src/trace-test/tests/closures/set-outer-trace-1.js
js/src/trace-test/tests/closures/set-outer-trace-2.js
js/src/trace-test/tests/closures/set-outer-trace-3.js
js/src/trace-test/tests/closures/set-outer-trace-4.js
js/src/trace-test/tests/closures/set-outer-trace.js
js/src/trace-test/tests/closures/setname-1.js
js/src/trace-test/tests/closures/setname-closure-2.js
js/src/trace-test/tests/closures/setname-closure.js
js/src/trace-test/tests/closures/setname-inner-heavy.js
js/src/trace-test/tests/closures/setname-loop-2.js
js/src/trace-test/tests/closures/setname-loop.js
js/src/trace-test/tests/closures/setname-no-pop.js
js/src/trace-test/tests/closures/t001.js
js/src/trace-test/tests/closures/t002.js
js/src/trace-test/tests/closures/t003.js
js/src/trace-test/tests/closures/t004.js
js/src/trace-test/tests/closures/t005.js
js/src/trace-test/tests/closures/t006.js
js/src/trace-test/tests/closures/t007.js
js/src/trace-test/tests/closures/t008.js
js/src/trace-test/tests/closures/t009.js
js/src/trace-test/tests/closures/t010.js
js/src/trace-test/tests/closures/t011.js
js/src/trace-test/tests/closures/t012.js
js/src/trace-test/tests/closures/t013.js
js/src/trace-test/tests/closures/t014.js
js/src/trace-test/tests/closures/t015.js
js/src/trace-test/tests/closures/t016.js
js/src/trace-test/tests/closures/t017.js
js/src/trace-test/tests/closures/t018.js
js/src/trace-test/tests/closures/t019.js
js/src/trace-test/tests/closures/t020.js
js/src/trace-test/tests/closures/t021.js
js/src/trace-test/tests/closures/t022.js
js/src/trace-test/tests/closures/t023.js
js/src/trace-test/tests/closures/t024.js
js/src/trace-test/tests/closures/t025.js
js/src/trace-test/tests/closures/t026.js
js/src/trace-test/tests/closures/t027.js
js/src/trace-test/tests/closures/t028.js
js/src/trace-test/tests/closures/t029.js
js/src/trace-test/tests/closures/t030.js
js/src/trace-test/tests/closures/t031.js
js/src/trace-test/tests/closures/t032.js
js/src/trace-test/tests/closures/t033.js
js/src/trace-test/tests/closures/t034.js
js/src/trace-test/tests/closures/t035.js
js/src/trace-test/tests/closures/t036.js
js/src/trace-test/tests/closures/t037.js
js/src/trace-test/tests/closures/test-inner-imports.js
js/src/trace-test/tests/closures/upvar-nest.js
js/src/trace-test/tests/jaeger/bug549393-1.js
js/src/trace-test/tests/jaeger/bug549393-2.js
js/src/trace-test/tests/jaeger/bug549396.js
js/src/trace-test/tests/jaeger/bug549398.js
js/src/trace-test/tests/jaeger/bug549521.js
js/src/trace-test/tests/jaeger/bug549602.js
js/src/trace-test/tests/jaeger/bug549603.js
js/src/trace-test/tests/jaeger/bug550490.js
js/src/trace-test/tests/jaeger/bug550665.js
js/src/trace-test/tests/jaeger/bug551603.js
js/src/trace-test/tests/jaeger/bug552644.js
js/src/trace-test/tests/jaeger/bug553781-2.js
js/src/trace-test/tests/jaeger/bug553781.js
js/src/trace-test/tests/jaeger/bug553784.js
js/src/trace-test/tests/jaeger/bug554580-1.js
js/src/trace-test/tests/jaeger/bug554580-2.js
js/src/trace-test/tests/jaeger/bug554580-3.js
js/src/trace-test/tests/jaeger/bug554580-4.js
js/src/trace-test/tests/jaeger/bug554580-5.js
js/src/trace-test/tests/jaeger/bug554651.js
js/src/trace-test/tests/jaeger/bug554675-1.js
js/src/trace-test/tests/jaeger/bug554675-2.js
js/src/trace-test/tests/jaeger/bug554675-3.js
js/src/trace-test/tests/jaeger/bug555152.js
js/src/trace-test/tests/jaeger/bug555155.js
js/src/trace-test/tests/jaeger/bug555206.js
js/src/trace-test/tests/jaeger/bug555543.js
js/src/trace-test/tests/jaeger/bug555922.js
js/src/trace-test/tests/jaeger/bug556525.js
js/src/trace-test/tests/jaeger/bug557063.js
js/src/trace-test/tests/jaeger/bug557068.js
js/src/trace-test/tests/jaeger/bug557070.js
js/src/trace-test/tests/jaeger/bug557075.js
js/src/trace-test/tests/jaeger/bug560221.js
js/src/trace-test/tests/jaeger/bug563000/eif-call-newvar.js
js/src/trace-test/tests/jaeger/bug563000/eif-call-typechange.js
js/src/trace-test/tests/jaeger/bug563000/eif-call.js
js/src/trace-test/tests/jaeger/bug563000/eif-getter-newvar.js
js/src/trace-test/tests/jaeger/bug563000/eif-getter-typechange.js
js/src/trace-test/tests/jaeger/bug563000/eif-getter.js
js/src/trace-test/tests/jaeger/bug563000/eif-trap-newvar.js
js/src/trace-test/tests/jaeger/bug563000/eif-trap-typechange.js
js/src/trace-test/tests/jaeger/bug563000/eif-trap.js
js/src/trace-test/tests/jaeger/bug563000/simple-trap-1.js
js/src/trace-test/tests/jaeger/bug563000/simple-trap-2.js
js/src/trace-test/tests/jaeger/bug563000/simple-untrap.js
js/src/trace-test/tests/jaeger/bug563000/test-debugger-1.js
js/src/trace-test/tests/jaeger/bug563000/test-debugger-2.js
js/src/trace-test/tests/jaeger/bug563000/test-throwhook-1.js
js/src/trace-test/tests/jaeger/bug563000/test-throwhook-2.js
js/src/trace-test/tests/jaeger/bug563000/trap-force-return-1.js
js/src/trace-test/tests/jaeger/bug563000/trap-force-return-2.js
js/src/trace-test/tests/jaeger/bug563000/trap-own-callsite.js
js/src/trace-test/tests/jaeger/bug563000/trap-parent-from-trap.js
js/src/trace-test/tests/jaeger/bug563000/trap-parent.js
js/src/trace-test/tests/jaeger/bug563000/trap-self-as-parent.js
js/src/trace-test/tests/jaeger/bug563000/trap-self-from-trap.js
js/src/trace-test/tests/jaeger/bug563000/trap-self.js
js/src/trace-test/tests/jaeger/bug563000/untrap-own-trapsite.js
js/src/trace-test/tests/jaeger/bug563000/untrap-self.js
js/src/trace-test/tests/jaeger/bug565198.js
js/src/trace-test/tests/jaeger/bug565202.js
js/src/trace-test/tests/jaeger/bug566022.js
js/src/trace-test/tests/jaeger/bug573433.js
js/src/trace-test/tests/jaeger/bug576398.js
js/src/trace-test/tests/jaeger/bug577580.js
js/src/trace-test/tests/jaeger/bug577646.js
js/src/trace-test/tests/jaeger/bug577705.js
js/src/trace-test/tests/jaeger/bug577996.js
js/src/trace-test/tests/jaeger/bug580703.js
js/src/trace-test/tests/jaeger/bug580712.js
js/src/trace-test/tests/jaeger/bug580883.js
js/src/trace-test/tests/jaeger/bug580884-2.js
js/src/trace-test/tests/jaeger/bug580884-3.js
js/src/trace-test/tests/jaeger/bug580884.js
js/src/trace-test/tests/jaeger/bug580931-2.js
js/src/trace-test/tests/jaeger/bug581871.js
js/src/trace-test/tests/jaeger/bug581936.js
js/src/trace-test/tests/jaeger/bug582185.js
js/src/trace-test/tests/jaeger/bug582286.js
js/src/trace-test/tests/jaeger/bug582392.js
js/src/trace-test/tests/jaeger/bug582880.js
js/src/trace-test/tests/jaeger/bug582882.js
js/src/trace-test/tests/jaeger/bug582884.js
js/src/trace-test/tests/jaeger/bug582894.js
js/src/trace-test/tests/jaeger/bug582897.js
js/src/trace-test/tests/jaeger/bug582898.js
js/src/trace-test/tests/jaeger/bug582900.js
js/src/trace-test/tests/jaeger/bug583158.js
js/src/trace-test/tests/jaeger/bug583160.js
js/src/trace-test/tests/jaeger/bug583672.js
js/src/trace-test/tests/jaeger/bug583684.js
js/src/trace-test/tests/jaeger/bug583688.js
js/src/trace-test/tests/jaeger/bug583689.js
js/src/trace-test/tests/jaeger/bug584644-2.js
js/src/trace-test/tests/jaeger/bug584646.js
js/src/trace-test/tests/jaeger/bug584647.js
js/src/trace-test/tests/jaeger/bug585310.js
js/src/trace-test/tests/jaeger/bug585341.js
js/src/trace-test/tests/jaeger/bug585391.js
js/src/trace-test/tests/jaeger/bug585408-2.js
js/src/trace-test/tests/jaeger/bug585408-3.js
js/src/trace-test/tests/jaeger/bug585408.js
js/src/trace-test/tests/jaeger/bug585540.js
js/src/trace-test/tests/jaeger/bug587431.js
js/src/trace-test/tests/jaeger/bug588338.js
js/src/trace-test/tests/jaeger/bug588362-1.js
js/src/trace-test/tests/jaeger/bug588362-2.js
js/src/trace-test/tests/jaeger/bug588362-3.js
js/src/trace-test/tests/jaeger/bug588363-1.js
js/src/trace-test/tests/jaeger/bug588363-2.js
js/src/trace-test/tests/jaeger/bug589108.js
js/src/trace-test/tests/jaeger/bug589115.js
js/src/trace-test/tests/jaeger/bug589461.js
js/src/trace-test/tests/jaeger/bug590083.js
js/src/trace-test/tests/jaeger/bug591602.js
js/src/trace-test/tests/jaeger/bug591606.js
js/src/trace-test/tests/jaeger/bug592973-1.js
js/src/trace-test/tests/jaeger/bug592973-2.js
js/src/trace-test/tests/jaeger/bug592973-3.js
js/src/trace-test/tests/jaeger/bug593554.js
js/src/trace-test/tests/jaeger/bug595917.js
js/src/trace-test/tests/jaeger/bug595921.js
js/src/trace-test/tests/jaeger/bug597378.js
js/src/trace-test/tests/jaeger/bug597871.js
js/src/trace-test/tests/jaeger/bug598696.js
js/src/trace-test/tests/jaeger/bug599488.js
js/src/trace-test/tests/jaeger/bug600139.js
js/src/trace-test/tests/jaeger/bug600419.js
js/src/trace-test/tests/jaeger/bug600424.js
js/src/trace-test/tests/jaeger/bug601982.js
js/src/trace-test/tests/jaeger/bug604427.js
js/src/trace-test/tests/jaeger/compare-wrong-1.js
js/src/trace-test/tests/jaeger/crash-on-compare.js
js/src/trace-test/tests/jaeger/deepBailAfterRunTracer.js
js/src/trace-test/tests/jaeger/fused-eq-ifeq.js
js/src/trace-test/tests/jaeger/getelem-sanity-1.js
js/src/trace-test/tests/jaeger/getelem-sanity-2.js
js/src/trace-test/tests/jaeger/getelem-sanity-3.js
js/src/trace-test/tests/jaeger/getelem-sanity-4.js
js/src/trace-test/tests/jaeger/getelem-sanity-5.js
js/src/trace-test/tests/jaeger/getelem-sanity-6.js
js/src/trace-test/tests/jaeger/getelem-sanity-7.js
js/src/trace-test/tests/jaeger/getelem-sanity-int-1.js
js/src/trace-test/tests/jaeger/getelem-sanity-int-2.js
js/src/trace-test/tests/jaeger/getelem-sanity-int-3.js
js/src/trace-test/tests/jaeger/globalOptimize-1.js
js/src/trace-test/tests/jaeger/instanceOfWithKnownTypes.js
js/src/trace-test/tests/jaeger/modWithConstLhs.js
js/src/trace-test/tests/jaeger/mulNegZero.js
js/src/trace-test/tests/jaeger/negation.js
js/src/trace-test/tests/jaeger/regalloc-1.js
js/src/trace-test/tests/jaeger/rsh-sanity-1.js
js/src/trace-test/tests/jaeger/scriptedICs-1.js
js/src/trace-test/tests/jaeger/strictModeSetUndefinedVar.js
js/src/trace-test/tests/jaeger/subCommutativity.js
js/src/trace-test/tests/jaeger/testAddStringObject.js
js/src/trace-test/tests/jaeger/testBug550743.js
js/src/trace-test/tests/jaeger/unsignedShiftZero.js
js/src/trace-test/tests/jaeger/xor-sanity.js
js/src/trace-test/tests/pic/bug558099.js
js/src/trace-test/tests/pic/bug558616.js
js/src/trace-test/tests/pic/bug582899.js
js/src/trace-test/tests/pic/bug584642.js
js/src/trace-test/tests/pic/bug595706.js
js/src/trace-test/tests/pic/call_self.js
js/src/trace-test/tests/pic/densearray.js
js/src/trace-test/tests/pic/fuzz1.js
js/src/trace-test/tests/pic/fuzz2.js
js/src/trace-test/tests/pic/fuzz3.js
js/src/trace-test/tests/pic/grandproto.js
js/src/trace-test/tests/pic/length_array.js
js/src/trace-test/tests/pic/length_mix.js
js/src/trace-test/tests/pic/length_object.js
js/src/trace-test/tests/pic/length_string.js
js/src/trace-test/tests/pic/proto1.js
js/src/trace-test/tests/pic/proto3.js
js/src/trace-test/tests/pic/proto_self.js
js/src/trace-test/tests/pic/self1.js
js/src/trace-test/tests/pic/self2.js
js/src/trace-test/tests/pic/self3.js
js/src/trace-test/tests/pic/self8.js
js/src/trace-test/tests/pic/set-assign.js
js/src/trace-test/tests/pic/set1.js
js/src/trace-test/tests/pic/set2.js
js/src/trace-test/tests/pic/shape_regen.js
js/src/trace-test/tests/pic/thisprop.js
js/src/trace-test/tests/sunspider/check-3d-cube.js
js/src/trace-test/tests/sunspider/check-3d-morph.js
js/src/trace-test/tests/sunspider/check-3d-raytrace.js
js/src/trace-test/tests/sunspider/check-access-binary-trees.js
js/src/trace-test/tests/sunspider/check-access-fannkuch.js
js/src/trace-test/tests/sunspider/check-access-nbody.js
js/src/trace-test/tests/sunspider/check-access-nsieve.js
js/src/trace-test/tests/sunspider/check-bitops-3bit-bits-in-byte.js
js/src/trace-test/tests/sunspider/check-bitops-bits-in-byte.js
js/src/trace-test/tests/sunspider/check-bitops-bitwise-and.js
js/src/trace-test/tests/sunspider/check-bitops-nsieve-bits.js
js/src/trace-test/tests/sunspider/check-controlflow-recursive.js
js/src/trace-test/tests/sunspider/check-crypto-aes.js
js/src/trace-test/tests/sunspider/check-crypto-md5.js
js/src/trace-test/tests/sunspider/check-crypto-sha1.js
js/src/trace-test/tests/sunspider/check-date-format-tofte.js
js/src/trace-test/tests/sunspider/check-date-format-xparb.js
js/src/trace-test/tests/sunspider/check-math-cordic.js
js/src/trace-test/tests/sunspider/check-math-partial-sums.js
js/src/trace-test/tests/sunspider/check-math-spectral-norm.js
js/src/trace-test/tests/sunspider/check-mont.js
js/src/trace-test/tests/sunspider/check-regexp-dna.js
js/src/trace-test/tests/sunspider/check-string-fasta.js
js/src/trace-test/tests/sunspider/check-string-tagcloud.js
js/src/trace-test/tests/sunspider/check-string-unpack-code.js
js/src/trace-test/tests/v8-v5/check-crypto.js
js/src/trace-test/tests/v8-v5/check-deltablue.js
js/src/trace-test/tests/v8-v5/check-earley-boyer.js
js/src/trace-test/tests/v8-v5/check-raytrace.js
js/src/trace-test/tests/v8-v5/check-regexp.js
js/src/trace-test/tests/v8-v5/check-richards.js
js/src/trace-test/tests/v8-v5/check-splay.js
js/src/trace-test/trace_test.py
media/libsydneyaudio/bug526411_latency.patch
services/crypto/modules/threaded.js
toolkit/content/jar.mn
toolkit/content/license.html
--- a/accessible/src/base/nsAccDocManager.cpp
+++ b/accessible/src/base/nsAccDocManager.cpp
@@ -86,24 +86,16 @@ nsAccDocManager::FindAccessibleInCache(n
   arg.mNode = aNode;
 
   mDocAccessibleCache.EnumerateRead(SearchAccessibleInDocCache,
                                     static_cast<void*>(&arg));
 
   return arg.mAccessible;
 }
 
-void
-nsAccDocManager::ShutdownDocAccessiblesInTree(nsIDocument *aDocument)
-{
-  nsCOMPtr<nsISupports> container = aDocument->GetContainer();
-  nsCOMPtr<nsIDocShellTreeItem> treeItem = do_QueryInterface(container);
-  ShutdownDocAccessiblesInTree(treeItem, aDocument);
-}
-
 
 ////////////////////////////////////////////////////////////////////////////////
 // nsAccDocManager protected
 
 PRBool
 nsAccDocManager::Init()
 {
   mDocAccessibleCache.Init(4);
@@ -127,31 +119,16 @@ nsAccDocManager::Shutdown()
     do_GetService(NS_DOCUMENTLOADER_SERVICE_CONTRACTID);
 
   if (progress)
     progress->RemoveProgressListener(static_cast<nsIWebProgressListener*>(this));
 
   ClearDocCache();
 }
 
-void
-nsAccDocManager::ShutdownDocAccessible(nsIDocument *aDocument)
-{
-  nsDocAccessible* docAccessible = mDocAccessibleCache.GetWeak(aDocument);
-  if (!docAccessible)
-    return;
-
-  // We're allowed to not remove listeners when accessible document is shutdown
-  // since we don't keep strong reference on chrome event target and listeners
-  // are removed automatically when chrome event target goes away.
-
-  docAccessible->Shutdown();
-  mDocAccessibleCache.Remove(aDocument);
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 // nsISupports
 
 NS_IMPL_THREADSAFE_ISUPPORTS3(nsAccDocManager,
                               nsIWebProgressListener,
                               nsIDOMEventListener,
                               nsISupportsWeakReference)
 
@@ -311,17 +288,24 @@ nsAccDocManager::HandleEvent(nsIDOMEvent
     NS_LOG_ACCDOCDESTROY("received 'pagehide' event", document)
 
     // Ignore 'pagehide' on temporary documents since we ignore them entirely in
     // accessibility.
     if (document->IsInitialDocument())
       return NS_OK;
 
     // Shutdown this one and sub document accessibles.
-    ShutdownDocAccessiblesInTree(document);
+
+    // We're allowed to not remove listeners when accessible document is
+    // shutdown since we don't keep strong reference on chrome event target and
+    // listeners are removed automatically when chrome event target goes away.
+    nsDocAccessible* docAccessible = mDocAccessibleCache.GetWeak(document);
+    if (docAccessible)
+      docAccessible->Shutdown();
+
     return NS_OK;
   }
 
   // XXX: handle error pages loading separately since they get neither
   // webprogress notifications nor 'pageshow' event.
   if (type.EqualsLiteral("DOMContentLoaded") &&
       nsCoreUtils::IsErrorPage(document)) {
     NS_LOG_ACCDOCLOAD2("handled 'DOMContentLoaded' event", document)
@@ -495,45 +479,16 @@ nsAccDocManager::CreateDocOrRootAccessib
   }
 
   NS_LOG_ACCDOCCREATE("document creation finished", aDocument)
 
   AddListeners(aDocument, isRootDoc);
   return docAcc;
 }
 
-void
-nsAccDocManager::ShutdownDocAccessiblesInTree(nsIDocShellTreeItem *aTreeItem,
-                                              nsIDocument *aDocument)
-{
-  nsCOMPtr<nsIDocShellTreeNode> treeNode(do_QueryInterface(aTreeItem));
-
-  if (treeNode) {
-    PRInt32 subDocumentsCount = 0;
-    treeNode->GetChildCount(&subDocumentsCount);
-    for (PRInt32 idx = 0; idx < subDocumentsCount; idx++) {
-      nsCOMPtr<nsIDocShellTreeItem> treeItemChild;
-      treeNode->GetChildAt(idx, getter_AddRefs(treeItemChild));
-      NS_ASSERTION(treeItemChild, "No tree item when there should be");
-      if (!treeItemChild)
-        continue;
-
-      nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(treeItemChild));
-      nsCOMPtr<nsIContentViewer> contentViewer;
-      docShell->GetContentViewer(getter_AddRefs(contentViewer));
-      if (!contentViewer)
-        continue;
-
-      ShutdownDocAccessiblesInTree(treeItemChild, contentViewer->GetDocument());
-    }
-  }
-
-  ShutdownDocAccessible(aDocument);
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 // nsAccDocManager static
 
 PLDHashOperator
 nsAccDocManager::ClearDocCacheEntry(const nsIDocument* aKey,
                                     nsRefPtr<nsDocAccessible>& aDocAccessible,
                                     void* aUserArg)
 {
--- a/accessible/src/base/nsAccDocManager.h
+++ b/accessible/src/base/nsAccDocManager.h
@@ -71,48 +71,44 @@ public:
 
   /**
    * Search through all document accessibles for an accessible with the given
    * unique id.
    */
   nsAccessible* FindAccessibleInCache(nsINode* aNode) const;
 
   /**
-   * Shutdown document accessibles in the tree starting from the given one.
-   *
-   * @param  aDocument  [in] the DOM document of start document accessible
-   */
-  void ShutdownDocAccessiblesInTree(nsIDocument *aDocument);
-
-  /**
    * Return document accessible from the cache. Convenient method for testing.
    */
   inline nsDocAccessible* GetDocAccessibleFromCache(nsIDocument* aDocument) const
   {
     return mDocAccessibleCache.GetWeak(aDocument);
   }
 
+  /**
+   * Called by document accessible when it gets shutdown.
+   */
+  inline void NotifyOfDocumentShutdown(nsIDocument* aDocument)
+  {
+    mDocAccessibleCache.Remove(aDocument);
+  }
+
 protected:
   nsAccDocManager() { };
 
   /**
    * Initialize the manager.
    */
   PRBool Init();
 
   /**
    * Shutdown the manager.
    */
   void Shutdown();
 
-  /**
-   * Shutdown the document accessible.
-   */
-  void ShutdownDocAccessible(nsIDocument* aDocument);
-
 private:
   nsAccDocManager(const nsAccDocManager&);
   nsAccDocManager& operator =(const nsAccDocManager&);
 
 private:
   /**
    * Create an accessible document if it was't created and fire accessibility
    * events if needed.
@@ -151,22 +147,16 @@ private:
    */
   void AddListeners(nsIDocument *aDocument, PRBool aAddPageShowListener);
 
   /**
    * Create document or root accessible.
    */
   nsDocAccessible *CreateDocOrRootAccessible(nsIDocument *aDocument);
 
-  /**
-   * Shutdown document accessibles in the tree starting from given tree item.
-   */
-  void ShutdownDocAccessiblesInTree(nsIDocShellTreeItem *aTreeItem,
-                                    nsIDocument *aDocument);
-
   typedef nsRefPtrHashtable<nsPtrHashKey<const nsIDocument>, nsDocAccessible>
     nsDocAccessibleHashtable;
 
   /**
    * Shutdown and remove the document accessible from cache.
    */
   static PLDHashOperator
     ClearDocCacheEntry(const nsIDocument* aKey,
--- a/accessible/src/base/nsAccessNode.cpp
+++ b/accessible/src/base/nsAccessNode.cpp
@@ -377,17 +377,18 @@ nsAccessNode::ScrollTo(PRUint32 aScrollT
   nsIFrame *frame = GetFrame();
   NS_ENSURE_TRUE(frame, NS_ERROR_FAILURE);
 
   nsCOMPtr<nsIContent> content = frame->GetContent();
   NS_ENSURE_TRUE(content, NS_ERROR_FAILURE);
 
   PRInt16 vPercent, hPercent;
   nsCoreUtils::ConvertScrollTypeToPercents(aScrollType, &vPercent, &hPercent);
-  return shell->ScrollContentIntoView(content, vPercent, hPercent);
+  return shell->ScrollContentIntoView(content, vPercent, hPercent,
+                                      nsIPresShell::SCROLL_OVERFLOW_HIDDEN);
 }
 
 NS_IMETHODIMP
 nsAccessNode::ScrollToPoint(PRUint32 aCoordinateType, PRInt32 aX, PRInt32 aY)
 {
   nsIFrame *frame = GetFrame();
   if (!frame)
     return NS_ERROR_FAILURE;
--- a/accessible/src/base/nsAccessibilityService.cpp
+++ b/accessible/src/base/nsAccessibilityService.cpp
@@ -538,17 +538,20 @@ nsAccessibilityService::PresShellDestroy
   // pagehide event for the iframe's underlying document and its presshell is
   // destroyed before we're notified styles were changed. Shutdown the document
   // accessible early.
   nsIDocument* doc = aPresShell->GetDocument();
   if (!doc)
     return;
 
   NS_LOG_ACCDOCDESTROY("presshell destroyed", doc)
-  ShutdownDocAccessible(doc);
+
+  nsDocAccessible* docAccessible = GetDocAccessibleFromCache(doc);
+  if (docAccessible)
+    docAccessible->Shutdown();
 }
 
 void
 nsAccessibilityService::RecreateAccessible(nsIPresShell* aPresShell,
                                            nsIContent* aContent)
 {
   nsDocAccessible* document = GetDocAccessible(aPresShell->GetDocument());
   if (document)
--- a/accessible/src/base/nsAccessible.cpp
+++ b/accessible/src/base/nsAccessible.cpp
@@ -2363,17 +2363,18 @@ nsAccessible::DispatchClickEvent(nsICont
 {
   if (IsDefunct())
     return;
 
   nsCOMPtr<nsIPresShell> presShell = GetPresShell();
 
   // Scroll into view.
   presShell->ScrollContentIntoView(aContent, NS_PRESSHELL_SCROLL_ANYWHERE,
-                                   NS_PRESSHELL_SCROLL_ANYWHERE);
+                                   NS_PRESSHELL_SCROLL_ANYWHERE,
+                                   nsIPresShell::SCROLL_OVERFLOW_HIDDEN);
 
   // Fire mouse down and mouse up events.
   PRBool res = nsCoreUtils::DispatchMouseEvent(NS_MOUSE_BUTTON_DOWN, presShell,
                                                aContent);
   if (!res)
     return;
 
   nsCoreUtils::DispatchMouseEvent(NS_MOUSE_BUTTON_UP, presShell, aContent);
@@ -2761,16 +2762,23 @@ nsAccessible::InsertChildAt(PRUint32 aIn
 }
 
 PRBool
 nsAccessible::RemoveChild(nsAccessible* aChild)
 {
   if (aChild->mParent != this || aChild->mIndexInParent == -1)
     return PR_FALSE;
 
+  if (aChild->mIndexInParent >= mChildren.Length() ||
+      mChildren[aChild->mIndexInParent] != aChild) {
+    NS_ERROR("Child is bound to parent but parent hasn't this child at its index!");
+    aChild->UnbindFromParent();
+    return PR_FALSE;
+  }
+
   for (PRUint32 idx = aChild->mIndexInParent + 1; idx < mChildren.Length(); idx++)
     mChildren[idx]->mIndexInParent--;
 
   mChildren.RemoveElementAt(aChild->mIndexInParent);
   mEmbeddedObjCollector = nsnull;
 
   aChild->UnbindFromParent();
   return PR_TRUE;
--- a/accessible/src/base/nsDocAccessible.cpp
+++ b/accessible/src/base/nsDocAccessible.cpp
@@ -670,27 +670,33 @@ nsDocAccessible::Shutdown()
   if (mParent) {
     nsDocAccessible* parentDocument = mParent->GetDocAccessible();
     if (parentDocument)
       parentDocument->RemoveChildDocument(this);
 
     mParent->RemoveChild(this);
   }
 
+  PRUint32 childDocCount = mChildDocuments.Length();
+  for (PRUint32 idx = 0; idx < childDocCount; idx++)
+    mChildDocuments[idx]->Shutdown();
+
   mChildDocuments.Clear();
 
   mWeakShell = nsnull;  // Avoid reentrancy
 
   mNodeToAccessibleMap.Clear();
   ClearCache(mAccessibleCache);
 
   nsCOMPtr<nsIDocument> kungFuDeathGripDoc = mDocument;
   mDocument = nsnull;
 
   nsHyperTextAccessibleWrap::Shutdown();
+
+  GetAccService()->NotifyOfDocumentShutdown(kungFuDeathGripDoc);
 }
 
 nsIFrame*
 nsDocAccessible::GetFrame()
 {
   nsCOMPtr<nsIPresShell> shell(do_QueryReferent(mWeakShell));
 
   nsIFrame* root = nsnull;
--- a/accessible/src/base/nsOuterDocAccessible.cpp
+++ b/accessible/src/base/nsOuterDocAccessible.cpp
@@ -164,17 +164,17 @@ nsOuterDocAccessible::Shutdown()
   // any to avoid hanging document accessible.
   NS_LOG_ACCDOCDESTROY_MSG("A11y outerdoc shutdown")
   NS_LOG_ACCDOCDESTROY_ACCADDRESS("outerdoc", this)
 
   nsAccessible *childAcc = mChildren.SafeElementAt(0, nsnull);
   if (childAcc) {
     NS_LOG_ACCDOCDESTROY("outerdoc's child document shutdown",
                          childAcc->GetDocumentNode())
-    GetAccService()->ShutdownDocAccessiblesInTree(childAcc->GetDocumentNode());
+    childAcc->Shutdown();
   }
 
   nsAccessibleWrap::Shutdown();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // nsAccessible public
 
--- a/accessible/src/html/nsHyperTextAccessible.cpp
+++ b/accessible/src/html/nsHyperTextAccessible.cpp
@@ -1533,17 +1533,17 @@ nsHyperTextAccessible::SetSelectionRange
       domSel->RemoveRange(range);
     }
   }
   
   if (selCon) {
     // XXX I'm not sure this can do synchronous scrolling. If the last param is
     // set to true, this calling might flush the pending reflow. See bug 418470.
     selCon->ScrollSelectionIntoView(nsISelectionController::SELECTION_NORMAL,
-      nsISelectionController::SELECTION_FOCUS_REGION, PR_FALSE);
+      nsISelectionController::SELECTION_FOCUS_REGION, 0);
   }
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsHyperTextAccessible::SetCaretOffset(PRInt32 aCaretOffset)
 {
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -967,18 +967,19 @@ var PlacesStarButton = {
   onBeginUpdateBatch: function PSB_onBeginUpdateBatch() {
     this._batching = true;
   },
 
   onEndUpdateBatch: function PSB_onEndUpdateBatch() {
     this.updateState();
     this._batching = false;
   },
-  
-  onItemAdded: function PSB_onItemAdded(aItemId, aFolder, aIndex, aItemType) {
+
+  onItemAdded: function PSB_onItemAdded(aItemId, aFolder, aIndex, aItemType,
+                                        aURI) {
     if (!this._batching && !this._starred)
       this.updateState();
   },
 
   onBeforeItemRemoved: function() {},
 
   onItemRemoved: function PSB_onItemRemoved(aItemId, aFolder, aIndex,
                                             aItemType) {
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -814,18 +814,17 @@ const gFormSubmitObserver = {
 
     if (!(element instanceof HTMLInputElement ||
           element instanceof HTMLTextAreaElement ||
           element instanceof HTMLSelectElement ||
           element instanceof HTMLButtonElement)) {
       return;
     }
 
-    // Limit the message to 256 characters.
-    this.panel.firstChild.textContent = element.validationMessage.substring(0, 256);
+    this.panel.firstChild.textContent = element.validationMessage;
 
     element.focus();
 
     // If the user type something or blur the element, we want to remove the popup.
     // We could check for clicks but a click is already removing the popup.
     let eventHandler = function(e) {
       gFormSubmitObserver.panel.hidePopup();
     };
@@ -3981,16 +3980,37 @@ var XULBrowserWindow = {
 
   setOverLink: function (link) {
     // Encode bidirectional formatting characters.
     // (RFC 3987 sections 3.2 and 4.1 paragraph 6)
     link = link.replace(/[\u200e\u200f\u202a\u202b\u202c\u202d\u202e]/g,
                         encodeURIComponent);
     gURLBar.setOverLink(link);
   },
+  
+  // Called before links are navigated to to allow us to retarget them if needed.
+  onBeforeLinkTraversal: function(originalTarget, linkURI, linkNode, isAppTab) {
+    // Don't modify non-default targets or targets that aren't in top-level app
+    // tab docshells (isAppTab will be false for app tab subframes).
+    if (originalTarget != "" || !isAppTab)
+      return originalTarget;
+
+    let docURI = linkNode.ownerDocument.documentURIObject;
+    try {
+      let docURIDomain = Services.eTLD.getBaseDomain(docURI, 0);
+      let linkURIDomain = Services.eTLD.getBaseDomain(linkURI, 0);
+      // External links from within app tabs should always open in new tabs
+      // instead of replacing the app tab's page (Bug 575561)
+      if (docURIDomain != linkURIDomain)
+        return "_blank";
+    } catch(e) {
+      // If getBaseDomain fails, we return originalTarget below.
+    }
+    return originalTarget;
+  },
 
   onLinkIconAvailable: function (aIconURL) {
     if (gProxyFavIcon && gBrowser.userTypedValue === null)
       PageProxySetIcon(aIconURL); // update the favicon in the URL bar
   },
 
   onProgressChange: function (aWebProgress, aRequest,
                               aCurSelfProgress, aMaxSelfProgress,
@@ -7482,35 +7502,37 @@ let gPrivateBrowsingUI = {
     this._setPBMenuTitle("stop");
 
     document.getElementById("menu_import").setAttribute("disabled", "true");
 
     // Disable the Clear Recent History... menu item when in PB mode
     // temporary fix until bug 463607 is fixed
     document.getElementById("Tools:Sanitize").setAttribute("disabled", "true");
 
+    let docElement = document.documentElement;
     if (this._privateBrowsingService.autoStarted) {
       // Disable the menu item in auto-start mode
       document.getElementById("privateBrowsingItem")
               .setAttribute("disabled", "true");
 #ifdef MENUBAR_CAN_AUTOHIDE
       document.getElementById("appmenu_privateBrowsing")
               .setAttribute("disabled", "true");
 #endif
       document.getElementById("Tools:PrivateBrowsing")
               .setAttribute("disabled", "true");
+      if (window.location.href == getBrowserURL())
+        docElement.setAttribute("privatebrowsingmode", "permanent");
     }
     else if (window.location.href == getBrowserURL()) {
       // Adjust the window's title
-      let docElement = document.documentElement;
       docElement.setAttribute("title",
         docElement.getAttribute("title_privatebrowsing"));
       docElement.setAttribute("titlemodifier",
         docElement.getAttribute("titlemodifier_privatebrowsing"));
-      docElement.setAttribute("browsingmode", "private");
+      docElement.setAttribute("privatebrowsingmode", "temporary");
       gBrowser.updateTitlebar();
     }
 
     if (!aOnWindowOpen && this._disableUIOnToggle)
       document.getElementById("Tools:PrivateBrowsing")
               .setAttribute("disabled", "true");
   },
 
@@ -7547,17 +7569,17 @@ let gPrivateBrowsingUI = {
 
     if (window.location.href == getBrowserURL()) {
       // Adjust the window's title
       let docElement = document.documentElement;
       docElement.setAttribute("title",
         docElement.getAttribute("title_normal"));
       docElement.setAttribute("titlemodifier",
         docElement.getAttribute("titlemodifier_normal"));
-      docElement.setAttribute("browsingmode", "normal");
+      docElement.removeAttribute("privatebrowsingmode");
     }
 
     // Enable the menu item in after exiting the auto-start mode
     document.getElementById("privateBrowsingItem")
             .removeAttribute("disabled");
 #ifdef MENUBAR_CAN_AUTOHIDE
     document.getElementById("appmenu_privateBrowsing")
             .removeAttribute("disabled");
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -821,22 +821,17 @@
 <deck flex="1" id="tab-view-deck">
 <vbox flex="1">
 
   <toolbox id="navigator-toolbox"
            defaultmode="icons" mode="icons"
 #ifdef WINCE
            defaulticonsize="small" iconsize="small"
 #endif
-#ifdef XP_WIN
            tabsontop="true"
-#endif
-#ifdef XP_MACOSX
-           tabsontop="true"
-#endif
            persist="tabsontop">
     <!-- Menu -->
     <toolbar type="menubar" id="toolbar-menubar" class="chromeclass-menubar" customizable="true"
              defaultset="menubar-items"
              mode="icons" iconsize="small" defaulticonsize="small"
              lockiconsize="true"
 #ifdef MENUBAR_CAN_AUTOHIDE
              toolbarname="&menubarCmd.label;"
@@ -1009,17 +1004,19 @@
                       label="&viewBookmarksToolbar.label;"/>
             <menuseparator/>
             <menuitem id="BMB_bookmarksShowAll"
                       label="&showAllBookmarks.label;"
                       command="Browser:ShowAllBookmarks"
                       key="manBookmarkKb"/>
             <menuseparator/>
             <menuitem id="BMB_bookmarkThisPage"
+#ifndef XP_MACOSX
                       class="menuitem-iconic"
+#endif
                       label="&bookmarkThisPageCmd.label;"
                       command="Browser:AddBookmarkAs"
                       key="addBookmarkAsKb"/>
             <menuitem id="BMB_subscribeToPageMenuitem"
                       label="&subscribeToPageMenuitem.label;"
                       oncommand="return FeedHandler.subscribeToFeed(null, event);"
                       onclick="checkForMiddleClick(this, event);"
                       observes="singleFeedMenuitemState"/>
--- a/browser/base/content/nsContextMenu.js
+++ b/browser/base/content/nsContextMenu.js
@@ -953,24 +953,27 @@ nsContextMenu.prototype = {
       onDataAvailable: function saveLinkAs_onDataAvailable(aRequest, aContext,
                                                            aInputStream,
                                                            aOffset, aCount) {
         this.extListener.onDataAvailable(aRequest, aContext, aInputStream,
                                          aOffset, aCount);
       }
     }
 
-    // in case we need to prompt the user for authentication
     function callbacks() {}
     callbacks.prototype = {
       getInterface: function sLA_callbacks_getInterface(aIID) {
         if (aIID.equals(Ci.nsIAuthPrompt) || aIID.equals(Ci.nsIAuthPrompt2)) {
-          var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].
-                   getService(Ci.nsIPromptFactory);
-          return ww.getPrompt(doc.defaultView, aIID);
+          // If the channel demands authentication prompt, we must cancel it
+          // because the save-as-timer would expire and cancel the channel
+          // before we get credentials from user.  Both authentication dialog
+          // and save as dialog would appear on the screen as we fall back to
+          // the old fashioned way after the timeout.
+          timer.cancel();
+          channel.cancel(NS_ERROR_SAVE_LINK_AS_TIMEOUT);
         }
         throw Cr.NS_ERROR_NO_INTERFACE;
       } 
     }
 
     // if it we don't have the headers after a short time, the user 
     // won't have received any feedback from their click.  that's bad.  so
     // we give up waiting for the filename. 
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -186,16 +186,18 @@
           if (aTab.hidden)
             this.showTab(aTab);
 
           this.moveTabTo(aTab, this._numPinnedTabs);
           aTab.setAttribute("pinned", "true");
           this.tabContainer._positionPinnedTabs();
           this.tabContainer.adjustTabstrip();
 
+          this.getBrowserForTab(aTab).docShell.isAppTab = true;
+
           let event = document.createEvent("Events");
           event.initEvent("TabPinned", true, false);
           aTab.dispatchEvent(event);
         ]]></body>
       </method>
 
       <method name="unpinTab">
         <parameter name="aTab"/>
@@ -205,16 +207,18 @@
 
           this.moveTabTo(aTab, this._numPinnedTabs - 1);
           aTab.setAttribute("fadein", "true");
           aTab.removeAttribute("pinned");
           aTab.style.MozMarginStart = "";
           this.tabContainer._positionPinnedTabs();
           this.tabContainer.adjustTabstrip();
 
+          this.getBrowserForTab(aTab).docShell.isAppTab = false;
+
           let event = document.createEvent("Events");
           event.initEvent("TabUnpinned", true, false);
           aTab.dispatchEvent(event);
         ]]></body>
       </method>
 
       <method name="previewTab">
         <parameter name="aTab"/>
--- a/browser/base/content/tabview/groupitems.js
+++ b/browser/base/content/tabview/groupitems.js
@@ -65,16 +65,17 @@
 //   dontPush - true if this groupItem shouldn't push away on creation; default is false
 //   dontPush - true if this groupItem shouldn't push away or snap on creation; default is false
 //   immediately - true if we want all placement immediately, not with animation
 function GroupItem(listOfEls, options) {
   if (typeof options == 'undefined')
     options = {};
 
   this._inited = false;
+  this._uninited = false;
   this._children = []; // an array of Items
   this.defaultSize = new Point(TabItems.tabWidth * 1.5, TabItems.tabHeight * 1.5);
   this.isAGroupItem = true;
   this.id = options.id || GroupItems.getNextID();
   this._isStacked = false;
   this._stackAngles = [0];
   this.expanded = null;
   this.locked = (options.locked ? Utils.copy(options.locked) : {});
@@ -361,25 +362,33 @@ GroupItem.prototype = Utils.extend(new I
   isEmpty: function GroupItem_isEmpty() {
     return !this._children.length && !this.getTitle();
   },
 
   // ----------
   // Function: save
   // Saves this groupItem to persistent storage.
   save: function GroupItem_save() {
-    if (!this._inited) // too soon to save now
+    if (!this._inited || this._uninited) // too soon/late to save
       return;
 
     var data = this.getStorageData();
     if (GroupItems.groupItemStorageSanity(data))
       Storage.saveGroupItem(gWindow, data);
   },
 
   // ----------
+  // Function: deleteData
+  // Deletes the groupItem in the persistent storage.
+  deleteData: function GroupItem_deleteData() {
+    this._uninited = true;
+    Storage.deleteGroupItem(gWindow, this.id);
+  },
+
+  // ----------
   // Function: getTitle
   // Returns the title of this groupItem as a string.
   getTitle: function GroupItem_getTitle() {
     var value = (this.$title ? this.$title.val() : '');
     return (value == this.defaultName ? '' : value);
   },
 
   // ----------
@@ -556,17 +565,17 @@ GroupItem.prototype = Utils.extend(new I
     }, {
       duration: 170,
       complete: function() {
         iQ(this).remove();
         Items.unsquish();
       }
     });
 
-    Storage.deleteGroupItem(gWindow, this.id);
+    this.deleteData();
   },
 
   // ----------
   // Function: closeAll
   // Closes the groupItem and all of its children.
   closeAll: function GroupItem_closeAll() {
     let closeCenter = this.getBounds().center();
     if (this._children.length > 0) {
@@ -642,17 +651,17 @@ GroupItem.prototype = Utils.extend(new I
       self._sendToSubscribers("close");
       self.removeTrenches();
 
       iQ(self.container).remove();
       self.$undoContainer.remove();
       self.$undoContainer = null;
       Items.unsquish();
 
-      Storage.deleteGroupItem(gWindow, self.id);
+      self.deleteData();
     };
 
     this.$undoContainer.click(function(e) {
       // Only do this for clicks on this actual element.
       if (e.target.nodeName != self.$undoContainer[0].nodeName)
         return;
 
       self.$undoContainer.fadeOut(function() {
@@ -2067,13 +2076,13 @@ let GroupItems = {
     this.groupItems.forEach(function(groupItem) {
       if (groupItem.hidden) {
         let toClose = groupItem._children.concat();
         toClose.forEach(function(child) {
           child.removeSubscriber(groupItem, "close");
           child.close();
         });
 
-        Storage.deleteGroupItem(gWindow, groupItem.id);
+        groupItem.deleteData();
       }
     });
   }
 };
--- a/browser/base/content/tabview/tabitems.js
+++ b/browser/base/content/tabview/tabitems.js
@@ -197,21 +197,20 @@ function TabItem(tab, options) {
 
   iQ("<div>")
     .addClass('expander')
     .appendTo($div);
 
   this._updateDebugBounds();
 
   TabItems.register(this);
-  
-  if (!this.reconnected) {
+
+  if (!this.reconnected)
     GroupItems.newTab(this, options);
-  }
-  
+
   // tabs which were not reconnected at all or were not immediately added
   // to a group get the same treatment.
   if (!this.reconnected || (reconnected && !reconnected.addedToGroup) ) {
     this.setResizable(true, options.immediately);
     this.droppable(true);
   }
 };
 
@@ -799,17 +798,17 @@ let TabItems = {
         tabItem.favEl.src = iconUrl;
 
       // ___ URL
       let tabUrl = tab.linkedBrowser.currentURI.spec;
       if (tabUrl != tabItem.url) {
         let oldURL = tabItem.url;
         tabItem.url = tabUrl;
 
-        if (!tabItem.reconnected && (oldURL == 'about:blank' || !oldURL))
+        if (!tabItem.reconnected)
           this.reconnect(tabItem);
 
         tabItem.save();
       }
 
       // ___ label
       let label = tab.label;
       let $name = iQ(tabItem.nameEl);
@@ -1052,20 +1051,20 @@ let TabItems = {
               item.hideCachedData();
             }
           }, 15000);
         }
 
         item.reconnected = true;
         found = {addedToGroup: tabData.groupID};
       } else {
-        // if it's not a blank tab or it belongs to a group, it would mean 
-        // the item is reconnected.
-        item.reconnected = 
-          (item.tab.linkedBrowser.currentURI.spec != 'about:blank' || item.parent);
+        // We should never have any orphaned tabs. Therefore, item is not 
+        // connected if it has no parent and GroupItems.newTab() would handle 
+        // the group creation.
+        item.reconnected = (item.parent != null);
       }
       item.save();
 
       if (item.reconnected)
         item._sendToSubscribers("reconnected");
     } catch(e) {
       Utils.log(e);
     }
--- a/browser/base/content/test/Makefile.in
+++ b/browser/base/content/test/Makefile.in
@@ -140,16 +140,17 @@ endif
                  browser_bug555224.js \
                  browser_bug555767.js \
                  browser_bug556061.js \
                  browser_bug559991.js \
                  browser_bug561623.js \
                  browser_bug561636.js \
                  browser_bug562649.js \
                  browser_bug563588.js \
+                 browser_bug575561.js \
                  browser_bug577121.js \
                  browser_bug579872.js \
                  browser_bug580956.js \
                  browser_bug581242.js \
                  browser_bug581253.js \
                  browser_bug581947.js \
                  browser_bug585785.js \
                  browser_bug585830.js \
@@ -213,16 +214,18 @@ endif
                  alltabslistener.html \
                  zoom_test.html \
                  dummy_page.html \
                  browser_tabMatchesInAwesomebar.js \
                  file_bug550565_popup.html \
                  file_bug550565_favicon.ico \
                  browser_overLinkInLocationBar.js \
                  browser_aboutHome.js \
+                 app_bug575561.html \
+                 app_subframe_bug575561.html \
                  $(NULL)
 
 # compartment-disabled
 #                 browser_popupUI.js \
 #                 browser_tab_dragdrop.js \
 
 ifneq (cocoa,$(MOZ_WIDGET_TOOLKIT))
 _BROWSER_FILES += \
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/app_bug575561.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=575561
+-->
+  <head>
+    <title>Test for links in app tabs</title>
+  </head>
+  <body>
+    <a href="http://example.com/browser/browser/base/content/test/dummy_page.html">same domain</a>
+    <a href="http://test1.example.com/browser/browser/base/content/test/dummy_page.html">same domain (different subdomain)</a>
+    <a href="http://example.org/browser/browser/base/content/test/dummy_page.html">different domain</a>
+    <a href="http://example.org/browser/browser/base/content/test/dummy_page.html" target="foo">different domain (with target)</a>
+    <iframe src="app_subframe_bug575561.html"></iframe>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/app_subframe_bug575561.html
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=575561
+-->
+  <head>
+    <title>Test for links in app tab subframes</title>
+  </head>
+  <body>
+    <a href="http://example.org/browser/browser/base/content/test/dummy_page.html">different domain</a>
+  </body>
+</html>
--- a/browser/base/content/test/browser_bug553455.js
+++ b/browser/base/content/test/browser_bug553455.js
@@ -603,16 +603,25 @@ function test() {
   Services.prefs.setBoolPref("extensions.logging.enabled", true);
 
   Services.obs.addObserver(XPInstallObserver, "addon-install-started", false);
   Services.obs.addObserver(XPInstallObserver, "addon-install-blocked", false);
   Services.obs.addObserver(XPInstallObserver, "addon-install-failed", false);
   Services.obs.addObserver(XPInstallObserver, "addon-install-complete", false);
 
   registerCleanupFunction(function() {
+    // Make sure no more test parts run in case we were timed out
+    TESTS = [];
+
+    AddonManager.getAllInstalls(function(aInstalls) {
+      aInstalls.forEach(function(aInstall) {
+        aInstall.cancel();
+      });
+    });
+
     Services.prefs.clearUserPref("extensions.logging.enabled");
 
     Services.obs.removeObserver(XPInstallObserver, "addon-install-started");
     Services.obs.removeObserver(XPInstallObserver, "addon-install-blocked");
     Services.obs.removeObserver(XPInstallObserver, "addon-install-failed");
     Services.obs.removeObserver(XPInstallObserver, "addon-install-complete");
   });
 
--- a/browser/base/content/test/browser_bug561636.js
+++ b/browser/base/content/test/browser_bug561636.js
@@ -12,18 +12,18 @@ function checkPopupHide()
 {
   ok(gInvalidFormPopup.state != 'showing' && gInvalidFormPopup.state != 'open',
      "The invalid form popup should not be shown");
 }
 
 function checkPopupMessage(doc)
 {
   is(gInvalidFormPopup.firstChild.textContent,
-     doc.getElementById('i').validationMessage.substring(0,256),
-     "The panel should show the 256 first characters of the validationMessage");
+     doc.getElementById('i').validationMessage,
+     "The panel should show the message from validationMessage");
 }
 
 let gObserver = {
   QueryInterface : XPCOMUtils.generateQI([Ci.nsIFormSubmitObserver]),
 
   notifyInvalidSubmit : function (aFormElement, aInvalidElements)
   {
   }
@@ -128,74 +128,75 @@ function test3()
     gBrowser.contentDocument.getElementById('s').click();
   }, true);
 
   gBrowser.selectedTab = tab;
   gBrowser.selectedTab.linkedBrowser.loadURI(uri);
 }
 
 /**
- * In this test, we check that the validation message is correctly cut.
+ * In this test, we check that, we can hide the popup by interacting with the
+ * invalid element.
  */
 function test4()
 {
-  let uri = "data:text/html,<iframe name='t'></iframe><form target='t' action='data:text/html,'><input id='i'><input id='s' type='submit'></form>";
+  let uri = "data:text/html,<iframe name='t'></iframe><form target='t' action='data:text/html,'><input id='i' required><input id='s' type='submit'></form>";
   let tab = gBrowser.addTab();
 
   gInvalidFormPopup.addEventListener("popupshown", function() {
     gInvalidFormPopup.removeEventListener("popupshown", arguments.callee, false);
 
     let doc = gBrowser.contentDocument;
     is(doc.activeElement, doc.getElementById('i'),
        "First invalid element should be focused");
 
     checkPopupShow();
     checkPopupMessage(doc);
 
-    // Clean-up and next test.
-    gBrowser.removeTab(gBrowser.selectedTab, {animate: false});
-    executeSoon(test5);
+    EventUtils.synthesizeKey("a", {});
+
+    executeSoon(function () {
+      checkPopupHide();
+
+      // Clean-up and next test.
+      gBrowser.removeTab(gBrowser.selectedTab, {animate: false});
+      executeSoon(test5);
+    });
   }, false);
 
   tab.linkedBrowser.addEventListener("load", function(aEvent) {
     tab.linkedBrowser.removeEventListener("load", arguments.callee, true);
 
-    let msg = "";
-    for (let i=0; i<50; ++i) {
-      msg += "abcde ";
-    }
-    // msg has 300 characters
-    gBrowser.contentDocument.getElementById('i').setCustomValidity(msg);
     gBrowser.contentDocument.getElementById('s').click();
   }, true);
 
   gBrowser.selectedTab = tab;
   gBrowser.selectedTab.linkedBrowser.loadURI(uri);
 }
 
 /**
- * In this test, we check that, we can hide the popup by interacting with the
- * invalid element.
+ * In this test, we check that we can hide the popup by blurring the invalid
+ * element.
  */
 function test5()
 {
   let uri = "data:text/html,<iframe name='t'></iframe><form target='t' action='data:text/html,'><input id='i' required><input id='s' type='submit'></form>";
   let tab = gBrowser.addTab();
 
   gInvalidFormPopup.addEventListener("popupshown", function() {
     gInvalidFormPopup.removeEventListener("popupshown", arguments.callee, false);
 
     let doc = gBrowser.contentDocument;
     is(doc.activeElement, doc.getElementById('i'),
        "First invalid element should be focused");
 
     checkPopupShow();
     checkPopupMessage(doc);
 
-    EventUtils.synthesizeKey("a", {});
+    doc.getElementById('i').blur();
 
     executeSoon(function () {
       checkPopupHide();
 
       // Clean-up and next test.
       gBrowser.removeTab(gBrowser.selectedTab, {animate: false});
       executeSoon(test6);
     });
@@ -207,35 +208,34 @@ function test5()
     gBrowser.contentDocument.getElementById('s').click();
   }, true);
 
   gBrowser.selectedTab = tab;
   gBrowser.selectedTab.linkedBrowser.loadURI(uri);
 }
 
 /**
- * In this test, we check that we can hide the popup by blurring the invalid
- * element.
+ * In this test, we check that we can hide the popup by pressing TAB.
  */
 function test6()
 {
   let uri = "data:text/html,<iframe name='t'></iframe><form target='t' action='data:text/html,'><input id='i' required><input id='s' type='submit'></form>";
   let tab = gBrowser.addTab();
 
   gInvalidFormPopup.addEventListener("popupshown", function() {
     gInvalidFormPopup.removeEventListener("popupshown", arguments.callee, false);
 
     let doc = gBrowser.contentDocument;
     is(doc.activeElement, doc.getElementById('i'),
        "First invalid element should be focused");
 
     checkPopupShow();
     checkPopupMessage(doc);
 
-    doc.getElementById('i').blur();
+    EventUtils.synthesizeKey("VK_TAB", {});
 
     executeSoon(function () {
       checkPopupHide();
 
       // Clean-up and next test.
       gBrowser.removeTab(gBrowser.selectedTab, {animate: false});
       executeSoon(test7);
     });
@@ -247,82 +247,43 @@ function test6()
     gBrowser.contentDocument.getElementById('s').click();
   }, true);
 
   gBrowser.selectedTab = tab;
   gBrowser.selectedTab.linkedBrowser.loadURI(uri);
 }
 
 /**
- * In this test, we check that we can hide the popup by pressing TAB.
+ * In this test, we check that the popup will hide if we move to another tab.
  */
 function test7()
 {
   let uri = "data:text/html,<iframe name='t'></iframe><form target='t' action='data:text/html,'><input id='i' required><input id='s' type='submit'></form>";
   let tab = gBrowser.addTab();
 
   gInvalidFormPopup.addEventListener("popupshown", function() {
     gInvalidFormPopup.removeEventListener("popupshown", arguments.callee, false);
 
     let doc = gBrowser.contentDocument;
     is(doc.activeElement, doc.getElementById('i'),
        "First invalid element should be focused");
 
     checkPopupShow();
     checkPopupMessage(doc);
 
-    EventUtils.synthesizeKey("VK_TAB", {});
-
-    executeSoon(function () {
-      checkPopupHide();
-
-      // Clean-up and next test.
-      gBrowser.removeTab(gBrowser.selectedTab, {animate: false});
-      executeSoon(test8);
-    });
-  }, false);
-
-  tab.linkedBrowser.addEventListener("load", function(aEvent) {
-    tab.linkedBrowser.removeEventListener("load", arguments.callee, true);
-
-    gBrowser.contentDocument.getElementById('s').click();
-  }, true);
-
-  gBrowser.selectedTab = tab;
-  gBrowser.selectedTab.linkedBrowser.loadURI(uri);
-}
-
-/**
- * In this test, we check that the popup will hide if we move to another tab.
- */
-function test8()
-{
-  let uri = "data:text/html,<iframe name='t'></iframe><form target='t' action='data:text/html,'><input id='i' required><input id='s' type='submit'></form>";
-  let tab = gBrowser.addTab();
-
-  gInvalidFormPopup.addEventListener("popupshown", function() {
-    gInvalidFormPopup.removeEventListener("popupshown", arguments.callee, false);
-
-    let doc = gBrowser.contentDocument;
-    is(doc.activeElement, doc.getElementById('i'),
-       "First invalid element should be focused");
-
-    checkPopupShow();
-    checkPopupMessage(doc);
-
     // Create a new tab and move to it.
     gBrowser.selectedTab  = gBrowser.addTab("about:blank", {skipAnimation: true});
 
     executeSoon(function() {
       checkPopupHide();
 
       // Clean-up and next test.
       gBrowser.removeTab(gBrowser.selectedTab, {animate: false});
       gBrowser.removeTab(gBrowser.selectedTab, {animate: false});
-      executeSoon(test9);
+      executeSoon(test8);
     });
   }, false);
 
   tab.linkedBrowser.addEventListener("load", function(aEvent) {
     tab.linkedBrowser.removeEventListener("load", arguments.callee, true);
 
     gBrowser.contentDocument.getElementById('s').click();
   }, true);
@@ -331,17 +292,17 @@ function test8()
   gBrowser.selectedTab.linkedBrowser.loadURI(uri);
 }
 
 /**
  * In this test, we check that nothing happen (no focus nor popup) if the
  * invalid form is submitted in another tab than the current focused one
  * (submitted in background).
  */
-function test9()
+function test8()
 {
   let uri = "data:text/html,<iframe name='t'></iframe><form target='t' action='data:text/html,'><input id='i' required><input id='s' type='submit'></form>";
   let tab = gBrowser.addTab();
 
   gObserver.notifyInvalidSubmit = function() {
     executeSoon(function() {
       let doc = tab.linkedBrowser.contentDocument;
       isnot(doc.activeElement, doc.getElementById('i'),
@@ -350,17 +311,17 @@ function test9()
       checkPopupHide();
 
       // Clean-up
       Services.obs.removeObserver(gObserver, "invalidformsubmit");
       gObserver.notifyInvalidSubmit = function () {};
       gBrowser.removeTab(tab, {animate: false});
 
       // Next test
-      executeSoon(test10);
+      executeSoon(test9);
     });
   };
 
   Services.obs.addObserver(gObserver, "invalidformsubmit", false);
 
   tab.linkedBrowser.addEventListener("load", function(aEvent) {
     tab.linkedBrowser.removeEventListener("load", arguments.callee, true);
 
@@ -371,17 +332,17 @@ function test9()
   }, true);
 
   tab.linkedBrowser.loadURI(uri);
 }
 
 /**
  * In this test, we check that the author defined error message is shown.
  */
-function test10()
+function test9()
 {
   let uri = "data:text/html,<iframe name='t'></iframe><form target='t' action='data:text/html,'><input x-moz-errormessage='foo' required id='i'><input id='s' type='submit'></form>";
   let tab = gBrowser.addTab();
 
   gInvalidFormPopup.addEventListener("popupshown", function() {
     gInvalidFormPopup.removeEventListener("popupshown", arguments.callee, false);
 
     let doc = gBrowser.contentDocument;
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/browser_bug575561.js
@@ -0,0 +1,77 @@
+function test() {
+  waitForExplicitFinish();
+
+  // Pinned: Link to the same domain should not open a new tab
+  // Tests link to http://example.com/browser/browser/base/content/test/dummy_page.html  
+  testLink(0, true, false, function() {
+    // Pinned: Link to the same domain should not open a new tab
+    // Tests link to http://test1.example.com/browser/browser/base/content/test/dummy_page.html
+    testLink(1, true, false, function() {
+      // Pinned: Link to a different domain should open a new tab
+      // Tests link to http://example.org/browser/browser/base/content/test/dummy_page.html
+      testLink(2, true, true, function() {
+        // Not Pinned: Link to a different domain should not open a new tab
+        // Tests link to http://example.org/browser/browser/base/content/test/dummy_page.html
+        testLink(2, false, false, function() {
+          // Pinned: Targetted link should open a new tab
+          // Tests link to http://example.org/browser/browser/base/content/test/dummy_page.html with target="foo"
+          testLink(3, true, true, function() {
+            // Pinned: Link in a subframe should not open a new tab
+            // Tests link to http://example.org/browser/browser/base/content/test/dummy_page.html in subframe
+            testLink(0, true, false, finish, true);
+          });
+        });
+      });
+    });
+  });
+}
+
+function testLink(aLinkIndex, pinTab, expectNewTab, nextTest, testSubFrame) {
+  let appTab = gBrowser.addTab("http://example.com/browser/browser/base/content/test/app_bug575561.html", {skipAnimation: true});
+  if (pinTab)
+    gBrowser.pinTab(appTab);
+  gBrowser.selectedTab = appTab;
+  appTab.linkedBrowser.addEventListener("load", onLoad, true);
+
+  let loadCount = 0;
+  function onLoad() {
+    loadCount++;
+    if (loadCount < 2)
+      return;
+
+    appTab.linkedBrowser.removeEventListener("load", onLoad, true);
+
+    let browser = gBrowser.getBrowserForTab(appTab);
+    if (testSubFrame)
+      browser = browser.contentDocument.getElementsByTagName("iframe")[0];
+
+    let links = browser.contentDocument.getElementsByTagName("a");
+
+    if (expectNewTab)
+      gBrowser.tabContainer.addEventListener("TabOpen", onTabOpen, true);
+    else
+      browser.addEventListener("load", onPageLoad, true);
+
+    info("Clicking " + links[aLinkIndex].textContent);
+    EventUtils.sendMouseEvent({type:"click"}, links[aLinkIndex], browser.contentWindow);
+
+    function onPageLoad() {
+      browser.removeEventListener("load", onPageLoad, true);
+      is(browser.contentDocument.location.href, links[aLinkIndex].href, "Link should not open in a new tab");
+      executeSoon(function(){
+        gBrowser.removeTab(appTab);
+        nextTest();
+      });
+    }
+
+    function onTabOpen(event) {
+      gBrowser.tabContainer.removeEventListener("TabOpen", onTabOpen, true);
+      ok(true, "Link should open a new tab");
+      executeSoon(function(){
+        gBrowser.removeTab(appTab);
+        gBrowser.removeCurrentTab();
+        nextTest();
+      });
+    }
+  }
+}
--- a/browser/base/content/test/browser_bug585785.js
+++ b/browser/base/content/test/browser_bug585785.js
@@ -1,31 +1,36 @@
 var tab;
-var performedTest = false;
 
 function test() {
   waitForExplicitFinish();
 
   tab = gBrowser.addTab();
   isnot(tab.getAttribute("fadein"), "true", "newly opened tab is yet to fade in");
 
-  // Remove the tab right before the opening animation's first frame
+  // Try to remove the tab right before the opening animation's first frame
   window.mozRequestAnimationFrame(checkAnimationState);
-  executeSoon(checkAnimationState);
 }
 
 function checkAnimationState() {
-  if (performedTest)
-    return;
-
   if (tab.getAttribute("fadein") != "true") {
     window.mozRequestAnimationFrame(checkAnimationState);
-    executeSoon(checkAnimationState);
     return;
   }
 
-  performedTest = true;
+  info(window.getComputedStyle(tab).maxWidth);
+  gBrowser.removeTab(tab, { animate: true });
+  if (!tab.parentNode) {
+    ok(true, "tab removed synchronously since the opening animation hasn't moved yet");
+    finish();
+    return;
+  }
 
-  info(window.getComputedStyle(tab).maxWidth);
-  gBrowser.removeTab(tab, {animate:true});
-  ok(!tab.parentNode, "tab successfully removed");
-  finish();
+  info("tab didn't close immediately, so the tab opening animation must have started moving");
+  info("waiting for the tab to close asynchronously");
+  tab.addEventListener("transitionend", function (event) {
+    if (event.propertyName == "max-width")
+      executeSoon(function () {
+        ok(!tab.parentNode, "tab removed asynchronously");
+        finish();
+      });
+  }, false);
 }
--- a/browser/base/content/test/tabview/Makefile.in
+++ b/browser/base/content/test/tabview/Makefile.in
@@ -51,27 +51,29 @@ include $(topsrcdir)/config/rules.mk
                  browser_tabview_bug590606.js \
                  browser_tabview_bug591706.js \
                  browser_tabview_bug594176.js \
                  browser_tabview_bug595191.js \
                  browser_tabview_bug595518.js \
                  browser_tabview_bug595804.js \
                  browser_tabview_bug595930.js \
                  browser_tabview_bug595943.js \
+                 browser_tabview_bug598600.js \
                  browser_tabview_dragdrop.js \
                  browser_tabview_exit_button.js \
                  browser_tabview_group.js \
                  browser_tabview_launch.js \
                  browser_tabview_orphaned_tabs.js \
                  browser_tabview_privatebrowsing.js \
                  browser_tabview_search.js \
                  browser_tabview_snapping.js \
                  browser_tabview_startup_transitions.js \
                  browser_tabview_undo_group.js \
                  browser_tabview_firstrun_pref.js \
+                 head.js \
                  search1.html \
                  search2.html \
                  $(NULL)
 
 # compartments: test disabled
 #                 browser_tabview_multiwindow_search.js \
 
 libs::	$(_BROWSER_FILES)
--- a/browser/base/content/test/tabview/browser_tabview_bug590606.js
+++ b/browser/base/content/test/tabview/browser_tabview_bug590606.js
@@ -54,17 +54,17 @@ function test() {
        "There is one group item on startup");
     let groupItemOne = contentWindow.GroupItems.groupItems[0];
     is(groupItemOne.getChildren().length, 2, 
        "There should be two tab items in that group.");
     is(gBrowser.selectedTab, groupItemOne.getChild(0).tab,
        "The currently selected tab should be the first tab in the groupItemOne");
 
     // create another group with a tab.
-    let groupItemTwo = createEmptyGroupItem(contentWindow, 200);
+    let groupItemTwo = createEmptyGroupItem(contentWindow, 300, 300, 200);
 
     let onTabViewHidden = function() {
       window.removeEventListener("tabviewhidden", onTabViewHidden, false);
       // start the test
       testGroupSwitch(contentWindow, groupItemOne, groupItemTwo);
     };
     window.addEventListener("tabviewhidden", onTabViewHidden, false);
 
@@ -106,21 +106,8 @@ function testGroupSwitch(contentWindow, 
     "The currently selected tab should be the second tab in the groupItemOne");
 
   // cleanup.
   gBrowser.removeTab(groupItemTwo.getChild(0).tab);
   gBrowser.removeTab(newTabOne);
 
   finish();
 }
-
-function createEmptyGroupItem(contentWindow, padding) {
-  let pageBounds = contentWindow.Items.getPageBounds();
-  pageBounds.inset(padding, padding);
-
-  let box = new contentWindow.Rect(pageBounds);
-  box.width = 300;
-  box.height = 300;
-
-  let emptyGroupItem = new contentWindow.GroupItem([], { bounds: box });
-
-  return emptyGroupItem;
-}
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/tabview/browser_tabview_bug598600.js
@@ -0,0 +1,115 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is tabview bug598600 test.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Raymond Lee <raymond@appcoast.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+let newWin;
+let prefService;
+
+function test() {
+  let ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
+  prefService = 
+    Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).
+      getBranch("browser.panorama.");
+  // make sure we don't trigger the 'first run' behavior
+  prefService.setBoolPref("experienced_first_run", true);
+
+  waitForExplicitFinish();
+
+  // open a new window and setup the window state.
+  newWin = openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no");
+  newWin.addEventListener("load", function(event) {
+    this.removeEventListener("load", arguments.callee, false);
+
+    let newState = {
+      windows: [{
+        tabs: [{
+          entries: [{ "url": "about:blank" }],
+          hidden: true,
+          attributes: {},
+          extData: {
+            "tabview-tab":
+              '{"bounds":{"left":20,"top":35,"width":280,"height":210},' +
+              '"userSize":null,"url":"about:blank","groupID":1,' + 
+              '"imageData":null,"title":null}'
+          }
+        },{
+          entries: [{ url: "about:blank" }],
+          index: 1,
+          hidden: false,
+          attributes: {},
+          extData: {
+            "tabview-tab": 
+              '{"bounds":{"left":375,"top":35,"width":280,"height":210},' + 
+              '"userSize":null,"url":"about:blank","groupID":2,' + 
+              '"imageData":null,"title":null}'
+          }
+        }],
+        selected:2,
+        _closedTabs: [],
+        extData: {
+          "tabview-groups": '{"nextID":3,"activeGroupId":2}',
+          "tabview-group": 
+            '{"1":{"bounds":{"left":15,"top":10,"width":320,"height":375},' + 
+            '"userSize":null,"locked":{},"title":"","id":1},' + 
+            '"2":{"bounds":{"left":380,"top":5,"width":320,"height":375},' + 
+            '"userSize":null,"locked":{},"title":"","id":2}}',
+          "tabview-ui": '{"pageBounds":{"left":0,"top":0,"width":875,"height":650}}'
+        }, sizemode:"normal"
+      }]
+    };
+    ss.setWindowState(newWin, JSON.stringify(newState), true);
+
+    // add a new tab.
+    newWin.gBrowser.addTab();
+    is(newWin.gBrowser.tabs.length, 3, "There are 3 browser tabs"); 
+
+    let onTabViewShow = function() {
+      newWin.removeEventListener("tabviewshown", onTabViewShow, false);
+
+      let contentWindow = newWin.document.getElementById("tab-view").contentWindow;
+
+      is(contentWindow.GroupItems.groupItems.length, 2, "Has two group items");
+      is(contentWindow.GroupItems.getOrphanedTabs().length, 0, "No orphan tabs");
+
+      // clean up and finish
+      prefService.setBoolPref("experienced_first_run", false);
+      newWin.close();
+
+      finish();
+    }
+    newWin.addEventListener("tabviewshown", onTabViewShow, false);
+    newWin.TabView.toggle();
+  }, false);
+}
--- a/browser/base/content/test/tabview/browser_tabview_dragdrop.js
+++ b/browser/base/content/test/tabview/browser_tabview_dragdrop.js
@@ -90,20 +90,18 @@ function addTest(contentWindow, groupOne
   let groupTwoTabItemCount = groupTwo.getChildren().length;
   is(groupOneTabItemCount, 1, "GroupItem one has one tab");
   is(groupTwoTabItemCount, 1, "GroupItem two has one tab as well");
 
   let tabItem = groupOne.getChild(0);
   ok(tabItem, "The tab item exists");
 
   // calculate the offsets
-  let groupTwoRect = groupTwo.getBounds();
-  let groupTwoRectCenter = groupTwoRect.center();
-  let tabItemRect = tabItem.getBounds();
-  let tabItemRectCenter = tabItemRect.center();
+  let groupTwoRectCenter = groupTwo.getBounds().center();
+  let tabItemRectCenter = tabItem.getBounds().center();
   let offsetX =
     Math.round(groupTwoRectCenter.x - tabItemRectCenter.x);
   let offsetY =
     Math.round(groupTwoRectCenter.y - tabItemRectCenter.y);
 
   function endGame() {
     groupTwo.removeSubscriber(groupTwo, "childAdded");
 
@@ -127,46 +125,28 @@ function addTest(contentWindow, groupOne
     window.addEventListener("tabviewhidden", onTabViewHidden, false);
     gBrowser.selectedTab = originalTab;
   }
   groupTwo.addSubscriber(groupTwo, "childAdded", endGame);
   
   simulateDragDrop(tabItem.container, offsetX, offsetY, contentWindow);
 }
 
-function simulateDragDrop(tabItem, offsetX, offsetY, contentWindow) {
-  // enter drag mode
-  let dataTransfer;
+function simulateDragDrop(element, offsetX, offsetY, contentWindow) {
+  let rect = element.getBoundingClientRect();
+  let startX = (rect.right - rect.left)/2;
+  let startY = (rect.bottom - rect.top)/2;
+  let incrementX = offsetX / 2;
+  let incrementY = offsetY / 2;
 
   EventUtils.synthesizeMouse(
-    tabItem, 1, 1, { type: "mousedown" }, contentWindow);
-  event = contentWindow.document.createEvent("DragEvents");
-  event.initDragEvent(
-    "dragenter", true, true, contentWindow, 0, 0, 0, 0, 0,
-    false, false, false, false, 1, null, dataTransfer);
-  tabItem.dispatchEvent(event);
+    element, startX, startY, { type: "mousedown" });
+  
+  for (let i = 1; i <= 2; i++) {
+    EventUtils.synthesizeMouse(
+      element, (startX + incrementX * i), (startY + incrementY * i), 
+      { type: "mousemove" });
+  }
 
-  // drag over
-  if (offsetX || offsetY) {
-    let Ci = Components.interfaces;
-    let utils = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor).
-                              getInterface(Ci.nsIDOMWindowUtils);
-    let rect = tabItem.getBoundingClientRect();
-    for (let i = 1; i <= 5; i++) {
-      let left = rect.left + Math.round(i * offsetX / 5);
-      let top = rect.top + Math.round(i * offsetY / 5);
-      utils.sendMouseEvent("mousemove", left, top, 0, 1, 0);
-    }
-    event = contentWindow.document.createEvent("DragEvents");
-    event.initDragEvent(
-      "dragover", true, true, contentWindow, 0, 0, 0, 0, 0,
-      false, false, false, false, 0, null, dataTransfer);
-    tabItem.dispatchEvent(event);
-  }
-  
-  // drop
-  EventUtils.synthesizeMouse(tabItem, 0, 0, { type: "mouseup" }, contentWindow);
-  event = contentWindow.document.createEvent("DragEvents");
-  event.initDragEvent(
-    "drop", true, true, contentWindow, 0, 0, 0, 0, 0,
-    false, false, false, false, 0, null, dataTransfer);
-  tabItem.dispatchEvent(event);
+  EventUtils.synthesizeMouse(
+    element, (startX + incrementX * 2), (startY + incrementY * 2), 
+    { type: "mouseup" });
 }
--- a/browser/base/content/test/tabview/browser_tabview_group.js
+++ b/browser/base/content/test/tabview/browser_tabview_group.js
@@ -60,17 +60,17 @@ function onTabViewWindowLoaded() {
 
   testEmptyGroupItem(contentWindow);
 }
 
 function testEmptyGroupItem(contentWindow) {
   let groupItemCount = contentWindow.GroupItems.groupItems.length;
   
   // create empty group item
-  let emptyGroupItem = createEmptyGroupItem(contentWindow, 100);
+  let emptyGroupItem = createEmptyGroupItem(contentWindow, 300, 300, 100, true);
   ok(emptyGroupItem.isEmpty(), "This group is empty");
 
   is(contentWindow.GroupItems.groupItems.length, ++groupItemCount,
      "The number of groups is increased by 1");
 
   emptyGroupItem.addSubscriber(emptyGroupItem, "close", function() {
     emptyGroupItem.removeSubscriber(emptyGroupItem, "close");
 
@@ -84,17 +84,17 @@ function testEmptyGroupItem(contentWindo
   let closeButton = emptyGroupItem.container.getElementsByClassName("close");
   ok(closeButton[0], "Group close button exists");
 
   // click the close button
   EventUtils.synthesizeMouse(closeButton[0], 1, 1, {}, contentWindow);
 }
 
 function testGroupItemWithTabItem(contentWindow) {
-  let groupItem = createEmptyGroupItem(contentWindow, 200);
+  let groupItem = createEmptyGroupItem(contentWindow, 300, 300, 200, true);
   let tabItemCount = 0;
 
   let onTabViewHidden = function() {
     window.removeEventListener("tabviewhidden", onTabViewHidden, false);
 
     is(groupItem.getChildren().length, ++tabItemCount,
        "The number of children in new tab group is increased by 1");
 
@@ -156,22 +156,8 @@ function testGroupItemWithTabItem(conten
   window.addEventListener("tabviewshown", onTabViewShown, false);
   
   // click on the + button
   let newTabButton = groupItem.container.getElementsByClassName("newTabButton");
   ok(newTabButton[0], "New tab button exists");
 
   EventUtils.synthesizeMouse(newTabButton[0], 1, 1, {}, contentWindow);
 }
-
-function createEmptyGroupItem(contentWindow, padding) {
-  let pageBounds = contentWindow.Items.getPageBounds();
-  pageBounds.inset(padding, padding);
-
-  let box = new contentWindow.Rect(pageBounds);
-  box.width = 300;
-  box.height = 300;
-
-  let emptyGroupItem = new contentWindow.GroupItem([], { bounds: box,
-                                                         immediately: true });
-
-  return emptyGroupItem;
-}
--- a/browser/base/content/test/tabview/browser_tabview_orphaned_tabs.js
+++ b/browser/base/content/test/tabview/browser_tabview_orphaned_tabs.js
@@ -62,17 +62,17 @@ function onTabViewWindowLoaded() {
 
   let contentWindow = newWin.document.getElementById("tab-view").contentWindow;
 
   // 1) the tab should belong to a group, and no orphan tabs
   ok(tabOne.tabItem.parent, "Tab one belongs to a group");
   is(contentWindow.GroupItems.getOrphanedTabs().length, 0, "No orphaned tabs");
 
   // 2) create a group, add a blank tab 
-  let groupItem = createEmptyGroupItem(contentWindow, 200);
+  let groupItem = createEmptyGroupItem(contentWindow, 300, 300, 200);
 
   let onTabViewHidden = function() {
     newWin.removeEventListener("tabviewhidden", onTabViewHidden, false);
 
     // 3) the new group item should have one child and no orphan tab
     is(groupItem.getChildren().length, 1, "The group item has an item");
     is(contentWindow.GroupItems.getOrphanedTabs().length, 0, "No orphaned tabs");
     
@@ -105,29 +105,16 @@ function onTabViewWindowLoaded() {
 
   // click on the + button
   let newTabButton = groupItem.container.getElementsByClassName("newTabButton");
   ok(newTabButton[0], "New tab button exists");
 
   EventUtils.sendMouseEvent({ type: "click" }, newTabButton[0], contentWindow);
 }
 
-function createEmptyGroupItem(contentWindow, padding) {
-  let pageBounds = contentWindow.Items.getPageBounds();
-  pageBounds.inset(padding, padding);
-
-  let box = new contentWindow.Rect(pageBounds);
-  box.width = 300;
-  box.height = 300;
-
-  let emptyGroupItem = new contentWindow.GroupItem([], { bounds: box });
-
-  return emptyGroupItem;
-}
-
 function whenWindowObservesOnce(win, topic, callback) {
   let windowWatcher = 
     Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher);
   function windowObserver(subject, topicName, aData) {
     if (win == subject.QueryInterface(Ci.nsIDOMWindow) && topic == topicName) {
       windowWatcher.unregisterNotification(windowObserver);
       callback();
     }
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/tabview/head.js
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the utilities for tabview.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Raymond Lee <raymond@appcoast.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+function createEmptyGroupItem(contentWindow, width, height, padding, noAnimation) {
+  let pageBounds = contentWindow.Items.getPageBounds();
+  pageBounds.inset(padding, padding);
+
+  let box = new contentWindow.Rect(pageBounds);
+  box.width = width;
+  box.height = height;
+  
+  let immediately = noAnimation ? true: false;
+  let emptyGroupItem = 
+    new contentWindow.GroupItem([], { bounds: box, immediately: immediately });
+
+  return emptyGroupItem;
+}
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -125,34 +125,48 @@
                                                 "anonid", "textbox-input-box");
         var cxmenu = document.getAnonymousElementByAttribute(textBox,
                                             "anonid", "input-box-contextmenu");
         var pasteAndGo;
         cxmenu.addEventListener("popupshowing", function() {
           if (!pasteAndGo)
             return;
           var controller = document.commandDispatcher.getControllerForCommand("cmd_paste");
-          var enabled = controller.isCommandEnabled("cmd_paste");
-          if (enabled)
-            pasteAndGo.removeAttribute("disabled");
-          else
-            pasteAndGo.setAttribute("disabled", "true");
+          var couldBeURL = controller.isCommandEnabled("cmd_paste");
+          if (couldBeURL) {
+            let cbSvc = Cc["@mozilla.org/widget/clipboard;1"].
+                          getService(Ci.nsIClipboard);
+            let xferable = Cc["@mozilla.org/widget/transferable;1"].
+                            createInstance(Ci.nsITransferable);
+            xferable.addDataFlavor("text/unicode");
+            cbSvc.getData(xferable, cbSvc.kGlobalClipboard);
+            let data = {};
+            xferable.getTransferData("text/unicode", data, {});
+            data = data.value.QueryInterface(Ci.nsISupportsString).data;
+            try {
+              makeURI(data);
+            } catch (ex) { // clipboard data is not a URL
+              couldBeURL = false;
+            }
+          }
+          pasteAndGo.hidden = !couldBeURL;
         }, false);
 
         var insertLocation = cxmenu.firstChild;
         while (insertLocation.nextSibling &&
                insertLocation.getAttribute("cmd") != "cmd_paste")
           insertLocation = insertLocation.nextSibling;
         if (insertLocation) {
           pasteAndGo = document.createElement("menuitem");
           let label = Services.strings.createBundle("chrome://browser/locale/browser.properties").
                                    GetStringFromName("pasteAndGo.label");
           pasteAndGo.setAttribute("label", label);
           pasteAndGo.setAttribute("anonid", "paste-and-go");
-          pasteAndGo.setAttribute("oncommand", "goDoCommand('cmd_paste'); gURLBar.handleCommand();");
+          pasteAndGo.setAttribute("oncommand",
+              "gURLBar.value = ''; goDoCommand('cmd_paste'); gURLBar.handleCommand();");
           cxmenu.insertBefore(pasteAndGo, insertLocation.nextSibling);
         }
       ]]></constructor>
 
       <destructor><![CDATA[
         this._prefs.removeObserver("", this);
         this._prefs = null;
         this.inputField.controllers.removeController(this._copyCutController);
--- a/browser/base/content/utilityOverlay.js
+++ b/browser/base/content/utilityOverlay.js
@@ -478,17 +478,17 @@ function openTroubleshootingPage()
   openUILinkIn("about:support", "tab");
 }
 
 /**
  * Opens the feedback page for this version of the application.
  */
 function openFeedbackPage()
 {
-  openUILinkIn("http://input.mozilla.com/sad", "tab");
+  openUILinkIn("http://input.mozilla.com/feedback", "tab");
 }
 
 
 #ifdef MOZ_UPDATER
 /**
  * Opens the update manager and checks for updates to the application.
  */
 function checkForUpdates()
--- a/browser/components/places/content/editBookmarkOverlay.js
+++ b/browser/components/places/content/editBookmarkOverlay.js
@@ -1156,17 +1156,18 @@ var gEditItemOverlay = {
 
     var folderItem = this._getFolderMenuItem(aNewParent);
 
     // just setting selectItem _does not_ trigger oncommand, so we don't
     // recurse
     this._folderMenuList.selectedItem = folderItem;
   },
 
-  onItemAdded: function EIO_onItemAdded(aItemId, aFolder, aIndex, aItemType) {
+  onItemAdded: function EIO_onItemAdded(aItemId, aFolder, aIndex, aItemType,
+                                        aURI) {
     this._lastNewItem = aItemId;
   },
 
   onBeginUpdateBatch: function() { },
   onEndUpdateBatch: function() { },
   onBeforeItemRemoved: function() { },
   onItemRemoved: function() { },
   onItemVisited: function() { },
--- a/browser/components/places/content/history-panel.xul
+++ b/browser/components/places/content/history-panel.xul
@@ -41,18 +41,16 @@
 <?xml-stylesheet href="chrome://browser/content/places/places.css"?>
 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
 <?xml-stylesheet href="chrome://browser/skin/places/places.css"?>
 
 <?xul-overlay href="chrome://global/content/editMenuOverlay.xul"?>
 <?xul-overlay href="chrome://browser/content/places/placesOverlay.xul"?>
 
 <!DOCTYPE page [
-<!ENTITY % historyDTD SYSTEM "chrome://browser/locale/history/history.dtd">
-%historyDTD;
 <!ENTITY % placesDTD SYSTEM "chrome://browser/locale/places/places.dtd">
 %placesDTD;
 ]>
 
 <!-- we need to keep id="history-panel" for upgrade and switching
      between versions of the browser -->
 
 <page id="history-panel" orient="vertical"
--- a/browser/components/places/content/places.xul
+++ b/browser/components/places/content/places.xul
@@ -386,17 +386,17 @@
       <treechildren flex="1"/>
     </tree>
     <splitter collapse="none" persist="state"></splitter>
     <vbox id="contentView" flex="4">
       <deck id="contentDeck" flex="1">
         <vbox id="defaultView" flex="1">
           <vbox id="searchModifiers" hidden="true">
             <toolbar id="organizerScopeBar" class="chromeclass-toolbar" align="center">
-              <label id="scopeBarTitle" value="&search.label;"/>
+              <label id="scopeBarTitle" value="&search.in.label;"/>
               <toolbarbutton id="scopeBarAll" type="radio" group="scopeBar"
                              oncommand="PlacesQueryBuilder.onScopeSelected(this);"
                              label="&search.scopeBookmarks.label;"
                              accesskey="&search.scopeBookmarks.accesskey;"/>
               <!--
               <toolbarbutton id="scopeBarDownloads" type="radio" group="scopeBar"
                              oncommand="PlacesQueryBuilder.onScopeSelected(this);"
                              label="&search.scopeDownloads.label;"
--- a/browser/components/places/tests/browser/browser_library_views_liveupdate.js
+++ b/browser/components/places/tests/browser/browser_library_views_liveupdate.js
@@ -199,17 +199,17 @@ var bookmarksObserver = {
   QueryInterface: function PSB_QueryInterface(aIID) {
     if (aIID.equals(Ci.nsINavBookmarkObserver) ||
         aIID.equals(Ci.nsISupports))
       return this;
     throw Cr.NS_NOINTERFACE;
   },
 
   // nsINavBookmarkObserver
-  onItemAdded: function PSB_onItemAdded(aItemId, aFolderId, aIndex) {
+  onItemAdded: function PSB_onItemAdded(aItemId, aFolderId, aIndex, aURI) {
     var node = null;
     var index = null;
     [node, index] = getNodeForTreeItem(aItemId, gLibrary.PlacesOrganizer._places);
     // Left pane should not be updated for normal bookmarks or separators.
     var type = PlacesUtils.bookmarks.getItemType(aItemId);
     switch (type) {
       case PlacesUtils.bookmarks.TYPE_BOOKMARK:
         var uriString = PlacesUtils.bookmarks.getBookmarkURI(aItemId).spec;
--- a/browser/components/places/tests/browser/browser_views_liveupdate.js
+++ b/browser/components/places/tests/browser/browser_views_liveupdate.js
@@ -218,17 +218,17 @@ var bookmarksObserver = {
     if (aIID.equals(Ci.nsINavBookmarkObserver) ||
         aIID.equals(Ci.nsISupports))
       return this;
     throw Cr.NS_NOINTERFACE;
   },
 
   // nsINavBookmarkObserver
   onItemAdded: function PSB_onItemAdded(aItemId, aFolderId, aIndex,
-                                        aItemType) {
+                                        aItemType, aURI) {
     var views = getViewsForFolder(aFolderId);
     ok(views.length > 0, "Found affected views (" + views.length + "): " + views);
 
     // Check that item has been added in the correct position.
     for (var i = 0; i < views.length; i++) {
       var [node, index] = searchItemInView(aItemId, views[i]);
       isnot(node, null, "Found new Places node in " + views[i]);
       is(index, aIndex, "Node is at index " + index);
--- a/browser/components/places/tests/unit/test_placesTxn.js
+++ b/browser/components/places/tests/unit/test_placesTxn.js
@@ -48,17 +48,17 @@ var annosvc = PlacesUtils.annotations;
 // create and add bookmarks observer
 var observer = {
   onBeginUpdateBatch: function() {
     this._beginUpdateBatch = true;
   },
   onEndUpdateBatch: function() {
     this._endUpdateBatch = true;
   },
-  onItemAdded: function(id, folder, index, itemType) {
+  onItemAdded: function(id, folder, index, itemType, uri) {
     this._itemAddedId = id;
     this._itemAddedParent = folder;
     this._itemAddedIndex = index;
     this._itemAddedType = itemType;
   },
   onBeforeItemRemoved: function(id) {
   },
   onItemRemoved: function(id, folder, index, itemType) {
--- a/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_theming.js
+++ b/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_theming.js
@@ -30,36 +30,36 @@
  * use your version of this file under the terms of the MPL, indicate your
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
-// This test makes sure that browsingmode attribute of the window is correctly
+// This test makes sure that privatebrowsingmode attribute of the window is correctly
 // switched with private browsing mode changes.
 
 function test() {
   // initialization
   gPrefService.setBoolPref("browser.privatebrowsing.keep_current_session", true);
   let pb = Cc["@mozilla.org/privatebrowsing;1"].
            getService(Ci.nsIPrivateBrowsingService);
   let docRoot = document.documentElement;
 
-  is(docRoot.getAttribute("browsingmode"), "normal",
-    "browsingmode should be \"normal\" initially");
+  ok(!docRoot.hasAttribute("privatebrowsingmode"),
+    "privatebrowsingmode should not be present in normal mode");
 
   // enter private browsing mode
   pb.privateBrowsingEnabled = true;
 
-  is(docRoot.getAttribute("browsingmode"), "private",
-    "browsingmode should be \"private\" inside the private browsing mode");
+  is(docRoot.getAttribute("privatebrowsingmode"), "temporary",
+    "privatebrowsingmode should be \"temporary\" inside the private browsing mode");
 
   // leave private browsing mode
   pb.privateBrowsingEnabled = false;
 
-  is(docRoot.getAttribute("browsingmode"), "normal",
-    "browsingmode should be \"normal\" outside the private browsing mode");
+  ok(!docRoot.hasAttribute("privatebrowsingmode"),
+    "privatebrowsingmode should not be present in normal mode");
 
   // cleanup
   gPrefService.clearUserPref("browser.privatebrowsing.keep_current_session");
 }
--- a/browser/components/search/content/search.xml
+++ b/browser/components/search/content/search.xml
@@ -599,17 +599,18 @@
           while (insertLocation.nextSibling &&
                  insertLocation.getAttribute("cmd") != "cmd_paste")
             insertLocation = insertLocation.nextSibling;
           if (insertLocation) {
             element = document.createElementNS(kXULNS, "menuitem");
             label = this._stringBundle.getString("cmd_pasteAndSearch");
             element.setAttribute("label", label);
             element.setAttribute("anonid", "paste-and-search");
-            element.setAttribute("oncommand", "goDoCommand('cmd_paste'); document.getElementById('searchbar').handleSearchCommand();");
+            element.setAttribute("oncommand",
+                "BrowserSearch.searchBar.value = ''; goDoCommand('cmd_paste'); BrowserSearch.searchBar.handleSearchCommand();");
             cxmenu.insertBefore(element, insertLocation.nextSibling);
             pasteAndSearch = element;
           }
 
           element = document.createElementNS(kXULNS, "menuitem");
           label = this._stringBundle.getString("cmd_clearHistory");
           akey = this._stringBundle.getString("cmd_clearHistory_accesskey");
           element.setAttribute("label", label);
--- a/browser/components/search/test/Makefile.in
+++ b/browser/components/search/test/Makefile.in
@@ -40,18 +40,19 @@ topsrcdir	= @top_srcdir@
 srcdir		= @srcdir@
 VPATH		= @srcdir@
 relativesrcdir  =  browser/components/search/test
 
 include $(DEPTH)/config/autoconf.mk
 include $(topsrcdir)/config/rules.mk
 
 _BROWSER_TEST_FILES = 	  browser_405664.js \
-	                  browser_415700.js \
+	                  browser_addEngine.js \
 	                  testEngine.xml \
+	                  testEngine.src \
 	                  browser_426329.js \
 	                  426329.xml \
 	                  browser_483086.js \
 	                  483086-1.xml \
 	                  483086-2.xml \
 	                  test.html \
 	                  $(NULL)
 
rename from browser/components/search/test/browser_415700.js
rename to browser/components/search/test/browser_addEngine.js
--- a/browser/components/search/test/browser_415700.js
+++ b/browser/components/search/test/browser_addEngine.js
@@ -30,56 +30,139 @@
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 var gSS = Services.search;
 
-function observers(aSubject, aTopic, aData) {
+function observer(aSubject, aTopic, aData) {
+  if (!gCurrentTest) {
+    info("Observer called with no test active");
+    return;
+  }
+
+  let engine = aSubject.QueryInterface(Ci.nsISearchEngine);
+  info("Observer: " + aData + " for " + engine.name);
+  let method;
   switch (aData) {
     case "engine-added":
-      test2();
+      if (gCurrentTest.added)
+        method = "added"
       break;
     case "engine-current":
-      test3();
+      if (gCurrentTest.current)
+        method = "current";
       break;
     case "engine-removed":
-      test4();
+      if (gCurrentTest.removed)
+        method = "removed";
       break;
   }
+
+  if (method)
+    gCurrentTest[method](engine);
+}
+
+function checkEngine(checkObj, engineObj) {
+  info("Checking engine");
+  for (var prop in checkObj)
+    is(checkObj[prop], engineObj[prop], prop + " is correct");
+}
+
+var gTests = [
+  {
+    name: "opensearch install",
+    engine: {
+      name: "Foo",
+      alias: null,
+      description: "Foo Search",
+      searchForm: "http://mochi.test:8888/browser/browser/components/search/test/",
+      type: Ci.nsISearchEngine.TYPE_OPENSEARCH
+    },
+    run: function () {
+      gSS.addEngine("http://mochi.test:8888/browser/browser/components/search/test/testEngine.xml",
+                    Ci.nsISearchEngine.DATA_XML, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGklEQVQoz2NgGB6AnZ1dUlJSXl4eSDIyMhLW4Ovr%2B%2Fr168uXL69Zs4YoG%2BLi4i5dusTExMTGxsbNzd3f37937976%2BnpmZmagbHR09J49e5YvX66kpATVEBYW9ubNm2nTphkbG7e2tp44cQLIuHfvXm5urpaWFlDKysqqu7v73LlzECMYIiIiHj58mJCQoKKicvXq1bS0NKBgW1vbjh074uPjgeqAXE1NzSdPnvDz84M0AEUvXLgAsW379u1z5swBen3jxo2zZ892cHB4%2BvQp0KlAfwI1cHJyghQFBwfv2rULokFXV%2FfixYu7d%2B8GGqGgoMDKyrpu3br9%2B%2FcDuXl5eVA%2FAEWBfoWHAdAYoNuAYQ0XAeoUERFhGDYAAPoUaT2dfWJuAAAAAElFTkSuQmCC",
+                    false);
+    },
+    added: function (engine) {
+      ok(engine, "engine was added.");
+
+      checkEngine(this.engine, engine);
+
+      let engineFromSS = gSS.getEngineByName(this.engine.name);
+      is(engine, engineFromSS, "engine is obtainable via getEngineByName");
+
+      let aEngine = gSS.getEngineByAlias("fooalias");
+      ok(!aEngine, "Alias was not parsed from engine description");
+
+      gSS.currentEngine = engine;
+    },
+    current: function (engine) {
+      let currentEngine = gSS.currentEngine;
+      is(engine, currentEngine, "engine is current");
+      is(engine.name, this.engine.name, "current engine was changed successfully");
+
+      gSS.removeEngine(engine);
+    },
+    removed: function (engine) {
+      let currentEngine = gSS.currentEngine;
+      ok(currentEngine, "An engine is present.");
+      isnot(currentEngine.name, this.engine.name, "Current engine reset after removal");
+
+      nextTest();
+    }
+  },
+  {
+    name: "sherlock install",
+    engine: {
+      name: "Test Sherlock",
+      alias: null,
+      description: "Test Description",
+      searchForm: "http://example.com/searchform",
+      type: Ci.nsISearchEngine.TYPE_SHERLOCK
+    },
+    run: function () {
+      gSS.addEngine("http://mochi.test:8888/browser/browser/components/search/test/testEngine.src",
+                    Ci.nsISearchEngine.DATA_TEXT, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGklEQVQoz2NgGB6AnZ1dUlJSXl4eSDIyMhLW4Ovr%2B%2Fr168uXL69Zs4YoG%2BLi4i5dusTExMTGxsbNzd3f37937976%2BnpmZmagbHR09J49e5YvX66kpATVEBYW9ubNm2nTphkbG7e2tp44cQLIuHfvXm5urpaWFlDKysqqu7v73LlzECMYIiIiHj58mJCQoKKicvXq1bS0NKBgW1vbjh074uPjgeqAXE1NzSdPnvDz84M0AEUvXLgAsW379u1z5swBen3jxo2zZ892cHB4%2BvQp0KlAfwI1cHJyghQFBwfv2rULokFXV%2FfixYu7d%2B8GGqGgoMDKyrpu3br9%2B%2FcDuXl5eVA%2FAEWBfoWHAdAYoNuAYQ0XAeoUERFhGDYAAPoUaT2dfWJuAAAAAElFTkSuQmCC",
+                    false);
+    },
+    added: function (engine) {
+      ok(engine, "engine was added.");
+      checkEngine(this.engine, engine);
+
+      let engineFromSS = gSS.getEngineByName(this.engine.name);
+      is(engineFromSS, engine, "engine is obtainable via getEngineByName");
+
+      gSS.removeEngine(engine);
+    },
+    removed: function (engine) {
+      let currentEngine = gSS.currentEngine;
+      ok(currentEngine, "An engine is present.");
+      isnot(currentEngine.name, this.engine.name, "Current engine reset after removal");
+
+      nextTest();
+    }
+  }
+];
+
+var gCurrentTest = null;
+function nextTest() {
+  if (gTests.length) {
+    gCurrentTest = gTests.shift();
+    info("Running " + gCurrentTest.name);
+    gCurrentTest.run();
+  } else
+    executeSoon(finish);
 }
 
 function test() {
   waitForExplicitFinish();
-  Services.obs.addObserver(observers, "browser-search-engine-modified", false);
+  Services.obs.addObserver(observer, "browser-search-engine-modified", false);
+  registerCleanupFunction(cleanup);
 
-  gSS.addEngine("http://mochi.test:8888/browser/browser/components/search/test/testEngine.xml",
-                Ci.nsISearchEngine.DATA_XML, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGklEQVQoz2NgGB6AnZ1dUlJSXl4eSDIyMhLW4Ovr%2B%2Fr168uXL69Zs4YoG%2BLi4i5dusTExMTGxsbNzd3f37937976%2BnpmZmagbHR09J49e5YvX66kpATVEBYW9ubNm2nTphkbG7e2tp44cQLIuHfvXm5urpaWFlDKysqqu7v73LlzECMYIiIiHj58mJCQoKKicvXq1bS0NKBgW1vbjh074uPjgeqAXE1NzSdPnvDz84M0AEUvXLgAsW379u1z5swBen3jxo2zZ892cHB4%2BvQp0KlAfwI1cHJyghQFBwfv2rULokFXV%2FfixYu7d%2B8GGqGgoMDKyrpu3br9%2B%2FcDuXl5eVA%2FAEWBfoWHAdAYoNuAYQ0XAeoUERFhGDYAAPoUaT2dfWJuAAAAAElFTkSuQmCC",
-                false);
+  nextTest();
 }
 
-function test2() {
-  var engine = gSS.getEngineByName("Foo");
-  ok(engine, "Engine was added.");
-
-  var aEngine = gSS.getEngineByAlias("fooalias");
-  ok(!aEngine, "Alias was not parsed from engine description");
-
-  gSS.currentEngine = engine;
+function cleanup() {
+  Services.obs.removeObserver(observer, "browser-search-engine-modified");
 }
-
-function test3() {
-  var engine = gSS.currentEngine;
-  is(engine.name, "Foo", "Current engine was changed successfully");
-
-  gSS.removeEngine(engine);
-}
-
-function test4() {
-  var engine = gSS.currentEngine;
-  ok(engine, "An engine is present.");
-  isnot(engine.name, "Foo", "Current engine reset after removal");
-
-  Services.obs.removeObserver(observers, "browser-search-engine-modified");
-  finish();
-}
new file mode 100644
--- /dev/null
+++ b/browser/components/search/test/testEngine.src
@@ -0,0 +1,11 @@
+<search 
+  name="Test Sherlock"
+  description="Test Description"
+  method="GET"
+  searchform="http://example.com/searchform"
+  action="http://example.com/action"
+  queryCharset="UTF-8"
+>
+  <input name="userParam" user>
+  <input name="param" value="value">
+</search>
--- a/browser/components/sessionstore/content/aboutSessionRestore.js
+++ b/browser/components/sessionstore/content/aboutSessionRestore.js
@@ -31,16 +31,17 @@
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
+const Cu = Components.utils;
 
 var gStateObject;
 var gTreeData;
 
 // Page initialization
 
 window.onload = function() {
   // the crashed session state is kept inside a textbox so that SessionStore picks it up
@@ -49,23 +50,36 @@ window.onload = function() {
   if (!sessionData.value) {
     var ss = Cc["@mozilla.org/browser/sessionstartup;1"].getService(Ci.nsISessionStartup);
     sessionData.value = ss.state;
     if (!sessionData.value) {
       document.getElementById("errorTryAgain").disabled = true;
       return;
     }
   }
+
+  // remove unneeded braces (added for compatibility with Firefox 2.0 and 3.0)
+  if (sessionData.value.charAt(0) == '(')
+    sessionData.value = sessionData.value.slice(1, -1);
+  try {
+    gStateObject = JSON.parse(sessionData.value);
+  }
+  catch (exJSON) {
+    var s = new Cu.Sandbox("about:blank");
+    gStateObject = Cu.evalInSandbox("(" + sessionData.value + ")", s);
+    // If we couldn't parse the string with JSON.parse originally, make sure
+    // that the value in the textbox will be parsable.
+    sessionData.value = JSON.stringify(gStateObject);
+  }
+
   // make sure the data is tracked to be restored in case of a subsequent crash
   var event = document.createEvent("UIEvents");
   event.initUIEvent("input", true, true, window, 0);
   sessionData.dispatchEvent(event);
-  
-  gStateObject = JSON.parse(sessionData.value);
-  
+
   initTreeView();
   
   document.getElementById("errorTryAgain").focus();
 };
 
 function initTreeView() {
   var tabList = document.getElementById("tabList");
   var winLabel = tabList.getAttribute("_window_label");
--- a/browser/components/sessionstore/src/nsSessionStore.js
+++ b/browser/components/sessionstore/src/nsSessionStore.js
@@ -1263,25 +1263,42 @@ SessionStoreService.prototype = {
     if (aWindow.__SSi && this._windows[aWindow.__SSi].extData &&
         this._windows[aWindow.__SSi].extData[aKey])
       delete this._windows[aWindow.__SSi].extData[aKey];
     else
       throw (Components.returnCode = Cr.NS_ERROR_INVALID_ARG);
   },
 
   getTabValue: function sss_getTabValue(aTab, aKey) {
-    var data = aTab.__SS_extdata || {};
+    let data = {};
+    if (aTab.__SS_extdata) {
+      data = aTab.__SS_extdata;
+    }
+    else if (aTab.linkedBrowser.__SS_data && aTab.linkedBrowser.__SS_data.extData) {
+      // If the tab hasn't been fully restored, get the data from the to-be-restored data
+      data = aTab.linkedBrowser.__SS_data.extData;
+    }
     return data[aKey] || "";
   },
 
   setTabValue: function sss_setTabValue(aTab, aKey, aStringValue) {
-    if (!aTab.__SS_extdata) {
+    // If the tab hasn't been restored, then set the data there, otherwise we
+    // could lose newly added data.
+    let saveTo;
+    if (aTab.__SS_extdata) {
+      saveTo = aTab.__SS_extdata;
+    }
+    else if (aTab.linkedBrowser.__SS_data && aTab.linkedBrowser.__SS_data.extData) {
+      saveTo = aTab.linkedBrowser.__SS_data.extData;
+    }
+    else {
       aTab.__SS_extdata = {};
+      saveTo = aTab.__SS_extdata;
     }
-    aTab.__SS_extdata[aKey] = aStringValue;
+    saveTo[aKey] = aStringValue;
     this.saveStateDelayed(aTab.ownerDocument.defaultView);
   },
 
   deleteTabValue: function sss_deleteTabValue(aTab, aKey) {
     if (aTab.__SS_extdata && aTab.__SS_extdata[aKey])
       delete aTab.__SS_extdata[aKey];
     else
       throw (Components.returnCode = Cr.NS_ERROR_INVALID_ARG);
--- a/browser/components/sessionstore/test/browser/Makefile.in
+++ b/browser/components/sessionstore/test/browser/Makefile.in
@@ -112,18 +112,20 @@ include $(topsrcdir)/config/rules.mk
 	browser_500328.js \
 	browser_514751.js \
 	browser_522545.js \
 	browser_524745.js \
 	browser_528776.js \
 	browser_579868.js \
 	browser_579879.js \
 	browser_580512.js \
+	browser_581593.js \
 	browser_586147.js \
 	browser_586068-cascaded_restore.js \
+	browser_590268.js \
 	browser_600545.js \
 	$(NULL)
 
 ifneq ($(OS_ARCH),Darwin)
 _BROWSER_TEST_FILES += \
 	browser_597071.js \
 	$(NULL)
 endif
new file mode 100644
--- /dev/null
+++ b/browser/components/sessionstore/test/browser/browser_581593.js
@@ -0,0 +1,90 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is sessionstore test code.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Paul O’Shannessy <paul@oshannessy.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+Cu.import("resource://gre/modules/Services.jsm");
+let ss = Cc["@mozilla.org/browser/sessionstore;1"].
+         getService(Ci.nsISessionStore);
+
+let stateBackup = ss.getBrowserState();
+
+
+function test() {
+  /** Test for bug 581593 **/
+  waitForExplicitFinish();
+
+  let oldState = { windows: [{ tabs: [{ entries: [{ url: "example.com" }] }] }]};
+  let pageData = {
+    url: "about:sessionrestore",
+    formdata: { "#sessionData": "(" + JSON.stringify(oldState) + ")" }
+  };
+  let state = { windows: [{ tabs: [{ entries: [pageData] }] }] };
+
+  // The form data will be restored before SSTabRestored, so we want to listen
+  // for that on the currently selected tab (it will be reused)
+  gBrowser.selectedTab.addEventListener("SSTabRestored", onSSTabRestored, true);
+
+  ss.setBrowserState(JSON.stringify(state));
+}
+
+function onSSTabRestored(aEvent) {
+  info("SSTabRestored event");
+  gBrowser.selectedTab.removeEventListener("SSTabRestored", onSSTabRestored, true);
+  gBrowser.selectedBrowser.addEventListener("input", onInput, true);
+}
+
+function onInput(aEvent) {
+  info("input event");
+  gBrowser.selectedBrowser.removeEventListener("input", onInput, true);
+
+  // This is an ok way to check this because we will make sure that the text
+  // field is parsable.
+  let val = gBrowser.selectedBrowser.contentDocument.getElementById("sessionData").value;
+  try {
+    JSON.parse(val);
+    ok(true, "JSON.parse succeeded");
+  }
+  catch (e) {
+    ok(false, "JSON.parse failed");
+  }
+  cleanup();
+}
+
+function cleanup() {
+  ss.setBrowserState(stateBackup);
+  executeSoon(finish);
+}
+
new file mode 100644
--- /dev/null
+++ b/browser/components/sessionstore/test/browser/browser_590268.js
@@ -0,0 +1,148 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is sessionstore test code.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Paul O’Shannessy <paul@oshannessy.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+const NUM_TABS = 12;
+
+Cu.import("resource://gre/modules/Services.jsm");
+let ss = Cc["@mozilla.org/browser/sessionstore;1"].
+         getService(Ci.nsISessionStore);
+
+let stateBackup = ss.getBrowserState();
+
+
+function test() {
+  /** Test for Bug 590268 - Provide access to sessionstore tab data sooner **/
+  waitForExplicitFinish();
+
+  let startedTest = false;
+
+  // wasLoaded will be used to keep track of tabs that have already had SSTabRestoring
+  // fired for them.
+  let wasLoaded = { };
+  let restoringTabsCount = 0;
+  let uniq2 = { };
+  let uniq2Count = 0;
+  let state = { windows: [{ tabs: [] }] };
+  // We're going to put a bunch of tabs into this state
+  for (let i = 0; i < NUM_TABS; i++) {
+    let uniq = r();
+    let tabData = {
+      entries: [{ url: "http://example.com/#" + i }],
+      extData: { "uniq": uniq }
+    };
+    state.windows[0].tabs.push(tabData);
+    wasLoaded[uniq] = false;
+  }
+
+
+  function onSSTabRestoring(aEvent) {
+    restoringTabsCount++;
+    let uniq = ss.getTabValue(aEvent.originalTarget, "uniq");
+    wasLoaded[uniq] = true;
+
+    // On the first SSTabRestoring we're going to run the the real test.
+    // We'll keep this listener around so we can keep marking tabs as restored.
+    if (restoringTabsCount == 1)
+      onFirstSSTabRestoring();
+    else if (restoringTabsCount == NUM_TABS)
+      onLastSSTabRestoring();
+  }
+
+  // This does the actual testing. SSTabRestoring should be firing on tabs from
+  // left to right, so we're going to start with the rightmost tab.
+  function onFirstSSTabRestoring() {
+    info("onFirstSSTabRestoring...");
+    for (let i = gBrowser.tabs.length - 1; i >= 0; i--) {
+      let tab = gBrowser.tabs[i];
+      let actualUniq = ss.getTabValue(tab, "uniq");
+      let expectedUniq = state.windows[0].tabs[i].extData["uniq"];
+
+      if (wasLoaded[actualUniq]) {
+        info("tab " + i + ": already restored");
+        continue;
+      }
+      is(actualUniq, expectedUniq, "tab " + i + ": extData was correct");
+
+      // Now we're going to set a piece of data back on the tab so it can be read
+      // to test setting a value "early".
+      uniq2[actualUniq] = r();
+      ss.setTabValue(tab, "uniq2", uniq2[actualUniq]);
+      // This will be used in the final comparison to make sure we checked the
+      // same number as we set.
+      uniq2Count++;
+    }
+  }
+
+  function onLastSSTabRestoring() {
+    let checked = 0;
+    for (let i = 0; i < gBrowser.tabs.length; i++) {
+      let tab = gBrowser.tabs[i];
+      let uniq = ss.getTabValue(tab, "uniq");
+
+      // Look to see if we set a uniq2 value for this uniq value
+      if (uniq in uniq2) {
+        is(ss.getTabValue(tab, "uniq2"), uniq2[uniq], "tab " + i + " has correct uniq2 value");
+        checked++;
+      }
+    }
+    is(checked, uniq2Count, "checked the same number of uniq2 as we set");
+    cleanup();
+  }
+
+  function cleanup() {
+    // remove the event listener and clean up before finishing
+    gBrowser.tabContainer.removeEventListener("SSTabRestoring", onSSTabRestoring, false);
+    // Put this in an executeSoon because we still haven't called restoreNextTab
+    // in sessionstore for the last tab (we'll call it after this). We end up
+    // trying to restore the tab (since we then add a closed tab to the array).
+    executeSoon(function() {
+      ss.setBrowserState(stateBackup);
+      executeSoon(finish);
+    });
+  }
+
+  // Add the event listener
+  gBrowser.tabContainer.addEventListener("SSTabRestoring", onSSTabRestoring, false);
+  // Restore state
+  ss.setBrowserState(JSON.stringify(state));
+}
+
+// Helper function to create a random value
+function r() {
+  return "" + Date.now() + Math.random();
+}
+
--- a/browser/fuel/src/fuelApplication.js
+++ b/browser/fuel/src/fuelApplication.js
@@ -389,17 +389,17 @@ Bookmark.prototype = {
 
   // observer
   onBeginUpdateBatch : function bm_obub() {
   },
 
   onEndUpdateBatch : function bm_oeub() {
   },
 
-  onItemAdded : function bm_oia(aId, aFolder, aIndex) {
+  onItemAdded : function bm_oia(aId, aFolder, aIndex, aItemType, aURI) {
     // bookmark object doesn't exist at this point
   },
 
   onBeforeItemRemoved : function bm_obir(aId) {
   },
 
   onItemRemoved : function bm_oir(aId, aFolder, aIndex) {
     if (this._id == aId)
@@ -542,17 +542,17 @@ BookmarkFolder.prototype = {
 
   // observer
   onBeginUpdateBatch : function bmf_obub() {
   },
 
   onEndUpdateBatch : function bmf_oeub() {
   },
 
-  onItemAdded : function bmf_oia(aId, aFolder, aIndex) {
+  onItemAdded : function bmf_oia(aId, aFolder, aIndex, aItemType, aURI) {
     // handle root folder events
     if (!this._parent)
       this._events.dispatch("add", aId);
 
     // handle this folder events
     if (this._id == aFolder)
       this._events.dispatch("addchild", aId);
   },
deleted file mode 100644
--- a/browser/locales/en-US/chrome/browser/history/history.dtd
+++ /dev/null
@@ -1,26 +0,0 @@
-<!ENTITY find.label                "Search:">
-<!ENTITY find.accesskey            "S">
-<!ENTITY expand.label              "Expand">
-<!ENTITY expand.accesskey          "E">
-<!ENTITY collapse.label            "Collapse">
-<!ENTITY collapse.accesskey        "C">
-<!ENTITY byDate.label "By Date">
-<!ENTITY byDate.accesskey "D">
-<!ENTITY bySite.label "By Site">
-<!ENTITY bySite.accesskey "S">
-<!ENTITY view.label "View">
-<!ENTITY view.accesskey "w">
-<!ENTITY byMostVisited.label "By Most Visited">
-<!ENTITY byMostVisited.accesskey "V">
-<!ENTITY byLastVisited.label "By Last Visited">
-<!ENTITY byLastVisited.accesskey "L">
-<!ENTITY byDayAndSite.label "By Date and Site">
-<!ENTITY byDayAndSite.accesskey "t">
-<!ENTITY openLinkInWindow.label "Open">
-<!ENTITY openLinkInWindow.accesskey "O">
-<!ENTITY openInNewTab.label "Open in New Tab">
-<!ENTITY openInNewTab.accesskey "T">
-<!ENTITY openInNewWindow.label "Open in New Window">
-<!ENTITY openInNewWindow.accesskey "W">
-<!ENTITY copyLink.label "Copy Link Location">
-<!ENTITY copyLink.accesskey "C">
--- a/browser/locales/en-US/chrome/browser/places/places.dtd
+++ b/browser/locales/en-US/chrome/browser/places/places.dtd
@@ -89,16 +89,18 @@
 <!ENTITY col.visitcount.label    "Visit Count">
 <!ENTITY col.keyword.label       "Keyword">
 <!ENTITY col.description.label   "Description">
 <!ENTITY col.dateadded.label     "Added">
 <!ENTITY col.lastmodified.label  "Last Modified">
 
 <!ENTITY search.label                              "Search:">
 <!ENTITY search.accesskey                          "S">
+
+<!ENTITY search.in.label                           "Search in:">
 <!ENTITY search.scopeFolder.label                  "Selected Folder">
 <!ENTITY search.scopeFolder.accesskey              "r">
 <!ENTITY search.scopeBookmarks.label               "Bookmarks">
 <!ENTITY search.scopeBookmarks.accesskey           "k">
 <!ENTITY search.scopeDownloads.label               "Downloads">
 <!ENTITY search.scopeDownloads.accesskey           "D">
 <!ENTITY search.scopeHistory.label                 "History">
 <!ENTITY search.scopeHistory.accesskey             "H">
@@ -118,8 +120,23 @@
 <!ENTITY forwardButton.tooltip  "Go forward">
 
 <!ENTITY detailsPane.more.label "More">
 <!ENTITY detailsPane.more.accesskey "e">
 <!ENTITY detailsPane.less.label "Less">
 <!ENTITY detailsPane.less.accesskey "e">
 <!ENTITY detailsPane.noPreviewAvailable.label "Preview">
 <!ENTITY detailsPane.selectAnItemText.description "Select an item to view and edit its properties">
+
+<!ENTITY find.label               "Search:">
+<!ENTITY find.accesskey           "S">
+<!ENTITY view.label               "View">
+<!ENTITY view.accesskey           "w">
+<!ENTITY byDate.label             "By Date">
+<!ENTITY byDate.accesskey         "D">
+<!ENTITY bySite.label             "By Site">
+<!ENTITY bySite.accesskey         "S">
+<!ENTITY byMostVisited.label      "By Most Visited">
+<!ENTITY byMostVisited.accesskey  "V">
+<!ENTITY byLastVisited.label      "By Last Visited">
+<!ENTITY byLastVisited.accesskey  "L">
+<!ENTITY byDayAndSite.label       "By Date and Site">
+<!ENTITY byDayAndSite.accesskey   "t">
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -40,17 +40,16 @@
     locale/browser/preferences/selectBookmark.dtd  (%chrome/browser/preferences/selectBookmark.dtd)
     locale/browser/places/moveBookmarks.dtd        (%chrome/browser/places/moveBookmarks.dtd)
 #ifdef MOZ_SAFE_BROWSING
     locale/browser/safebrowsing/phishing-afterload-warning-message.dtd (%chrome/browser/safebrowsing/phishing-afterload-warning-message.dtd)
     locale/browser/safebrowsing/report-phishing.dtd                    (%chrome/browser/safebrowsing/report-phishing.dtd)
 #endif
     locale/browser/feeds/subscribe.dtd              (%chrome/browser/feeds/subscribe.dtd)
     locale/browser/feeds/subscribe.properties       (%chrome/browser/feeds/subscribe.properties)
-    locale/browser/history/history.dtd             (%chrome/browser/history/history.dtd)
     locale/browser/migration/migration.dtd         (%chrome/browser/migration/migration.dtd)
     locale/browser/migration/migration.properties  (%chrome/browser/migration/migration.properties)
     locale/browser/preferences/advanced.dtd           (%chrome/browser/preferences/advanced.dtd)
 *   locale/browser/preferences/advanced-scripts.dtd   (%chrome/browser/preferences/advanced-scripts.dtd)
     locale/browser/preferences/applicationManager.dtd        (%chrome/browser/preferences/applicationManager.dtd)
     locale/browser/preferences/applicationManager.properties (%chrome/browser/preferences/applicationManager.properties)
     locale/browser/preferences/colors.dtd             (%chrome/browser/preferences/colors.dtd)
     locale/browser/preferences/cookies.dtd            (%chrome/browser/preferences/cookies.dtd)
--- a/browser/locales/shipped-locales
+++ b/browser/locales/shipped-locales
@@ -41,13 +41,14 @@ nso
 pa-IN
 pl
 pt-BR
 pt-PT
 ro
 ru
 sk
 son
+sq
 sv-SE
 tr
 uk
 zh-CN
 zh-TW
--- a/browser/themes/gnomestripe/browser/browser.css
+++ b/browser/themes/gnomestripe/browser/browser.css
@@ -469,21 +469,25 @@ menuitem:not([type]) {
 
 #bookmarksShowAll {
   list-style-image: url("chrome://browser/skin/Toolbar-small.png");
   -moz-image-region: rect(0px 48px 16px 32px);
 }
 
 #bookmarksToolbarFolderMenu,
 #BMB_bookmarksToolbar {
-  list-style-image: url("chrome://browser/skin/places/bookmarksToolbar.png");  
+  list-style-image: url("chrome://browser/skin/places/bookmarksToolbar.png");
+}
+
+#BMB_bookmarkThisPage {
+  list-style-image: url("chrome://browser/skin/places/starPage.png");
 }
 
 #BMB_unsortedBookmarks {
-  list-style-image: url("chrome://browser/skin/places/unsortedBookmarks.png");  
+  list-style-image: url("chrome://browser/skin/places/unsortedBookmarks.png");
 }
 
 #menu_openDownloads {
   list-style-image: url("chrome://browser/skin/Toolbar-small.png");
   -moz-image-region: rect(0px 16px 16px 0px);
 }
 
 #menu_pageInfo,
--- a/browser/themes/winstripe/browser/browser-aero.css
+++ b/browser/themes/winstripe/browser/browser-aero.css
@@ -1,14 +1,16 @@
 %define WINSTRIPE_AERO
 %include browser.css
 %undef WINSTRIPE_AERO
 
 %define customToolbarColor hsl(214,44%,87%)
 %define glassToolbarBorderColor rgb(40%,40%,40%)
+%define glassActiveBorderColor rgb(37, 44, 51)
+%define glassInactiveBorderColor rgb(102, 102, 102)
 
 @media all and (-moz-windows-default-theme) {
   #navigator-toolbox > toolbar:not(:-moz-lwtheme) {
     background-color: @customToolbarColor@;
   }
 
   .tabbrowser-tab[selected="true"]:not(:-moz-lwtheme) {
     background-image: -moz-linear-gradient(white, @toolbarHighlight@ 30%),
@@ -26,16 +28,22 @@
     border-top: none;
     -moz-border-left-colors: rgba(255,255,255,.5) rgba(83,42,6,.9);
     -moz-border-bottom-colors: rgba(255,255,255,.5) rgba(83,42,6,.9);
     -moz-border-right-colors: rgba(255,255,255,.5) rgba(83,42,6,.9);
     box-shadow: 0 1px 0 rgba(255,255,255,.25) inset,
                 0 0 2px 1px rgba(255,255,255,.25) inset;
   }
 
+  #main-window[privatebrowsingmode=temporary] #appmenu-button:not(:-moz-window-inactive) {
+    -moz-border-left-colors: rgba(255,255,255,.5) rgba(43,8,65,.9);
+    -moz-border-bottom-colors: rgba(255,255,255,.5) rgba(43,8,65,.9);
+    -moz-border-right-colors: rgba(255,255,255,.5) rgba(43,8,65,.9);
+  }
+
   #appmenu-button:-moz-window-inactive {
     -moz-border-left-colors: rgba(255,255,255,.4) rgba(0,0,0,.5);
     -moz-border-bottom-colors: rgba(255,255,255,.4) rgba(0,0,0,.5);
     -moz-border-right-colors: rgba(255,255,255,.4) rgba(0,0,0,.5);
     box-shadow: 0 0 0 1px rgba(255,255,255,.25) inset;
   }
 
   /* Bug 413060, comment 16: Vista Aero is a special case where we use a
@@ -80,16 +88,34 @@
     -moz-appearance: -moz-win-borderless-glass;
     background: transparent;
   }
 
   #main-window[chromemargin^="0,"][sizemode="normal"]:not([inFullscreen="true"]) #navigator-toolbox {
     margin-top: -7px;
   }
 
+  /* Artificially draw window borders that are covered by lwtheme, see bug 591930. */
+  #main-window[sizemode="normal"] > #titlebar > #titlebar-content:-moz-lwtheme {
+    border-top: 2px solid;
+    -moz-border-top-colors: @glassActiveBorderColor@ rgba(255,255,255,.6);
+  }
+
+  #main-window[sizemode="normal"] > #titlebar > #titlebar-content:-moz-lwtheme:-moz-window-inactive {
+    -moz-border-top-colors: @glassInactiveBorderColor@ rgba(255,255,255,.6);
+  }
+
+  #main-window[sizemode="normal"] > #titlebar > #titlebar-content > #appmenu-button-container:-moz-lwtheme {
+    margin-top: -1px;
+  }
+
+  #main-window[sizemode="normal"] > #titlebar > #titlebar-content > #titlebar-buttonbox:-moz-lwtheme {
+    margin-top: -2px;
+  }
+
   #main-window:not(:-moz-lwtheme)[inFullscreen="true"] {
     -moz-appearance: none;
     background-color: #556;
   }
 
   #toolbar-menubar:not(:-moz-lwtheme),
   #TabsToolbar[tabsontop="true"]:not(:-moz-lwtheme),
   #navigator-toolbox[tabsontop="false"] > #nav-bar:not(:-moz-lwtheme),
--- a/browser/themes/winstripe/browser/browser.css
+++ b/browser/themes/winstripe/browser/browser.css
@@ -121,39 +121,59 @@
   color: white;
   text-shadow: 0 0 1px rgba(0,0,0,.7),
                0 1px 1.5px rgba(0,0,0,.5);
   font-weight: bold;
   padding: .1em 1.5em .15em;
   margin: 0;
 }
 
+#main-window[privatebrowsingmode=temporary] #appmenu-button:not(:-moz-window-inactive) {
+  background-image: -moz-linear-gradient(rgb(153,38,211), rgb(105,19,163) 95%);
+  border-color: rgba(43,8,65,.9);
+}
+
 #appmenu-button:-moz-window-inactive {
   background-image: none;
   border-color: rgba(0,0,0,.4);
 }
 
 #appmenu-button:hover:not(:active):not([open]) {
   background-image: -moz-radial-gradient(center bottom, farthest-side, rgba(252,240,89,.5) 10%, rgba(252,240,89,0) 70%),
                     -moz-radial-gradient(center bottom, farthest-side, rgb(236,133,0), rgba(255,229,172,0)),
                     -moz-linear-gradient(rgb(246,170,69), rgb(209,74,0) 95%);
   border-color: rgba(83,42,6,.9);
   box-shadow: 0 1px 0 rgba(255,255,255,.1) inset,
               0 0 1.5px 1px rgba(250,234,169,.7) inset,
               0 -1px 0 rgba(250,234,169,.5) inset;
 }
 
+#main-window[privatebrowsingmode=temporary] #appmenu-button:hover:not(:active):not([open]) {
+  background-image: -moz-radial-gradient(center bottom, farthest-side, rgba(240,193,255,.5) 10%, rgba(240,193,255,0) 70%),
+                    -moz-radial-gradient(center bottom, farthest-side, rgb(192,81,247), rgba(236,172,255,0)),
+                    -moz-linear-gradient(rgb(144,20,207), rgb(95,0,158) 95%);
+  border-color: rgba(43,8,65,.9);
+  box-shadow: 0 1px 0 rgba(255,255,255,.1) inset,
+              0 0 2px 1px rgba(240,193,255,.7) inset,
+              0 -1px 0 rgba(240,193,255,.5) inset;
+}
+
 #appmenu-button:hover:active,
 #appmenu-button[open] {
   background-image: -moz-linear-gradient(rgb(246,170,69), rgb(209,74,0) 95%);
   border-radius: 0;
   box-shadow: 0 2px 3px rgba(0,0,0,.4) inset,
               0 1px 1px rgba(0,0,0,.2) inset;
 }
 
+#main-window[privatebrowsingmode=temporary] #appmenu-button:hover:active,
+#main-window[privatebrowsingmode=temporary] #appmenu-button[open] {
+  background-image: -moz-linear-gradient(rgb(144,20,207), rgb(95,0,158) 95%);
+}
+
 #appmenu-button > .button-box {
   border-style: none;
   padding: 0;
 }
 
 #appmenu-button > .button-box > .button-menu-dropmarker {
   list-style-image: url(appmenu-dropmarker.png);
   width: auto;
--- a/build/automation.py.in
+++ b/build/automation.py.in
@@ -346,16 +346,17 @@ user_pref("shell.checkDefaultClient", fa
 user_pref("browser.warnOnQuit", false);
 user_pref("accessibility.typeaheadfind.autostart", false);
 user_pref("javascript.options.showInConsole", true);
 user_pref("devtools.errorconsole.enabled", true);
 user_pref("layout.debug.enable_data_xbl", true);
 user_pref("browser.EULA.override", true);
 user_pref("javascript.options.tracejit.content", true);
 user_pref("javascript.options.methodjit.content", true);
+user_pref("javascript.options.jitprofiling.content", true);
 user_pref("gfx.color_management.force_srgb", true);
 user_pref("network.manage-offline-status", false);
 user_pref("test.mousescroll", true);
 user_pref("security.default_personal_cert", "Select Automatically"); // Need to client auth test be w/o any dialogs
 user_pref("network.http.prompt-temp-redirect", false);
 user_pref("media.cache_size", 100);
 user_pref("security.warn_viewing_mixed", false);
 user_pref("app.update.enabled", false);
--- a/configure.in
+++ b/configure.in
@@ -5001,18 +5001,18 @@ NECKO_WIFI=1
 NECKO_COOKIES=1
 NECKO_DISK_CACHE=1
 NECKO_PROTOCOLS_DEFAULT="about data file ftp http res viewsource wyciwyg"
 USE_ARM_KUSER=
 BUILD_CTYPES=1
 XPC_IDISPATCH_SUPPORT=
 
 
-case "$target_os" in
-darwin*|*wince*|*winmo*)
+case "${target}" in
+*android*|*darwin*|*wince*|*winmo*)
     ACCESSIBILITY=
     ;;
 *)
     ACCESSIBILITY=1
     ;;
 esac
 
 case "$target_os" in
@@ -8507,41 +8507,16 @@ if test "$MOZ_TREE_CAIRO"; then
 
         AC_CHECK_HEADER(d3d9.h, MOZ_ENABLE_D3D9_LAYER=1)
 
         dnl D3D10 Layers depend on D2D Surfaces.
         if test -n "$WIN32_D2D_SURFACE_FEATURE"; then
           AC_CHECK_HEADER(d3d10.h, MOZ_ENABLE_D3D10_LAYER=1)
         fi
 
-        AC_TRY_COMPILE([#include <ddraw.h>], [int foo = DDLOCK_WAITNOTBUSY;], HAS_DDRAW=1, HAS_DDRAW=)
-        if test -z "$HAS_DDRAW"; then
-            AC_MSG_WARN([DirectDraw ddraw.h header not found or it's missing DDLOCK_WAITNOTBUSY, disabling DirectDraw surface.  If you have an older SDK (such as the CE5 SDK), try copying in ddraw.lib and ddraw.h from the WM6 SDK.])
-            DDRAW_SURFACE_FEATURE=
-        else
-            DDRAW_SURFACE_FEATURE="#define CAIRO_HAS_DDRAW_SURFACE 1"
-        fi
-
-        if test -z "$OGLES_SDK_DIR"; then
-            OGLES_SURFACE_FEATURE=
-        else
-            AC_TRY_COMPILE([
-              #include <EGL/egl.h>
-              #include <EGL/eglext.h>
-              #include <GLES2/gl2.h>
-              #include <GLES2/gl2ext.h>
-            ], [ EGLDisplay _cairo_ddraw_egl_dpy = EGL_NO_DISPLAY;], HAS_OGLES=1, HAS_OGLES=)
-            if test -z "$HAS_OGLES"; then
-              AC_MSG_WARN([OpenGL ES2 headers not found, disabling OpenGL acceleration surfaces.])
-              OGLES_SURFACE_FEATURE=
-            else
-              OGLES_SURFACE_FEATURE="#define CAIRO_DDRAW_USE_GL 1"
-            fi
-        fi
-
         PDF_SURFACE_FEATURE="#define CAIRO_HAS_PDF_SURFACE 1"
     fi
     if test "$MOZ_WIDGET_TOOLKIT" = "os2"; then
         OS2_SURFACE_FEATURE="#define CAIRO_HAS_OS2_SURFACE 1"
         FT_FONT_FEATURE="#define CAIRO_HAS_FT_FONT 1"
         PDF_SURFACE_FEATURE="#define CAIRO_HAS_PDF_SURFACE 1"
         MOZ_ENABLE_CAIRO_FT=1
         CAIRO_FT_CFLAGS="-I${MZFTCFGFT2}/include"
@@ -8576,18 +8551,16 @@ if test "$MOZ_TREE_CAIRO"; then
     AC_SUBST(PDF_SURFACE_FEATURE)
     AC_SUBST(SVG_SURFACE_FEATURE)
     AC_SUBST(XLIB_SURFACE_FEATURE)
     AC_SUBST(XLIB_XRENDER_SURFACE_FEATURE)
     AC_SUBST(QUARTZ_SURFACE_FEATURE)
     AC_SUBST(QUARTZ_IMAGE_SURFACE_FEATURE)
     AC_SUBST(XCB_SURFACE_FEATURE)
     AC_SUBST(WIN32_SURFACE_FEATURE)
-    AC_SUBST(DDRAW_SURFACE_FEATURE)
-    AC_SUBST(OGLES_SURFACE_FEATURE)    
     AC_SUBST(OS2_SURFACE_FEATURE)
     AC_SUBST(BEOS_SURFACE_FEATURE)
     AC_SUBST(DIRECTFB_SURFACE_FEATURE)
     AC_SUBST(FT_FONT_FEATURE)
     AC_SUBST(FC_FONT_FEATURE)
     AC_SUBST(WIN32_FONT_FEATURE)
     AC_SUBST(WIN32_DWRITE_FONT_FEATURE)
     AC_SUBST(WIN32_D2D_SURFACE_FEATURE)
--- a/content/base/public/nsISelectionController.idl
+++ b/content/base/public/nsISelectionController.idl
@@ -46,17 +46,17 @@
 typedef short SelectionType;
 typedef short SelectionRegion;
 %}
 
 interface nsIDOMNode;
 interface nsISelection;
 interface nsISelectionDisplay;
 
-[scriptable, uuid(bc5795ab-bcb5-448b-b3c7-a111bead7c26)]
+[scriptable, uuid(ff11fa25-788f-444f-8f69-dcdf14348fb3)]
 interface nsISelectionController : nsISelectionDisplay
 {
    const short SELECTION_NONE=0;
    const short SELECTION_NORMAL=1;
    const short SELECTION_SPELLCHECK=2;
    const short SELECTION_IME_RAWINPUT=4;
    const short SELECTION_IME_SELECTEDRAWTEXT=8;
    const short SELECTION_IME_CONVERTEDTEXT=16;
@@ -89,30 +89,37 @@ interface nsISelectionController : nsISe
    * GetSelection will return the selection that the presentation
    *  shell may implement.
    *
    * @param aType will hold the type of selection //SelectionType
    * @param _return will hold the return value
    */
     nsISelection getSelection(in short type);
 
+   const short SCROLL_SYNCHRONOUS = 1<<1;
+   const short SCROLL_FIRST_ANCESTOR_ONLY = 1<<2;
+
    /**
    * ScrollSelectionIntoView scrolls a region of the selection,
    * so that it is visible in the scrolled view.
    *
    * @param aType the selection to scroll into view. //SelectionType
    * @param aRegion the region inside the selection to scroll into view. //SelectionRegion
-   * @param aIsSynchronous when true, scrolls the selection into view
-   * before returning. If false, posts a request which is processed
+   * @param aFlags the scroll flags.  Valid bits include:
+   * SCROLL_SYNCHRONOUS: when set, scrolls the selection into view
+   * before returning. If not set, posts a request which is processed
    * at some point after the method returns.
+   * SCROLL_FIRST_ANCESTOR_ONLY: if set, only the first ancestor will be scrolled
+   * into view.
    *
    * Note that if isSynchronous is true, then this might flush the pending
    * reflow. It's dangerous for some objects. See bug 418470 comment 12.
    */
-    void scrollSelectionIntoView(in short type, in short region, in boolean isSynchronous);
+    void scrollSelectionIntoView(in short type, in short region, in short flags);
+
    /**
    * RepaintSelection repaints the selection specified by aType.
    *
    * @param aType specifies the selection to repaint.
    */
     void repaintSelection(in short type);
 
    /**
--- a/content/base/src/CSPUtils.jsm
+++ b/content/base/src/CSPUtils.jsm
@@ -375,18 +375,17 @@ CSPRep.prototype = {
         return false;
       }
     }
     return (this.allowsInlineScripts === that.allowsInlineScripts)
         && (this.allowsEvalInScripts === that.allowsEvalInScripts);
   },
 
   /**
-   * Generates string representation of the policy.  Should be fairly similar
-   * to the original.
+   * Generates canonical string representation of the policy.
    */
   toString:
   function csp_toString() {
     var dirs = [];
 
     if (this._allowEval || this._allowInlineScripts) {
       dirs.push("options " + (this._allowEval ? "eval-script" : "")
                            + (this._allowInlineScripts ? "inline-script" : ""));
@@ -602,18 +601,17 @@ CSPSourceList.prototype = {
       if (!a_sorted[i].equals(b_sorted[i])) {
         return false;
       }
     }
     return true;
   },
 
   /**
-   * Generates string representation of the Source List.
-   * Should be fairly similar to the original.
+   * Generates canonical string representation of the Source List.
    */
   toString:
   function() {
     if (this.isNone()) {
       return "'none'";
     }
     if (this._permitAllSources) {
       return "*";
@@ -634,17 +632,17 @@ CSPSourceList.prototype = {
    * Returns whether or not this source list permits all sources (*).
    */
   isAll:
   function() {
     return this._permitAllSources;
   },
 
   /**
-   * Makes a new instance that resembles this object.
+   * Makes a new deep copy of this object.
    * @returns
    *      a new CSPSourceList
    */
   clone:
   function() {
     var aSL = new CSPSourceList();
     aSL._permitAllSources = this._permitAllSources;
     for (var i in this._sources) {
@@ -946,17 +944,17 @@ CSPSource.fromString = function(aStr, se
     // is the first bit a scheme?
     else if (CSPSource.validSchemeName(chunks[0])) {
       sObj._scheme = chunks[0];
       // then the second bit *must* be a host or empty
       if (chunks[1] === "") {
         // Allow scheme-only sources!  These default to wildcard host/port,
         // especially since host and port don't always matter.
         // Example: "javascript:" and "data:" 
-        if (!sObj._host) sObj._host = "*";
+        if (!sObj._host) sObj._host = CSPHost.fromString("*");
         if (!sObj._port) sObj._port = "*";
       } else {
         // some host was defined.
         // ... remove <= 3 leading slashes (from the scheme) and parse
         var cleanHost = chunks[1].replace(/^\/{0,3}/,"");
         // ... and parse
         sObj._host = CSPHost.fromString(cleanHost);
         if (!sObj._host) {
@@ -1045,18 +1043,17 @@ CSPSource.prototype = {
     }
     // if there was no scheme (and thus no default scheme), return self.port
     if (this._self && this._self.port) return this._self.port;
 
     return undefined;
   },
 
   /**
-   * Generates string representation of the Source.
-   * Should be fairly similar to the original.
+   * Generates canonical string representation of the Source.
    */
   toString:
   function() {
     if (this._isSelf) 
       return this._self.toString();
 
     var s = "";
     if (this._scheme)
@@ -1064,17 +1061,17 @@ CSPSource.prototype = {
     if (this._host)
       s = s + this._host;
     if (this._port)
       s = s + ":" + this._port;
     return s;
   },
 
   /**
-   * Makes a new instance that resembles this object.
+   * Makes a new deep copy of this object.
    * @returns
    *      a new CSPSource
    */
   clone:
   function() {
     var aClone = new CSPSource();
     aClone._self = this._self ? this._self.clone() : undefined;
     aClone._scheme = this._scheme;
@@ -1167,23 +1164,38 @@ CSPSource.prototype = {
     else if (that._scheme === this._scheme)
       newSource._scheme = this._scheme;
     else {
       CSPError("Could not intersect " + this + " with " + that
                + " due to scheme problems.");
       return null;
     }
 
+    // NOTE: Both sources must have a host, if they don't, something funny is
+    // going on.  The fromString() factory method should have set the host to
+    // * if there's no host specified in the input. Regardless, if a host is
+    // not present either the scheme is hostless or any host should be allowed.
+    // This means we can use the other source's host as the more restrictive
+    // host expression, or if neither are present, we can use "*", but the
+    // error should still be reported.
+
     // host
-    if (!this._host)
-      newSource._host = that._host;
-    else if (!that._host)
-      newSource._host = this._host;
-    else // both this and that have hosts
+    if (this._host && that._host) {
       newSource._host = this._host.intersectWith(that._host);
+    } else if (this._host) {
+      CSPError("intersecting source with undefined host: " + that.toString());
+      newSource._host = this._host.clone();
+    } else if (that._host) {
+      CSPError("intersecting source with undefined host: " + this.toString());
+      newSource._host = that._host.clone();
+    } else {
+      CSPError("intersecting two sources with undefined hosts: " +
+               this.toString() + " and " + that.toString());
+      newSource._host = CSPHost.fromString("*");
+    }
 
     return newSource;
   },
 
   /**
    * Compares one CSPSource to another.
    *
    * @param that
@@ -1261,26 +1273,25 @@ CSPHost.fromString = function(aStr) {
       return null;
     }
   }
   return hObj;
 };
 
 CSPHost.prototype = {
   /**
-   * Generates string representation of the Source.
-   * Should be fairly similar to the original.
+   * Generates canonical string representation of the Host.
    */
   toString:
   function() {
     return this._segments.join(".");
   },
 
   /**
-   * Makes a new instance that resembles this object.
+   * Makes a new deep copy of this object.
    * @returns
    *      a new CSPHost
    */
   clone:
   function() {
     var aHost = new CSPHost();
     for (var i in this._segments) {
       aHost._segments[i] = this._segments[i];
@@ -1292,17 +1303,17 @@ CSPHost.prototype = {
    * Returns true if this host accepts the provided host (or the other way
    * around).
    * @param aHost
    *        the FQDN in question (CSPHost or String)
    * @returns
    */
   permits:
   function(aHost) {
-    if (!aHost) return false;
+    if (!aHost) aHost = CSPHost.fromString("*");
 
     if (!(aHost instanceof CSPHost)) {
       // -- compare CSPHost to String
       return this.permits(CSPHost.fromString(aHost));
     }
     var thislen = this._segments.length;
     var thatlen = aHost._segments.length;
 
--- a/content/base/src/nsContentUtils.cpp
+++ b/content/base/src/nsContentUtils.cpp
@@ -5849,17 +5849,17 @@ CloneSimpleValues(JSContext* cx,
   // Do we support FileList?
 
   // Function objects don't get cloned.
   if (JS_ObjectIsFunction(cx, obj)) {
     return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
   }
 
   // Security wrapped objects are not allowed either.
-  if (obj->getClass()->ext.wrappedObject)
+  if (obj->isWrapper() && !obj->getClass()->ext.innerObject)
     return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
 
   // See if this JSObject is backed by some C++ object. If it is then we assume
   // that it is inappropriate to clone.
   nsCOMPtr<nsIXPConnectWrappedNative> wrapper;
   nsContentUtils::XPConnect()->
     GetWrappedNativeOfJSObject(cx, obj, getter_AddRefs(wrapper));
   if (wrapper) {
--- a/content/base/src/nsGenericElement.cpp
+++ b/content/base/src/nsGenericElement.cpp
@@ -3563,28 +3563,28 @@ nsINode::doInsertChildAt(nsIContent* aKi
       nsCOMPtr<nsIDOMNode> adoptedKid;
       rv = domDoc->AdoptNode(kid, getter_AddRefs(adoptedKid));
       NS_ENSURE_SUCCESS(rv, rv);
 
       NS_ASSERTION(adoptedKid == kid, "Uh, adopt node changed nodes?");
     }
   }
 
-  PRUint32 childCount = aChildArray.ChildCount();
-  NS_ENSURE_TRUE(aIndex <= childCount, NS_ERROR_ILLEGAL_VALUE);
-
   // The id-handling code, and in the future possibly other code, need to
   // react to unexpected attribute changes.
   nsMutationGuard::DidMutate();
 
-  PRBool isAppend = (aIndex == childCount);
-
+  // Do this before checking the child-count since this could cause mutations
   nsIDocument* doc = GetCurrentDoc();
   mozAutoDocUpdate updateBatch(doc, UPDATE_CONTENT_MODEL, aNotify);
 
+  PRUint32 childCount = aChildArray.ChildCount();
+  NS_ENSURE_TRUE(aIndex <= childCount, NS_ERROR_ILLEGAL_VALUE);
+  PRBool isAppend = (aIndex == childCount);
+
   rv = aChildArray.InsertChildAt(aKid, aIndex);
   NS_ENSURE_SUCCESS(rv, rv);
   if (aIndex == 0) {
     mFirstChild = aKid;
   }
 
   nsIContent* parent =
     IsNodeOfType(eDOCUMENT) ? nsnull : static_cast<nsIContent*>(this);
@@ -4014,16 +4014,18 @@ nsINode::ReplaceOrInsertBefore(PRBool aR
   if (IsNodeOfType(eATTRIBUTE)) {
     return NS_ERROR_NOT_IMPLEMENTED;
   }
 
   nsIContent* refContent;
   nsresult res = NS_OK;
   PRInt32 insPos;
 
+  mozAutoDocConditionalContentUpdateBatch batch(GetCurrentDoc(), PR_TRUE);
+
   // Figure out which index to insert at
   if (aRefChild) {
     insPos = IndexOf(aRefChild);
     if (insPos < 0) {
       return NS_ERROR_DOM_NOT_FOUND_ERR;
     }
 
     if (aRefChild == aNewChild) {
@@ -4075,21 +4077,16 @@ nsINode::ReplaceOrInsertBefore(PRBool aR
       NS_ENSURE_SUCCESS(rv, rv);
 
       NS_ASSERTION(adoptedKid == newChild, "Uh, adopt node changed nodes?");
       NS_ASSERTION(HasSameOwnerDoc(newContent) && doc == GetOwnerDoc(),
                    "ownerDocument changed again after adopting!");
     }
   }
 
-  // We want an update batch when we expect several mutations to be performed,
-  // which is when we're replacing a node, or when we're inserting a fragment.
-  mozAutoDocConditionalContentUpdateBatch batch(GetCurrentDoc(),
-    aReplace || nodeType == nsIDOMNode::DOCUMENT_FRAGMENT_NODE);
-
   // If we're replacing
   if (aReplace) {
     refContent = GetChildAt(insPos + 1);
 
     nsMutationGuard guard;
 
     res = RemoveChildAt(insPos, PR_TRUE);
     NS_ENSURE_SUCCESS(res, res);
@@ -5323,17 +5320,17 @@ nsGenericElement::PostHandleEventForLink
           if (fm) {
             nsCOMPtr<nsIDOMElement> elem = do_QueryInterface(this);
             fm->SetFocus(elem, nsIFocusManager::FLAG_BYMOUSE |
                                nsIFocusManager::FLAG_NOSCROLL);
           }
 
           nsIEventStateManager* esm =
             aVisitor.mPresContext->EventStateManager();
-          nsEventStateManager::SetGlobalActiveContent(
+          nsEventStateManager::SetActiveManager(
             static_cast<nsEventStateManager*>(esm), this);
         }
       }
     }
     break;
 
   case NS_MOUSE_CLICK:
     if (NS_IS_MOUSE_LEFT_CLICK(aVisitor.mEvent)) {
--- a/content/base/test/test_bug373181.xhtml
+++ b/content/base/test/test_bug373181.xhtml
@@ -1,20 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <title>Testcase for bug 373181</title>
     <script type="text/javascript" src="/MochiKit/packed.js"/>
     <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"/>
     <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
     <script type="application/x-javascript">
-      var bodyOnLoad = false;
-      function checkOnLoad()
+      function onLoadFired()
       {
-        ok(bodyOnLoad, "Body onload event should fire");
+        ok(true, "Body onload event should fire");
         SimpleTest.finish();
       }
       SimpleTest.waitForExplicitFinish();
-      setTimeout(checkOnLoad, 500);
     </script>
   </head>
-  <body onload="bodyOnLoad = true;"/>
+  <body onload="onLoadFired();"/>
 </html>
--- a/content/base/test/unit/test_csputils.js
+++ b/content/base/test/unit/test_csputils.js
@@ -30,16 +30,17 @@
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 //load('CSPUtils.jsm');
 Components.utils.import('resource://gre/modules/CSPUtils.jsm');
+Components.utils.import('resource://gre/modules/NetUtil.jsm');
 
 // load the HTTP server
 do_load_httpd_js();
 
 var httpServer = new nsHttpServer();
 
 const POLICY_FROM_URI = "allow 'self'; img-src *";
 const POLICY_PORT = 9000;
@@ -185,16 +186,17 @@ test(
       do_check_neq(null, CSPSource.fromString("*.a.com"));
 
       //print(" --- Ignore the following two errors if they print ---");
       //"wildcard should not work in non-first token for host.");
       do_check_eq(null, CSPSource.fromString("x.*.a.com"));
 
       //"funny characters (#) should not work for host.");
       do_check_eq(null, CSPSource.fromString("a#2-c.com"));
+
       //print(" --- Stop ignoring errors that print ---\n");
 
       //"failed to parse host with port.");
       do_check_neq(null, CSPSource.create("a.com:23"));
       //"failed to parse host with scheme.");
       do_check_neq(null, CSPSource.create("https://a.com"));
       //"failed to parse host with scheme and port.");
       do_check_neq(null, CSPSource.create("https://a.com:200"));
@@ -224,16 +226,26 @@ test(
       //"src should inherit port *
       do_check_true(src.permits("https://foobar.com:443"));
       //"src should inherit and require https scheme
       do_check_false(src.permits("http://foobar.com"));
       //"src should inherit scheme 'https'"
       do_check_true(src.permits("https://foobar.com"));
       //"src should reject other hosts"
       do_check_false(src.permits("https://a.com"));
+
+      src = CSPSource.create("javascript:", "https://foobar.com:443");
+      //"hostless schemes should be parseable."
+      var aUri = NetUtil.newURI("javascript:alert('foo');");
+      do_check_true(src.permits(aUri));
+      //"src should reject other hosts"
+      do_check_false(src.permits("https://a.com"));
+      //"nothing else should be allowed"
+      do_check_false(src.permits("https://foobar.com"));
+
     });
 
 ///////////////////// Test the source list //////////////////////
 
 test(
     function test_CSPSourceList_fromString() {
       var sd = CSPSourceList.fromString("'none'");
       //"'none' -- should parse"
--- a/content/canvas/public/DocumentRendererChild.h
+++ b/content/canvas/public/DocumentRendererChild.h
@@ -48,19 +48,21 @@ namespace mozilla {
 namespace ipc {
 
 class DocumentRendererChild : public PDocumentRendererChild
 {
 public:
     DocumentRendererChild();
     virtual ~DocumentRendererChild();
     
-    bool RenderDocument(nsIDOMWindow *window, const PRInt32& x, const PRInt32& y, const PRInt32& w, const PRInt32& h,
-			    const nsString& bgcolor, const PRUint32& flags, const PRBool& flush, 
-			    PRUint32& _width, PRUint32& _height, nsCString& data);
+    bool RenderDocument(nsIDOMWindow *window,
+                        const nsRect& documentRect, const gfxMatrix& transform,
+                        const nsString& bgcolor,
+                        PRUint32 renderFlags, PRBool flushLayout, 
+                        const nsIntSize& renderSize, nsCString& data);
 
 private:
 
     DISALLOW_EVIL_CONSTRUCTORS(DocumentRendererChild);
 };
 
 }
 }
--- a/content/canvas/public/DocumentRendererParent.h
+++ b/content/canvas/public/DocumentRendererParent.h
@@ -49,20 +49,20 @@ namespace ipc {
 class DocumentRendererParent : public PDocumentRendererParent
 {
 public:
     DocumentRendererParent();
     virtual ~DocumentRendererParent();
 
     void SetCanvasContext(nsICanvasRenderingContextInternal* aCanvas,
 			  gfxContext* ctx);
-    void DrawToCanvas(PRUint32 aWidth, PRUint32 aHeight,
+    void DrawToCanvas(const nsIntSize& renderedSize,
 		      const nsCString& aData);
 
-    virtual bool Recv__delete__(const PRUint32& w, const PRUint32& h,
+    virtual bool Recv__delete__(const nsIntSize& renderedSize,
                                 const nsCString& data);
 
 private:
     nsCOMPtr<nsICanvasRenderingContextInternal> mCanvas;
     nsRefPtr<gfxContext> mCanvasContext;
 
     DISALLOW_EVIL_CONSTRUCTORS(DocumentRendererParent);
 };
--- a/content/canvas/public/nsICanvasRenderingContextInternal.h
+++ b/content/canvas/public/nsICanvasRenderingContextInternal.h
@@ -115,24 +115,14 @@ public:
   // Redraw the dirty rectangle of this canvas.
   NS_IMETHOD Redraw(const gfxRect &dirty) = 0;
 
   // If this context can be set to use Mozilla's Shmem segments as its backing
   // store, this will set it to that state. Note that if you have drawn
   // anything into this canvas before changing the shmem state, it will be
   // lost.
   NS_IMETHOD SetIsIPC(PRBool isIPC) = 0;
-
-  // Swap this back buffer with the front, and copy its contents to the new
-  // back. x, y, w, and h specify the area of |back| that is dirty.
-  NS_IMETHOD Swap(mozilla::ipc::Shmem& back,
-                  PRInt32 x, PRInt32 y, PRInt32 w, PRInt32 h) = 0;
-
-  // Sync back and front buffer, move ownership of back buffer to parent
-  NS_IMETHOD Swap(PRUint32 nativeID,
-                  PRInt32 x, PRInt32 y, PRInt32 w, PRInt32 h) = 0;
-
 };
 
 NS_DEFINE_STATIC_IID_ACCESSOR(nsICanvasRenderingContextInternal,
                               NS_ICANVASRENDERINGCONTEXTINTERNAL_IID)
 
 #endif /* nsICanvasRenderingContextInternal_h___ */
--- a/content/canvas/src/DocumentRendererChild.cpp
+++ b/content/canvas/src/DocumentRendererChild.cpp
@@ -94,51 +94,55 @@ FlushLayoutForTree(nsIDOMWindow* aWindow
             if (win) {
                 FlushLayoutForTree(win);
             }
         }
     }
 }
 
 bool
-DocumentRendererChild::RenderDocument(nsIDOMWindow *window, const PRInt32& x, const PRInt32& y, const PRInt32& w, const PRInt32& h,
-                                      const nsString& aBGColor, const PRUint32& flags, const PRBool& flush, 
-                                      PRUint32& _width, PRUint32& _height, nsCString& data)
+DocumentRendererChild::RenderDocument(nsIDOMWindow *window,
+                                      const nsRect& documentRect,
+                                      const gfxMatrix& transform,
+                                      const nsString& bgcolor,
+                                      PRUint32 renderFlags,
+                                      PRBool flushLayout, 
+                                      const nsIntSize& renderSize,
+                                      nsCString& data)
 {
-    if (flush)
+    if (flushLayout)
         FlushLayoutForTree(window);
 
     nsCOMPtr<nsPresContext> presContext;
     nsCOMPtr<nsPIDOMWindow> win = do_QueryInterface(window);
     if (win) {
         nsIDocShell* docshell = win->GetDocShell();
         if (docshell) {
             docshell->GetPresContext(getter_AddRefs(presContext));
         }
     }
     if (!presContext)
         return false;
 
     nscolor bgColor;
     nsCSSParser parser;
-    nsresult rv = parser.ParseColorString(PromiseFlatString(aBGColor),
+    nsresult rv = parser.ParseColorString(PromiseFlatString(bgcolor),
                                           nsnull, 0, &bgColor);
     if (NS_FAILED(rv))
         return false;
 
     nsIPresShell* presShell = presContext->PresShell();
 
-    nsRect r(x, y, w, h);
-
-    _width = nsPresContext::AppUnitsToIntCSSPixels(w);
-    _height = nsPresContext::AppUnitsToIntCSSPixels(h);
+    // Draw directly into the output array.
+    data.SetLength(renderSize.width * renderSize.height * 4);
 
-    // Draw directly into the output array.
-    data.SetLength(_width * _height * 4);
-    nsRefPtr<gfxImageSurface> surf = new gfxImageSurface(reinterpret_cast<PRUint8*>(const_cast<char*>(data.get())),
-                                                         gfxIntSize(_width, _height),
-                                                         4 * _width, gfxASurface::ImageFormatARGB32);
+    nsRefPtr<gfxImageSurface> surf =
+        new gfxImageSurface(reinterpret_cast<uint8*>(data.BeginWriting()),
+                            gfxIntSize(renderSize.width, renderSize.height),
+                            4 * renderSize.width,
+                            gfxASurface::ImageFormatARGB32);
     nsRefPtr<gfxContext> ctx = new gfxContext(surf);
+    ctx->SetMatrix(transform);
 
-    presShell->RenderDocument(r, flags, bgColor, ctx);
+    presShell->RenderDocument(documentRect, renderFlags, bgColor, ctx);
 
     return true;
 }
deleted file mode 100644
--- a/content/canvas/src/DocumentRendererNativeIDChild.cpp
+++ /dev/null
@@ -1,185 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Fennec Electrolysis.
- *
- * The Initial Developer of the Original Code is
- *   Nokia.
- * Portions created by the Initial Developer are Copyright (C) 2010
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifdef MOZ_WIDGET_QT
-#include <QX11Info>
-#define DISPLAY QX11Info::display
-#endif
-
-#ifdef MOZ_WIDGET_GTK2
-#include <gdk/gdkx.h>
-#define DISPLAY GDK_DISPLAY
-#endif
-
-#include "base/basictypes.h"
-
-#include "gfxImageSurface.h"
-#include "gfxPattern.h"
-#include "nsPIDOMWindow.h"
-#include "nsIDOMWindow.h"
-#include "nsIDOMDocument.h"
-#include "nsIDocShell.h"
-#include "nsIDocShellTreeNode.h"
-#include "nsIDocShellTreeItem.h"
-#include "nsIDocument.h"
-#include "nsIInterfaceRequestorUtils.h"
-#include "nsComponentManagerUtils.h"
-#include "nsCSSParser.h"
-#include "nsPresContext.h"
-#include "nsCOMPtr.h"
-#include "nsColor.h"
-#include "gfxContext.h"
-#include "gfxImageSurface.h"
-#include "nsLayoutUtils.h"
-
-#include "mozilla/ipc/DocumentRendererNativeIDChild.h"
-
-#ifdef MOZ_X11
-#include "gfxXlibSurface.h"
-#endif
-
-using namespace mozilla::ipc;
-
-DocumentRendererNativeIDChild::DocumentRendererNativeIDChild()
-{}
-
-DocumentRendererNativeIDChild::~DocumentRendererNativeIDChild()
-{}
-
-static void
-FlushLayoutForTree(nsIDOMWindow* aWindow)
-{
-    nsCOMPtr<nsPIDOMWindow> piWin = do_QueryInterface(aWindow);
-    if (!piWin)
-        return;
-
-    // Note that because FlushPendingNotifications flushes parents, this
-    // is O(N^2) in docshell tree depth.  However, the docshell tree is
-    // usually pretty shallow.
-
-    nsCOMPtr<nsIDOMDocument> domDoc;
-    aWindow->GetDocument(getter_AddRefs(domDoc));
-    nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDoc);
-    if (doc) {
-        doc->FlushPendingNotifications(Flush_Layout);
-    }
-
-    nsCOMPtr<nsIDocShellTreeNode> node =
-        do_QueryInterface(piWin->GetDocShell());
-    if (node) {
-        PRInt32 i = 0, i_end;
-        node->GetChildCount(&i_end);
-        for (; i < i_end; ++i) {
-            nsCOMPtr<nsIDocShellTreeItem> item;
-            node->GetChildAt(i, getter_AddRefs(item));
-            nsCOMPtr<nsIDOMWindow> win = do_GetInterface(item);
-            if (win) {
-                FlushLayoutForTree(win);
-            }
-        }
-    }
-}
-
-bool
-DocumentRendererNativeIDChild::RenderDocument(nsIDOMWindow* window, const PRInt32& x,
-                                      const PRInt32& y, const PRInt32& w,
-                                      const PRInt32& h, const nsString& aBGColor,
-                                      const PRUint32& flags, const PRBool& flush,
-                                      const gfxMatrix& aMatrix,
-                                      const PRInt32& nativeID)
-{
-    if (!nativeID)
-        return false;
-
-    if (flush)
-        FlushLayoutForTree(window);
-
-    nsCOMPtr<nsPresContext> presContext;
-    nsCOMPtr<nsPIDOMWindow> win = do_QueryInterface(window);
-    if (win) {
-        nsIDocShell* docshell = win->GetDocShell();
-        if (docshell) {
-            docshell->GetPresContext(getter_AddRefs(presContext));
-        }
-    }
-    if (!presContext)
-        return false;
-
-    nscolor bgColor;
-    nsCSSParser parser;
-    nsresult rv = parser.ParseColorString(PromiseFlatString(aBGColor), nsnull, 0, &bgColor);
-    if (NS_FAILED(rv))
-        return false;
-
-    nsIPresShell* presShell = presContext->PresShell();
-
-    nsRect r(x, y, w, h);
-
-    // Draw directly into the output array.
-    nsRefPtr<gfxASurface> surf;
-#ifdef MOZ_X11
-    // Initialize gfxXlibSurface from native XID by using toolkit functionality
-    // Would be nice to have gfxXlibSurface(nativeID) implementation
-    Display* dpy = DISPLAY();
-    int depth = DefaultDepth(dpy, DefaultScreen(dpy));
-    XVisualInfo vinfo;
-    int foundVisual = XMatchVisualInfo(dpy,
-                                       DefaultScreen(dpy),
-                                       depth,
-                                       TrueColor,
-                                       &vinfo);
-    if (!foundVisual)
-        return false;
-
-    surf = new gfxXlibSurface(dpy, nativeID, vinfo.visual);
-#else
-    NS_ERROR("NativeID handler not implemented for your platform");
-#endif
-
-    nsRefPtr<gfxContext> ctx = new gfxContext(surf);
-    ctx->SetMatrix(aMatrix);
-
-    presShell->RenderDocument(r, flags, bgColor, ctx);
-#ifdef MOZ_X11
-    // We are about to pass this buffer across process boundaries, and when we
-    // try to read from the surface in the other process, we're not guaranteed
-    // the drawing has actually happened, as the drawing commands might still
-    // be queued. By syncing with X, we guarantee the drawing has finished
-    // before we pass the buffer back.
-    XSync(dpy, False);
-#endif
-    return true;
-}
deleted file mode 100644
--- a/content/canvas/src/DocumentRendererNativeIDParent.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Fennec Electrolysis.
- *
- * The Initial Developer of the Original Code is
- *   Nokia.
- * Portions created by the Initial Developer are Copyright (C) 2010
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "mozilla/ipc/DocumentRendererNativeIDParent.h"
-
-using namespace mozilla::ipc;
-
-DocumentRendererNativeIDParent::DocumentRendererNativeIDParent()
-{}
-
-DocumentRendererNativeIDParent::~DocumentRendererNativeIDParent()
-{}
-
-void