mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
import changes from `dev' branch of rmottola/Arctic-Fox:
- non-android part of Bug 1159371 - Make --disable-compile-environment work with --enable-application=mobile/android. r=glandium (489eef9b71) - Bug 1159371 - Allow compiling sub-directories with --disable-compile-environment. r=glandium (5994752e02) - Bug 1191819 - part 1 - substitute MOZ_BZ2_CFLAGS as a list; r=mshal (71cc3c5600) - Bug 973933 - New updater-xpcshell binary for updater tests. r=rstrong (231074b8dd) - Bug 973933 - Fix mochitest chrome updater tests. r=rstrong (30fbbcb6fc) - Bug 973933 - Fix Nightly builds failing on updater-xpcshell. r=rstrong (8321af1395) - Bug 1151827 - Fix re-building toolkit/mozapps/update on Windows. r=rstrong (ebc315c842) - missing bit of Bug 1043692 - Add a DIST_INSTALL variable to moz.build, and replace NO_DIST_INSTALL with it. r=gps (cd79d1609d) - Bug 1165061 - Fix Intermittent test_0102_background_restartNotification_staging.xul by not copying app files when staging for tests and enable the tests for Linux and Mac. r=spohl (918995f426) - Bug 1191819 - part 2 - move updater's CXXFLAGS munging to moz.build; r=mshal (1e671a9838) - Bug 1168042, return a bool from PerformAccessKey indicating if focus was changed, r=masayuki (2077cb0763) - Bug 895274 part.36 Rename NS_MOUSEENTER to eMouseEnter r=smaug (fa49e67e92) - Bug 895274 part.37 Rename NS_MOUSELEAVE to eMouseLeave r=smaug (1cc67b7bf5) - Bug 895274 part.38 Rename NS_MOUSE_MOZLONGTAP to eMouseLongTap r=smaug (57b23d9678) - Bug 1188234, part 1 - Initialize |number|. r=smaug (65734ffddd) - Bug 1188234, part 2 - Add bounds checking in nsXULPrototypeElement::Deserialize(). r=smaug (c60e5e2eb0) - Bug 1188234, part 3 - Make allocation of nsXULPrototypeAttribute fallible in nsXULPrototypeElement::Deserialize(). r=smaug (8ce4fe9925) - Bug 1188234, part 4 - Don't append null to mChildren. r=smaug (2ec23c1c28) - Bug 1190608, part 4 - Brace a few ifs in nsXULElement.cpp. r=poiru (1186ad8a86) - Bug 1190608, part 3 - Remove some infallible new checks in nsXULElement.cpp. r=poiru (b2cf9b38b9) - part of Bug 1190608, part 2 - Tuck elses in nsXULElement.cpp. r=poiru (98e6b93cdd) - Bug 1190608, part 1 - Delete trailing whitespace in nsXULElement.cpp and nsXULPrototypeCache.cpp. r=poiru (3e80527246) - Bug 1190608, part 5 - Sink the declaration of i in nsXULElement.cpp. r=poiru (d6917f5d96) - Bug 1193572, part 1 - Don't use return values of failing calls in XUL deserialize methods. r=baku (8410bb3954) - Bug 1193572, part 2 - nsXULPrototypeElement::Deserialize should use fallible SetCapacity. r=baku (15bf7ba655) - Bug 1193572, part 3 - Don't re-initialize mType for XUL proto elements. r=baku (bdddcc6b0e) - Bug 1193572, part 4 - Make script element ownership more direct. r=baku (7729aba5b3) - Bug 95274 part.39 Rename NS_POINTER_EVENT_START to ePointerEventFirst and add ePointerEventLast r=smaug (12289fc024) - Bug 895274 part.40 Rename NS_POINTER_LOST_CAPTURE to ePointerLostCapture r=smaug (8cf49e2dce) - Bug 895274 part.41 Rename NS_POINTER_GOT_CAPTURE to ePointerGotCapture r=smaug (11e1d37261) - Bug 895274 part.42 Rename NS_POINTER_CANCEL to ePointerCancel r=smaug (ffe18b2169) - Bug 1162990 - Add POINTER_LEAVE on captured element on e10s. r=smaug (98430e3bdc) - Bug 895274 part.43 Rename NS_POINTER_LEAVE to ePointerLeave r=smaug (635c331338)
This commit is contained in:
@@ -128,7 +128,9 @@ endef
|
||||
$(foreach subtier,$(filter-out compile,$(TIERS)),$(eval $(call CREATE_SUBTIER_TRAVERSAL_RULE,$(subtier))))
|
||||
|
||||
ifndef TOPLEVEL_BUILD
|
||||
ifdef COMPILE_ENVIRONMENT
|
||||
libs:: target host
|
||||
endif # COMPILE_ENVIRONMENT
|
||||
endif
|
||||
|
||||
endif # ifeq ($(NO_RECURSE_MAKELEVEL),$(MAKELEVEL))
|
||||
|
||||
+22
-9
@@ -362,6 +362,15 @@ dnl ========================================================
|
||||
dnl AR_FLAGS set here so HOST_AR_FLAGS can be set correctly (see bug 538269)
|
||||
AR_FLAGS='crs $@'
|
||||
|
||||
if test -z "$COMPILE_ENVIRONMENT"; then
|
||||
if test "$target" != "$host"; then
|
||||
# Assert that we're cross compiling, but don't require a compile toolchain (as
|
||||
# MOZ_CROSS_COMPILER does below).
|
||||
CROSS_COMPILE=1
|
||||
AC_DEFINE(CROSS_COMPILE)
|
||||
fi
|
||||
fi # !COMPILE_ENVIRONMENT
|
||||
|
||||
if test "$COMPILE_ENVIRONMENT"; then
|
||||
|
||||
if test "$target" != "$host"; then
|
||||
@@ -1925,7 +1934,7 @@ case "$target" in
|
||||
TARGET_COMPILER_ABI="ibmc"
|
||||
CC_VERSION=`lslpp -Lcq vac.C 2>/dev/null | awk -F: '{ print $3 }'`
|
||||
CXX_VERSION=`lslpp -Lcq vacpp.cmp.core 2>/dev/null | awk -F: '{ print $3 }'`
|
||||
fi
|
||||
fi # COMPILE_ENVIRONMENT
|
||||
fi
|
||||
case "${target_os}" in
|
||||
aix4.1*)
|
||||
@@ -1934,7 +1943,7 @@ case "$target" in
|
||||
esac
|
||||
if test "$COMPILE_ENVIRONMENT"; then
|
||||
MOZ_CHECK_HEADERS(sys/inttypes.h)
|
||||
fi
|
||||
fi # COMPILE_ENVIRONMENT
|
||||
AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES)
|
||||
;;
|
||||
|
||||
@@ -2061,7 +2070,9 @@ ia64*-hpux*)
|
||||
MOZ_SYNTH_PICO=1
|
||||
else
|
||||
_PLATFORM_DEFAULT_TOOLKIT=cairo-android
|
||||
MOZ_LINKER=1
|
||||
if test "$COMPILE_ENVIRONMENT"; then
|
||||
MOZ_LINKER=1
|
||||
fi
|
||||
fi
|
||||
TARGET_NSPR_MDCPUCFG='\"md/_linux.cfg\"'
|
||||
|
||||
@@ -2551,7 +2562,7 @@ if test -z "$COMPILE_ENVIRONMENT"; then
|
||||
SKIP_LIBRARY_CHECKS=1
|
||||
else
|
||||
MOZ_COMPILER_OPTS
|
||||
fi
|
||||
fi # COMPILE_ENVIRONMENT
|
||||
|
||||
if test -z "$SKIP_COMPILER_CHECKS"; then
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
@@ -3823,7 +3834,9 @@ case "${target}" in
|
||||
NSS_DISABLE_DBM=1
|
||||
MOZ_THEME_FASTSTRIPE=1
|
||||
MOZ_TREE_FREETYPE=1
|
||||
MOZ_MEMORY=1
|
||||
if test "$COMPILE_ENVIRONMENT"; then
|
||||
MOZ_MEMORY=1
|
||||
fi
|
||||
MOZ_RAW=1
|
||||
;;
|
||||
|
||||
@@ -5369,7 +5382,7 @@ if test -n "$MOZ_VPX" -a -z "$MOZ_NATIVE_LIBVPX"; then
|
||||
VPX_ASFLAGS="-f win32 -rnasm -pnasm -DPIC"
|
||||
VPX_X86_ASM=1
|
||||
dnl The encoder needs obj_int_extract to get asm offsets.
|
||||
fi
|
||||
fi # COMPILE_ENVIRONMENT and others
|
||||
;;
|
||||
*:arm*)
|
||||
if test -n "$GNU_AS" ; then
|
||||
@@ -5398,7 +5411,7 @@ if test -n "$MOZ_VPX" -a -z "$MOZ_NATIVE_LIBVPX"; then
|
||||
|
||||
if test -n "$COMPILE_ENVIRONMENT" -a -n "$VPX_X86_ASM" -a -z "$VPX_AS"; then
|
||||
AC_MSG_ERROR([yasm is a required build tool for this architecture when webm is enabled. You may either install yasm or --disable-webm (which disables the WebM video format). See https://developer.mozilla.org/en/YASM for more details.])
|
||||
fi
|
||||
fi # COMPILE_ENVIRONMENT and others
|
||||
|
||||
if test -z "$GNU_CC" -a -z "$INTEL_CC" -a -z "$CLANG_CC" ; then
|
||||
dnl We prefer to get asm offsets using inline assembler, which the above
|
||||
@@ -7047,7 +7060,7 @@ if test -n "$COMPILE_ENVIRONMENT" -a -n "$USE_ELF_HACK"; then
|
||||
USE_ELF_HACK=
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi # COMPILE_ENVIRONMENT and others.
|
||||
|
||||
dnl ========================================================
|
||||
dnl = libstdc++ compatibility hacks
|
||||
@@ -8405,7 +8418,7 @@ AC_SUBST(MOZ_NATIVE_BZ2)
|
||||
|
||||
AC_SUBST(MOZ_JPEG_CFLAGS)
|
||||
AC_SUBST_LIST(MOZ_JPEG_LIBS)
|
||||
AC_SUBST(MOZ_BZ2_CFLAGS)
|
||||
AC_SUBST_LIST(MOZ_BZ2_CFLAGS)
|
||||
AC_SUBST_LIST(MOZ_BZ2_LIBS)
|
||||
AC_SUBST(MOZ_PNG_CFLAGS)
|
||||
AC_SUBST_LIST(MOZ_PNG_LIBS)
|
||||
|
||||
@@ -40,8 +40,8 @@ enum nsLinkState {
|
||||
|
||||
// IID for the nsIContent interface
|
||||
#define NS_ICONTENT_IID \
|
||||
{ 0x52cebfc8, 0x79ba, 0x4e38, \
|
||||
{ 0x8a, 0x4c, 0x7f, 0x9d, 0xb1, 0xa2, 0xb6, 0x1d } }
|
||||
{ 0x8e1bab9d, 0x8815, 0x4d2c, \
|
||||
{ 0xa2, 0x4d, 0x7a, 0xba, 0x52, 0x39, 0xdc, 0x22 } }
|
||||
|
||||
/**
|
||||
* A node of content in a document's content model. This interface
|
||||
@@ -593,10 +593,12 @@ public:
|
||||
* @param aKeyCausesActivation - if true then element should be activated
|
||||
* @param aIsTrustedEvent - if true then event that is cause of accesskey
|
||||
* execution is trusted.
|
||||
* @return true if the focus was changed.
|
||||
*/
|
||||
virtual void PerformAccesskey(bool aKeyCausesActivation,
|
||||
virtual bool PerformAccesskey(bool aKeyCausesActivation,
|
||||
bool aIsTrustedEvent)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -352,8 +352,8 @@ EventListenerManager::AddEventListenerInternal(
|
||||
if (window && !aFlags.mInSystemGroup) {
|
||||
window->SetHasTouchEventListeners();
|
||||
}
|
||||
} else if (aEventMessage >= NS_POINTER_EVENT_START &&
|
||||
aEventMessage <= NS_POINTER_LOST_CAPTURE) {
|
||||
} else if (aEventMessage >= ePointerEventFirst &&
|
||||
aEventMessage <= ePointerEventLast) {
|
||||
nsPIDOMWindow* window = GetInnerWindowForTarget();
|
||||
if (aTypeAtom == nsGkAtoms::onpointerenter ||
|
||||
aTypeAtom == nsGkAtoms::onpointerleave) {
|
||||
|
||||
@@ -271,11 +271,11 @@ EVENT(mousedown,
|
||||
EventNameType_All,
|
||||
eMouseEventClass)
|
||||
EVENT(mouseenter,
|
||||
NS_MOUSEENTER,
|
||||
eMouseEnter,
|
||||
EventNameType_All,
|
||||
eMouseEventClass)
|
||||
EVENT(mouseleave,
|
||||
NS_MOUSELEAVE,
|
||||
eMouseLeave,
|
||||
EventNameType_All,
|
||||
eMouseEventClass)
|
||||
EVENT(mousemove,
|
||||
@@ -323,7 +323,7 @@ EVENT(pointerup,
|
||||
EventNameType_All,
|
||||
ePointerEventClass)
|
||||
EVENT(pointercancel,
|
||||
NS_POINTER_CANCEL,
|
||||
ePointerCancel,
|
||||
EventNameType_All,
|
||||
ePointerEventClass)
|
||||
EVENT(pointerover,
|
||||
@@ -339,15 +339,15 @@ EVENT(pointerenter,
|
||||
EventNameType_All,
|
||||
ePointerEventClass)
|
||||
EVENT(pointerleave,
|
||||
NS_POINTER_LEAVE,
|
||||
ePointerLeave,
|
||||
EventNameType_All,
|
||||
ePointerEventClass)
|
||||
EVENT(gotpointercapture,
|
||||
NS_POINTER_GOT_CAPTURE,
|
||||
ePointerGotCapture,
|
||||
EventNameType_All,
|
||||
ePointerEventClass)
|
||||
EVENT(lostpointercapture,
|
||||
NS_POINTER_LOST_CAPTURE,
|
||||
ePointerLostCapture,
|
||||
EventNameType_All,
|
||||
ePointerEventClass)
|
||||
EVENT(selectstart,
|
||||
|
||||
@@ -638,7 +638,7 @@ EventStateManager::PreHandleEvent(nsPresContext* aPresContext,
|
||||
} else {
|
||||
if (sPointerEventEnabled) {
|
||||
// We should synthetize corresponding pointer events
|
||||
GeneratePointerEnterExit(NS_POINTER_LEAVE, mouseEvent);
|
||||
GeneratePointerEnterExit(ePointerLeave, mouseEvent);
|
||||
}
|
||||
GenerateMouseEnterExit(mouseEvent);
|
||||
//This is a window level mouse exit event and should stop here
|
||||
@@ -3017,7 +3017,7 @@ EventStateManager::PostHandleEvent(nsPresContext* aPresContext,
|
||||
SetActiveManager(this, activeContent);
|
||||
}
|
||||
break;
|
||||
case NS_POINTER_CANCEL: {
|
||||
case ePointerCancel: {
|
||||
if(WidgetMouseEvent* mouseEvent = aEvent->AsMouseEvent()) {
|
||||
GenerateMouseEnterExit(mouseEvent);
|
||||
}
|
||||
@@ -3776,8 +3776,8 @@ EventStateManager::DispatchMouseOrPointerEvent(WidgetMouseEvent* aMouseEvent,
|
||||
// "[When the mouse is locked on an element...e]vents that require the concept
|
||||
// of a mouse cursor must not be dispatched (for example: mouseover, mouseout).
|
||||
if (sIsPointerLocked &&
|
||||
(aMessage == NS_MOUSELEAVE ||
|
||||
aMessage == NS_MOUSEENTER ||
|
||||
(aMessage == eMouseLeave ||
|
||||
aMessage == eMouseEnter ||
|
||||
aMessage == eMouseOver ||
|
||||
aMessage == eMouseOut)) {
|
||||
mCurrentTargetContent = nullptr;
|
||||
@@ -3891,7 +3891,7 @@ public:
|
||||
|
||||
~EnterLeaveDispatcher()
|
||||
{
|
||||
if (mEventMessage == NS_MOUSEENTER ||
|
||||
if (mEventMessage == eMouseEnter ||
|
||||
mEventMessage == NS_POINTER_ENTER) {
|
||||
for (int32_t i = mTargets.Count() - 1; i >= 0; --i) {
|
||||
mESM->DispatchMouseOrPointerEvent(mMouseEvent, mEventMessage,
|
||||
@@ -3962,13 +3962,18 @@ EventStateManager::NotifyMouseOut(WidgetMouseEvent* aMouseEvent,
|
||||
SetContentState(nullptr, NS_EVENT_STATE_HOVER);
|
||||
}
|
||||
|
||||
// In case we go out from capturing element (retargetedByPointerCapture is true)
|
||||
// we should dispatch ePointerLeave event and only for capturing element.
|
||||
nsRefPtr<nsIContent> movingInto = aMouseEvent->retargetedByPointerCapture
|
||||
? wrapper->mLastOverElement->GetParent()
|
||||
: aMovingInto;
|
||||
|
||||
EnterLeaveDispatcher leaveDispatcher(this, wrapper->mLastOverElement,
|
||||
aMovingInto, aMouseEvent,
|
||||
isPointer ? NS_POINTER_LEAVE :
|
||||
NS_MOUSELEAVE);
|
||||
movingInto, aMouseEvent,
|
||||
isPointer ? ePointerLeave : eMouseLeave);
|
||||
|
||||
// Fire mouseout
|
||||
DispatchMouseOrPointerEvent(aMouseEvent, isPointer ? NS_POINTER_OUT : eMouseOut,
|
||||
DispatchMouseOrPointerEvent(aMouseEvent, isPointer ? ePointerLeave : eMouseOut,
|
||||
wrapper->mLastOverElement, aMovingInto);
|
||||
|
||||
wrapper->mLastOverFrame = nullptr;
|
||||
@@ -4025,7 +4030,7 @@ EventStateManager::NotifyMouseOver(WidgetMouseEvent* aMouseEvent,
|
||||
Maybe<EnterLeaveDispatcher> enterDispatcher;
|
||||
if (dispatch) {
|
||||
enterDispatcher.emplace(this, aContent, lastOverElement, aMouseEvent,
|
||||
isPointer ? NS_POINTER_ENTER : NS_MOUSEENTER);
|
||||
isPointer ? NS_POINTER_ENTER : eMouseEnter);
|
||||
}
|
||||
|
||||
NotifyMouseOut(aMouseEvent, aContent);
|
||||
@@ -4199,8 +4204,8 @@ EventStateManager::GenerateMouseEnterExit(WidgetMouseEvent* aMouseEvent)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NS_POINTER_LEAVE:
|
||||
case NS_POINTER_CANCEL:
|
||||
case ePointerLeave:
|
||||
case ePointerCancel:
|
||||
case eMouseExitFromWidget:
|
||||
{
|
||||
// This is actually the window mouse exit or pointer leave event. We're not moving
|
||||
|
||||
@@ -212,18 +212,20 @@ HTMLLabelElement::SubmitNamesValues(nsFormSubmission* aFormSubmission)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
HTMLLabelElement::PerformAccesskey(bool aKeyCausesActivation,
|
||||
bool aIsTrustedEvent)
|
||||
{
|
||||
if (!aKeyCausesActivation) {
|
||||
nsRefPtr<Element> element = GetLabeledElement();
|
||||
if (element)
|
||||
element->PerformAccesskey(aKeyCausesActivation, aIsTrustedEvent);
|
||||
if (element) {
|
||||
return element->PerformAccesskey(aKeyCausesActivation, aIsTrustedEvent);
|
||||
}
|
||||
} else {
|
||||
nsPresContext *presContext = GetPresContext(eForUncomposedDoc);
|
||||
if (!presContext)
|
||||
return;
|
||||
if (!presContext) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Click on it if the users prefs indicate to do so.
|
||||
WidgetMouseEvent event(aIsTrustedEvent, eMouseClick,
|
||||
@@ -236,6 +238,8 @@ HTMLLabelElement::PerformAccesskey(bool aKeyCausesActivation,
|
||||
EventDispatcher::Dispatch(static_cast<nsIContent*>(this), presContext,
|
||||
&event);
|
||||
}
|
||||
|
||||
return aKeyCausesActivation;
|
||||
}
|
||||
|
||||
nsGenericHTMLElement*
|
||||
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
// nsIContent
|
||||
virtual nsresult PostHandleEvent(
|
||||
EventChainPostVisitor& aVisitor) override;
|
||||
virtual void PerformAccesskey(bool aKeyCausesActivation,
|
||||
virtual bool PerformAccesskey(bool aKeyCausesActivation,
|
||||
bool aIsTrustedEvent) override;
|
||||
virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const override;
|
||||
|
||||
|
||||
@@ -128,13 +128,14 @@ HTMLLegendElement::Focus(ErrorResult& aError)
|
||||
getter_AddRefs(result));
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
HTMLLegendElement::PerformAccesskey(bool aKeyCausesActivation,
|
||||
bool aIsTrustedEvent)
|
||||
{
|
||||
// just use the same behaviour as the focus method
|
||||
ErrorResult rv;
|
||||
Focus(rv);
|
||||
return NS_SUCCEEDED(rv.StealNSResult());
|
||||
}
|
||||
|
||||
already_AddRefed<HTMLFormElement>
|
||||
|
||||
@@ -27,7 +27,7 @@ public:
|
||||
using nsGenericHTMLElement::Focus;
|
||||
virtual void Focus(ErrorResult& aError) override;
|
||||
|
||||
virtual void PerformAccesskey(bool aKeyCausesActivation,
|
||||
virtual bool PerformAccesskey(bool aKeyCausesActivation,
|
||||
bool aIsTrustedEvent) override;
|
||||
|
||||
// nsIContent
|
||||
|
||||
@@ -2452,13 +2452,13 @@ nsGenericHTMLFormElement::IsElementDisabledForEvents(EventMessage aMessage,
|
||||
case eMouseMove:
|
||||
case eMouseOver:
|
||||
case eMouseOut:
|
||||
case NS_MOUSEENTER:
|
||||
case NS_MOUSELEAVE:
|
||||
case eMouseEnter:
|
||||
case eMouseLeave:
|
||||
case NS_POINTER_MOVE:
|
||||
case NS_POINTER_OVER:
|
||||
case NS_POINTER_OUT:
|
||||
case NS_POINTER_ENTER:
|
||||
case NS_POINTER_LEAVE:
|
||||
case ePointerLeave:
|
||||
case NS_WHEEL_WHEEL:
|
||||
case NS_MOUSE_SCROLL:
|
||||
case NS_MOUSE_PIXEL_SCROLL:
|
||||
@@ -2778,18 +2778,24 @@ nsGenericHTMLElement::RegUnRegAccessKey(bool aDoReg)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
nsGenericHTMLElement::PerformAccesskey(bool aKeyCausesActivation,
|
||||
bool aIsTrustedEvent)
|
||||
{
|
||||
nsPresContext* presContext = GetPresContext(eForUncomposedDoc);
|
||||
if (!presContext)
|
||||
return;
|
||||
if (!presContext) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// It's hard to say what HTML4 wants us to do in all cases.
|
||||
nsIFocusManager* fm = nsFocusManager::GetFocusManager();
|
||||
bool focused = true;
|
||||
nsFocusManager* fm = nsFocusManager::GetFocusManager();
|
||||
if (fm) {
|
||||
fm->SetFocus(this, nsIFocusManager::FLAG_BYKEY);
|
||||
|
||||
// Return true if the element became the current focus within its window.
|
||||
nsPIDOMWindow* window = OwnerDoc()->GetWindow();
|
||||
focused = (window && window->GetFocusedNode());
|
||||
}
|
||||
|
||||
if (aKeyCausesActivation) {
|
||||
@@ -2798,6 +2804,8 @@ nsGenericHTMLElement::PerformAccesskey(bool aKeyCausesActivation,
|
||||
openAllowed : openAbused);
|
||||
DispatchSimulatedClick(this, aIsTrustedEvent, presContext);
|
||||
}
|
||||
|
||||
return focused;
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
||||
@@ -600,7 +600,7 @@ public:
|
||||
virtual bool IsHTMLFocusable(bool aWithMouse,
|
||||
bool *aIsFocusable,
|
||||
int32_t *aTabIndex);
|
||||
virtual void PerformAccesskey(bool aKeyCausesActivation,
|
||||
virtual bool PerformAccesskey(bool aKeyCausesActivation,
|
||||
bool aIsTrustedEvent) override;
|
||||
|
||||
/**
|
||||
|
||||
+96
-124
@@ -1,4 +1,4 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
@@ -291,10 +291,6 @@ nsXULElement::Create(nsXULPrototypeElement* aPrototype,
|
||||
|
||||
nsRefPtr<nsXULElement> element = Create(aPrototype, nodeInfo,
|
||||
aIsScriptable, aIsRoot);
|
||||
if (!element) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
element.forget(aResult);
|
||||
|
||||
return NS_OK;
|
||||
@@ -623,7 +619,7 @@ nsXULElement::IsFocusableInternal(int32_t *aTabIndex, bool aWithMouse)
|
||||
return shouldFocus;
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
nsXULElement::PerformAccesskey(bool aKeyCausesActivation,
|
||||
bool aIsTrustedEvent)
|
||||
{
|
||||
@@ -646,21 +642,24 @@ nsXULElement::PerformAccesskey(bool aKeyCausesActivation,
|
||||
// |element|, or clear it.
|
||||
content = do_QueryInterface(element);
|
||||
|
||||
if (!content)
|
||||
return;
|
||||
if (!content) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
nsIFrame* frame = content->GetPrimaryFrame();
|
||||
if (!frame || !frame->IsVisibleConsideringAncestors())
|
||||
return;
|
||||
if (!frame || !frame->IsVisibleConsideringAncestors()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool focused = false;
|
||||
nsXULElement* elm = FromContent(content);
|
||||
if (elm) {
|
||||
// Define behavior for each type of XUL element.
|
||||
if (!content->IsXULElement(nsGkAtoms::toolbarbutton)) {
|
||||
nsIFocusManager* fm = nsFocusManager::GetFocusManager();
|
||||
if (fm) {
|
||||
nsCOMPtr<nsIDOMElement> element;
|
||||
nsCOMPtr<nsIDOMElement> elementToFocus;
|
||||
// for radio buttons, focus the radiogroup instead
|
||||
if (content->IsXULElement(nsGkAtoms::radio)) {
|
||||
nsCOMPtr<nsIDOMXULSelectControlItemElement> controlItem(do_QueryInterface(content));
|
||||
@@ -670,25 +669,30 @@ nsXULElement::PerformAccesskey(bool aKeyCausesActivation,
|
||||
if (!disabled) {
|
||||
nsCOMPtr<nsIDOMXULSelectControlElement> selectControl;
|
||||
controlItem->GetControl(getter_AddRefs(selectControl));
|
||||
element = do_QueryInterface(selectControl);
|
||||
elementToFocus = do_QueryInterface(selectControl);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
elementToFocus = do_QueryInterface(content);
|
||||
}
|
||||
else {
|
||||
element = do_QueryInterface(content);
|
||||
if (elementToFocus) {
|
||||
fm->SetFocus(elementToFocus, nsIFocusManager::FLAG_BYKEY);
|
||||
|
||||
// Return true if the element became focused.
|
||||
nsPIDOMWindow* window = OwnerDoc()->GetWindow();
|
||||
focused = (window && window->GetFocusedNode());
|
||||
}
|
||||
if (element)
|
||||
fm->SetFocus(element, nsIFocusManager::FLAG_BYKEY);
|
||||
}
|
||||
}
|
||||
if (aKeyCausesActivation &&
|
||||
!content->IsAnyOfXULElements(nsGkAtoms::textbox, nsGkAtoms::menulist)) {
|
||||
elm->ClickWithInputSource(nsIDOMMouseEvent::MOZ_SOURCE_KEYBOARD);
|
||||
}
|
||||
} else {
|
||||
return content->PerformAccesskey(aKeyCausesActivation, aIsTrustedEvent);
|
||||
}
|
||||
else {
|
||||
content->PerformAccesskey(aKeyCausesActivation, aIsTrustedEvent);
|
||||
}
|
||||
|
||||
return focused;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
@@ -1050,9 +1054,9 @@ nsXULElement::BeforeSetAttr(int32_t aNamespaceID, nsIAtom* aName,
|
||||
if (GetAttr(aNamespaceID, aName, oldValue)) {
|
||||
UnregisterAccessKey(oldValue);
|
||||
}
|
||||
}
|
||||
else if (aNamespaceID == kNameSpaceID_None && (aName ==
|
||||
nsGkAtoms::command || aName == nsGkAtoms::observes) && IsInDoc()) {
|
||||
} else if (aNamespaceID == kNameSpaceID_None &&
|
||||
(aName == nsGkAtoms::command || aName == nsGkAtoms::observes) &&
|
||||
IsInDoc()) {
|
||||
// XXX sXBL/XBL2 issue! Owner or current document?
|
||||
nsAutoString oldValue;
|
||||
GetAttr(kNameSpaceID_None, nsGkAtoms::observes, oldValue);
|
||||
@@ -2277,62 +2281,55 @@ nsXULPrototypeElement::Deserialize(nsIObjectInputStream* aStream,
|
||||
NS_PRECONDITION(aNodeInfos, "missing nodeinfo array");
|
||||
|
||||
// Read Node Info
|
||||
uint32_t number;
|
||||
uint32_t number = 0;
|
||||
nsresult rv = aStream->Read32(&number);
|
||||
mNodeInfo = aNodeInfos->ElementAt(number);
|
||||
if (!mNodeInfo)
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
mNodeInfo = aNodeInfos->SafeElementAt(number, nullptr);
|
||||
if (!mNodeInfo) {
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
// Read Attributes
|
||||
nsresult tmp = aStream->Read32(&number);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
rv = aStream->Read32(&number);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
mNumAttributes = int32_t(number);
|
||||
|
||||
uint32_t i;
|
||||
if (mNumAttributes > 0) {
|
||||
mAttributes = new nsXULPrototypeAttribute[mNumAttributes];
|
||||
if (! mAttributes)
|
||||
mAttributes = new (fallible) nsXULPrototypeAttribute[mNumAttributes];
|
||||
if (!mAttributes) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
nsAutoString attributeValue;
|
||||
for (i = 0; i < mNumAttributes; ++i) {
|
||||
tmp = aStream->Read32(&number);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
mozilla::dom::NodeInfo* ni = aNodeInfos->ElementAt(number);
|
||||
if (!ni)
|
||||
for (uint32_t i = 0; i < mNumAttributes; ++i) {
|
||||
rv = aStream->Read32(&number);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
mozilla::dom::NodeInfo* ni = aNodeInfos->SafeElementAt(number, nullptr);
|
||||
if (!ni) {
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
mAttributes[i].mName.SetTo(ni);
|
||||
|
||||
tmp = aStream->ReadString(attributeValue);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
tmp = SetAttrAt(i, attributeValue, aDocumentURI);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
rv = aStream->ReadString(attributeValue);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
rv = SetAttrAt(i, attributeValue, aDocumentURI);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
}
|
||||
}
|
||||
|
||||
tmp = aStream->Read32(&number);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
rv = aStream->Read32(&number);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
uint32_t numChildren = int32_t(number);
|
||||
|
||||
if (numChildren > 0) {
|
||||
mChildren.SetCapacity(numChildren);
|
||||
if (!mChildren.SetCapacity(numChildren, fallible)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
for (i = 0; i < numChildren; i++) {
|
||||
tmp = aStream->Read32(&number);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
for (uint32_t i = 0; i < numChildren; i++) {
|
||||
rv = aStream->Read32(&number);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
Type childType = (Type)number;
|
||||
|
||||
nsRefPtr<nsXULPrototypeNode> child;
|
||||
@@ -2340,79 +2337,52 @@ nsXULPrototypeElement::Deserialize(nsIObjectInputStream* aStream,
|
||||
switch (childType) {
|
||||
case eType_Element:
|
||||
child = new nsXULPrototypeElement();
|
||||
if (! child)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
child->mType = childType;
|
||||
|
||||
tmp = child->Deserialize(aStream, aProtoDoc, aDocumentURI,
|
||||
aNodeInfos);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
rv = child->Deserialize(aStream, aProtoDoc, aDocumentURI,
|
||||
aNodeInfos);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
break;
|
||||
case eType_Text:
|
||||
child = new nsXULPrototypeText();
|
||||
if (! child)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
child->mType = childType;
|
||||
|
||||
tmp = child->Deserialize(aStream, aProtoDoc, aDocumentURI,
|
||||
aNodeInfos);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
rv = child->Deserialize(aStream, aProtoDoc, aDocumentURI,
|
||||
aNodeInfos);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
break;
|
||||
case eType_PI:
|
||||
child = new nsXULPrototypePI();
|
||||
if (! child)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
child->mType = childType;
|
||||
|
||||
tmp = child->Deserialize(aStream, aProtoDoc, aDocumentURI,
|
||||
aNodeInfos);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
rv = child->Deserialize(aStream, aProtoDoc, aDocumentURI,
|
||||
aNodeInfos);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
break;
|
||||
case eType_Script: {
|
||||
// language version/options obtained during deserialization.
|
||||
nsXULPrototypeScript* script = new nsXULPrototypeScript(0, 0);
|
||||
if (! script)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
child = script;
|
||||
child->mType = childType;
|
||||
nsRefPtr<nsXULPrototypeScript> script = new nsXULPrototypeScript(0, 0);
|
||||
|
||||
tmp = aStream->ReadBoolean(&script->mOutOfLine);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
if (! script->mOutOfLine) {
|
||||
tmp = script->Deserialize(aStream, aProtoDoc, aDocumentURI,
|
||||
aNodeInfos);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
rv = aStream->ReadBoolean(&script->mOutOfLine);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
if (!script->mOutOfLine) {
|
||||
rv = script->Deserialize(aStream, aProtoDoc, aDocumentURI,
|
||||
aNodeInfos);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
} else {
|
||||
nsCOMPtr<nsISupports> supports;
|
||||
tmp = aStream->ReadObject(true, getter_AddRefs(supports));
|
||||
rv = aStream->ReadObject(true, getter_AddRefs(supports));
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
script->mSrcURI = do_QueryInterface(supports);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
|
||||
tmp = script->DeserializeOutOfLine(aStream, aProtoDoc);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
rv = script->DeserializeOutOfLine(aStream, aProtoDoc);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
|
||||
}
|
||||
// If we failed to deserialize, consider deleting 'script'?
|
||||
|
||||
child = script.forget();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
NS_NOTREACHED("Unexpected child type!");
|
||||
rv = NS_ERROR_UNEXPECTED;
|
||||
MOZ_ASSERT(false, "Unexpected child type!");
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(child, "Don't append null to mChildren");
|
||||
MOZ_ASSERT(child->mType == childType);
|
||||
mChildren.AppendElement(child);
|
||||
|
||||
// Oh dear. Something failed during the deserialization.
|
||||
@@ -2423,7 +2393,7 @@ nsXULPrototypeElement::Deserialize(nsIObjectInputStream* aStream,
|
||||
// death. So, let's just fail now, and propagate that failure
|
||||
// upward so that the ChromeProtocolHandler knows it can't use
|
||||
// a cached chrome channel for this.
|
||||
if (NS_FAILED(rv))
|
||||
if (NS_WARN_IF(NS_FAILED(rv)))
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
@@ -2623,13 +2593,16 @@ nsXULPrototypeScript::Deserialize(nsIObjectInputStream* aStream,
|
||||
nsIURI* aDocumentURI,
|
||||
const nsTArray<nsRefPtr<mozilla::dom::NodeInfo>> *aNodeInfos)
|
||||
{
|
||||
nsresult rv;
|
||||
NS_ASSERTION(!mSrcLoading || mSrcLoadWaiters != nullptr ||
|
||||
!mScriptObject,
|
||||
"prototype script not well-initialized when deserializing?!");
|
||||
|
||||
// Read basic prototype data
|
||||
aStream->Read32(&mLineNo);
|
||||
aStream->Read32(&mLangVersion);
|
||||
rv = aStream->Read32(&mLineNo);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = aStream->Read32(&mLangVersion);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
AutoSafeJSContext cx;
|
||||
JS::Rooted<JSObject*> global(cx, xpc::CompilationScope());
|
||||
@@ -2637,8 +2610,8 @@ nsXULPrototypeScript::Deserialize(nsIObjectInputStream* aStream,
|
||||
JSAutoCompartment ac(cx, global);
|
||||
|
||||
JS::Rooted<JSScript*> newScriptObject(cx);
|
||||
nsresult rv = nsContentUtils::XPConnect()->ReadScript(aStream, cx,
|
||||
newScriptObject.address());
|
||||
rv = nsContentUtils::XPConnect()->ReadScript(aStream, cx,
|
||||
newScriptObject.address());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
Set(newScriptObject);
|
||||
return NS_OK;
|
||||
@@ -2868,11 +2841,11 @@ nsXULPrototypeText::Deserialize(nsIObjectInputStream* aStream,
|
||||
nsIURI* aDocumentURI,
|
||||
const nsTArray<nsRefPtr<mozilla::dom::NodeInfo>> *aNodeInfos)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
rv = aStream->ReadString(mValue);
|
||||
|
||||
return rv;
|
||||
nsresult rv = aStream->ReadString(mValue);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
@@ -2911,10 +2884,9 @@ nsXULPrototypePI::Deserialize(nsIObjectInputStream* aStream,
|
||||
nsresult rv;
|
||||
|
||||
rv = aStream->ReadString(mTarget);
|
||||
nsresult tmp = aStream->ReadString(mData);
|
||||
if (NS_FAILED(tmp)) {
|
||||
rv = tmp;
|
||||
}
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = aStream->ReadString(mData);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -399,7 +399,7 @@ public:
|
||||
}
|
||||
#endif
|
||||
|
||||
virtual void PerformAccesskey(bool aKeyCausesActivation,
|
||||
virtual bool PerformAccesskey(bool aKeyCausesActivation,
|
||||
bool aIsTrustedEvent) override;
|
||||
nsresult ClickWithInputSource(uint16_t aInputSource);
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ UpdategDisableXULCache()
|
||||
if (gDisableXULCache) {
|
||||
Telemetry::Accumulate(Telemetry::XUL_CACHE_DISABLED, true);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -100,7 +100,7 @@ nsXULPrototypeCache::GetInstance()
|
||||
obsSvc->AddObserver(p, "chrome-flush-caches", false);
|
||||
obsSvc->AddObserver(p, "startupcache-invalidate", false);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
return sInstance;
|
||||
}
|
||||
@@ -149,19 +149,19 @@ nsXULPrototypeCache::GetPrototype(nsIURI* aURI)
|
||||
rv = GetInputStream(aURI, getter_AddRefs(ois));
|
||||
if (NS_FAILED(rv))
|
||||
return nullptr;
|
||||
|
||||
|
||||
nsRefPtr<nsXULPrototypeDocument> newProto;
|
||||
rv = NS_NewXULPrototypeDocument(getter_AddRefs(newProto));
|
||||
if (NS_FAILED(rv))
|
||||
return nullptr;
|
||||
|
||||
|
||||
rv = newProto->Read(ois);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
rv = PutPrototype(newProto);
|
||||
} else {
|
||||
newProto = nullptr;
|
||||
}
|
||||
|
||||
|
||||
mInputStreamTable.Remove(aURI);
|
||||
return newProto;
|
||||
}
|
||||
@@ -347,13 +347,13 @@ nsXULPrototypeCache::WritePrototype(nsXULPrototypeDocument* aPrototypeDocument)
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsXULPrototypeCache::GetInputStream(nsIURI* uri, nsIObjectInputStream** stream)
|
||||
nsXULPrototypeCache::GetInputStream(nsIURI* uri, nsIObjectInputStream** stream)
|
||||
{
|
||||
nsAutoCString spec(kXULCachePrefix);
|
||||
nsresult rv = PathifyURI(uri, spec);
|
||||
if (NS_FAILED(rv))
|
||||
if (NS_FAILED(rv))
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
|
||||
|
||||
nsAutoArrayPtr<char> buf;
|
||||
uint32_t len;
|
||||
nsCOMPtr<nsIObjectInputStream> ois;
|
||||
@@ -370,7 +370,7 @@ nsXULPrototypeCache::GetInputStream(nsIURI* uri, nsIObjectInputStream** stream)
|
||||
buf.forget();
|
||||
|
||||
mInputStreamTable.Put(uri, ois);
|
||||
|
||||
|
||||
ois.forget(stream);
|
||||
return NS_OK;
|
||||
}
|
||||
@@ -395,7 +395,7 @@ nsXULPrototypeCache::GetOutputStream(nsIURI* uri, nsIObjectOutputStream** stream
|
||||
= do_QueryInterface(storageStream);
|
||||
objectOutput->SetOutputStream(outputStream);
|
||||
} else {
|
||||
rv = NewObjectOutputWrappedStorageStream(getter_AddRefs(objectOutput),
|
||||
rv = NewObjectOutputWrappedStorageStream(getter_AddRefs(objectOutput),
|
||||
getter_AddRefs(storageStream),
|
||||
false);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
@@ -406,7 +406,7 @@ nsXULPrototypeCache::GetOutputStream(nsIURI* uri, nsIObjectOutputStream** stream
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsXULPrototypeCache::FinishOutputStream(nsIURI* uri)
|
||||
nsXULPrototypeCache::FinishOutputStream(nsIURI* uri)
|
||||
{
|
||||
nsresult rv;
|
||||
StartupCache* sc = StartupCache::GetSingleton();
|
||||
@@ -420,10 +420,10 @@ nsXULPrototypeCache::FinishOutputStream(nsIURI* uri)
|
||||
nsCOMPtr<nsIOutputStream> outputStream
|
||||
= do_QueryInterface(storageStream);
|
||||
outputStream->Close();
|
||||
|
||||
|
||||
nsAutoArrayPtr<char> buf;
|
||||
uint32_t len;
|
||||
rv = NewBufferFromStorageStream(storageStream, getter_Transfers(buf),
|
||||
rv = NewBufferFromStorageStream(storageStream, getter_Transfers(buf),
|
||||
&len);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
@@ -534,16 +534,16 @@ nsXULPrototypeCache::BeginCaching(nsIURI* aURI)
|
||||
return rv;
|
||||
|
||||
nsAutoCString fileChromePath, fileLocale;
|
||||
|
||||
|
||||
nsAutoArrayPtr<char> buf;
|
||||
uint32_t len, amtRead;
|
||||
nsCOMPtr<nsIObjectInputStream> objectInput;
|
||||
|
||||
rv = startupCache->GetBuffer(kXULCacheInfoKey, getter_Transfers(buf),
|
||||
rv = startupCache->GetBuffer(kXULCacheInfoKey, getter_Transfers(buf),
|
||||
&len);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
rv = NewObjectInputStreamFromBuffer(buf, len, getter_AddRefs(objectInput));
|
||||
|
||||
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
buf.forget();
|
||||
rv = objectInput->ReadCString(fileLocale);
|
||||
@@ -598,7 +598,7 @@ nsXULPrototypeCache::BeginCaching(nsIURI* aURI)
|
||||
rv = NS_ERROR_FILE_TOO_BIG;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
buf = new char[len];
|
||||
rv = inputStream->Read(buf, len, &amtRead);
|
||||
|
||||
@@ -497,7 +497,7 @@ APZCCallbackHelper::DispatchSynthesizedMouseEvent(EventMessage aMsg,
|
||||
nsIWidget* aWidget)
|
||||
{
|
||||
MOZ_ASSERT(aMsg == eMouseMove || aMsg == eMouseDown ||
|
||||
aMsg == eMouseUp || aMsg == NS_MOUSE_MOZLONGTAP);
|
||||
aMsg == eMouseUp || aMsg == eMouseLongTap);
|
||||
|
||||
WidgetMouseEvent event(true, aMsg, nullptr,
|
||||
WidgetMouseEvent::eReal, WidgetMouseEvent::eNormal);
|
||||
|
||||
@@ -237,7 +237,9 @@ APZEventState::ProcessLongTap(const nsCOMPtr<nsIPresShell>& aPresShell,
|
||||
* widget->GetDefaultScale();
|
||||
int time = 0;
|
||||
nsEventStatus status =
|
||||
APZCCallbackHelper::DispatchSynthesizedMouseEvent(NS_MOUSE_MOZLONGTAP, time, currentPoint, aModifiers, widget);
|
||||
APZCCallbackHelper::DispatchSynthesizedMouseEvent(eMouseLongTap, time,
|
||||
currentPoint,
|
||||
aModifiers, widget);
|
||||
eventHandled = (status == nsEventStatus_eConsumeNoDefault);
|
||||
APZES_LOG("MOZLONGTAP event handled: %d\n", eventHandled);
|
||||
}
|
||||
|
||||
@@ -516,10 +516,10 @@ AccessibleCaretEventHub::HandleMouseEvent(WidgetMouseEvent* aEvent)
|
||||
rv);
|
||||
break;
|
||||
|
||||
case NS_MOUSE_MOZLONGTAP:
|
||||
AC_LOGV("Before NS_MOUSE_MOZLONGTAP, state: %s", mState->Name());
|
||||
case eMouseLongTap:
|
||||
AC_LOGV("Before eMouseLongTap, state: %s", mState->Name());
|
||||
rv = mState->OnLongTap(this, point);
|
||||
AC_LOGV("After NS_MOUSE_MOZLONGTAP, state: %s, consume: %d", mState->Name(),
|
||||
AC_LOGV("After eMouseLongTap, state: %s, consume: %d", mState->Name(),
|
||||
rv);
|
||||
break;
|
||||
|
||||
|
||||
@@ -264,15 +264,15 @@ SelectionCarets::HandleEvent(WidgetEvent* aEvent)
|
||||
CancelLongTapDetector();
|
||||
}
|
||||
|
||||
} else if (aEvent->mMessage == NS_MOUSE_MOZLONGTAP) {
|
||||
} else if (aEvent->mMessage == eMouseLongTap) {
|
||||
if (!mVisible || !sSelectionCaretDetectsLongTap) {
|
||||
SELECTIONCARETS_LOG("SelectWord from NS_MOUSE_MOZLONGTAP");
|
||||
SELECTIONCARETS_LOG("SelectWord from eMouseLongTap");
|
||||
|
||||
mDownPoint = ptInRoot;
|
||||
nsresult wordSelected = SelectWord();
|
||||
|
||||
if (NS_FAILED(wordSelected)) {
|
||||
SELECTIONCARETS_LOG("SelectWord from NS_MOUSE_MOZLONGTAP failed!");
|
||||
SELECTIONCARETS_LOG("SelectWord from eMouseLongTap failed!");
|
||||
return nsEventStatus_eIgnore;
|
||||
}
|
||||
|
||||
|
||||
@@ -795,7 +795,7 @@ TouchCaret::HandleEvent(WidgetEvent* aEvent)
|
||||
TOUCHCARET_LOG("Receive key/wheel event %d", aEvent->mMessage);
|
||||
SetVisibility(false);
|
||||
break;
|
||||
case NS_MOUSE_MOZLONGTAP:
|
||||
case eMouseLongTap:
|
||||
if (mState == TOUCHCARET_TOUCHDRAG_ACTIVE) {
|
||||
// Disable long tap event from APZ while dragging the touch caret.
|
||||
status = nsEventStatus_eConsumeNoDefault;
|
||||
|
||||
@@ -140,7 +140,7 @@ public:
|
||||
|
||||
static UniquePtr<WidgetEvent> CreateLongTapEvent(nscoord aX, nscoord aY)
|
||||
{
|
||||
return CreateMouseEvent(NS_MOUSE_MOZLONGTAP, aX, aY);
|
||||
return CreateMouseEvent(eMouseLongTap, aX, aY);
|
||||
}
|
||||
|
||||
static UniquePtr<WidgetEvent> CreateTouchEvent(EventMessage aMessage,
|
||||
|
||||
@@ -6694,7 +6694,7 @@ DispatchPointerFromMouseOrTouch(PresShell* aShell,
|
||||
pointerMessage = NS_POINTER_DOWN;
|
||||
break;
|
||||
case NS_TOUCH_CANCEL:
|
||||
pointerMessage = NS_POINTER_CANCEL;
|
||||
pointerMessage = ePointerCancel;
|
||||
break;
|
||||
default:
|
||||
return NS_OK;
|
||||
@@ -7443,9 +7443,10 @@ PresShell::HandleEvent(nsIFrame* aFrame,
|
||||
}
|
||||
|
||||
if (pointerEvent->mMessage == NS_POINTER_UP ||
|
||||
pointerEvent->mMessage == NS_POINTER_CANCEL) {
|
||||
pointerEvent->mMessage == ePointerCancel) {
|
||||
// Implicitly releasing capture for given pointer.
|
||||
// LOST_POINTER_CAPTURE should be send after NS_POINTER_UP or NS_POINTER_CANCEL.
|
||||
// ePointerLostCapture should be send after NS_POINTER_UP or
|
||||
// ePointerCancel.
|
||||
releasePointerCaptureCaller.SetTarget(pointerId, pointerCapturingContent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,8 +17,8 @@ support-files =
|
||||
[test_0015_check_incompat_basic_addons.xul]
|
||||
[test_0016_check_incompat_basic_license_addons.xul]
|
||||
[test_0017_check_staging_basic.xul]
|
||||
skip-if = os != 'win'
|
||||
reason = Bug 918029 and bug 1164560 - timeout caused by copying too many files.
|
||||
skip-if = asan
|
||||
reason = Bug 1168003
|
||||
[test_0021_check_billboard.xul]
|
||||
[test_0022_check_billboard_license.xul]
|
||||
[test_0023_check_incompat_billboard.xul]
|
||||
@@ -59,11 +59,15 @@ reason = Bug 918029 and bug 1164560 - timeout caused by copying too many files.
|
||||
[test_0094_restartNotification_remote.xul]
|
||||
[test_0095_restartNotification_remoteInvalidNumber.xul]
|
||||
[test_0096_restartNotification_stagedBackground.xul]
|
||||
skip-if = asan
|
||||
reason = Bug 1168003
|
||||
[test_0097_restartNotification_stagedServiceBackground.xul]
|
||||
skip-if = os != 'win'
|
||||
reason = only Windows has the maintenance service.
|
||||
[test_0101_background_restartNotification.xul]
|
||||
[test_0102_background_restartNotification_staging.xul]
|
||||
skip-if = os == 'linux'
|
||||
reason = Bug 918029 - timeout caused by copying too many files.
|
||||
skip-if = asan
|
||||
reason = Bug 1168003
|
||||
[test_0103_background_restartNotification_stagingService.xul]
|
||||
skip-if = os != 'win'
|
||||
reason = only Windows has the maintenance service.
|
||||
|
||||
@@ -31,6 +31,8 @@ const TESTS = [ {
|
||||
buttonClick: "extra1"
|
||||
} ];
|
||||
|
||||
gUseTestUpdater = true;
|
||||
|
||||
function runTest() {
|
||||
debugDump("entering");
|
||||
|
||||
|
||||
@@ -24,6 +24,8 @@ const TESTS = [ {
|
||||
buttonClick: "extra1"
|
||||
} ];
|
||||
|
||||
gUseTestUpdater = true;
|
||||
|
||||
function runTest() {
|
||||
debugDump("entering");
|
||||
|
||||
|
||||
+2
@@ -24,6 +24,8 @@ const TESTS = [ {
|
||||
buttonClick: "extra1"
|
||||
} ];
|
||||
|
||||
gUseTestUpdater = true;
|
||||
|
||||
function runTest() {
|
||||
debugDump("entering");
|
||||
|
||||
|
||||
+2
@@ -24,6 +24,8 @@ const TESTS = [ {
|
||||
buttonClick: "extra1"
|
||||
} ];
|
||||
|
||||
gUseTestUpdater = true;
|
||||
|
||||
function runTest() {
|
||||
debugDump("entering");
|
||||
|
||||
|
||||
+2
@@ -24,6 +24,8 @@ const TESTS = [ {
|
||||
buttonClick: "extra1"
|
||||
} ];
|
||||
|
||||
gUseTestUpdater = true;
|
||||
|
||||
function runTest() {
|
||||
debugDump("entering");
|
||||
|
||||
|
||||
@@ -81,7 +81,29 @@ function runTest() {
|
||||
", Exception: " + e);
|
||||
}
|
||||
|
||||
resetAddons(finishTest);
|
||||
resetAddons(cleanupRestoreUpdaterBackup);
|
||||
}
|
||||
|
||||
/**
|
||||
* After all tests finish this will repeatedly attempt to restore the real
|
||||
* updater if it exists and then call finishTest after the restore is
|
||||
* successful.
|
||||
*/
|
||||
function cleanupRestoreUpdaterBackup() {
|
||||
debugDump("entering");
|
||||
|
||||
try {
|
||||
// Windows debug builds keep the updater file in use for a short period of
|
||||
// time after the updater process exits.
|
||||
restoreUpdaterBackup();
|
||||
} catch (e) {
|
||||
logTestInfo("Attempt to restore the backed up updater failed... " +
|
||||
"will try again, Exception: " + e);
|
||||
SimpleTest.executeSoon(cleanupRestoreUpdaterBackup);
|
||||
return;
|
||||
}
|
||||
|
||||
SimpleTest.executeSoon(finishTest);
|
||||
}
|
||||
|
||||
function finishTest() {
|
||||
|
||||
@@ -129,6 +129,7 @@ Cu.import("resource://gre/modules/AddonManager.jsm", this);
|
||||
Cu.import("resource://gre/modules/Services.jsm", this);
|
||||
|
||||
const IS_MACOSX = ("nsILocalFileMac" in Ci);
|
||||
const IS_WIN = ("@mozilla.org/windows-registry-key;1" in Cc);
|
||||
|
||||
// The tests have to use the pageid instead of the pageIndex due to the
|
||||
// app update wizard's access method being random.
|
||||
@@ -182,6 +183,10 @@ const TEST_ADDONS = [ "appdisabled_1", "appdisabled_2",
|
||||
|
||||
const LOG_FUNCTION = info;
|
||||
|
||||
const BIN_SUFFIX = (IS_WIN ? ".exe" : "");
|
||||
const FILE_UPDATER_BIN = "updater" + (IS_MACOSX ? ".app" : BIN_SUFFIX);
|
||||
const FILE_UPDATER_BIN_BAK = FILE_UPDATER_BIN + ".bak";
|
||||
|
||||
var gURLData = URL_HOST + "/" + REL_PATH_DATA + "/";
|
||||
|
||||
var gTestTimeout = 240000; // 4 minutes
|
||||
@@ -210,6 +215,7 @@ var gPrefToCheck;
|
||||
var gDisableNoUpdateAddon = false;
|
||||
var gDisableUpdateCompatibilityAddon = false;
|
||||
var gDisableUpdateVersionAddon = false;
|
||||
var gUseTestUpdater = false;
|
||||
|
||||
// Set to true to log additional information for debugging. To log additional
|
||||
// information for an individual test set DEBUG_AUS_TEST to true in the test's
|
||||
@@ -324,9 +330,10 @@ function runTestDefaultWaitForWindowClosed() {
|
||||
|
||||
setupFiles();
|
||||
setupPrefs();
|
||||
gEnv.set("MOZ_TEST_SKIP_UPDATE_STAGE", "1");
|
||||
removeUpdateDirsAndFiles();
|
||||
reloadUpdateManagerData();
|
||||
setupAddons(runTest);
|
||||
setupAddons(setupTestUpdater);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -352,6 +359,7 @@ function finishTestDefault() {
|
||||
verifyTestsRan();
|
||||
|
||||
resetPrefs();
|
||||
gEnv.set("MOZ_TEST_SKIP_UPDATE_STAGE", "");
|
||||
resetFiles();
|
||||
removeUpdateDirsAndFiles();
|
||||
reloadUpdateManagerData();
|
||||
@@ -361,7 +369,7 @@ function finishTestDefault() {
|
||||
gDocElem.removeEventListener("pageshow", onPageShowDefault, false);
|
||||
}
|
||||
|
||||
finishTestDefaultWaitForWindowClosed();
|
||||
finishTestRestoreUpdaterBackup();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -384,6 +392,28 @@ function finishTestTimeout(aTimer) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* When a test finishes this will repeatedly attempt to restore the real updater
|
||||
* for tests that use the test updater and then call
|
||||
* finishTestDefaultWaitForWindowClosed after the restore is successful.
|
||||
*/
|
||||
function finishTestRestoreUpdaterBackup() {
|
||||
if (gUseTestUpdater) {
|
||||
try {
|
||||
// Windows debug builds keep the updater file in use for a short period of
|
||||
// time after the updater process exits.
|
||||
restoreUpdaterBackup();
|
||||
} catch (e) {
|
||||
logTestInfo("Attempt to restore the backed up updater failed... " +
|
||||
"will try again, Exception: " + e);
|
||||
SimpleTest.executeSoon(finishTestRestoreUpdaterBackup);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
finishTestDefaultWaitForWindowClosed();
|
||||
}
|
||||
|
||||
/**
|
||||
* If an update window is found SimpleTest.executeSoon can callback before the
|
||||
* update window is fully closed especially with debug builds. If an update
|
||||
@@ -394,6 +424,7 @@ function finishTestTimeout(aTimer) {
|
||||
function finishTestDefaultWaitForWindowClosed() {
|
||||
gCloseWindowTimeoutCounter++;
|
||||
if (gCloseWindowTimeoutCounter > CLOSE_WINDOW_TIMEOUT_MAXCOUNT) {
|
||||
SimpleTest.requestCompleteLog();
|
||||
SimpleTest.finish();
|
||||
return;
|
||||
}
|
||||
@@ -746,7 +777,7 @@ function checkIncompatbleList() {
|
||||
for (let i = 0; i < gIncompatibleListbox.itemCount; i++) {
|
||||
let label = gIncompatibleListbox.getItemAtIndex(i).label;
|
||||
// Use indexOf since locales can change the text displayed
|
||||
ok(label.indexOf("noupdate") != -1, "Checking that only incompatible " +
|
||||
ok(label.indexOf("noupdate") != -1, "Checking that only incompatible " +
|
||||
"add-ons that don't have an update are listed in the incompatible list");
|
||||
}
|
||||
}
|
||||
@@ -886,6 +917,102 @@ function setupFiles() {
|
||||
writeFile(updateSettingsIni, UPDATE_SETTINGS_CONTENTS);
|
||||
}
|
||||
|
||||
/**
|
||||
* For tests that use the test updater restores the backed up real updater if
|
||||
* it exists and tries again on failure since Windows debug builds at times
|
||||
* leave the file in use. After success moveRealUpdater is called to continue
|
||||
* the setup of the test updater. For tests that don't use the test updater
|
||||
* runTest will be called.
|
||||
*/
|
||||
function setupTestUpdater() {
|
||||
if (!gUseTestUpdater) {
|
||||
runTest();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
restoreUpdaterBackup();
|
||||
} catch (e) {
|
||||
logTestInfo("Attempt to restore the backed up updater failed... " +
|
||||
"will try again, Exception: " + e);
|
||||
SimpleTest.executeSoon(setupTestUpdater);
|
||||
return;
|
||||
}
|
||||
moveRealUpdater();
|
||||
}
|
||||
|
||||
/**
|
||||
* Backs up the real updater and tries again on failure since Windows debug
|
||||
* builds at times leave the file in use. After success it will call
|
||||
* copyTestUpdater to continue the setup of the test updater.
|
||||
*/
|
||||
function moveRealUpdater() {
|
||||
try {
|
||||
// Move away the real updater
|
||||
let baseAppDir = getAppBaseDir();
|
||||
let updater = baseAppDir.clone();
|
||||
updater.append(FILE_UPDATER_BIN);
|
||||
updater.moveTo(baseAppDir, FILE_UPDATER_BIN_BAK);
|
||||
} catch (e) {
|
||||
logTestInfo("Attempt to move the real updater out of the way failed... " +
|
||||
"will try again, Exception: " + e);
|
||||
SimpleTest.executeSoon(moveRealUpdater);
|
||||
return;
|
||||
}
|
||||
|
||||
copyTestUpdater();
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies the test updater so it can be used by tests and tries again on failure
|
||||
* since Windows debug builds at times leave the file in use. After success it
|
||||
* will call runTest to continue the test.
|
||||
*/
|
||||
function copyTestUpdater() {
|
||||
try {
|
||||
// Copy the test updater
|
||||
let baseAppDir = getAppBaseDir();
|
||||
let testUpdaterDir = Services.dirsvc.get("CurWorkD", Ci.nsILocalFile);
|
||||
let relPath = REL_PATH_DATA;
|
||||
let pathParts = relPath.split("/");
|
||||
for (let i = 0; i < pathParts.length; ++i) {
|
||||
testUpdaterDir.append(pathParts[i]);
|
||||
}
|
||||
|
||||
let testUpdater = testUpdaterDir.clone();
|
||||
testUpdater.append(FILE_UPDATER_BIN);
|
||||
testUpdater.copyToFollowingLinks(baseAppDir, FILE_UPDATER_BIN);
|
||||
} catch (e) {
|
||||
logTestInfo("Attempt to copy the test updater failed... " +
|
||||
"will try again, Exception: " + e);
|
||||
SimpleTest.executeSoon(copyTestUpdater);
|
||||
return;
|
||||
}
|
||||
|
||||
runTest();
|
||||
}
|
||||
|
||||
/**
|
||||
* Restores the updater that was backed up. This is called in setupTestUpdater
|
||||
* before the backup of the real updater is done in case the previous test
|
||||
* failed to restore the updater, in finishTestDefaultWaitForWindowClosed when
|
||||
* the test has finished, and in test_9999_cleanup.xul after all tests have
|
||||
* finished.
|
||||
*/
|
||||
function restoreUpdaterBackup() {
|
||||
let baseAppDir = getAppBaseDir();
|
||||
let updater = baseAppDir.clone();
|
||||
let updaterBackup = baseAppDir.clone();
|
||||
updater.append(FILE_UPDATER_BIN);
|
||||
updaterBackup.append(FILE_UPDATER_BIN_BAK);
|
||||
if (updaterBackup.exists()) {
|
||||
if (updater.exists()) {
|
||||
updater.remove(true);
|
||||
}
|
||||
updaterBackup.moveTo(baseAppDir, FILE_UPDATER_BIN);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the most common preferences used by tests to values used by the majority
|
||||
* of the tests and when necessary saves the preference's original values if
|
||||
|
||||
@@ -131,6 +131,10 @@ XPCOMUtils.defineLazyGetter(this, "gPrefRoot", function test_gPR() {
|
||||
return Services.prefs.getBranch(null);
|
||||
});
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "gEnv",
|
||||
"@mozilla.org/process/environment;1",
|
||||
"nsIEnvironment");
|
||||
|
||||
XPCOMUtils.defineLazyGetter(this, "gZipW", function test_gZipW() {
|
||||
return Cc["@mozilla.org/zipwriter;1"].
|
||||
createInstance(Ci.nsIZipWriter);
|
||||
|
||||
@@ -1181,12 +1181,15 @@ function getTestDirPath() {
|
||||
* The relative path to the file or directory to get from the root of
|
||||
* the test's data directory. If not specified the test's data
|
||||
* directory will be returned.
|
||||
* @param aAllowNonExists (optional)
|
||||
* Whether or not to throw an error if the path exists.
|
||||
* If not specified, then false is used.
|
||||
* @return The nsIFile for the file in the test data directory.
|
||||
* @throws If the file or directory does not exist.
|
||||
*/
|
||||
function getTestDirFile(aRelPath) {
|
||||
function getTestDirFile(aRelPath, aAllowNonExists) {
|
||||
let relpath = getTestDirPath() + (aRelPath ? aRelPath : "");
|
||||
return do_get_file(relpath, false);
|
||||
return do_get_file(relpath, !!aAllowNonExists);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1484,8 +1487,7 @@ function runUpdate(aExpectedExitValue, aExpectedStatus, aCallback) {
|
||||
let updater = binDir.clone();
|
||||
updater.append("updater.app");
|
||||
if (!updater.exists()) {
|
||||
updater = binDir.clone();
|
||||
updater.append(FILE_UPDATER_BIN);
|
||||
updater = getTestDirFile(FILE_UPDATER_BIN);
|
||||
if (!updater.exists()) {
|
||||
do_throw("Unable to find updater binary!");
|
||||
}
|
||||
@@ -1759,8 +1761,6 @@ function setupAppFiles() {
|
||||
// dependentlibs.list file.
|
||||
let appFiles = [ { relPath : FILE_APP_BIN,
|
||||
inGreDir : false },
|
||||
{ relPath : FILE_UPDATER_BIN,
|
||||
inGreDir : false },
|
||||
{ relPath : FILE_APPLICATION_INI,
|
||||
inGreDir : true },
|
||||
{ relPath : "dependentlibs.list",
|
||||
@@ -1795,8 +1795,19 @@ function setupAppFiles() {
|
||||
copyFileToTestAppDir(aAppFile.relPath, aAppFile.inGreDir);
|
||||
});
|
||||
|
||||
logTestInfo("finish - copying or creating symlinks to application files " +
|
||||
"for the test");
|
||||
// Copy the xpcshell updater binary
|
||||
let updater = getTestDirFile("updater.app", true);
|
||||
if (!updater.exists()) {
|
||||
updater = getTestDirFile(FILE_UPDATER_BIN);
|
||||
if (!updater.exists()) {
|
||||
do_throw("Unable to find the updater binary!");
|
||||
}
|
||||
}
|
||||
let testBinDir = getGREBinDir();
|
||||
updater.copyToFollowingLinks(testBinDir, updater.leafName);
|
||||
|
||||
debugDump("finish - copying or creating symlinks to application files " +
|
||||
"for the test");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2094,10 +2105,13 @@ function runUpdateUsingService(aInitialStatus, aExpectedStatus, aCheckSvcLog) {
|
||||
|
||||
setEnvironment();
|
||||
|
||||
// There is a security check done by the service to make sure the updater
|
||||
// we are executing is the same as the one in the apply-to dir.
|
||||
// To make sure they match from tests we copy updater.exe to the apply-to dir.
|
||||
copyFileToTestAppDir(FILE_UPDATER_BIN, false);
|
||||
let updater = getTestDirFile(FILE_UPDATER_BIN);
|
||||
if (!updater.exists()) {
|
||||
do_throw("Unable to find updater binary!");
|
||||
}
|
||||
let testBinDir = getGREBinDir()
|
||||
updater.copyToFollowingLinks(testBinDir, updater.leafName);
|
||||
updater.copyToFollowingLinks(updatesDir, updater.leafName);
|
||||
|
||||
// The service will execute maintenanceservice_installer.exe and
|
||||
// will copy maintenanceservice.exe out of the same directory from
|
||||
|
||||
@@ -18,9 +18,9 @@ skip-if = toolkit == 'gonk'
|
||||
reason = bug 820380
|
||||
[marStageSuccessPartial.js]
|
||||
[marVersionDowngrade.js]
|
||||
run-if = os == 'win'
|
||||
skip-if = os != 'win' && os != 'mac' && os != 'linux'
|
||||
[marWrongChannel.js]
|
||||
run-if = os == 'win'
|
||||
skip-if = os != 'win' && os != 'mac' && os != 'linux'
|
||||
[marStageFailurePartial.js]
|
||||
[marCallbackAppSuccessComplete_win.js]
|
||||
run-if = os == 'win'
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* Bootstrap the tests using the service by installing our own version of the service */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest(true)) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
// We don't actually care if the MAR has any data, we only care about the
|
||||
// application return code and update.status result.
|
||||
gTestFiles = gTestFilesCommon;
|
||||
gTestDirs = [];
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_SUCCEEDED, false);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
|
||||
// We need to check the service log even though this is a bootstrap
|
||||
// because the app bin could be in use by this test by the time the next
|
||||
// test runs.
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/**
|
||||
* We skip authenticode cert checks from the service udpates
|
||||
* so that we can use updater-xpcshell with the wrong certs for testing.
|
||||
* This tests that code path. */
|
||||
|
||||
function run_test() {
|
||||
if (!IS_AUTHENTICODE_CHECK_ENABLED) {
|
||||
return;
|
||||
}
|
||||
|
||||
let binDir = getGREBinDir();
|
||||
let maintenanceServiceBin = binDir.clone();
|
||||
maintenanceServiceBin.append(FILE_MAINTENANCE_SERVICE_BIN);
|
||||
|
||||
let updaterBin = binDir.clone();
|
||||
updaterBin.append(FILE_UPDATER_BIN);
|
||||
|
||||
debugDump("Launching maintenance service bin: " +
|
||||
maintenanceServiceBin.path + " to check updater: " +
|
||||
updaterBin.path + " signature.");
|
||||
|
||||
// Bypass the manifest and run as invoker
|
||||
let env = Cc["@mozilla.org/process/environment;1"].
|
||||
getService(Ci.nsIEnvironment);
|
||||
env.set("__COMPAT_LAYER", "RunAsInvoker");
|
||||
|
||||
let dummyInstallPath = "---";
|
||||
let maintenanceServiceBinArgs = ["check-cert", dummyInstallPath,
|
||||
updaterBin.path];
|
||||
let maintenanceServiceBinProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
maintenanceServiceBinProcess.init(maintenanceServiceBin);
|
||||
maintenanceServiceBinProcess.run(true, maintenanceServiceBinArgs,
|
||||
maintenanceServiceBinArgs.length);
|
||||
Assert.equal(maintenanceServiceBinProcess.exitValue, 0,
|
||||
"the maintenance service exit value should be 0");
|
||||
}
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test applying an update by staging an update and launching an application to
|
||||
* apply it.
|
||||
*/
|
||||
|
||||
const START_STATE = STATE_PENDING_SVC;
|
||||
const END_STATE = STATE_PENDING;
|
||||
|
||||
function run_test() {
|
||||
if (MOZ_APP_NAME == "xulrunner") {
|
||||
logTestInfo("Unable to run this test on xulrunner");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
createUpdaterINI(false);
|
||||
|
||||
if (IS_WIN) {
|
||||
Services.prefs.setBoolPref(PREF_APP_UPDATE_SERVICE_ENABLED, true);
|
||||
}
|
||||
|
||||
let channel = Services.prefs.getCharPref(PREF_APP_UPDATE_CHANNEL);
|
||||
let patches = getLocalPatchString(null, null, null, null, null, "true",
|
||||
START_STATE);
|
||||
let updates = getLocalUpdateString(patches, null, null, null, null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, "true", channel);
|
||||
writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true);
|
||||
writeVersionFile(getAppVersion());
|
||||
writeStatusFile(START_STATE);
|
||||
|
||||
reloadUpdateManagerData();
|
||||
Assert.ok(!!gUpdateManager.activeUpdate,
|
||||
"the active update should be defined");
|
||||
|
||||
lockDirectory(getAppBaseDir());
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
stageUpdate();
|
||||
}
|
||||
|
||||
function end_test() {
|
||||
resetEnvironment();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if staging the update has failed.
|
||||
*/
|
||||
function checkUpdateApplied() {
|
||||
// Don't proceed until the update has failed, and reset to pending.
|
||||
if (gUpdateManager.activeUpdate.state != END_STATE) {
|
||||
if (++gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the " +
|
||||
"active update status state to equal: " +
|
||||
END_STATE +
|
||||
", current state: " + gUpdateManager.activeUpdate.state);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateApplied);
|
||||
return;
|
||||
}
|
||||
|
||||
do_timeout(TEST_CHECK_TIMEOUT, finishTest);
|
||||
}
|
||||
|
||||
function finishTest() {
|
||||
checkPostUpdateRunningFile(false);
|
||||
Assert.equal(readStatusState(), END_STATE,
|
||||
"the status state" + MSG_SHOULD_EQUAL);
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, false, false);
|
||||
unlockDirectory(getAppBaseDir());
|
||||
standardInit();
|
||||
waitForFilesInUse();
|
||||
}
|
||||
+254
@@ -0,0 +1,254 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test applying an update by staging an update and launching an application to
|
||||
* apply it.
|
||||
*/
|
||||
|
||||
const START_STATE = STATE_PENDING_SVC;
|
||||
const END_STATE = STATE_APPLIED_SVC;
|
||||
|
||||
function run_test() {
|
||||
if (MOZ_APP_NAME == "xulrunner") {
|
||||
logTestInfo("Unable to run this test on xulrunner");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
createUpdaterINI(true);
|
||||
|
||||
if (IS_WIN) {
|
||||
Services.prefs.setBoolPref(PREF_APP_UPDATE_SERVICE_ENABLED, true);
|
||||
}
|
||||
|
||||
let channel = Services.prefs.getCharPref(PREF_APP_UPDATE_CHANNEL);
|
||||
let patches = getLocalPatchString(null, null, null, null, null, "true",
|
||||
START_STATE);
|
||||
let updates = getLocalUpdateString(patches, null, null, null, null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, "true", channel);
|
||||
writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true);
|
||||
writeVersionFile(getAppVersion());
|
||||
writeStatusFile(START_STATE);
|
||||
|
||||
reloadUpdateManagerData();
|
||||
Assert.ok(!!gUpdateManager.activeUpdate,
|
||||
"the active update should be defined");
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
setAppBundleModTime();
|
||||
stageUpdate();
|
||||
}
|
||||
|
||||
function customLaunchAppToApplyUpdate() {
|
||||
debugDump("start - locking installation directory");
|
||||
const LPCWSTR = ctypes.char16_t.ptr;
|
||||
const DWORD = ctypes.uint32_t;
|
||||
const LPVOID = ctypes.voidptr_t;
|
||||
const GENERIC_READ = 0x80000000;
|
||||
const FILE_SHARE_READ = 1;
|
||||
const FILE_SHARE_WRITE = 2;
|
||||
const OPEN_EXISTING = 3;
|
||||
const FILE_FLAG_BACKUP_SEMANTICS = 0x02000000;
|
||||
const INVALID_HANDLE_VALUE = LPVOID(0xffffffff);
|
||||
let kernel32 = ctypes.open("kernel32");
|
||||
let CreateFile = kernel32.declare("CreateFileW", ctypes.default_abi,
|
||||
LPVOID, LPCWSTR, DWORD, DWORD,
|
||||
LPVOID, DWORD, DWORD, LPVOID);
|
||||
gHandle = CreateFile(getAppBaseDir().path, GENERIC_READ,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, LPVOID(0),
|
||||
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, LPVOID(0));
|
||||
Assert.notEqual(gHandle.toString(), INVALID_HANDLE_VALUE.toString(),
|
||||
"the handle should not equal INVALID_HANDLE_VALUE");
|
||||
kernel32.close();
|
||||
debugDump("finish - locking installation directory");
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the update has finished being staged.
|
||||
*/
|
||||
function checkUpdateApplied() {
|
||||
gTimeoutRuns++;
|
||||
// Don't proceed until the active update's state is the expected value.
|
||||
if (gUpdateManager.activeUpdate.state != END_STATE) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the " +
|
||||
"active update status state to equal: " +
|
||||
END_STATE +
|
||||
", current state: " + gUpdateManager.activeUpdate.state);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateApplied);
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't proceed until the update's status state is the expected value.
|
||||
let state = readStatusState();
|
||||
if (state != END_STATE) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the update" +
|
||||
"status file state to equal: " +
|
||||
END_STATE +
|
||||
", current status state: " + state);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateApplied);
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't proceed until the last update log has been created.
|
||||
let log;
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
log = getUpdatesDir();
|
||||
} else {
|
||||
log = getStageDirFile(null, true);
|
||||
log.append(DIR_UPDATES);
|
||||
}
|
||||
log.append(FILE_LAST_LOG);
|
||||
if (!log.exists()) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the update log " +
|
||||
"to be created. Path: " + log.path);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateApplied);
|
||||
return;
|
||||
}
|
||||
|
||||
checkPostUpdateRunningFile(false);
|
||||
checkFilesAfterUpdateSuccess(getStageDirFile, true, false);
|
||||
|
||||
log = getUpdatesPatchDir();
|
||||
log.append(FILE_UPDATE_LOG);
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
log = getUpdatesDir();
|
||||
log.append(FILE_LAST_LOG);
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
Assert.ok(log.exists(), MSG_SHOULD_EXIST);
|
||||
} else {
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
}
|
||||
|
||||
log = getUpdatesDir();
|
||||
log.append(FILE_BACKUP_LOG);
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
let updatesDir = getStageDirFile(DIR_UPDATES + "/" + DIR_PATCH, true);
|
||||
Assert.ok(!updatesDir.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
log = getStageDirFile(DIR_UPDATES + "/" + FILE_LAST_LOG, true);
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
} else {
|
||||
Assert.ok(log.exists(), MSG_SHOULD_EXIST);
|
||||
}
|
||||
|
||||
log = getStageDirFile(DIR_UPDATES + "/" + FILE_BACKUP_LOG, true);
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
// Switch the application to the staged application that was updated by
|
||||
// launching the application.
|
||||
do_timeout(TEST_CHECK_TIMEOUT, launchAppToApplyUpdate);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the post update binary was properly launched for the platforms that
|
||||
* support launching post update process.
|
||||
*/
|
||||
function checkUpdateFinished() {
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
gCheckFunc = finishCheckUpdateFinished;
|
||||
checkPostUpdateAppLog();
|
||||
} else {
|
||||
finishCheckUpdateFinished();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the update has finished and if it has finished performs checks for
|
||||
* the test.
|
||||
*/
|
||||
function finishCheckUpdateFinished() {
|
||||
gTimeoutRuns++;
|
||||
// Don't proceed until the update's status state is the expected value.
|
||||
let state = readStatusState();
|
||||
if (state != STATE_SUCCEEDED) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the " +
|
||||
"update status file state to equal: " +
|
||||
STATE_SUCCEEDED +
|
||||
", current status state: " + state);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateFinished);
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't proceed until the application was switched out with the staged update
|
||||
// successfully.
|
||||
let updatedDir = getStageDirFile(null, true);
|
||||
if (updatedDir.exists()) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the updated " +
|
||||
"directory to not exist. Path: " + updatedDir.path);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateFinished);
|
||||
return;
|
||||
}
|
||||
|
||||
if (IS_WIN) {
|
||||
// Don't proceed until the updater binary is no longer in use.
|
||||
let updater = getUpdatesPatchDir();
|
||||
updater.append(FILE_UPDATER_BIN);
|
||||
if (updater.exists()) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the " +
|
||||
"updater binary to no longer be in use");
|
||||
}
|
||||
try {
|
||||
updater.remove(false);
|
||||
} catch (e) {
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateFinished);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checkPostUpdateRunningFile(true);
|
||||
checkAppBundleModTime();
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
checkUpdateLogContents(LOG_COMPLETE_SUCCESS);
|
||||
|
||||
standardInit();
|
||||
|
||||
let update = gUpdateManager.getUpdateAt(0);
|
||||
Assert.equal(update.state, STATE_SUCCEEDED,
|
||||
"the update state" + MSG_SHOULD_EQUAL);
|
||||
|
||||
let updatesDir = getUpdatesPatchDir();
|
||||
Assert.ok(updatesDir.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
let log = getUpdatesPatchDir();
|
||||
log.append(FILE_UPDATE_LOG);
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
log = getUpdatesDir();
|
||||
log.append(FILE_LAST_LOG);
|
||||
Assert.ok(log.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
log = getUpdatesDir();
|
||||
log.append(FILE_BACKUP_LOG);
|
||||
Assert.ok(log.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
waitForFilesInUse();
|
||||
}
|
||||
+236
@@ -0,0 +1,236 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test applying an update by staging an update and launching an application to
|
||||
* apply it.
|
||||
*/
|
||||
|
||||
const START_STATE = STATE_PENDING_SVC;
|
||||
const END_STATE = STATE_APPLIED_SVC;
|
||||
|
||||
function run_test() {
|
||||
if (MOZ_APP_NAME == "xulrunner") {
|
||||
logTestInfo("Unable to run this test on xulrunner");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
createUpdaterINI(false);
|
||||
|
||||
if (IS_WIN) {
|
||||
Services.prefs.setBoolPref(PREF_APP_UPDATE_SERVICE_ENABLED, true);
|
||||
}
|
||||
|
||||
let channel = Services.prefs.getCharPref(PREF_APP_UPDATE_CHANNEL);
|
||||
let patches = getLocalPatchString(null, null, null, null, null, "true",
|
||||
START_STATE);
|
||||
let updates = getLocalUpdateString(patches, null, null, null, null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, "true", channel);
|
||||
writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true);
|
||||
writeVersionFile(getAppVersion());
|
||||
writeStatusFile(START_STATE);
|
||||
|
||||
reloadUpdateManagerData();
|
||||
Assert.ok(!!gUpdateManager.activeUpdate,
|
||||
"the active update should be defined");
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
setAppBundleModTime();
|
||||
stageUpdate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the update has finished being staged.
|
||||
*/
|
||||
function checkUpdateApplied() {
|
||||
gTimeoutRuns++;
|
||||
// Don't proceed until the active update's state is the expected value.
|
||||
if (gUpdateManager.activeUpdate.state != END_STATE) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the " +
|
||||
"active update status state to equal: " +
|
||||
END_STATE +
|
||||
", current state: " + gUpdateManager.activeUpdate.state);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateApplied);
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't proceed until the update's status state is the expected value.
|
||||
let state = readStatusState();
|
||||
if (state != END_STATE) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the update " +
|
||||
"status state to equal: " +
|
||||
END_STATE +
|
||||
", current status state: " + state);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateApplied);
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't proceed until the last update log has been created.
|
||||
let log;
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
log = getUpdatesDir();
|
||||
} else {
|
||||
log = getStageDirFile(null, true);
|
||||
log.append(DIR_UPDATES);
|
||||
}
|
||||
log.append(FILE_LAST_LOG);
|
||||
if (!log.exists()) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the update log " +
|
||||
"to be created. Path: " + log.path);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateApplied);
|
||||
return;
|
||||
}
|
||||
|
||||
checkPostUpdateRunningFile(false);
|
||||
checkFilesAfterUpdateSuccess(getStageDirFile, true, false);
|
||||
|
||||
log = getUpdatesPatchDir();
|
||||
log.append(FILE_UPDATE_LOG);
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
log = getUpdatesDir();
|
||||
log.append(FILE_LAST_LOG);
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
Assert.ok(log.exists(), MSG_SHOULD_EXIST);
|
||||
} else {
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
}
|
||||
|
||||
log = getUpdatesDir();
|
||||
log.append(FILE_BACKUP_LOG);
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
let updatesDir = getStageDirFile(DIR_UPDATES + "/" + DIR_PATCH, true);
|
||||
Assert.ok(!updatesDir.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
log = getStageDirFile(DIR_UPDATES + "/" + FILE_LAST_LOG, true);
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
} else {
|
||||
Assert.ok(log.exists(), MSG_SHOULD_EXIST);
|
||||
}
|
||||
|
||||
log = getStageDirFile(DIR_UPDATES + "/" + FILE_BACKUP_LOG, true);
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
// Switch the application to the staged application that was updated by
|
||||
// launching the application.
|
||||
do_timeout(TEST_CHECK_TIMEOUT, launchAppToApplyUpdate);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the post update binary was properly launched for the platforms that
|
||||
* support launching post update process.
|
||||
*/
|
||||
function checkUpdateFinished() {
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
gCheckFunc = finishCheckUpdateApplied;
|
||||
checkPostUpdateAppLog();
|
||||
} else {
|
||||
finishCheckUpdateApplied();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the update has finished and if it has finished performs checks for
|
||||
* the test.
|
||||
*/
|
||||
function finishCheckUpdateApplied() {
|
||||
gTimeoutRuns++;
|
||||
// Don't proceed until the update's status state is the expected value.
|
||||
let state = readStatusState();
|
||||
if (state != STATE_SUCCEEDED) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the " +
|
||||
"update status file state to equal: " +
|
||||
STATE_SUCCEEDED +
|
||||
", current status state: " + state);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateFinished);
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't proceed until the application was switched out with the staged update
|
||||
// successfully.
|
||||
let updatedDir = getStageDirFile(null, true);
|
||||
if (updatedDir.exists()) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the updated " +
|
||||
"directory to not exist. Path: " + updatedDir.path);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateFinished);
|
||||
return;
|
||||
}
|
||||
|
||||
if (IS_WIN) {
|
||||
// Don't proceed until the updater binary is no longer in use.
|
||||
let updater = getUpdatesPatchDir();
|
||||
updater.append(FILE_UPDATER_BIN);
|
||||
if (updater.exists()) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the " +
|
||||
"updater binary to no longer be in use");
|
||||
}
|
||||
try {
|
||||
updater.remove(false);
|
||||
} catch (e) {
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateFinished);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checkPostUpdateRunningFile(true);
|
||||
checkAppBundleModTime();
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, true);
|
||||
gSwitchApp = true;
|
||||
checkUpdateLogContents();
|
||||
gSwitchApp = false;
|
||||
|
||||
standardInit();
|
||||
|
||||
let update = gUpdateManager.getUpdateAt(0);
|
||||
Assert.equal(update.state, STATE_SUCCEEDED,
|
||||
"the update state" + MSG_SHOULD_EQUAL);
|
||||
|
||||
let updatesDir = getUpdatesPatchDir();
|
||||
Assert.ok(updatesDir.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
let log = getUpdatesPatchDir();
|
||||
log.append(FILE_UPDATE_LOG);
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
log = getUpdatesDir();
|
||||
log.append(FILE_LAST_LOG);
|
||||
Assert.ok(log.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
log = getUpdatesDir();
|
||||
log.append(FILE_BACKUP_LOG);
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
Assert.ok(log.exists(), MSG_SHOULD_EXIST);
|
||||
} else {
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
}
|
||||
|
||||
waitForFilesInUse();
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test applying an update by staging an update and launching an application to
|
||||
* apply it.
|
||||
*/
|
||||
|
||||
const START_STATE = STATE_PENDING_SVC;
|
||||
const END_STATE = STATE_SUCCEEDED;
|
||||
|
||||
function run_test() {
|
||||
if (MOZ_APP_NAME == "xulrunner") {
|
||||
logTestInfo("Unable to run this test on xulrunner");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
createUpdaterINI();
|
||||
setAppBundleModTime();
|
||||
|
||||
let channel = Services.prefs.getCharPref(PREF_APP_UPDATE_CHANNEL);
|
||||
let patches = getLocalPatchString(null, null, null, null, null, "true",
|
||||
START_STATE);
|
||||
let updates = getLocalUpdateString(patches, null, null, null, null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, "true", channel);
|
||||
writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true);
|
||||
writeVersionFile(getAppVersion());
|
||||
writeStatusFile(START_STATE);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(START_STATE, END_STATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the post update binary was properly launched for the platforms that
|
||||
* support launching post update process.
|
||||
*/
|
||||
function checkUpdateFinished() {
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
gCheckFunc = finishCheckUpdateFinished;
|
||||
checkPostUpdateAppLog();
|
||||
} else {
|
||||
finishCheckUpdateFinished();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the update has finished and if it has finished performs checks for
|
||||
* the test.
|
||||
*/
|
||||
function finishCheckUpdateFinished() {
|
||||
gTimeoutRuns++;
|
||||
// Don't proceed until the update's status state is the expected value.
|
||||
let state = readStatusState();
|
||||
if (state != END_STATE) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the update " +
|
||||
"status state to equal: " + END_STATE +
|
||||
", current status state: " + state);
|
||||
} else {
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateFinished);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't proceed until the update log has been created.
|
||||
let log = getUpdatesPatchDir();
|
||||
log.append(FILE_UPDATE_LOG);
|
||||
if (!log.exists()) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded MAX_TIMEOUT_RUNS while waiting for the update log " +
|
||||
"to be created. Path: " + log.path);
|
||||
}
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateFinished);
|
||||
return;
|
||||
}
|
||||
|
||||
if (IS_WIN) {
|
||||
// Don't proceed until the updater binary is no longer in use.
|
||||
let updater = getUpdatesPatchDir();
|
||||
updater.append(FILE_UPDATER_BIN);
|
||||
if (updater.exists()) {
|
||||
if (gTimeoutRuns > MAX_TIMEOUT_RUNS) {
|
||||
do_throw("Exceeded while waiting for updater binary to no longer be " +
|
||||
"in use");
|
||||
}
|
||||
try {
|
||||
updater.remove(false);
|
||||
} catch (e) {
|
||||
do_timeout(TEST_CHECK_TIMEOUT, checkUpdateFinished);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checkAppBundleModTime();
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
checkUpdateLogContents(LOG_COMPLETE_SUCCESS);
|
||||
|
||||
standardInit();
|
||||
|
||||
let update = gUpdateManager.getUpdateAt(0);
|
||||
Assert.equal(update.state, END_STATE,
|
||||
"the update state" + MSG_SHOULD_EQUAL);
|
||||
|
||||
let updatesDir = getUpdatesPatchDir();
|
||||
Assert.ok(updatesDir.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
log = getUpdatesPatchDir();
|
||||
log.append(FILE_UPDATE_LOG);
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
log = getUpdatesDir();
|
||||
log.append(FILE_LAST_LOG);
|
||||
Assert.ok(log.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
log = getUpdatesDir();
|
||||
log.append(FILE_BACKUP_LOG);
|
||||
Assert.ok(!log.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
waitForFilesInUse();
|
||||
}
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* Application in use complete MAR file staged patch apply failure test */
|
||||
|
||||
const START_STATE = STATE_PENDING_SVC;
|
||||
const END_STATE = STATE_PENDING;
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
// Launch the callback helper application so it is in use during the update.
|
||||
let callbackApp = getApplyDirFile(DIR_RESOURCES + gCallbackBinFile);
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT];
|
||||
let callbackAppProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
callbackAppProcess.init(callbackApp);
|
||||
callbackAppProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(START_STATE, STATE_APPLIED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
// Switch the application to the staged application that was updated.
|
||||
gStageUpdate = false;
|
||||
gSwitchApp = true;
|
||||
runUpdate(1, END_STATE, checkUpdateApplied);
|
||||
}
|
||||
|
||||
function checkUpdateApplied() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, false, false);
|
||||
checkUpdateLogContains(ERR_RENAME_FILE);
|
||||
checkUpdateLogContains(ERR_MOVE_DESTDIR_7);
|
||||
standardInit();
|
||||
checkCallbackAppLog();
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* Application in use complete MAR file patch apply success test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
// Launch the callback helper application so it is in use during the update.
|
||||
let callbackApp = getApplyDirFile(DIR_RESOURCES + gCallbackBinFile);
|
||||
callbackApp.permissions = PERMS_DIRECTORY;
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT];
|
||||
let callbackAppProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
callbackAppProcess.init(callbackApp);
|
||||
callbackAppProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
setAppBundleModTime();
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_SUCCEEDED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkAppBundleModTime();
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
checkUpdateLogContents(LOG_COMPLETE_SUCCESS);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* Replace app binary complete MAR file staged patch apply success test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
gCallbackBinFile = "exe0.exe";
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_APPLIED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
// Switch the application to the staged application that was updated.
|
||||
gStageUpdate = false;
|
||||
gSwitchApp = true;
|
||||
runUpdate(0, STATE_SUCCEEDED, checkUpdateApplied);
|
||||
}
|
||||
|
||||
function checkUpdateApplied() {
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
standardInit();
|
||||
checkCallbackAppLog();
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* Patch app binary partial MAR file staged patch apply success test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
|
||||
gCallbackBinFile = "exe0.exe";
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_APPLIED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
// Switch the application to the staged application that was updated.
|
||||
gStageUpdate = false;
|
||||
gSwitchApp = true;
|
||||
runUpdate(0, STATE_SUCCEEDED, checkUpdateApplied);
|
||||
}
|
||||
|
||||
function checkUpdateApplied() {
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
standardInit();
|
||||
checkCallbackAppLog();
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* Replace app binary complete MAR file patch apply success test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
gCallbackBinFile = "exe0.exe";
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_SUCCEEDED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* Patch app binary partial MAR file patch apply success test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
|
||||
gCallbackBinFile = "exe0.exe";
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_SUCCEEDED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
/* General Partial MAR File Patch Apply Failure Test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestFiles[11].originalFile = "partial.png";
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
|
||||
createUpdaterINI();
|
||||
setAppBundleModTime();
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC,
|
||||
STATE_FAILED_LOADSOURCE_ERROR_WRONG_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the update has finished and if it has finished performs checks for
|
||||
* the test.
|
||||
*/
|
||||
function checkUpdateFinished() {
|
||||
checkPostUpdateRunningFile(false);
|
||||
checkAppBundleModTime();
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, false, false);
|
||||
checkUpdateLogContents(LOG_PARTIAL_FAILURE);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File in use complete MAR file staged patch apply failure test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
// Launch an existing file so it is in use during the update.
|
||||
let fileInUseBin = getApplyDirFile(gTestFiles[13].relPathDir +
|
||||
gTestFiles[13].fileName);
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT];
|
||||
let fileInUseProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
fileInUseProcess.init(fileInUseBin);
|
||||
fileInUseProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_APPLIED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
// Switch the application to the staged application that was updated.
|
||||
gStageUpdate = false;
|
||||
gSwitchApp = true;
|
||||
runUpdate(1, STATE_PENDING, checkUpdateApplied);
|
||||
}
|
||||
|
||||
function checkUpdateApplied() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, false, false);
|
||||
checkUpdateLogContains(ERR_RENAME_FILE);
|
||||
checkUpdateLogContains(ERR_MOVE_DESTDIR_7);
|
||||
standardInit();
|
||||
checkCallbackAppLog();
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File in use partial MAR file staged patch apply failure test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
|
||||
// Launch an existing file so it is in use during the update.
|
||||
let fileInUseBin = getApplyDirFile(gTestFiles[11].relPathDir +
|
||||
gTestFiles[11].fileName);
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT];
|
||||
let fileInUseProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
fileInUseProcess.init(fileInUseBin);
|
||||
fileInUseProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_APPLIED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
// Switch the application to the staged application that was updated.
|
||||
gStageUpdate = false;
|
||||
gSwitchApp = true;
|
||||
runUpdate(1, STATE_PENDING, checkUpdateApplied);
|
||||
}
|
||||
|
||||
function checkUpdateApplied() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, false, false);
|
||||
checkUpdateLogContains(ERR_RENAME_FILE);
|
||||
checkUpdateLogContains(ERR_MOVE_DESTDIR_7);
|
||||
standardInit();
|
||||
checkCallbackAppLog();
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File in use complete MAR file patch apply success test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
// Launch an existing file so it is in use during the update.
|
||||
let fileInUseBin = getApplyDirFile(gTestFiles[13].relPathDir +
|
||||
gTestFiles[13].fileName);
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT];
|
||||
let fileInUseProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
fileInUseProcess.init(fileInUseBin);
|
||||
fileInUseProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_SUCCEEDED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, true);
|
||||
checkUpdateLogContains(ERR_BACKUP_DISCARD);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File in use partial MAR file patch apply success test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
|
||||
// Launch an existing file so it is in use during the update.
|
||||
let fileInUseBin = getApplyDirFile(gTestFiles[11].relPathDir +
|
||||
gTestFiles[11].fileName);
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT];
|
||||
let fileInUseProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
fileInUseProcess.init(fileInUseBin);
|
||||
fileInUseProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_SUCCEEDED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, true);
|
||||
checkUpdateLogContains(ERR_BACKUP_DISCARD);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File locked complete MAR file patch apply failure test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
// Exclusively lock an existing file so it is in use during the update.
|
||||
let helperBin = getTestDirFile(FILE_HELPER_BIN);
|
||||
let helperDestDir = getApplyDirFile(DIR_RESOURCES);
|
||||
helperBin.copyTo(helperDestDir, FILE_HELPER_BIN);
|
||||
helperBin = getApplyDirFile(DIR_RESOURCES + FILE_HELPER_BIN);
|
||||
// Strip off the first two directories so the path has to be from the helper's
|
||||
// working directory.
|
||||
let lockFileRelPath = gTestFiles[3].relPathDir.split("/");
|
||||
if (IS_MACOSX) {
|
||||
lockFileRelPath = lockFileRelPath.slice(2);
|
||||
}
|
||||
lockFileRelPath = lockFileRelPath.join("/") + "/" + gTestFiles[3].fileName;
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT, lockFileRelPath];
|
||||
let lockFileProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
lockFileProcess.init(helperBin);
|
||||
lockFileProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_FAILED_WRITE_ERROR);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, false, false);
|
||||
checkUpdateLogContains(ERR_RENAME_FILE);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File locked partial MAR file patch apply failure test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
|
||||
// Exclusively lock an existing file so it is in use during the update.
|
||||
let helperBin = getTestDirFile(FILE_HELPER_BIN);
|
||||
let helperDestDir = getApplyDirFile(DIR_RESOURCES);
|
||||
helperBin.copyTo(helperDestDir, FILE_HELPER_BIN);
|
||||
helperBin = getApplyDirFile(DIR_RESOURCES + FILE_HELPER_BIN);
|
||||
// Strip off the first two directories so the path has to be from the helper's
|
||||
// working directory.
|
||||
let lockFileRelPath = gTestFiles[2].relPathDir.split("/");
|
||||
if (IS_MACOSX) {
|
||||
lockFileRelPath = lockFileRelPath.slice(2);
|
||||
}
|
||||
lockFileRelPath = lockFileRelPath.join("/") + "/" + gTestFiles[2].fileName;
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT, lockFileRelPath];
|
||||
let lockFileProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
lockFileProcess.init(helperBin);
|
||||
lockFileProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_FAILED_READ_ERROR);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, false, false);
|
||||
checkUpdateLogContains(ERR_UNABLE_OPEN_DEST);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File locked complete MAR file staged patch apply failure test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
// Exclusively lock an existing file so it is in use during the update.
|
||||
let helperBin = getTestDirFile(FILE_HELPER_BIN);
|
||||
let helperDestDir = getApplyDirFile(DIR_RESOURCES);
|
||||
helperBin.copyTo(helperDestDir, FILE_HELPER_BIN);
|
||||
helperBin = getApplyDirFile(DIR_RESOURCES + FILE_HELPER_BIN);
|
||||
// Strip off the first two directories so the path has to be from the helper's
|
||||
// working directory.
|
||||
let lockFileRelPath = gTestFiles[3].relPathDir.split("/");
|
||||
if (IS_MACOSX) {
|
||||
lockFileRelPath = lockFileRelPath.slice(2);
|
||||
}
|
||||
lockFileRelPath = lockFileRelPath.join("/") + "/" + gTestFiles[3].fileName;
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT, lockFileRelPath];
|
||||
let lockFileProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
lockFileProcess.init(helperBin);
|
||||
lockFileProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_FAILED_WRITE_ERROR_FILE_COPY);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
// Switch the application to the staged application that was updated.
|
||||
gStageUpdate = false;
|
||||
gSwitchApp = true;
|
||||
runUpdate(1, STATE_PENDING, checkUpdateApplied);
|
||||
}
|
||||
|
||||
function checkUpdateApplied() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, false, false);
|
||||
checkUpdateLogContains(ERR_RENAME_FILE);
|
||||
checkUpdateLogContains(ERR_MOVE_DESTDIR_7);
|
||||
standardInit();
|
||||
checkCallbackAppLog();
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File locked partial MAR file staged patch apply failure test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
|
||||
// Exclusively lock an existing file so it is in use during the update.
|
||||
let helperBin = getTestDirFile(FILE_HELPER_BIN);
|
||||
let helperDestDir = getApplyDirFile(DIR_RESOURCES);
|
||||
helperBin.copyTo(helperDestDir, FILE_HELPER_BIN);
|
||||
helperBin = getApplyDirFile(DIR_RESOURCES + FILE_HELPER_BIN);
|
||||
// Strip off the first two directories so the path has to be from the helper's
|
||||
// working directory.
|
||||
let lockFileRelPath = gTestFiles[2].relPathDir.split("/");
|
||||
if (IS_MACOSX) {
|
||||
lockFileRelPath = lockFileRelPath.slice(2);
|
||||
}
|
||||
lockFileRelPath = lockFileRelPath.join("/") + "/" + gTestFiles[2].fileName;
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT, lockFileRelPath];
|
||||
let lockFileProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
lockFileProcess.init(helperBin);
|
||||
lockFileProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_FAILED_WRITE_ERROR_FILE_COPY);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
// Switch the application to the staged application that was updated.
|
||||
gStageUpdate = false;
|
||||
gSwitchApp = true;
|
||||
runUpdate(1, STATE_PENDING, checkUpdateApplied);
|
||||
}
|
||||
|
||||
function checkUpdateApplied() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, false, false);
|
||||
checkUpdateLogContains(ERR_RENAME_FILE);
|
||||
checkUpdateLogContains(ERR_MOVE_DESTDIR_7);
|
||||
standardInit();
|
||||
checkCallbackAppLog();
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File in use inside removed dir complete MAR file staged patch apply failure
|
||||
test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
let fileInUseBin = getApplyDirFile(gTestDirs[4].relPathDir +
|
||||
gTestDirs[4].subDirs[0] +
|
||||
gTestDirs[4].subDirFiles[0]);
|
||||
// Remove the empty file created for the test so the helper application can
|
||||
// replace it.
|
||||
fileInUseBin.remove(false);
|
||||
|
||||
let helperBin = getTestDirFile(FILE_HELPER_BIN);
|
||||
let fileInUseDir = getApplyDirFile(gTestDirs[4].relPathDir +
|
||||
gTestDirs[4].subDirs[0]);
|
||||
helperBin.copyTo(fileInUseDir, gTestDirs[4].subDirFiles[0]);
|
||||
|
||||
// Launch an existing file so it is in use during the update.
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT];
|
||||
let fileInUseProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
fileInUseProcess.init(fileInUseBin);
|
||||
fileInUseProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_APPLIED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
// Switch the application to the staged application that was updated.
|
||||
gStageUpdate = false;
|
||||
gSwitchApp = true;
|
||||
runUpdate(1, STATE_PENDING, checkUpdateApplied);
|
||||
}
|
||||
|
||||
function checkUpdateApplied() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, false, false);
|
||||
checkUpdateLogContains(ERR_RENAME_FILE);
|
||||
checkUpdateLogContains(ERR_MOVE_DESTDIR_7);
|
||||
standardInit();
|
||||
checkCallbackAppLog();
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File in use inside removed dir partial MAR file staged patch apply failure
|
||||
test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
|
||||
let fileInUseBin = getApplyDirFile(gTestDirs[2].relPathDir +
|
||||
gTestDirs[2].files[0]);
|
||||
// Remove the empty file created for the test so the helper application can
|
||||
// replace it.
|
||||
fileInUseBin.remove(false);
|
||||
|
||||
let helperBin = getTestDirFile(FILE_HELPER_BIN);
|
||||
let fileInUseDir = getApplyDirFile(gTestDirs[2].relPathDir);
|
||||
helperBin.copyTo(fileInUseDir, gTestDirs[2].files[0]);
|
||||
|
||||
// Launch an existing file so it is in use during the update.
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT];
|
||||
let fileInUseProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
fileInUseProcess.init(fileInUseBin);
|
||||
fileInUseProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_APPLIED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
// Switch the application to the staged application that was updated.
|
||||
gStageUpdate = false;
|
||||
gSwitchApp = true;
|
||||
runUpdate(1, STATE_PENDING, checkUpdateApplied);
|
||||
}
|
||||
|
||||
function checkUpdateApplied() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, false, false);
|
||||
checkUpdateLogContains(ERR_RENAME_FILE);
|
||||
checkUpdateLogContains(ERR_MOVE_DESTDIR_7);
|
||||
standardInit();
|
||||
checkCallbackAppLog();
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File in use inside removed dir complete MAR file patch apply success test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
|
||||
let fileInUseBin = getApplyDirFile(gTestDirs[4].relPathDir +
|
||||
gTestDirs[4].subDirs[0] +
|
||||
gTestDirs[4].subDirFiles[0]);
|
||||
// Remove the empty file created for the test so the helper application can
|
||||
// replace it.
|
||||
fileInUseBin.remove(false);
|
||||
|
||||
let helperBin = getTestDirFile(FILE_HELPER_BIN);
|
||||
let fileInUseDir = getApplyDirFile(gTestDirs[4].relPathDir +
|
||||
gTestDirs[4].subDirs[0]);
|
||||
helperBin.copyTo(fileInUseDir, gTestDirs[4].subDirFiles[0]);
|
||||
|
||||
// Launch an existing file so it is in use during the update.
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT];
|
||||
let fileInUseProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
fileInUseProcess.init(fileInUseBin);
|
||||
fileInUseProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_SUCCEEDED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, true);
|
||||
checkUpdateLogContains(ERR_BACKUP_DISCARD);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
/* File in use inside removed dir partial MAR file patch apply success test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
|
||||
let fileInUseBin = getApplyDirFile(gTestDirs[2].relPathDir +
|
||||
gTestDirs[2].files[0]);
|
||||
// Remove the empty file created for the test so the helper application can
|
||||
// replace it.
|
||||
fileInUseBin.remove(false);
|
||||
|
||||
let helperBin = getTestDirFile(FILE_HELPER_BIN);
|
||||
let fileInUseDir = getApplyDirFile(gTestDirs[2].relPathDir);
|
||||
helperBin.copyTo(fileInUseDir, gTestDirs[2].files[0]);
|
||||
|
||||
// Launch an existing file so it is in use during the update.
|
||||
let args = [getApplyDirPath() + DIR_RESOURCES, "input", "output", "-s",
|
||||
HELPER_SLEEP_TIMEOUT];
|
||||
let fileInUseProcess = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
fileInUseProcess.init(fileInUseBin);
|
||||
fileInUseProcess.run(false, args, args.length);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
|
||||
}
|
||||
|
||||
function doUpdate() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_SUCCEEDED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
setupHelperFinish();
|
||||
}
|
||||
|
||||
function checkUpdate() {
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, true);
|
||||
checkUpdateLogContains(ERR_BACKUP_DISCARD);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
/* General Partial MAR File Staged Patch Apply Failure Test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestFiles[11].originalFile = "partial.png";
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
setTestFilesAndDirsForFailure();
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
|
||||
createUpdaterINI(true);
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC,
|
||||
STATE_FAILED_LOADSOURCE_ERROR_WRONG_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the update has finished and if it has finished performs checks for
|
||||
* the test.
|
||||
*/
|
||||
function checkUpdateFinished() {
|
||||
checkPostUpdateRunningFile(false);
|
||||
checkFilesAfterUpdateFailure(getApplyDirFile, true, false);
|
||||
checkUpdateLogContents(LOG_PARTIAL_FAILURE);
|
||||
standardInit();
|
||||
waitForFilesInUse();
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
/* General Complete MAR File Staged Patch Apply Test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestFiles[gTestFiles.length - 1].originalContents = null;
|
||||
gTestFiles[gTestFiles.length - 1].compareContents = "FromComplete\n";
|
||||
gTestFiles[gTestFiles.length - 1].comparePerms = 0o644;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
if (IS_MACOSX) {
|
||||
// Create files in the old distribution directory location to verify that
|
||||
// the directory and its contents are removed when there is a distribution
|
||||
// directory in the new location.
|
||||
let testFile = getApplyDirFile(DIR_MACOS + "distribution/testFile", true);
|
||||
writeFile(testFile, "test\n");
|
||||
testFile = getApplyDirFile(DIR_MACOS + "distribution/test1/testFile", true);
|
||||
writeFile(testFile, "test\n");
|
||||
}
|
||||
|
||||
createUpdaterINI(false);
|
||||
setAppBundleModTime();
|
||||
|
||||
// Don't test symlinks on Mac OS X in this test since it tends to timeout.
|
||||
// It is tested on Mac OS X in marAppInUseStageSuccessComplete_unix.js
|
||||
// The tests don't support symlinks on gonk.
|
||||
if (IS_UNIX && !IS_MACOSX && !IS_TOOLKIT_GONK) {
|
||||
removeSymlink();
|
||||
createSymlink();
|
||||
do_register_cleanup(removeSymlink);
|
||||
gTestFiles.splice(gTestFiles.length - 3, 0,
|
||||
{
|
||||
description : "Readable symlink",
|
||||
fileName : "link",
|
||||
relPathDir : DIR_RESOURCES,
|
||||
originalContents : "test",
|
||||
compareContents : "test",
|
||||
originalFile : null,
|
||||
compareFile : null,
|
||||
originalPerms : 0o666,
|
||||
comparePerms : 0o666
|
||||
});
|
||||
}
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_APPLIED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
checkFilesAfterUpdateSuccess(getStageDirFile, true, false);
|
||||
checkUpdateLogContents(LOG_COMPLETE_SUCCESS);
|
||||
checkPostUpdateRunningFile(false);
|
||||
|
||||
// Switch the application to the staged application that was updated.
|
||||
gStageUpdate = false;
|
||||
gSwitchApp = true;
|
||||
do_timeout(TEST_CHECK_TIMEOUT, function() {
|
||||
runUpdate(0, STATE_SUCCEEDED, checkUpdateApplied);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the post update binary was properly launched for the platforms that
|
||||
* support launching post update process.
|
||||
*/
|
||||
function checkUpdateApplied() {
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
gCheckFunc = finishCheckUpdateApplied;
|
||||
checkPostUpdateAppLog();
|
||||
} else {
|
||||
finishCheckUpdateApplied();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the update has finished and if it has finished performs checks for
|
||||
* the test.
|
||||
*/
|
||||
function finishCheckUpdateApplied() {
|
||||
checkPostUpdateRunningFile(true);
|
||||
|
||||
if (IS_MACOSX) {
|
||||
let distributionDir = getApplyDirFile(DIR_MACOS + "distribution", true);
|
||||
Assert.ok(!distributionDir.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
checkUpdateLogContains("removing old distribution directory");
|
||||
}
|
||||
|
||||
// The tests don't support symlinks on gonk.
|
||||
if (IS_UNIX && !IS_MACOSX && !IS_TOOLKIT_GONK) {
|
||||
checkSymlink();
|
||||
}
|
||||
checkAppBundleModTime();
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
checkUpdateLogContents(LOG_COMPLETE_SUCCESS);
|
||||
standardInit();
|
||||
checkCallbackAppLog();
|
||||
}
|
||||
|
||||
function runHelperProcess(args) {
|
||||
let helperBin = getTestDirFile(FILE_HELPER_BIN);
|
||||
let process = Cc["@mozilla.org/process/util;1"].
|
||||
createInstance(Ci.nsIProcess);
|
||||
process.init(helperBin);
|
||||
debugDump("Running " + helperBin.path + " " + args.join(" "));
|
||||
process.run(true, args, args.length);
|
||||
Assert.equal(process.exitValue, 0,
|
||||
"the helper process exit value should be 0");
|
||||
}
|
||||
|
||||
function createSymlink() {
|
||||
let args = ["setup-symlink", "moz-foo", "moz-bar", "target",
|
||||
getApplyDirFile().path + "/" + DIR_RESOURCES + "link"];
|
||||
runHelperProcess(args);
|
||||
getApplyDirFile(DIR_RESOURCES + "link", false).permissions = 0o666;
|
||||
|
||||
args = ["setup-symlink", "moz-foo2", "moz-bar2", "target2",
|
||||
getApplyDirFile().path + "/" + DIR_RESOURCES + "link2", "change-perm"];
|
||||
runHelperProcess(args);
|
||||
}
|
||||
|
||||
function removeSymlink() {
|
||||
let args = ["remove-symlink", "moz-foo", "moz-bar", "target",
|
||||
getApplyDirFile().path + "/" + DIR_RESOURCES + "link"];
|
||||
runHelperProcess(args);
|
||||
args = ["remove-symlink", "moz-foo2", "moz-bar2", "target2",
|
||||
getApplyDirFile().path + "/" + DIR_RESOURCES + "link2"];
|
||||
runHelperProcess(args);
|
||||
}
|
||||
|
||||
function checkSymlink() {
|
||||
let args = ["check-symlink",
|
||||
getApplyDirFile().path + "/" + DIR_RESOURCES + "link"];
|
||||
runHelperProcess(args);
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
/* General Partial MAR File Staged Patch Apply Test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gStageUpdate = true;
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestFiles[gTestFiles.length - 2].originalContents = null;
|
||||
gTestFiles[gTestFiles.length - 2].compareContents = "FromPartial\n";
|
||||
gTestFiles[gTestFiles.length - 2].comparePerms = 0o644;
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
preventDistributionFiles();
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
if (IS_MACOSX) {
|
||||
// Create files in the old distribution directory location to verify that
|
||||
// the directory and its contents are moved to the new location on update.
|
||||
let testFile = getApplyDirFile(DIR_MACOS + "distribution/testFile", true);
|
||||
writeFile(testFile, "test\n");
|
||||
testFile = getApplyDirFile(DIR_MACOS + "distribution/test/testFile", true);
|
||||
writeFile(testFile, "test\n");
|
||||
}
|
||||
|
||||
createUpdaterINI(false);
|
||||
setAppBundleModTime();
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_APPLIED);
|
||||
}
|
||||
|
||||
function checkUpdateFinished() {
|
||||
checkFilesAfterUpdateSuccess(getStageDirFile, true, false);
|
||||
checkUpdateLogContents(LOG_PARTIAL_SUCCESS, true);
|
||||
checkPostUpdateRunningFile(false);
|
||||
|
||||
// Switch the application to the staged application that was updated.
|
||||
gStageUpdate = false;
|
||||
gSwitchApp = true;
|
||||
do_timeout(TEST_CHECK_TIMEOUT, function() {
|
||||
runUpdate(0, STATE_SUCCEEDED, checkUpdateApplied);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the post update binary was properly launched for the platforms that
|
||||
* support launching post update process.
|
||||
*/
|
||||
function checkUpdateApplied() {
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
gCheckFunc = finishCheckUpdateApplied;
|
||||
checkPostUpdateAppLog();
|
||||
} else {
|
||||
finishCheckUpdateApplied();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the update has finished and if it has finished performs checks for
|
||||
* the test.
|
||||
*/
|
||||
function finishCheckUpdateApplied() {
|
||||
checkPostUpdateRunningFile(true);
|
||||
|
||||
let distributionDir = getApplyDirFile(DIR_RESOURCES + "distribution", true);
|
||||
if (IS_MACOSX) {
|
||||
Assert.ok(distributionDir.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
let testFile = getApplyDirFile(DIR_RESOURCES + "distribution/testFile", true);
|
||||
Assert.ok(testFile.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
testFile = getApplyDirFile(DIR_RESOURCES + "distribution/test/testFile", true);
|
||||
Assert.ok(testFile.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
distributionDir = getApplyDirFile(DIR_MACOS + "distribution", true);
|
||||
Assert.ok(!distributionDir.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
checkUpdateLogContains("Moving old distribution directory to new location");
|
||||
} else {
|
||||
debugDump("testing that files aren't added with an add-if instruction " +
|
||||
"when the file's destination directory doesn't exist");
|
||||
Assert.ok(!distributionDir.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
}
|
||||
|
||||
checkAppBundleModTime();
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
checkUpdateLogContents(LOG_PARTIAL_SUCCESS, true);
|
||||
standardInit();
|
||||
checkCallbackAppLog();
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
/* General Complete MAR File Patch Apply Test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesCompleteSuccess;
|
||||
gTestDirs = gTestDirsCompleteSuccess;
|
||||
preventDistributionFiles();
|
||||
setupUpdaterTest(FILE_COMPLETE_MAR);
|
||||
if (IS_MACOSX) {
|
||||
// Create files in the old distribution directory location to verify that
|
||||
// the directory and its contents are moved to the new location on update.
|
||||
let testFile = getApplyDirFile(DIR_MACOS + "distribution/testFile", true);
|
||||
writeFile(testFile, "test\n");
|
||||
testFile = getApplyDirFile(DIR_MACOS + "distribution/test/testFile", true);
|
||||
writeFile(testFile, "test\n");
|
||||
}
|
||||
|
||||
createUpdaterINI();
|
||||
setAppBundleModTime();
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_SUCCEEDED);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the post update binary was properly launched for the platforms that
|
||||
* support launching post update process.
|
||||
*/
|
||||
function checkUpdateFinished() {
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
gCheckFunc = finishCheckUpdateFinished;
|
||||
checkPostUpdateAppLog();
|
||||
} else {
|
||||
finishCheckUpdateFinished();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the update has finished and if it has finished performs checks for
|
||||
* the test.
|
||||
*/
|
||||
function finishCheckUpdateFinished() {
|
||||
let distributionDir = getApplyDirFile(DIR_RESOURCES + "distribution", true);
|
||||
if (IS_MACOSX) {
|
||||
Assert.ok(distributionDir.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
let testFile = getApplyDirFile(DIR_RESOURCES + "distribution/testFile", true);
|
||||
Assert.ok(testFile.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
testFile = getApplyDirFile(DIR_RESOURCES + "distribution/test/testFile", true);
|
||||
Assert.ok(testFile.exists(), MSG_SHOULD_EXIST);
|
||||
|
||||
distributionDir = getApplyDirFile(DIR_MACOS + "distribution", true);
|
||||
Assert.ok(!distributionDir.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
|
||||
checkUpdateLogContains("Moving old distribution directory to new location");
|
||||
} else {
|
||||
debugDump("testing that files aren't added with an add-if instruction " +
|
||||
"when the file's destination directory doesn't exist");
|
||||
Assert.ok(!distributionDir.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
}
|
||||
|
||||
checkAppBundleModTime();
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
checkUpdateLogContents(LOG_COMPLETE_SUCCESS, true);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
/* General Partial MAR File Patch Apply Test */
|
||||
|
||||
function run_test() {
|
||||
if (!shouldRunServiceTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setupTestCommon();
|
||||
gTestFiles = gTestFilesPartialSuccess;
|
||||
gTestFiles[gTestFiles.length - 1].originalContents = null;
|
||||
gTestFiles[gTestFiles.length - 1].compareContents = "FromPartial\n";
|
||||
gTestFiles[gTestFiles.length - 1].comparePerms = 0o644;
|
||||
gTestFiles[gTestFiles.length - 2].originalContents = null;
|
||||
gTestFiles[gTestFiles.length - 2].compareContents = "FromPartial\n";
|
||||
gTestFiles[gTestFiles.length - 2].comparePerms = 0o644;
|
||||
gTestDirs = gTestDirsPartialSuccess;
|
||||
setupUpdaterTest(FILE_PARTIAL_MAR);
|
||||
if (IS_MACOSX) {
|
||||
// Create files in the old distribution directory location to verify that
|
||||
// the directory and its contents are removed when there is a distribution
|
||||
// directory in the new location.
|
||||
let testFile = getApplyDirFile(DIR_MACOS + "distribution/testFile", true);
|
||||
writeFile(testFile, "test\n");
|
||||
testFile = getApplyDirFile(DIR_MACOS + "distribution/test/testFile", true);
|
||||
writeFile(testFile, "test\n");
|
||||
}
|
||||
|
||||
createUpdaterINI(true);
|
||||
setAppBundleModTime();
|
||||
|
||||
setupAppFilesAsync();
|
||||
}
|
||||
|
||||
function setupAppFilesFinished() {
|
||||
runUpdateUsingService(STATE_PENDING_SVC, STATE_SUCCEEDED);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the post update binary was properly launched for the platforms that
|
||||
* support launching post update process.
|
||||
*/
|
||||
function checkUpdateFinished() {
|
||||
if (IS_WIN || IS_MACOSX) {
|
||||
gCheckFunc = finishCheckUpdateFinished;
|
||||
checkPostUpdateAppLog();
|
||||
} else {
|
||||
finishCheckUpdateFinished();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the update has finished and if it has finished performs checks for
|
||||
* the test.
|
||||
*/
|
||||
function finishCheckUpdateFinished() {
|
||||
if (IS_MACOSX) {
|
||||
let distributionDir = getApplyDirFile(DIR_MACOS + "distribution", true);
|
||||
Assert.ok(!distributionDir.exists(), MSG_SHOULD_NOT_EXIST);
|
||||
checkUpdateLogContains("removing old distribution directory");
|
||||
}
|
||||
|
||||
checkAppBundleModTime();
|
||||
checkFilesAfterUpdateSuccess(getApplyDirFile, false, false);
|
||||
checkUpdateLogContents(LOG_PARTIAL_SUCCESS);
|
||||
standardInit();
|
||||
checkCallbackServiceLog();
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
; This Source Code Form is subject to the terms of the Mozilla Public
|
||||
; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
; Tests that require the updater binary and the maintenance service.
|
||||
|
||||
[DEFAULT]
|
||||
tags = appupdate
|
||||
head = head_update.js
|
||||
tail =
|
||||
|
||||
[bootstrapSvc.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marSuccessCompleteSvc.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marSuccessPartialSvc.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marFailurePartialSvc.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marStageSuccessCompleteSvc.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marStageSuccessPartialSvc.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marStageFailurePartialSvc.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marCallbackAppSuccessCompleteSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marCallbackAppSuccessPartialSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marCallbackAppStageSuccessCompleteSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marCallbackAppStageSuccessPartialSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marAppInUseSuccessCompleteSvc.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marAppInUseStageFailureCompleteSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marFileLockedFailureCompleteSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marFileLockedFailurePartialSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marFileLockedStageFailureCompleteSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marFileLockedStageFailurePartialSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marFileInUseSuccessCompleteSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marFileInUseSuccessPartialSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marRMRFDirFileInUseSuccessCompleteSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marRMRFDirFileInUseSuccessPartialSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marFileInUseStageFailureCompleteSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marFileInUseStageFailurePartialSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marRMRFDirFileInUseStageFailureCompleteSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marRMRFDirFileInUseStageFailurePartialSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marAppApplyDirLockedStageFailureSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marAppApplyUpdateAppBinInUseStageSuccessSvc_win.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marAppApplyUpdateSuccessSvc.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[marAppApplyUpdateStageSuccessSvc.js]
|
||||
run-sequentially = Uses the Mozilla Maintenance Service.
|
||||
[checkUpdaterSigSvc.js]
|
||||
@@ -3,6 +3,8 @@
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
# For changes here, also consider ./updater-xpcshell/Makefile.in
|
||||
|
||||
ifndef MOZ_WINCONSOLE
|
||||
ifdef MOZ_DEBUG
|
||||
MOZ_WINCONSOLE = 1
|
||||
@@ -43,5 +45,3 @@ libs::
|
||||
$(NSINSTALL) $(DIST)/bin/updater $(DIST)/bin/updater.app/Contents/MacOS
|
||||
rm -f $(DIST)/bin/updater
|
||||
endif
|
||||
|
||||
CXXFLAGS += $(MOZ_BZ2_CFLAGS)
|
||||
|
||||
@@ -17,9 +17,14 @@
|
||||
|
||||
// These are generated at compile time based on the DER file for the channel
|
||||
// being used
|
||||
#ifdef MOZ_VERIFY_MAR_SIGNATURE
|
||||
#ifdef TEST_UPDATER
|
||||
#include "../xpcshellCert.h"
|
||||
#else
|
||||
#include "primaryCert.h"
|
||||
#include "secondaryCert.h"
|
||||
#include "xpcshellCert.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define UPDATER_NO_STRING_GLUE_STL
|
||||
#include "nsVersionComparator.cpp"
|
||||
@@ -77,21 +82,19 @@ ArchiveReader::VerifySignature()
|
||||
return ARCHIVE_NOT_OPEN;
|
||||
}
|
||||
|
||||
// If the fallback key exists we're running an XPCShell test and we should
|
||||
// use the XPCShell specific cert for the signed MAR.
|
||||
int rv = OK;
|
||||
#ifdef XP_WIN
|
||||
if (DoesFallbackKeyExist()) {
|
||||
rv = VerifyLoadedCert(mArchive, xpcshellCertData);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
rv = VerifyLoadedCert(mArchive, primaryCertData);
|
||||
if (rv != OK) {
|
||||
rv = VerifyLoadedCert(mArchive, secondaryCertData);
|
||||
}
|
||||
#ifndef MOZ_VERIFY_MAR_SIGNATURE
|
||||
return OK;
|
||||
#else
|
||||
#ifdef TEST_UPDATER
|
||||
int rv = VerifyLoadedCert(mArchive, xpcshellCertData);
|
||||
#else
|
||||
int rv = VerifyLoadedCert(mArchive, primaryCertData);
|
||||
if (rv != OK) {
|
||||
rv = VerifyLoadedCert(mArchive, secondaryCertData);
|
||||
}
|
||||
#endif
|
||||
return rv;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -6,123 +6,9 @@
|
||||
|
||||
Program('updater')
|
||||
|
||||
SOURCES += [
|
||||
'archivereader.cpp',
|
||||
'bspatch.cpp',
|
||||
'updater.cpp',
|
||||
]
|
||||
updater_rel_path = ''
|
||||
include('updater-common.build')
|
||||
if CONFIG['ENABLE_TESTS']:
|
||||
DIRS += ['updater-xpcshell']
|
||||
|
||||
have_progressui = 0
|
||||
|
||||
if CONFIG['MOZ_VERIFY_MAR_SIGNATURE']:
|
||||
USE_LIBS += [
|
||||
'verifymar',
|
||||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] == 'WINNT':
|
||||
have_progressui = 1
|
||||
SOURCES += [
|
||||
'loaddlls.cpp',
|
||||
'progressui_win.cpp',
|
||||
'win_dirent.cpp',
|
||||
]
|
||||
RCINCLUDE = 'updater.rc'
|
||||
DEFINES['UNICODE'] = True
|
||||
DEFINES['_UNICODE'] = True
|
||||
DEFINES['NOMINMAX'] = True
|
||||
USE_STATIC_LIBS = True
|
||||
|
||||
# Pick up nsWindowsRestart.cpp
|
||||
LOCAL_INCLUDES += [
|
||||
'/toolkit/xre',
|
||||
]
|
||||
USE_LIBS += [
|
||||
'updatecommon-standalone',
|
||||
]
|
||||
OS_LIBS += [
|
||||
'comctl32',
|
||||
'ws2_32',
|
||||
'shell32',
|
||||
'shlwapi',
|
||||
'crypt32',
|
||||
'advapi32',
|
||||
]
|
||||
elif CONFIG['OS_ARCH'] == 'Linux':
|
||||
USE_LIBS += [
|
||||
'updatecommon',
|
||||
'/modules/libmar/sign/signmar',
|
||||
'/security/nss/lib/nss/nss3',
|
||||
'/security/nss/lib/util/nssutil3',
|
||||
]
|
||||
OS_LIBS += CONFIG['NSPR_LIBS']
|
||||
else:
|
||||
USE_LIBS += [
|
||||
'updatecommon',
|
||||
]
|
||||
|
||||
USE_LIBS += [
|
||||
'mar',
|
||||
]
|
||||
|
||||
if CONFIG['MOZ_NATIVE_BZ2']:
|
||||
OS_LIBS += CONFIG['MOZ_BZ2_LIBS']
|
||||
else:
|
||||
USE_LIBS += [
|
||||
'bz2',
|
||||
]
|
||||
|
||||
if CONFIG['MOZ_ENABLE_GTK']:
|
||||
have_progressui = 1
|
||||
SOURCES += [
|
||||
'progressui_gtk.cpp',
|
||||
]
|
||||
|
||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
|
||||
have_progressui = 1
|
||||
SOURCES += [
|
||||
'launchchild_osx.mm',
|
||||
'progressui_osx.mm',
|
||||
]
|
||||
OS_LIBS += ['-framework Cocoa -framework Security']
|
||||
elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
|
||||
have_progressui = 1
|
||||
SOURCES += [
|
||||
'automounter_gonk.cpp',
|
||||
'progressui_gonk.cpp',
|
||||
]
|
||||
DISABLE_STL_WRAPPING = True
|
||||
OS_LIBS += [
|
||||
'cutils',
|
||||
'sysutils',
|
||||
]
|
||||
|
||||
if have_progressui == 0:
|
||||
SOURCES += [
|
||||
'progressui_null.cpp',
|
||||
]
|
||||
|
||||
DEFINES['NS_NO_XPCOM'] = True
|
||||
DISABLE_STL_WRAPPING = True
|
||||
for var in ('MAR_CHANNEL_ID', 'MOZ_APP_VERSION'):
|
||||
DEFINES[var] = '"%s"' % CONFIG[var]
|
||||
|
||||
LOCAL_INCLUDES += [
|
||||
'../common',
|
||||
'/xpcom/glue',
|
||||
]
|
||||
|
||||
DELAYLOAD_DLLS += [
|
||||
'crypt32.dll',
|
||||
'comctl32.dll',
|
||||
'userenv.dll',
|
||||
'wsock32.dll',
|
||||
]
|
||||
|
||||
if CONFIG['_MSC_VER']:
|
||||
WIN32_EXE_LDFLAGS += ['-ENTRY:wmainCRTStartup']
|
||||
elif CONFIG['OS_ARCH'] == 'WINNT':
|
||||
WIN32_EXE_LDFLAGS += ['-municode']
|
||||
|
||||
if CONFIG['MOZ_WIDGET_GTK']:
|
||||
CXXFLAGS += CONFIG['TK_CFLAGS']
|
||||
OS_LIBS += CONFIG['TK_LIBS']
|
||||
CXXFLAGS += CONFIG['MOZ_BZ2_CFLAGS']
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
# vim: set filetype=python:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
srcs = [
|
||||
'archivereader.cpp',
|
||||
'bspatch.cpp',
|
||||
'updater.cpp',
|
||||
]
|
||||
|
||||
have_progressui = 0
|
||||
|
||||
if CONFIG['MOZ_VERIFY_MAR_SIGNATURE']:
|
||||
USE_LIBS += [
|
||||
'verifymar',
|
||||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] == 'WINNT':
|
||||
have_progressui = 1
|
||||
srcs += [
|
||||
'loaddlls.cpp',
|
||||
'progressui_win.cpp',
|
||||
'win_dirent.cpp',
|
||||
]
|
||||
RCINCLUDE = '%supdater.rc' % updater_rel_path
|
||||
DEFINES['UNICODE'] = True
|
||||
DEFINES['_UNICODE'] = True
|
||||
DEFINES['NOMINMAX'] = True
|
||||
USE_STATIC_LIBS = True
|
||||
|
||||
# Pick up nsWindowsRestart.cpp
|
||||
LOCAL_INCLUDES += [
|
||||
'/toolkit/xre',
|
||||
]
|
||||
USE_LIBS += [
|
||||
'updatecommon-standalone',
|
||||
]
|
||||
OS_LIBS += [
|
||||
'comctl32',
|
||||
'ws2_32',
|
||||
'shell32',
|
||||
'shlwapi',
|
||||
'crypt32',
|
||||
'advapi32',
|
||||
]
|
||||
elif CONFIG['OS_ARCH'] == 'Linux' and CONFIG['MOZ_VERIFY_MAR_SIGNATURE']:
|
||||
USE_LIBS += [
|
||||
'nss',
|
||||
'signmar',
|
||||
'updatecommon',
|
||||
]
|
||||
OS_LIBS += CONFIG['nspr']
|
||||
else:
|
||||
USE_LIBS += [
|
||||
'updatecommon',
|
||||
]
|
||||
|
||||
USE_LIBS += [
|
||||
'mar',
|
||||
]
|
||||
|
||||
if CONFIG['MOZ_NATIVE_BZ2']:
|
||||
OS_LIBS += CONFIG['MOZ_BZ2_LIBS']
|
||||
else:
|
||||
USE_LIBS += [
|
||||
'bz2',
|
||||
]
|
||||
|
||||
if CONFIG['MOZ_ENABLE_GTK']:
|
||||
have_progressui = 1
|
||||
srcs += [
|
||||
'progressui_gtk.cpp',
|
||||
]
|
||||
|
||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
|
||||
have_progressui = 1
|
||||
srcs += [
|
||||
'launchchild_osx.mm',
|
||||
'progressui_osx.mm',
|
||||
]
|
||||
OS_LIBS += [
|
||||
'-framework Cocoa',
|
||||
'-framework Security',
|
||||
]
|
||||
elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
|
||||
have_progressui = 1
|
||||
srcs += [
|
||||
'automounter_gonk.cpp',
|
||||
'progressui_gonk.cpp',
|
||||
]
|
||||
DISABLE_STL_WRAPPING = True
|
||||
OS_LIBS += [
|
||||
'cutils',
|
||||
'sysutils',
|
||||
]
|
||||
|
||||
if have_progressui == 0:
|
||||
srcs += [
|
||||
'progressui_null.cpp',
|
||||
]
|
||||
|
||||
SOURCES += ['%s%s' % (updater_rel_path, f) for f in sorted(srcs)]
|
||||
|
||||
DEFINES['NS_NO_XPCOM'] = True
|
||||
DISABLE_STL_WRAPPING = True
|
||||
for var in ('MAR_CHANNEL_ID', 'MOZ_APP_VERSION'):
|
||||
DEFINES[var] = '"%s"' % CONFIG[var]
|
||||
|
||||
LOCAL_INCLUDES += [
|
||||
'/toolkit/mozapps/update/common',
|
||||
'/xpcom/glue',
|
||||
]
|
||||
|
||||
DELAYLOAD_DLLS += [
|
||||
'crypt32.dll',
|
||||
'comctl32.dll',
|
||||
'userenv.dll',
|
||||
'wsock32.dll',
|
||||
]
|
||||
|
||||
if CONFIG['_MSC_VER']:
|
||||
WIN32_EXE_LDFLAGS += ['-ENTRY:wmainCRTStartup']
|
||||
elif CONFIG['OS_ARCH'] == 'WINNT':
|
||||
WIN32_EXE_LDFLAGS += ['-municode']
|
||||
|
||||
if CONFIG['MOZ_WIDGET_GTK']:
|
||||
CXXFLAGS += CONFIG['TK_CFLAGS']
|
||||
OS_LIBS += CONFIG['TK_LIBS']
|
||||
@@ -0,0 +1,40 @@
|
||||
# vim:set ts=8 sw=8 sts=8 noet:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
# For changes here, also consider ../Makefile.in
|
||||
|
||||
XPCSHELLTESTROOT = $(abspath $(DEPTH))/_tests/xpcshell/toolkit/mozapps/update/tests
|
||||
MOCHITESTROOT = $(abspath $(DEPTH))/_tests/testing/mochitest/chrome/toolkit/mozapps/update/tests
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
ifndef MOZ_WINCONSOLE
|
||||
ifdef MOZ_DEBUG
|
||||
MOZ_WINCONSOLE = 1
|
||||
else
|
||||
MOZ_WINCONSOLE = 0
|
||||
endif
|
||||
endif
|
||||
|
||||
libs::
|
||||
ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
|
||||
# Copy for xpcshell tests
|
||||
$(NSINSTALL) -D $(XPCSHELLTESTROOT)/data/updater-xpcshell.app
|
||||
rsync -a -C --exclude '*.in' $(srcdir)/../macbuild/Contents $(XPCSHELLTESTROOT)/data/updater-xpcshell.app
|
||||
sed -e 's/%APP_NAME%/$(MOZ_APP_DISPLAYNAME)/' $(srcdir)/../macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | \
|
||||
iconv -f UTF-8 -t UTF-16 > $(XPCSHELLTESTROOT)/data/updater-xpcshell.app/Contents/Resources/English.lproj/InfoPlist.strings
|
||||
$(NSINSTALL) -D $(XPCSHELLTESTROOT)/data/updater-xpcshell.app/Contents/MacOS/updater-xpcshell
|
||||
$(NSINSTALL) $(PROGRAM) $(XPCSHELLTESTROOT)/data/updater-xpcshell.app/Contents/MacOS
|
||||
rm -f $(PROGRAM)
|
||||
rm -Rf $(XPCSHELLTESTROOT)/data/updater.app
|
||||
mv $(XPCSHELLTESTROOT)/data/updater-xpcshell.app $(XPCSHELLTESTROOT)/data/updater.app
|
||||
mv $(XPCSHELLTESTROOT)/data/updater.app/Contents/MacOS/updater-xpcshell $(XPCSHELLTESTROOT)/data/updater.app/Contents/MacOS/updater
|
||||
|
||||
# Copy for mochitest chrome tests
|
||||
rsync -a -C $(XPCSHELLTESTROOT)/data/updater.app $(MOCHITESTROOT)/data/updater.app
|
||||
else
|
||||
cp $(PROGRAM) $(XPCSHELLTESTROOT)/data/updater$(BIN_SUFFIX)
|
||||
cp $(PROGRAM) $(MOCHITESTROOT)/data/updater$(BIN_SUFFIX)
|
||||
endif
|
||||
@@ -0,0 +1,14 @@
|
||||
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
# vim: set filetype=python:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
Program('updater-xpcshell')
|
||||
|
||||
updater_rel_path = '../'
|
||||
DIST_INSTALL = False
|
||||
DEFINES['TEST_UPDATER'] = True
|
||||
include('../updater-common.build')
|
||||
|
||||
CXXFLAGS += CONFIG['MOZ_BZ2_CFLAGS']
|
||||
@@ -2342,7 +2342,12 @@ UpdateThreadFunc(void *param)
|
||||
NS_tchar updateSettingsPath[MAX_TEXT_LEN];
|
||||
NS_tsnprintf(updateSettingsPath,
|
||||
sizeof(updateSettingsPath) / sizeof(updateSettingsPath[0]),
|
||||
NS_T("%s/update-settings.ini"), gWorkingDirPath);
|
||||
#ifdef XP_MACOSX
|
||||
NS_T("%s/Contents/Resources/update-settings.ini"),
|
||||
#else
|
||||
NS_T("%s/update-settings.ini"),
|
||||
#endif
|
||||
gWorkingDirPath);
|
||||
MARChannelStringTable MARStrings;
|
||||
if (ReadMARChannelIDs(updateSettingsPath, &MARStrings) != OK) {
|
||||
// If we can't read from update-settings.ini then we shouldn't impose
|
||||
@@ -2357,7 +2362,18 @@ UpdateThreadFunc(void *param)
|
||||
#endif
|
||||
|
||||
if (rv == OK && sStagedUpdate && !sIsOSUpdate) {
|
||||
#ifdef TEST_UPDATER
|
||||
// The MOZ_TEST_SKIP_UPDATE_STAGE environment variable prevents copying
|
||||
// the files in dist/bin in the test updater when staging an update since
|
||||
// this can cause tests to timeout.
|
||||
if (getenv("MOZ_TEST_SKIP_UPDATE_STAGE")) {
|
||||
rv = OK;
|
||||
} else {
|
||||
rv = CopyInstallDirToDestDir();
|
||||
}
|
||||
#else
|
||||
rv = CopyInstallDirToDestDir();
|
||||
#endif
|
||||
}
|
||||
|
||||
if (rv == OK) {
|
||||
|
||||
@@ -4,7 +4,17 @@
|
||||
|
||||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#ifdef TEST_UPDATER
|
||||
#include "../resource.h"
|
||||
#define MANIFEST_PATH "../updater.exe.manifest"
|
||||
#define COMCTL32_MANIFEST_PATH "../updater.exe.comctl32.manifest"
|
||||
#define ICON_PATH "../updater.ico"
|
||||
#else
|
||||
#include "resource.h"
|
||||
#define MANIFEST_PATH "updater.exe.manifest"
|
||||
#define COMCTL32_MANIFEST_PATH "updater.exe.comctl32.manifest"
|
||||
#define ICON_PATH "updater.ico"
|
||||
#endif
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
@@ -30,15 +40,15 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
// RT_MANIFEST
|
||||
//
|
||||
|
||||
1 RT_MANIFEST "updater.exe.manifest"
|
||||
IDR_COMCTL32_MANIFEST RT_MANIFEST "updater.exe.comctl32.manifest"
|
||||
1 RT_MANIFEST MANIFEST_PATH
|
||||
IDR_COMCTL32_MANIFEST RT_MANIFEST COMCTL32_MANIFEST_PATH
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
IDI_DIALOG ICON "updater.ico"
|
||||
IDI_DIALOG ICON ICON_PATH
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
+15
-14
@@ -58,22 +58,23 @@ NS_EVENT_MESSAGE(eMouseActivate, eMouseEventFirst + 30)
|
||||
NS_EVENT_MESSAGE(eMouseOver, eMouseEventFirst + 31)
|
||||
NS_EVENT_MESSAGE(eMouseOut, eMouseEventFirst + 32)
|
||||
NS_EVENT_MESSAGE(eMouseHitTest, eMouseEventFirst + 33)
|
||||
NS_EVENT_MESSAGE(NS_MOUSEENTER, eMouseEventFirst + 34)
|
||||
NS_EVENT_MESSAGE(NS_MOUSELEAVE, eMouseEventFirst + 35)
|
||||
NS_EVENT_MESSAGE(NS_MOUSE_MOZLONGTAP, eMouseEventFirst + 36)
|
||||
NS_EVENT_MESSAGE(eMouseEnter, eMouseEventFirst + 34)
|
||||
NS_EVENT_MESSAGE(eMouseLeave, eMouseEventFirst + 35)
|
||||
NS_EVENT_MESSAGE(eMouseLongTap, eMouseEventFirst + 36)
|
||||
|
||||
// Pointer spec events
|
||||
NS_EVENT_MESSAGE(NS_POINTER_EVENT_START, 4400)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_MOVE, NS_POINTER_EVENT_START)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_UP, NS_POINTER_EVENT_START + 1)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_DOWN, NS_POINTER_EVENT_START + 2)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_OVER, NS_POINTER_EVENT_START + 22)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_OUT, NS_POINTER_EVENT_START + 23)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_ENTER, NS_POINTER_EVENT_START + 24)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_LEAVE, NS_POINTER_EVENT_START + 25)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_CANCEL, NS_POINTER_EVENT_START + 26)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_GOT_CAPTURE, NS_POINTER_EVENT_START + 27)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_LOST_CAPTURE, NS_POINTER_EVENT_START + 28)
|
||||
NS_EVENT_MESSAGE(ePointerEventFirst, 4400)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_MOVE, ePointerEventFirst)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_UP, ePointerEventFirst + 1)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_DOWN, ePointerEventFirst + 2)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_OVER, ePointerEventFirst + 22)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_OUT, ePointerEventFirst + 23)
|
||||
NS_EVENT_MESSAGE(NS_POINTER_ENTER, ePointerEventFirst + 24)
|
||||
NS_EVENT_MESSAGE(ePointerLeave, ePointerEventFirst + 25)
|
||||
NS_EVENT_MESSAGE(ePointerCancel, ePointerEventFirst + 26)
|
||||
NS_EVENT_MESSAGE(ePointerGotCapture, ePointerEventFirst + 27)
|
||||
NS_EVENT_MESSAGE(ePointerLostCapture, ePointerEventFirst + 28)
|
||||
NS_EVENT_MESSAGE(ePointerEventLast, ePointerLostCapture)
|
||||
|
||||
NS_EVENT_MESSAGE(NS_CONTEXTMENU_MESSAGE_START, 500)
|
||||
NS_EVENT_MESSAGE(NS_CONTEXTMENU, NS_CONTEXTMENU_MESSAGE_START)
|
||||
|
||||
@@ -204,8 +204,8 @@ protected:
|
||||
, clickCount(0)
|
||||
{
|
||||
switch (aMessage) {
|
||||
case NS_MOUSEENTER:
|
||||
case NS_MOUSELEAVE:
|
||||
case eMouseEnter:
|
||||
case eMouseLeave:
|
||||
mFlags.mBubbles = false;
|
||||
mFlags.mCancelable = false;
|
||||
break;
|
||||
@@ -224,8 +224,8 @@ public:
|
||||
reason(aReason), context(aContext), exit(eChild), clickCount(0)
|
||||
{
|
||||
switch (aMessage) {
|
||||
case NS_MOUSEENTER:
|
||||
case NS_MOUSELEAVE:
|
||||
case eMouseEnter:
|
||||
case eMouseLeave:
|
||||
mFlags.mBubbles = false;
|
||||
mFlags.mCancelable = false;
|
||||
break;
|
||||
@@ -626,13 +626,13 @@ public:
|
||||
{
|
||||
switch (mMessage) {
|
||||
case NS_POINTER_ENTER:
|
||||
case NS_POINTER_LEAVE:
|
||||
case ePointerLeave:
|
||||
mFlags.mBubbles = false;
|
||||
mFlags.mCancelable = false;
|
||||
break;
|
||||
case NS_POINTER_CANCEL:
|
||||
case NS_POINTER_GOT_CAPTURE:
|
||||
case NS_POINTER_LOST_CAPTURE:
|
||||
case ePointerCancel:
|
||||
case ePointerGotCapture:
|
||||
case ePointerLostCapture:
|
||||
mFlags.mCancelable = false;
|
||||
break;
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user