Merge last PGO-green changeset of mozilla-inbound to mozilla-central

This commit is contained in:
Ed Morley 2012-10-08 15:21:04 +01:00
Родитель d87cad64a8 42c894c446
Коммит fda7933881
22 изменённых файлов: 214 добавлений и 60 удалений

Просмотреть файл

@ -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 -