зеркало из https://github.com/mozilla/gecko-dev.git
Merge last PGO-green changeset of mozilla-inbound to mozilla-central
This commit is contained in:
Коммит
fda7933881
|
@ -46,7 +46,9 @@ function virtualCursorControl(aMessage) {
|
|||
moved = vc[details.action](rule);
|
||||
}
|
||||
} catch (x) {
|
||||
moved = vc.moveNext(rule, content.document.activeElement, true);
|
||||
let acc = Utils.AccRetrieval.
|
||||
getAccessibleFor(content.document.activeElement);
|
||||
moved = vc.moveNext(rule, acc, true);
|
||||
}
|
||||
break;
|
||||
case 'moveToPoint':
|
||||
|
@ -88,7 +90,7 @@ function forwardMessage(aVirtualCursor, aMessage) {
|
|||
return true;
|
||||
}
|
||||
} catch (x) {
|
||||
Logger.error(x);
|
||||
// Frame may be hidden, we regard this case as false.
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -158,26 +158,7 @@ const gXPInstallObserver = {
|
|||
}
|
||||
else {
|
||||
messageString = gNavigatorBundle.getString("addonsInstalled");
|
||||
action = {
|
||||
label: gNavigatorBundle.getString("addonInstallManage"),
|
||||
accessKey: gNavigatorBundle.getString("addonInstallManage.accesskey"),
|
||||
callback: function() {
|
||||
// Calculate the add-on type that is most popular in the list of
|
||||
// installs
|
||||
var types = {};
|
||||
var bestType = null;
|
||||
for (let install of installInfo.installs) {
|
||||
if (install.type in types)
|
||||
types[install.type]++;
|
||||
else
|
||||
types[install.type] = 1;
|
||||
if (!bestType || types[install.type] > types[bestType])
|
||||
bestType = install.type;
|
||||
}
|
||||
|
||||
BrowserOpenAddonsMgr("addons://list/" + bestType);
|
||||
}
|
||||
};
|
||||
action = null;
|
||||
}
|
||||
|
||||
messageString = PluralForm.get(installInfo.installs.length, messageString);
|
||||
|
|
|
@ -4158,7 +4158,7 @@ var XULBrowserWindow = {
|
|||
// Don't need to re-enable/disable find commands for same-document location changes
|
||||
// (e.g. the replaceStates in about:addons)
|
||||
if (!(aFlags & nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT)) {
|
||||
if (content.document.readyState == 'interactive' || content.document.readyState == "complete")
|
||||
if (content.document.readyState == "interactive" || content.document.readyState == "complete")
|
||||
disableFindCommands(shouldDisableFind(content.document));
|
||||
else {
|
||||
content.document.addEventListener("readystatechange", onContentRSChange);
|
||||
|
|
|
@ -336,7 +336,6 @@ function test_restartless() {
|
|||
wait_for_notification(function(aPanel) {
|
||||
let notification = aPanel.childNodes[0];
|
||||
is(notification.id, "addon-install-complete-notification", "Should have seen the install complete");
|
||||
is(notification.button.label, "Open Add-ons Manager", "Should have seen the right button");
|
||||
is(notification.getAttribute("label"),
|
||||
"XPI Test has been installed successfully.",
|
||||
"Should have seen the right message");
|
||||
|
|
|
@ -48,8 +48,6 @@ addonsInstalled=#1 has been installed successfully.;#2 add-ons have been install
|
|||
addonsInstalledNeedsRestart=#1 will be installed after you restart #3.;#2 add-ons will be installed after you restart #3.
|
||||
addonInstallRestartButton=Restart Now
|
||||
addonInstallRestartButton.accesskey=R
|
||||
addonInstallManage=Open Add-ons Manager
|
||||
addonInstallManage.accesskey=O
|
||||
|
||||
# LOCALIZATION NOTE (addonError-1, addonError-2, addonError-3, addonError-4):
|
||||
# #1 is the add-on name, #2 is the host name, #3 is the application name
|
||||
|
|
|
@ -2165,6 +2165,11 @@ ia64*-hpux*)
|
|||
DLL_PREFIX=
|
||||
IMPORT_LIB_SUFFIX=dll.a
|
||||
GCC_VERSION=`$CC -v 2>&1 | awk '/^gcc version/ { print $3 }'`
|
||||
|
||||
# We use mix of both POSIX and Win32 printf format across the tree, so format
|
||||
# warnings are useless on mingw.
|
||||
MOZ_C_SUPPORTS_WARNING(-Wno-, format, ac_c_has_wno_format)
|
||||
MOZ_CXX_SUPPORTS_WARNING(-Wno-, format, ac_cxx_has_wno_format)
|
||||
else
|
||||
TARGET_COMPILER_ABI=msvc
|
||||
HOST_CC='$(CC)'
|
||||
|
|
|
@ -699,6 +699,7 @@ GK_ATOM(onhashchange, "onhashchange")
|
|||
GK_ATOM(onheld, "onheld")
|
||||
GK_ATOM(onholding, "onholding")
|
||||
GK_ATOM(oniccinfochange, "oniccinfochange")
|
||||
GK_ATOM(onicccardlockerror, "onicccardlockerror")
|
||||
GK_ATOM(onincoming, "onincoming")
|
||||
GK_ATOM(oninput, "oninput")
|
||||
GK_ATOM(oninvalid, "oninvalid")
|
||||
|
|
|
@ -16,6 +16,7 @@ include $(topsrcdir)/dom/dom-config.mk
|
|||
XPIDLSRCS = \
|
||||
nsIDOMIccManager.idl \
|
||||
SimToolKit.idl \
|
||||
nsIDOMICCCardLockErrorEvent.idl \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
/* 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/. */
|
||||
|
||||
#include "nsIDOMEvent.idl"
|
||||
|
||||
[scriptable, builtinclass, uuid(109c1117-1199-47aa-aad2-ea9f456220fa)]
|
||||
interface nsIDOMICCCardLockErrorEvent : nsIDOMEvent
|
||||
{
|
||||
readonly attribute DOMString lockType;
|
||||
readonly attribute long retryCount;
|
||||
|
||||
[noscript] void initICCCardLockErrorEvent(in DOMString aType,
|
||||
in boolean aCanBubble,
|
||||
in boolean aCancelable,
|
||||
in DOMString aLockType,
|
||||
in int32_t aRetryCount);
|
||||
};
|
||||
|
||||
dictionary ICCCardLockErrorEventInit : EventInit
|
||||
{
|
||||
DOMString lockType;
|
||||
long retryCount;
|
||||
};
|
|
@ -12,7 +12,7 @@ interface nsIDOMMozMobileNetworkInfo;
|
|||
interface nsIDOMMozMobileCellInfo;
|
||||
interface nsIDOMMozIccManager;
|
||||
|
||||
[scriptable, builtinclass, uuid(f7bddd87-e967-4f97-9481-2042beb86a92)]
|
||||
[scriptable, builtinclass, uuid(5362762c-7091-4da9-aecd-ba878bc51b3d)]
|
||||
interface nsIDOMMozMobileConnection : nsIDOMEventTarget
|
||||
{
|
||||
/**
|
||||
|
@ -260,6 +260,12 @@ interface nsIDOMMozMobileConnection : nsIDOMEventTarget
|
|||
* receives an error from the RIL
|
||||
*/
|
||||
[implicit_jscontext] attribute jsval ondataerror;
|
||||
|
||||
/**
|
||||
* The 'icccardlockerror' event is notified whenever 'unlockCardLock' or
|
||||
* 'setCardLock' fails.
|
||||
*/
|
||||
[implicit_jscontext] attribute jsval onicccardlockerror;
|
||||
};
|
||||
|
||||
[scriptable, uuid(5ea0e4a9-4684-40da-9930-8ebb61d187f3)]
|
||||
|
|
|
@ -11,6 +11,13 @@
|
|||
#include "DataErrorEvent.h"
|
||||
#include "mozilla/Services.h"
|
||||
#include "IccManager.h"
|
||||
#include "GeneratedEvents.h"
|
||||
#include "nsIDOMICCCardLockErrorEvent.h"
|
||||
|
||||
#include "nsContentUtils.h"
|
||||
#include "nsJSUtils.h"
|
||||
#include "nsJSON.h"
|
||||
#include "jsapi.h"
|
||||
|
||||
#define NS_RILCONTENTHELPER_CONTRACTID "@mozilla.org/ril/content-helper;1"
|
||||
|
||||
|
@ -20,6 +27,7 @@
|
|||
#define ICCINFOCHANGE_EVENTNAME NS_LITERAL_STRING("iccinfochange")
|
||||
#define USSDRECEIVED_EVENTNAME NS_LITERAL_STRING("ussdreceived")
|
||||
#define DATAERROR_EVENTNAME NS_LITERAL_STRING("dataerror")
|
||||
#define ICCCARDLOCKERROR_EVENTNAME NS_LITERAL_STRING("icccardlockerror")
|
||||
|
||||
DOMCI_DATA(MozMobileConnection, mozilla::dom::network::MobileConnection)
|
||||
|
||||
|
@ -33,6 +41,7 @@ const char* kCardStateChangedTopic = "mobile-connection-cardstate-changed";
|
|||
const char* kIccInfoChangedTopic = "mobile-connection-iccinfo-changed";
|
||||
const char* kUssdReceivedTopic = "mobile-connection-ussd-received";
|
||||
const char* kDataErrorTopic = "mobile-connection-data-error";
|
||||
const char* kIccCardLockErrorTopic = "mobile-connection-icccardlock-error";
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_CLASS(MobileConnection)
|
||||
|
||||
|
@ -61,6 +70,7 @@ NS_IMPL_EVENT_HANDLER(MobileConnection, voicechange)
|
|||
NS_IMPL_EVENT_HANDLER(MobileConnection, datachange)
|
||||
NS_IMPL_EVENT_HANDLER(MobileConnection, ussdreceived)
|
||||
NS_IMPL_EVENT_HANDLER(MobileConnection, dataerror)
|
||||
NS_IMPL_EVENT_HANDLER(MobileConnection, icccardlockerror)
|
||||
|
||||
MobileConnection::MobileConnection()
|
||||
{
|
||||
|
@ -90,6 +100,7 @@ MobileConnection::Init(nsPIDOMWindow* aWindow)
|
|||
obs->AddObserver(this, kIccInfoChangedTopic, false);
|
||||
obs->AddObserver(this, kUssdReceivedTopic, false);
|
||||
obs->AddObserver(this, kDataErrorTopic, false);
|
||||
obs->AddObserver(this, kIccCardLockErrorTopic, false);
|
||||
|
||||
mIccManager = new icc::IccManager();
|
||||
mIccManager->Init(aWindow);
|
||||
|
@ -110,6 +121,7 @@ MobileConnection::Shutdown()
|
|||
obs->RemoveObserver(this, kIccInfoChangedTopic);
|
||||
obs->RemoveObserver(this, kUssdReceivedTopic);
|
||||
obs->RemoveObserver(this, kDataErrorTopic);
|
||||
obs->RemoveObserver(this, kIccCardLockErrorTopic);
|
||||
|
||||
if (mIccManager) {
|
||||
mIccManager->Shutdown();
|
||||
|
@ -168,6 +180,60 @@ MobileConnection::Observe(nsISupports* aSubject,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
if (!strcmp(aTopic, kIccCardLockErrorTopic)) {
|
||||
nsString errorMsg;
|
||||
errorMsg.Assign(aData);
|
||||
|
||||
if (errorMsg.IsEmpty()) {
|
||||
NS_ERROR("Got a 'icc-cardlock-error' topic without a valid message!");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsString lockType;
|
||||
int32_t retryCount = -1;
|
||||
|
||||
// Decode the json string "errorMsg" and retrieve its properties:
|
||||
// "lockType" and "retryCount".
|
||||
nsresult rv;
|
||||
nsIScriptContext* sc = GetContextForEventHandlers(&rv);
|
||||
NS_ENSURE_STATE(sc);
|
||||
JSContext* cx = sc->GetNativeContext();
|
||||
NS_ASSERTION(cx, "Failed to get a context!");
|
||||
|
||||
nsCOMPtr<nsIJSON> json(new nsJSON());
|
||||
jsval error;
|
||||
rv = json->DecodeToJSVal(errorMsg, cx, &error);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
jsval type;
|
||||
if (JS_GetProperty(cx, JSVAL_TO_OBJECT(error), "lockType", &type)) {
|
||||
if (JSVAL_IS_STRING(type)) {
|
||||
nsDependentJSString str;
|
||||
str.init(cx, type.toString());
|
||||
lockType.Assign(str);
|
||||
}
|
||||
}
|
||||
|
||||
jsval count;
|
||||
if (JS_GetProperty(cx, JSVAL_TO_OBJECT(error), "retryCount", &count)) {
|
||||
if (JSVAL_IS_NUMBER(count)) {
|
||||
retryCount = count.toNumber();
|
||||
}
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIDOMEvent> event;
|
||||
NS_NewDOMICCCardLockErrorEvent(getter_AddRefs(event), nullptr, nullptr);
|
||||
|
||||
nsCOMPtr<nsIDOMICCCardLockErrorEvent> e = do_QueryInterface(event);
|
||||
e->InitICCCardLockErrorEvent(NS_LITERAL_STRING("icccardlockerror"),
|
||||
false, false, lockType, retryCount);
|
||||
e->SetTrusted(true);
|
||||
bool dummy;
|
||||
DispatchEvent(event, &dummy);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
MOZ_NOT_REACHED("Unknown observer topic!");
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -73,6 +73,7 @@ const kUssdReceivedTopic = "mobile-connection-ussd-received";
|
|||
const kStkCommandTopic = "icc-manager-stk-command";
|
||||
const kStkSessionEndTopic = "icc-manager-stk-session-end";
|
||||
const kDataErrorTopic = "mobile-connection-data-error";
|
||||
const kIccCardLockErrorTopic = "mobile-connection-icccardlock-error";
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
|
||||
"@mozilla.org/childprocessmessagemanager;1",
|
||||
|
@ -698,7 +699,14 @@ RILContentHelper.prototype = {
|
|||
let result = new MobileICCCardLockResult(msg.json);
|
||||
this.fireRequestSuccess(msg.json.requestId, result);
|
||||
} else {
|
||||
this.fireRequestError(msg.json.requestId, msg.json);
|
||||
if (msg.json.rilMessageType == "iccSetCardLock" ||
|
||||
msg.json.rilMessageType == "iccUnlockCardLock") {
|
||||
let result = JSON.stringify({lockType: msg.json.lockType,
|
||||
retryCount: msg.json.retryCount});
|
||||
Services.obs.notifyObservers(null, kIccCardLockErrorTopic,
|
||||
result);
|
||||
}
|
||||
this.fireRequestError(msg.json.requestId, msg.json.errorMsg);
|
||||
}
|
||||
break;
|
||||
case "RIL:USSDReceived":
|
||||
|
|
|
@ -993,7 +993,7 @@ DrawTargetD2D::PushClip(const Path *aPath)
|
|||
mTransformDirty = true;
|
||||
|
||||
if (mClipsArePushed) {
|
||||
PushD2DLayer(pathD2D->mGeometry, clip.mLayer, clip.mTransform);
|
||||
PushD2DLayer(mRT, pathD2D->mGeometry, clip.mLayer, clip.mTransform);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1817,7 +1817,7 @@ DrawTargetD2D::PushClipsToRT(ID2D1RenderTarget *aRT)
|
|||
for (std::vector<PushedClip>::iterator iter = mPushedClips.begin();
|
||||
iter != mPushedClips.end(); iter++) {
|
||||
if (iter->mLayer) {
|
||||
PushD2DLayer(iter->mPath->mGeometry, iter->mLayer, iter->mTransform);
|
||||
PushD2DLayer(aRT, iter->mPath->mGeometry, iter->mLayer, iter->mTransform);
|
||||
} else {
|
||||
aRT->PushAxisAlignedClip(iter->mBounds, iter->mIsPixelAligned ? D2D1_ANTIALIAS_MODE_ALIASED : D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
|
||||
}
|
||||
|
@ -2701,7 +2701,7 @@ DrawTargetD2D::SetScissorToRect(IntRect *aRect)
|
|||
}
|
||||
|
||||
void
|
||||
DrawTargetD2D::PushD2DLayer(ID2D1Geometry *aGeometry, ID2D1Layer *aLayer, const D2D1_MATRIX_3X2_F &aTransform)
|
||||
DrawTargetD2D::PushD2DLayer(ID2D1RenderTarget *aRT, ID2D1Geometry *aGeometry, ID2D1Layer *aLayer, const D2D1_MATRIX_3X2_F &aTransform)
|
||||
{
|
||||
D2D1_LAYER_OPTIONS options = D2D1_LAYER_OPTIONS_NONE;
|
||||
D2D1_LAYER_OPTIONS1 options1 = D2D1_LAYER_OPTIONS1_NONE;
|
||||
|
@ -2712,10 +2712,10 @@ DrawTargetD2D::PushD2DLayer(ID2D1Geometry *aGeometry, ID2D1Layer *aLayer, const
|
|||
}
|
||||
|
||||
RefPtr<ID2D1DeviceContext> dc;
|
||||
HRESULT hr = mRT->QueryInterface(IID_ID2D1DeviceContext, (void**)((ID2D1DeviceContext**)byRef(dc)));
|
||||
HRESULT hr = aRT->QueryInterface(IID_ID2D1DeviceContext, (void**)((ID2D1DeviceContext**)byRef(dc)));
|
||||
|
||||
if (FAILED(hr)) {
|
||||
mRT->PushLayer(D2D1::LayerParameters(D2D1::InfiniteRect(), aGeometry,
|
||||
aRT->PushLayer(D2D1::LayerParameters(D2D1::InfiniteRect(), aGeometry,
|
||||
D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, aTransform,
|
||||
1.0, nullptr, options),
|
||||
aLayer);
|
||||
|
|
|
@ -211,7 +211,7 @@ private:
|
|||
// surface bounds when NULL is specified.
|
||||
void SetScissorToRect(IntRect *aRect);
|
||||
|
||||
void PushD2DLayer(ID2D1Geometry *aGeometry, ID2D1Layer *aLayer, const D2D1_MATRIX_3X2_F &aTransform);
|
||||
void PushD2DLayer(ID2D1RenderTarget *aRT, ID2D1Geometry *aGeometry, ID2D1Layer *aLayer, const D2D1_MATRIX_3X2_F &aTransform);
|
||||
|
||||
static const uint32_t test = 4;
|
||||
|
||||
|
|
|
@ -489,9 +489,22 @@ gfxPlatform::CreateDrawTargetForSurface(gfxASurface *aSurface, const IntSize& aS
|
|||
|
||||
cairo_user_data_key_t kSourceSurface;
|
||||
|
||||
void SourceBufferDestroy(void *srcBuffer)
|
||||
/**
|
||||
* Record the backend that was used to construct the SourceSurface.
|
||||
* When getting the cached SourceSurface for a gfxASurface/DrawTarget pair,
|
||||
* we check to make sure the DrawTarget's backend matches the backend
|
||||
* for the cached SourceSurface, and only use it if they match. This
|
||||
* can avoid expensive and unnecessary readbacks.
|
||||
*/
|
||||
struct SourceSurfaceUserData
|
||||
{
|
||||
static_cast<SourceSurface*>(srcBuffer)->Release();
|
||||
RefPtr<SourceSurface> mSrcSurface;
|
||||
BackendType mBackendType;
|
||||
};
|
||||
|
||||
void SourceBufferDestroy(void *srcSurfUD)
|
||||
{
|
||||
delete static_cast<SourceSurfaceUserData*>(srcSurfUD);
|
||||
}
|
||||
|
||||
void SourceSnapshotDetached(cairo_surface_t *nullSurf)
|
||||
|
@ -508,10 +521,10 @@ gfxPlatform::GetSourceSurfaceForSurface(DrawTarget *aTarget, gfxASurface *aSurfa
|
|||
void *userData = aSurface->GetData(&kSourceSurface);
|
||||
|
||||
if (userData) {
|
||||
SourceSurface *surf = static_cast<SourceSurface*>(userData);
|
||||
SourceSurfaceUserData *surf = static_cast<SourceSurfaceUserData*>(userData);
|
||||
|
||||
if (surf->IsValid()) {
|
||||
return surf;
|
||||
if (surf->mSrcSurface->IsValid() && surf->mBackendType == aTarget->GetType()) {
|
||||
return surf->mSrcSurface;
|
||||
}
|
||||
// We can just continue here as when setting new user data the destroy
|
||||
// function will be called for the old user data.
|
||||
|
@ -623,8 +636,10 @@ gfxPlatform::GetSourceSurfaceForSurface(DrawTarget *aTarget, gfxASurface *aSurfa
|
|||
cairo_surface_destroy(nullSurf);
|
||||
}
|
||||
|
||||
srcBuffer->AddRef();
|
||||
aSurface->SetData(&kSourceSurface, srcBuffer, SourceBufferDestroy);
|
||||
SourceSurfaceUserData *srcSurfUD = new SourceSurfaceUserData;
|
||||
srcSurfUD->mBackendType = aTarget->GetType();
|
||||
srcSurfUD->mSrcSurface = srcBuffer;
|
||||
aSurface->SetData(&kSourceSurface, srcSurfUD, SourceBufferDestroy);
|
||||
|
||||
return srcBuffer;
|
||||
}
|
||||
|
|
|
@ -1735,6 +1735,11 @@ ia64*-hpux*)
|
|||
DLL_PREFIX=
|
||||
IMPORT_LIB_SUFFIX=dll.a
|
||||
GCC_VERSION=`$CC -v 2>&1 | awk '/^gcc version/ { print $3 }'`
|
||||
|
||||
# We use mix of both POSIX and Win32 printf format across the tree, so format
|
||||
# warnings are useless on mingw.
|
||||
MOZ_C_SUPPORTS_WARNING(-Wno-, format, ac_c_has_wno_format)
|
||||
MOZ_CXX_SUPPORTS_WARNING(-Wno-, format, ac_cxx_has_wno_format)
|
||||
else
|
||||
TARGET_COMPILER_ABI=msvc
|
||||
HOST_CC='$(CC)'
|
||||
|
|
|
@ -481,7 +481,7 @@ struct AssemblerBufferWithConstantPool : public AssemblerBuffer<SliceSize, Inst>
|
|||
// Since the last pool is pools[0].other, and the first pool
|
||||
// is pools[numPoolKinds-1], we actually want to process this
|
||||
// forwards.
|
||||
for (cur = &pools[numPoolKinds-1]; cur >= pools; cur--) {
|
||||
for (cur = pools; cur < &pools[numPoolKinds]; cur++) {
|
||||
// fetch the pool for the backwards half.
|
||||
tmp = cur->other;
|
||||
if (p == cur)
|
||||
|
@ -504,7 +504,6 @@ struct AssemblerBufferWithConstantPool : public AssemblerBuffer<SliceSize, Inst>
|
|||
if (p == tmp) {
|
||||
poolOffset += tmp->immSize;
|
||||
}
|
||||
poolOffset += tmp->immSize * tmp->numEntries + tmp->getAlignment();
|
||||
}
|
||||
return p->numEntries + p->other->insertEntry(data, this->nextOffset());
|
||||
}
|
||||
|
|
|
@ -2697,11 +2697,32 @@ ScriptAnalysis::addTypeBarrier(JSContext *cx, const jsbytecode *pc, TypeSet *tar
|
|||
}
|
||||
|
||||
/* Ignore duplicate barriers. */
|
||||
size_t barrierCount = 0;
|
||||
TypeBarrier *barrier = code.typeBarriers;
|
||||
while (barrier) {
|
||||
if (barrier->target == target && barrier->type == type && !barrier->singleton)
|
||||
return;
|
||||
if (barrier->target == target && !barrier->singleton) {
|
||||
if (barrier->type == type)
|
||||
return;
|
||||
if (barrier->type.isAnyObject() && !type.isUnknown() &&
|
||||
/* type.isAnyObject() must be false, since type != barrier->type */
|
||||
type.isObject())
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
barrier = barrier->next;
|
||||
barrierCount++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Use a generic object barrier if the number of barriers on an opcode gets
|
||||
* excessive: it is unlikely that we will be able to completely discharge
|
||||
* the barrier anyways without the target being marked as a generic object.
|
||||
*/
|
||||
if (barrierCount >= BARRIER_OBJECT_LIMIT &&
|
||||
!type.isUnknown() && !type.isAnyObject() && type.isObject())
|
||||
{
|
||||
type = Type::AnyObjectType();
|
||||
}
|
||||
|
||||
InferSpew(ISpewOps, "typeBarrier: #%u:%05u: %sT%p%s %s",
|
||||
|
|
|
@ -25,6 +25,9 @@ simple_events = [
|
|||
#ifdef MOZ_B2G_BT
|
||||
'BluetoothDeviceEvent',
|
||||
'BluetoothDeviceAddressEvent',
|
||||
#endif
|
||||
#ifdef MOZ_B2G_RIL
|
||||
'ICCCardLockErrorEvent',
|
||||
#endif
|
||||
'DeviceStorageChangeEvent',
|
||||
'PopupBlockedEvent'
|
||||
|
|
|
@ -43,12 +43,8 @@ function doTest() {
|
|||
|
||||
setTimeout(function() {
|
||||
// Check if the 10px were scrolled.
|
||||
const isOSXMtnLion = navigator.userAgent.indexOf("Mac OS X 10.8") != -1;
|
||||
if (isOSXMtnLion) {
|
||||
todo(false, "Starting a 0-delta scroll shouldn't cancel a pending async scroll is disabled on OS X 10.8, see bug 752786");
|
||||
} else {
|
||||
is(scrollbox.scrollTop, 10, "Starting a 0-delta scroll shouldn't cancel a pending async scroll.");
|
||||
}
|
||||
todo(false, "Starting a 0-delta scroll shouldn't cancel a pending async scroll is disabled, see bug 752786");
|
||||
//is(scrollbox.scrollTop, 10, "Starting a 0-delta scroll shouldn't cancel a pending async scroll.");
|
||||
|
||||
// Second test
|
||||
scrollbox.scrollTop = 20;
|
||||
|
|
|
@ -15,6 +15,12 @@ import android.os.Build;
|
|||
import android.os.Bundle;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.RunningServiceInfo;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.json.*;
|
||||
|
||||
|
@ -27,22 +33,39 @@ public class GeckoAccessibility {
|
|||
private static JSONObject mEventMessage = null;
|
||||
private static AccessibilityNodeInfo mVirtualCursorNode = null;
|
||||
|
||||
private static final HashSet<String> ServiceWhitelist =
|
||||
new HashSet<String>(Arrays.asList(new String[] {
|
||||
"com.google.android.marvin.talkback.TalkBackService", // Google Talkback screen reader
|
||||
"com.mot.readout.ScreenReader", // Motorola screen reader
|
||||
"info.spielproject.spiel.SpielService", // Spiel screen reader
|
||||
"es.codefactory.android.app.ma.MAAccessibilityService" // Codefactory Mobile Accessibility screen reader
|
||||
}));
|
||||
|
||||
public static void updateAccessibilitySettings () {
|
||||
GeckoAppShell.getHandler().post(new Runnable() {
|
||||
public void run() {
|
||||
JSONObject ret = new JSONObject();
|
||||
boolean enabled = false;
|
||||
AccessibilityManager accessibilityManager =
|
||||
(AccessibilityManager) GeckoApp.mAppContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
|
||||
try {
|
||||
ret.put("enabled", accessibilityManager.isEnabled());
|
||||
if (Build.VERSION.SDK_INT >= 14) { // Build.VERSION_CODES.ICE_CREAM_SANDWICH
|
||||
ret.put("exploreByTouch", accessibilityManager.isTouchExplorationEnabled());
|
||||
} else {
|
||||
ret.put("exploreByTouch", false);
|
||||
if (accessibilityManager.isEnabled()) {
|
||||
ActivityManager activityManager =
|
||||
(ActivityManager) GeckoApp.mAppContext.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
List<RunningServiceInfo> runningServices = activityManager.getRunningServices(Integer.MAX_VALUE);
|
||||
|
||||
for (RunningServiceInfo runningServiceInfo : runningServices) {
|
||||
enabled = ServiceWhitelist.contains(runningServiceInfo.service.getClassName());
|
||||
if (enabled)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
ret.put("enabled", enabled);
|
||||
} catch (Exception ex) {
|
||||
Log.e(LOGTAG, "Error building JSON arguments for Accessibility:Settings:", ex);
|
||||
}
|
||||
|
||||
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Accessibility:Settings",
|
||||
ret.toString()));
|
||||
}
|
||||
|
|
|
@ -202,13 +202,14 @@ SocialProvider.prototype = {
|
|||
workerAPI: null,
|
||||
|
||||
// Contains information related to the user's profile. Populated by the
|
||||
// workerAPI via updateUserProfile. Null if the provider has no FrameWorker.
|
||||
// workerAPI via updateUserProfile.
|
||||
// Properties:
|
||||
// iconURL, portrait, userName, displayName, profileURL
|
||||
// See https://github.com/mozilla/socialapi-dev/blob/develop/docs/socialAPI.md
|
||||
// A value of null or an empty object means 'user not logged in'.
|
||||
// A value of undefined means the service has not told us the status of the
|
||||
// profile, but is expected to soon (ie, the service is still loading/initing)
|
||||
// A value of undefined means the service has not yet told us the status of
|
||||
// the profile (ie, the service is still loading/initing, or the provider has
|
||||
// no FrameWorker)
|
||||
// This distinction might be used to cache certain data between runs - eg,
|
||||
// browser-social.js caches the notification icons so they can be displayed
|
||||
// quickly at startup without waiting for the provider to initialize -
|
||||
|
|
Загрузка…
Ссылка в новой задаче