зеркало из https://github.com/mozilla/gecko-dev.git
merge mozilla-inbound to mozilla-central. r=merge a=merge
MozReview-Commit-ID: EqC7wKnn6Jt
This commit is contained in:
Коммит
79f625ac56
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -149,6 +149,8 @@ module.exports = createClass({
|
|||
let { value } = this.state;
|
||||
let divClassList = ["devtools-searchbox", "has-clear-btn"];
|
||||
let inputClassList = [`devtools-${type}input`];
|
||||
let showAutocomplete =
|
||||
autocompleteList.length > 0 && this.state.focused && value !== "";
|
||||
|
||||
if (value !== "") {
|
||||
inputClassList.push("filled");
|
||||
|
@ -170,8 +172,7 @@ module.exports = createClass({
|
|||
hidden: value == "",
|
||||
onClick: this.onClearButtonClick
|
||||
}),
|
||||
autocompleteList.length > 0 && this.state.focused &&
|
||||
AutocompletePopup({
|
||||
showAutocomplete && AutocompletePopup({
|
||||
list: autocompleteList,
|
||||
filter: value,
|
||||
ref: "autocomplete",
|
||||
|
|
|
@ -51,6 +51,11 @@ window.onload = async function () {
|
|||
"pqr",
|
||||
"xyz",
|
||||
"ABC",
|
||||
"a1",
|
||||
"a2",
|
||||
"a3",
|
||||
"a4",
|
||||
"a5",
|
||||
],
|
||||
onChange: () => null,
|
||||
});
|
||||
|
@ -61,15 +66,19 @@ window.onload = async function () {
|
|||
|
||||
$(".devtools-searchinput").focus();
|
||||
await forceRender(component); // Wait for state update
|
||||
ok(!$(".devtools-autocomplete-popup"), "Autocomplete list not visible");
|
||||
|
||||
sendString("a");
|
||||
await forceRender(component);
|
||||
|
||||
compareAutocompleteList($(".devtools-autocomplete-listbox"), [
|
||||
"ABC",
|
||||
"BAR",
|
||||
"a1",
|
||||
"a2",
|
||||
"a3",
|
||||
"a4",
|
||||
"a5",
|
||||
"abc",
|
||||
"baZ",
|
||||
"foo",
|
||||
"pqr",
|
||||
"xyz",
|
||||
]);
|
||||
|
||||
is(refs.autocomplete.state.selectedIndex, -1, "Initialised selectedIndex is -1");
|
||||
|
@ -82,16 +91,8 @@ window.onload = async function () {
|
|||
}
|
||||
|
||||
async function testKeyEventsWithAutocomplete() {
|
||||
// Filtering of list
|
||||
$(".devtools-searchinput").focus();
|
||||
await forceRender(component);
|
||||
sendString("aB");
|
||||
await forceRender(component);
|
||||
compareAutocompleteList($(".devtools-autocomplete-listbox"), ["ABC", "abc"]);
|
||||
|
||||
// Clear the initial input
|
||||
synthesizeKey("VK_BACK_SPACE", {});
|
||||
synthesizeKey("VK_BACK_SPACE", {});
|
||||
$(".devtools-searchinput").focus();
|
||||
|
||||
// ArrowDown
|
||||
synthesizeKey("VK_DOWN", {});
|
||||
|
|
|
@ -341,9 +341,15 @@ void
|
|||
Element::Focus(mozilla::ErrorResult& aError)
|
||||
{
|
||||
nsCOMPtr<nsIDOMElement> domElement = do_QueryInterface(this);
|
||||
nsIFocusManager* fm = nsFocusManager::GetFocusManager();
|
||||
nsFocusManager* fm = nsFocusManager::GetFocusManager();
|
||||
// Also other browsers seem to have the hack to not re-focus (and flush) when
|
||||
// the element is already focused.
|
||||
if (fm && domElement) {
|
||||
aError = fm->SetFocus(domElement, 0);
|
||||
if (fm->CanSkipFocus(this)) {
|
||||
fm->NeedsFlushBeforeEventHandling(this);
|
||||
} else {
|
||||
aError = fm->SetFocus(domElement, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ Timeout::Timeout()
|
|||
mReason(Reason::eTimeoutOrInterval),
|
||||
mTimeoutId(0),
|
||||
mInterval(0),
|
||||
mFiringDepth(0),
|
||||
mFiringId(TimeoutManager::InvalidFiringId),
|
||||
mNestingLevel(0),
|
||||
mPopupState(openAllowed)
|
||||
{
|
||||
|
@ -43,13 +43,11 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(Timeout)
|
|||
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Timeout)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mPrincipal)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mScriptHandler)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Timeout)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPrincipal)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mScriptHandler)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||
|
||||
|
|
|
@ -90,11 +90,9 @@ public:
|
|||
// Interval in milliseconds
|
||||
uint32_t mInterval;
|
||||
|
||||
// Principal with which to execute
|
||||
nsCOMPtr<nsIPrincipal> mPrincipal;
|
||||
|
||||
// stack depth at which timeout is firing
|
||||
uint32_t mFiringDepth;
|
||||
// Identifies which firing level this Timeout is being processed in
|
||||
// when sync loops trigger nested firing.
|
||||
uint32_t mFiringId;
|
||||
|
||||
uint32_t mNestingLevel;
|
||||
|
||||
|
|
|
@ -139,12 +139,73 @@ static int32_t gMinTrackingBackgroundTimeoutValue = 0;
|
|||
static int32_t gTrackingTimeoutThrottlingDelay = 0;
|
||||
static bool gAnnotateTrackingChannels = false;
|
||||
|
||||
// static
|
||||
const uint32_t TimeoutManager::InvalidFiringId = 0;
|
||||
|
||||
bool
|
||||
TimeoutManager::IsBackground() const
|
||||
{
|
||||
return !mWindow.AsInner()->IsPlayingAudio() && mWindow.IsBackgroundInternal();
|
||||
}
|
||||
|
||||
uint32_t
|
||||
TimeoutManager::CreateFiringId()
|
||||
{
|
||||
uint32_t id = mNextFiringId;
|
||||
mNextFiringId += 1;
|
||||
if (mNextFiringId == InvalidFiringId) {
|
||||
mNextFiringId += 1;
|
||||
}
|
||||
|
||||
mFiringIdStack.AppendElement(id);
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
void
|
||||
TimeoutManager::DestroyFiringId(uint32_t aFiringId)
|
||||
{
|
||||
MOZ_DIAGNOSTIC_ASSERT(!mFiringIdStack.IsEmpty());
|
||||
MOZ_DIAGNOSTIC_ASSERT(mFiringIdStack.LastElement() == aFiringId);
|
||||
mFiringIdStack.RemoveElementAt(mFiringIdStack.Length() - 1);
|
||||
}
|
||||
|
||||
bool
|
||||
TimeoutManager::IsInvalidFiringId(uint32_t aFiringId) const
|
||||
{
|
||||
// Check the most common ways to invalidate a firing id first.
|
||||
// These should be quite fast.
|
||||
if (aFiringId == InvalidFiringId ||
|
||||
mFiringIdStack.IsEmpty() ||
|
||||
(mFiringIdStack.Length() == 1 && mFiringIdStack[0] != aFiringId)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Next do a range check on the first and last items in the stack
|
||||
// of active firing ids. This is a bit slower.
|
||||
uint32_t low = mFiringIdStack[0];
|
||||
uint32_t high = mFiringIdStack.LastElement();
|
||||
MOZ_DIAGNOSTIC_ASSERT(low != high);
|
||||
if (low > high) {
|
||||
// If the first element is bigger than the last element in the
|
||||
// stack, that means mNextFiringId wrapped around to zero at
|
||||
// some point.
|
||||
Swap(low, high);
|
||||
}
|
||||
MOZ_DIAGNOSTIC_ASSERT(low < high);
|
||||
|
||||
if (aFiringId < low || aFiringId > high) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Finally, fall back to verifying the firing id is not anywhere
|
||||
// in the stack. This could be slow for a large stack, but that
|
||||
// should be rare. It can only happen with deeply nested event
|
||||
// loop spinning. For example, a page that does a lot of timers
|
||||
// and a lot of sync XHRs within those timers could be slow here.
|
||||
return !mFiringIdStack.Contains(aFiringId);
|
||||
}
|
||||
|
||||
int32_t
|
||||
TimeoutManager::DOMMinTimeoutValue(bool aIsTracking) const {
|
||||
// First apply any back pressure delay that might be in effect.
|
||||
|
@ -184,10 +245,10 @@ uint32_t TimeoutManager::sNestingLevel = 0;
|
|||
|
||||
namespace {
|
||||
|
||||
// The maximum number of timer callbacks we will try to run in a single event
|
||||
// loop runnable.
|
||||
#define DEFAULT_TARGET_MAX_CONSECUTIVE_CALLBACKS 5
|
||||
uint32_t gTargetMaxConsecutiveCallbacks;
|
||||
// The maximum number of milliseconds to allow consecutive timer callbacks
|
||||
// to run in a single event loop runnable.
|
||||
#define DEFAULT_MAX_CONSECUTIVE_CALLBACKS_MILLISECONDS 4
|
||||
uint32_t gMaxConsecutiveCallbacksMilliseconds;
|
||||
|
||||
// The number of queued runnables within the TabGroup ThrottledEventQueue
|
||||
// at which to begin applying back pressure to the window.
|
||||
|
@ -241,7 +302,7 @@ CalculateNewBackPressureDelayMS(uint32_t aBacklogDepth)
|
|||
TimeoutManager::TimeoutManager(nsGlobalWindow& aWindow)
|
||||
: mWindow(aWindow),
|
||||
mTimeoutIdCounter(1),
|
||||
mTimeoutFiringDepth(0),
|
||||
mNextFiringId(InvalidFiringId + 1),
|
||||
mRunningTimeout(nullptr),
|
||||
mIdleCallbackTimeoutCounter(1),
|
||||
mBackPressureDelayMS(0),
|
||||
|
@ -302,9 +363,9 @@ TimeoutManager::Initialize()
|
|||
"dom.timeout.back_pressure_delay_minimum_ms",
|
||||
DEFAULT_BACK_PRESSURE_DELAY_MINIMUM_MS);
|
||||
|
||||
Preferences::AddUintVarCache(&gTargetMaxConsecutiveCallbacks,
|
||||
"dom.timeout.max_consecutive_callbacks",
|
||||
DEFAULT_TARGET_MAX_CONSECUTIVE_CALLBACKS);
|
||||
Preferences::AddUintVarCache(&gMaxConsecutiveCallbacksMilliseconds,
|
||||
"dom.timeout.max_consecutive_callbacks_ms",
|
||||
DEFAULT_MAX_CONSECUTIVE_CALLBACKS_MILLISECONDS);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
|
@ -319,6 +380,12 @@ TimeoutManager::GetTimeoutId(Timeout::Reason aReason)
|
|||
}
|
||||
}
|
||||
|
||||
bool
|
||||
TimeoutManager::IsRunningTimeout() const
|
||||
{
|
||||
return mRunningTimeout;
|
||||
}
|
||||
|
||||
nsresult
|
||||
TimeoutManager::SetTimeout(nsITimeoutHandler* aHandler,
|
||||
int32_t interval, bool aIsInterval,
|
||||
|
@ -522,12 +589,33 @@ TimeoutManager::RunTimeout(Timeout* aTimeout)
|
|||
|
||||
NS_ASSERTION(!mWindow.IsFrozen(), "Timeout running on a window in the bfcache!");
|
||||
|
||||
// Limit the overall time spent in RunTimeout() to reduce jank.
|
||||
uint32_t totalTimeLimitMS = std::max(1u, gMaxConsecutiveCallbacksMilliseconds);
|
||||
const TimeDuration totalTimeLimit = TimeDuration::FromMilliseconds(totalTimeLimitMS);
|
||||
|
||||
// Allow up to 25% of our total time budget to be used figuring out which
|
||||
// timers need to run. This is the initial loop in this method.
|
||||
const TimeDuration initalTimeLimit =
|
||||
TimeDuration::FromMilliseconds(totalTimeLimit.ToMilliseconds() / 4);
|
||||
|
||||
// Ammortize overhead from from calling TimeStamp::Now() in the initial
|
||||
// loop, though, by only checking for an elapsed limit every N timeouts.
|
||||
const uint32_t kNumTimersPerInitialElapsedCheck = 100;
|
||||
|
||||
// Start measuring elapsed time immediately. We won't potentially expire
|
||||
// the time budget until at least one Timeout has run, though.
|
||||
TimeStamp start = TimeStamp::Now();
|
||||
|
||||
Timeout* last_expired_normal_timeout = nullptr;
|
||||
Timeout* last_expired_tracking_timeout = nullptr;
|
||||
bool last_expired_timeout_is_normal = false;
|
||||
Timeout* last_normal_insertion_point = nullptr;
|
||||
Timeout* last_tracking_insertion_point = nullptr;
|
||||
uint32_t firingDepth = mTimeoutFiringDepth + 1;
|
||||
|
||||
uint32_t firingId = CreateFiringId();
|
||||
auto guard = MakeScopeExit([&] {
|
||||
DestroyFiringId(firingId);
|
||||
});
|
||||
|
||||
// Make sure that the window and the script context don't go away as
|
||||
// a result of running timeouts
|
||||
|
@ -577,10 +665,10 @@ TimeoutManager::RunTimeout(Timeout* aTimeout)
|
|||
break;
|
||||
}
|
||||
|
||||
if (timeout->mFiringDepth == 0) {
|
||||
if (IsInvalidFiringId(timeout->mFiringId)) {
|
||||
// Mark any timeouts that are on the list to be fired with the
|
||||
// firing depth so that we can reentrantly run timeouts
|
||||
timeout->mFiringDepth = firingDepth;
|
||||
timeout->mFiringId = firingId;
|
||||
last_expired_timeout_is_normal = expiredIter.PickedNormalIter();
|
||||
if (last_expired_timeout_is_normal) {
|
||||
last_expired_normal_timeout = timeout;
|
||||
|
@ -600,16 +688,13 @@ TimeoutManager::RunTimeout(Timeout* aTimeout)
|
|||
// maximum. Note, we must always run our target timer however.
|
||||
// Further timers that are ready will get picked up by their own
|
||||
// nsITimer runnables when they execute.
|
||||
//
|
||||
// For chrome windows, however, we do coalesce all timers and
|
||||
// do not yield the main thread. This is partly because we
|
||||
// trust chrome windows not to misbehave and partly because a
|
||||
// number of browser chrome tests have races that depend on this
|
||||
// coalescing.
|
||||
if (targetTimerSeen &&
|
||||
numTimersToRun >= gTargetMaxConsecutiveCallbacks &&
|
||||
!mWindow.IsChromeWindow()) {
|
||||
break;
|
||||
if (targetTimerSeen) {
|
||||
if (numTimersToRun % kNumTimersPerInitialElapsedCheck == 0) {
|
||||
TimeDuration elapsed(TimeStamp::Now() - start);
|
||||
if (elapsed >= initalTimeLimit) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -630,14 +715,14 @@ TimeoutManager::RunTimeout(Timeout* aTimeout)
|
|||
// win_run_timeout(). This dummy timeout serves as the head of the
|
||||
// list for any timeouts inserted as a result of running a timeout.
|
||||
RefPtr<Timeout> dummy_normal_timeout = new Timeout();
|
||||
dummy_normal_timeout->mFiringDepth = firingDepth;
|
||||
dummy_normal_timeout->mFiringId = firingId;
|
||||
dummy_normal_timeout->SetDummyWhen(now);
|
||||
if (last_expired_timeout_is_normal) {
|
||||
last_expired_normal_timeout->setNext(dummy_normal_timeout);
|
||||
}
|
||||
|
||||
RefPtr<Timeout> dummy_tracking_timeout = new Timeout();
|
||||
dummy_tracking_timeout->mFiringDepth = firingDepth;
|
||||
dummy_tracking_timeout->mFiringId = firingId;
|
||||
dummy_tracking_timeout->SetDummyWhen(now);
|
||||
if (!last_expired_timeout_is_normal) {
|
||||
last_expired_tracking_timeout->setNext(dummy_tracking_timeout);
|
||||
|
@ -663,6 +748,8 @@ TimeoutManager::RunTimeout(Timeout* aTimeout)
|
|||
mTrackingTimeouts.SetInsertionPoint(dummy_tracking_timeout);
|
||||
}
|
||||
|
||||
bool targetTimeoutSeen = false;
|
||||
|
||||
// We stop iterating each list when we go past the last expired timeout from
|
||||
// that list that we have observed above. That timeout will either be the
|
||||
// dummy timeout for the list that the last expired timeout came from, or it
|
||||
|
@ -680,7 +767,7 @@ TimeoutManager::RunTimeout(Timeout* aTimeout)
|
|||
last_expired_tracking_timeout ?
|
||||
last_expired_tracking_timeout->getNext() :
|
||||
nullptr);
|
||||
while (!mWindow.IsFrozen()) {
|
||||
while (true) {
|
||||
Timeout* timeout = runIter.Next();
|
||||
MOZ_ASSERT(timeout != dummy_normal_timeout &&
|
||||
timeout != dummy_tracking_timeout,
|
||||
|
@ -691,17 +778,15 @@ TimeoutManager::RunTimeout(Timeout* aTimeout)
|
|||
}
|
||||
runIter.UpdateIterator();
|
||||
|
||||
if (timeout->mFiringDepth != firingDepth) {
|
||||
if (timeout->mFiringId != firingId) {
|
||||
// We skip the timeout since it's on the list to run at another
|
||||
// depth.
|
||||
continue;
|
||||
}
|
||||
|
||||
MOZ_ASSERT_IF(mWindow.IsFrozen(), mWindow.IsSuspended());
|
||||
if (mWindow.IsSuspended()) {
|
||||
// Some timer did suspend us. Make sure the
|
||||
// rest of the timers get executed later.
|
||||
timeout->mFiringDepth = 0;
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
|
||||
// The timeout is on the list to run at this depth, go ahead and
|
||||
|
@ -713,10 +798,17 @@ TimeoutManager::RunTimeout(Timeout* aTimeout)
|
|||
|
||||
if (!scx) {
|
||||
// No context means this window was closed or never properly
|
||||
// initialized for this language.
|
||||
// initialized for this language. This timer will never fire
|
||||
// so just remove it.
|
||||
timeout->remove();
|
||||
timeout->Release();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (timeout == aTimeout) {
|
||||
targetTimeoutSeen = true;
|
||||
}
|
||||
|
||||
// This timeout is good to run
|
||||
bool timeout_was_cleared = mWindow.RunTimeoutHandler(timeout, scx);
|
||||
MOZ_LOG(gLog, LogLevel::Debug,
|
||||
|
@ -750,6 +842,9 @@ TimeoutManager::RunTimeout(Timeout* aTimeout)
|
|||
mNormalTimeouts.SetInsertionPoint(last_normal_insertion_point);
|
||||
mTrackingTimeouts.SetInsertionPoint(last_tracking_insertion_point);
|
||||
|
||||
// Since ClearAllTimeouts() was called the lists should be empty.
|
||||
MOZ_DIAGNOSTIC_ASSERT(!HasTimeouts());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -779,6 +874,18 @@ TimeoutManager::RunTimeout(Timeout* aTimeout)
|
|||
|
||||
// Release the timeout struct since it's possibly out of the list
|
||||
timeout->Release();
|
||||
|
||||
// Check to see if we have run out of time to execute timeout handlers.
|
||||
// If we've exceeded our time budget then terminate the loop immediately.
|
||||
//
|
||||
// Note, we only do this if we have seen the Timeout object explicitly
|
||||
// passed to RunTimeout(). The target timeout must always be executed.
|
||||
if (targetTimeoutSeen) {
|
||||
TimeDuration elapsed = TimeStamp::Now() - start;
|
||||
if (elapsed >= totalTimeLimit) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1100,11 +1207,11 @@ TimeoutManager::Timeouts::ResetTimersForThrottleReduction(int32_t aPreviousThrot
|
|||
NS_ASSERTION(!nextTimeout ||
|
||||
timeout->When() < nextTimeout->When(), "How did that happen?");
|
||||
timeout->remove();
|
||||
// Insert() will addref |timeout| and reset mFiringDepth. Make sure to
|
||||
// Insert() will addref |timeout| and reset mFiringId. Make sure to
|
||||
// undo that after calling it.
|
||||
uint32_t firingDepth = timeout->mFiringDepth;
|
||||
uint32_t firingId = timeout->mFiringId;
|
||||
Insert(timeout, aSortBy);
|
||||
timeout->mFiringDepth = firingDepth;
|
||||
timeout->mFiringId = firingId;
|
||||
timeout->Release();
|
||||
}
|
||||
|
||||
|
@ -1198,7 +1305,7 @@ TimeoutManager::Timeouts::Insert(Timeout* aTimeout, SortBy aSortBy)
|
|||
InsertFront(aTimeout);
|
||||
}
|
||||
|
||||
aTimeout->mFiringDepth = 0;
|
||||
aTimeout->mFiringId = InvalidFiringId;
|
||||
|
||||
// Increment the timeout's reference count since it's now held on to
|
||||
// by the list
|
||||
|
@ -1212,7 +1319,6 @@ TimeoutManager::BeginRunningTimeout(Timeout* aTimeout)
|
|||
mRunningTimeout = aTimeout;
|
||||
|
||||
++gRunningTimeoutDepth;
|
||||
++mTimeoutFiringDepth;
|
||||
|
||||
if (!mWindow.IsChromeWindow()) {
|
||||
TimeStamp now = TimeStamp::Now();
|
||||
|
@ -1233,7 +1339,6 @@ TimeoutManager::BeginRunningTimeout(Timeout* aTimeout)
|
|||
void
|
||||
TimeoutManager::EndRunningTimeout(Timeout* aTimeout)
|
||||
{
|
||||
--mTimeoutFiringDepth;
|
||||
--gRunningTimeoutDepth;
|
||||
|
||||
if (!mWindow.IsChromeWindow()) {
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#define mozilla_dom_TimeoutManager_h__
|
||||
|
||||
#include "mozilla/dom/Timeout.h"
|
||||
#include "nsTArray.h"
|
||||
|
||||
class nsIEventTarget;
|
||||
class nsITimeoutHandler;
|
||||
|
@ -27,7 +28,7 @@ public:
|
|||
TimeoutManager(const TimeoutManager& rhs) = delete;
|
||||
void operator=(const TimeoutManager& rhs) = delete;
|
||||
|
||||
bool IsRunningTimeout() const { return mTimeoutFiringDepth > 0; }
|
||||
bool IsRunningTimeout() const;
|
||||
|
||||
static uint32_t GetNestingLevel() { return sNestingLevel; }
|
||||
static void SetNestingLevel(uint32_t aLevel) { sNestingLevel = aLevel; }
|
||||
|
@ -117,11 +118,24 @@ public:
|
|||
|
||||
void BeginSyncOperation();
|
||||
void EndSyncOperation();
|
||||
|
||||
static const uint32_t InvalidFiringId;
|
||||
|
||||
private:
|
||||
nsresult ResetTimersForThrottleReduction(int32_t aPreviousThrottleDelayMS);
|
||||
void MaybeStartThrottleTrackingTimout();
|
||||
|
||||
bool IsBackground() const;
|
||||
|
||||
uint32_t
|
||||
CreateFiringId();
|
||||
|
||||
void
|
||||
DestroyFiringId(uint32_t aFiringId);
|
||||
|
||||
bool
|
||||
IsInvalidFiringId(uint32_t aFiringId) const;
|
||||
|
||||
private:
|
||||
struct Timeouts {
|
||||
Timeouts()
|
||||
|
@ -209,7 +223,8 @@ private:
|
|||
// The list of timeouts coming from scripts on the tracking protection list.
|
||||
Timeouts mTrackingTimeouts;
|
||||
uint32_t mTimeoutIdCounter;
|
||||
uint32_t mTimeoutFiringDepth;
|
||||
uint32_t mNextFiringId;
|
||||
AutoTArray<uint32_t, 2> mFiringIdStack;
|
||||
mozilla::dom::Timeout* mRunningTimeout;
|
||||
|
||||
// The current idle request callback timeout handle
|
||||
|
|
|
@ -181,6 +181,7 @@ static const char* kObservedPrefs[] = {
|
|||
};
|
||||
|
||||
nsFocusManager::nsFocusManager()
|
||||
: mEventHandlingNeedsFlush(false)
|
||||
{ }
|
||||
|
||||
nsFocusManager::~nsFocusManager()
|
||||
|
@ -1567,6 +1568,7 @@ nsFocusManager::CheckIfFocusable(nsIContent* aContent, uint32_t aFlags)
|
|||
}
|
||||
|
||||
// Make sure that our frames are up to date
|
||||
mEventHandlingNeedsFlush = false;
|
||||
doc->FlushPendingNotifications(FlushType::Layout);
|
||||
|
||||
nsIPresShell *shell = doc->GetShell();
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#define nsFocusManager_h___
|
||||
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "nsIContent.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsIFocusManager.h"
|
||||
#include "nsIObserver.h"
|
||||
|
@ -93,6 +94,29 @@ public:
|
|||
return handlingDocument.forget();
|
||||
}
|
||||
|
||||
void NeedsFlushBeforeEventHandling(nsIContent* aContent)
|
||||
{
|
||||
if (mFocusedContent == aContent) {
|
||||
mEventHandlingNeedsFlush = true;
|
||||
}
|
||||
}
|
||||
|
||||
bool CanSkipFocus(nsIContent* aContent)
|
||||
{
|
||||
return mFocusedContent == aContent;
|
||||
}
|
||||
|
||||
void FlushBeforeEventHandlingIfNeeded(nsIContent* aContent)
|
||||
{
|
||||
if (mEventHandlingNeedsFlush) {
|
||||
nsCOMPtr<nsIDocument> doc = aContent->GetComposedDoc();
|
||||
if (doc) {
|
||||
mEventHandlingNeedsFlush = false;
|
||||
doc->FlushPendingNotifications(mozilla::FlushType::Layout);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the caret with current mode (whether in caret browsing mode or not).
|
||||
*/
|
||||
|
@ -561,6 +585,10 @@ private:
|
|||
// moving focus.
|
||||
nsCOMPtr<nsIDocument> mMouseButtonEventHandlingDocument;
|
||||
|
||||
// If set to true, layout of the document of the event target should be
|
||||
// flushed before handling focus depending events.
|
||||
bool mEventHandlingNeedsFlush;
|
||||
|
||||
static bool sTestMode;
|
||||
|
||||
// the single focus manager
|
||||
|
|
|
@ -4925,6 +4925,14 @@ HTMLInputElement::HandleTypeChange(uint8_t aNewType, bool aNotify)
|
|||
uint8_t oldType = mType;
|
||||
MOZ_ASSERT(oldType != aNewType);
|
||||
|
||||
nsFocusManager* fm = nsFocusManager::GetFocusManager();
|
||||
if (fm) {
|
||||
// Input element can represent very different kinds of UIs, and we may
|
||||
// need to flush styling even when focusing the already focused input
|
||||
// element.
|
||||
fm->NeedsFlushBeforeEventHandling(this);
|
||||
}
|
||||
|
||||
if (aNewType == NS_FORM_INPUT_FILE || oldType == NS_FORM_INPUT_FILE) {
|
||||
if (aNewType == NS_FORM_INPUT_FILE) {
|
||||
mFileData.reset(new FileData());
|
||||
|
|
|
@ -14,6 +14,10 @@ UNIFIED_SOURCES += [
|
|||
'nsPopupWindowManager.cpp',
|
||||
]
|
||||
|
||||
LOCAL_INCLUDES += [
|
||||
'/caps',
|
||||
]
|
||||
|
||||
include('/ipc/chromium/chromium-config.mozbuild')
|
||||
|
||||
FINAL_LIBRARY = 'xul'
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set ts=8 sts=2 et sw=2 tw=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/. */
|
||||
|
@ -41,6 +42,7 @@
|
|||
#include "nsIObserverService.h"
|
||||
#include "nsPrintfCString.h"
|
||||
#include "mozilla/AbstractThread.h"
|
||||
#include "ContentPrincipal.h"
|
||||
|
||||
static nsPermissionManager *gPermissionManager = nullptr;
|
||||
|
||||
|
@ -238,6 +240,37 @@ GetNextSubDomainForHost(const nsACString& aHost)
|
|||
return subDomain;
|
||||
}
|
||||
|
||||
// This function produces a nsIURI which is identical to the current
|
||||
// nsIURI, except that it has one less subdomain segment. It returns
|
||||
// `nullptr` if there are no more segments to remove.
|
||||
already_AddRefed<nsIURI>
|
||||
GetNextSubDomainURI(nsIURI* aURI)
|
||||
{
|
||||
nsAutoCString host;
|
||||
nsresult rv = aURI->GetHost(host);
|
||||
if (NS_FAILED(rv)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsCString domain = GetNextSubDomainForHost(host);
|
||||
if (domain.IsEmpty()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
rv = aURI->Clone(getter_AddRefs(uri));
|
||||
if (NS_FAILED(rv) || !uri) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
rv = uri->SetHost(domain);
|
||||
if (NS_FAILED(rv)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return uri.forget();
|
||||
}
|
||||
|
||||
// This function produces a nsIPrincipal which is identical to the current
|
||||
// nsIPrincipal, except that it has one less subdomain segment. It returns
|
||||
// `nullptr` if there are no more segments to remove.
|
||||
|
@ -250,26 +283,9 @@ GetNextSubDomainPrincipal(nsIPrincipal* aPrincipal)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
nsAutoCString host;
|
||||
rv = uri->GetHost(host);
|
||||
if (NS_FAILED(rv)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsCString domain = GetNextSubDomainForHost(host);
|
||||
if (domain.IsEmpty()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Create a new principal which is identical to the current one, but with the new host
|
||||
nsCOMPtr<nsIURI> newURI;
|
||||
rv = uri->Clone(getter_AddRefs(newURI));
|
||||
if (NS_FAILED(rv)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
rv = newURI->SetHost(domain);
|
||||
if (NS_FAILED(rv)) {
|
||||
nsCOMPtr<nsIURI> newURI = GetNextSubDomainURI(uri);
|
||||
if (!newURI) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -711,6 +727,18 @@ nsPermissionManager::PermissionKey::CreateFromPrincipal(nsIPrincipal* aPrincipal
|
|||
return new PermissionKey(origin);
|
||||
}
|
||||
|
||||
nsPermissionManager::PermissionKey*
|
||||
nsPermissionManager::PermissionKey::CreateFromURI(nsIURI* aURI, nsresult& aResult)
|
||||
{
|
||||
nsAutoCString origin;
|
||||
aResult = ContentPrincipal::GenerateOriginNoSuffixFromURI(aURI, origin);
|
||||
if (NS_WARN_IF(NS_FAILED(aResult))) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return new PermissionKey(origin);
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple callback used by |AsyncClose| to trigger a treatment once
|
||||
* the database is closed.
|
||||
|
@ -2069,11 +2097,7 @@ nsPermissionManager::TestExactPermission(nsIURI *aURI,
|
|||
const char *aType,
|
||||
uint32_t *aPermission)
|
||||
{
|
||||
nsCOMPtr<nsIPrincipal> principal;
|
||||
nsresult rv = GetPrincipal(aURI, getter_AddRefs(principal));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
return TestExactPermissionFromPrincipal(principal, aType, aPermission);
|
||||
return CommonTestPermission(aURI, aType, aPermission, true, true);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -2097,11 +2121,7 @@ nsPermissionManager::TestPermission(nsIURI *aURI,
|
|||
const char *aType,
|
||||
uint32_t *aPermission)
|
||||
{
|
||||
nsCOMPtr<nsIPrincipal> principal;
|
||||
nsresult rv = GetPrincipal(aURI, getter_AddRefs(principal));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
return TestPermissionFromPrincipal(principal, aType, aPermission);
|
||||
return CommonTestPermission(aURI, aType, aPermission, false, true);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -2198,16 +2218,19 @@ nsPermissionManager::GetPermissionObject(nsIPrincipal* aPrincipal,
|
|||
}
|
||||
|
||||
nsresult
|
||||
nsPermissionManager::CommonTestPermission(nsIPrincipal* aPrincipal,
|
||||
const char *aType,
|
||||
uint32_t *aPermission,
|
||||
bool aExactHostMatch,
|
||||
bool aIncludingSession)
|
||||
nsPermissionManager::CommonTestPermissionInternal(nsIPrincipal* aPrincipal,
|
||||
nsIURI * aURI,
|
||||
const char * aType,
|
||||
uint32_t * aPermission,
|
||||
bool aExactHostMatch,
|
||||
bool aIncludingSession)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aPrincipal);
|
||||
MOZ_ASSERT(aPrincipal || aURI);
|
||||
MOZ_ASSERT_IF(aPrincipal, !aURI);
|
||||
NS_ENSURE_ARG_POINTER(aPrincipal || aURI);
|
||||
NS_ENSURE_ARG_POINTER(aType);
|
||||
|
||||
if (nsContentUtils::IsSystemPrincipal(aPrincipal)) {
|
||||
if (aPrincipal && nsContentUtils::IsSystemPrincipal(aPrincipal)) {
|
||||
*aPermission = nsIPermissionManager::ALLOW_ACTION;
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -2225,8 +2248,8 @@ nsPermissionManager::CommonTestPermission(nsIPrincipal* aPrincipal,
|
|||
|
||||
for (size_t i = 0; i < whitelist->Length(); ++i) {
|
||||
uint32_t perm;
|
||||
rv = CommonTestPermission(whitelist->ElementAt(i), aType, &perm, aExactHostMatch,
|
||||
aIncludingSession);
|
||||
rv = CommonTestPermission(whitelist->ElementAt(i), aType, &perm,
|
||||
aExactHostMatch, aIncludingSession);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (perm == nsIPermissionManager::ALLOW_ACTION) {
|
||||
*aPermission = perm;
|
||||
|
@ -2240,14 +2263,24 @@ nsPermissionManager::CommonTestPermission(nsIPrincipal* aPrincipal,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(PermissionAvaliable(aPrincipal, aType));
|
||||
#ifdef DEBUG
|
||||
{
|
||||
nsCOMPtr<nsIPrincipal> prin = aPrincipal;
|
||||
if (!prin) {
|
||||
prin = mozilla::BasePrincipal::CreateCodebasePrincipal(aURI, OriginAttributes());
|
||||
}
|
||||
MOZ_ASSERT(PermissionAvaliable(prin, aType));
|
||||
}
|
||||
#endif
|
||||
|
||||
int32_t typeIndex = GetTypeIndex(aType, false);
|
||||
// If type == -1, the type isn't known,
|
||||
// so just return NS_OK
|
||||
if (typeIndex == -1) return NS_OK;
|
||||
|
||||
PermissionHashKey* entry = GetPermissionHashKey(aPrincipal, typeIndex, aExactHostMatch);
|
||||
PermissionHashKey* entry = aPrincipal ?
|
||||
GetPermissionHashKey(aPrincipal, typeIndex, aExactHostMatch) :
|
||||
GetPermissionHashKey(aURI, typeIndex, aExactHostMatch);
|
||||
if (!entry ||
|
||||
(!aIncludingSession &&
|
||||
entry->GetPermission(typeIndex).mNonSessionExpireType ==
|
||||
|
@ -2317,6 +2350,74 @@ nsPermissionManager::GetPermissionHashKey(nsIPrincipal* aPrincipal,
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
// Returns PermissionHashKey for a given { host, appId, isInBrowserElement } tuple.
|
||||
// This is not simply using PermissionKey because we will walk-up domains in
|
||||
// case of |host| contains sub-domains.
|
||||
// Returns null if nothing found.
|
||||
// Also accepts host on the format "<foo>". This will perform an exact match
|
||||
// lookup as the string doesn't contain any dots.
|
||||
nsPermissionManager::PermissionHashKey*
|
||||
nsPermissionManager::GetPermissionHashKey(nsIURI* aURI,
|
||||
uint32_t aType,
|
||||
bool aExactHostMatch)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
{
|
||||
nsCOMPtr<nsIPrincipal> principal;
|
||||
nsresult rv = GetPrincipal(aURI, getter_AddRefs(principal));
|
||||
MOZ_ASSERT_IF(NS_SUCCEEDED(rv),
|
||||
PermissionAvaliable(principal, mTypeArray[aType].get()));
|
||||
}
|
||||
#endif
|
||||
|
||||
nsresult rv;
|
||||
RefPtr<PermissionKey> key =
|
||||
PermissionKey::CreateFromURI(aURI, rv);
|
||||
if (!key) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
PermissionHashKey* entry = mPermissionTable.GetEntry(key);
|
||||
|
||||
if (entry) {
|
||||
PermissionEntry permEntry = entry->GetPermission(aType);
|
||||
|
||||
// if the entry is expired, remove and keep looking for others.
|
||||
// Note that EXPIRE_SESSION only honors expireTime if it is nonzero.
|
||||
if ((permEntry.mExpireType == nsIPermissionManager::EXPIRE_TIME ||
|
||||
(permEntry.mExpireType == nsIPermissionManager::EXPIRE_SESSION &&
|
||||
permEntry.mExpireTime != 0)) &&
|
||||
permEntry.mExpireTime <= (PR_Now() / 1000)) {
|
||||
entry = nullptr;
|
||||
// If we need to remove a permission we mint a principal. This is a bit
|
||||
// inefficient, but hopefully this code path isn't super common.
|
||||
nsCOMPtr<nsIPrincipal> principal;
|
||||
nsresult rv = GetPrincipal(aURI, getter_AddRefs(principal));
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return nullptr;
|
||||
}
|
||||
RemoveFromPrincipal(principal, mTypeArray[aType].get());
|
||||
} else if (permEntry.mPermission == nsIPermissionManager::UNKNOWN_ACTION) {
|
||||
entry = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
if (entry) {
|
||||
return entry;
|
||||
}
|
||||
|
||||
// If aExactHostMatch wasn't true, we can check if the base domain has a permission entry.
|
||||
if (!aExactHostMatch) {
|
||||
nsCOMPtr<nsIURI> uri = GetNextSubDomainURI(aURI);
|
||||
if (uri) {
|
||||
return GetPermissionHashKey(uri, aType, aExactHostMatch);
|
||||
}
|
||||
}
|
||||
|
||||
// No entry, really...
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsPermissionManager::GetEnumerator(nsISimpleEnumerator **aEnum)
|
||||
{
|
||||
if (XRE_IsContentProcess()) {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set ts=8 sts=2 et sw=2 tw=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/. */
|
||||
|
@ -76,6 +77,8 @@ public:
|
|||
public:
|
||||
static PermissionKey* CreateFromPrincipal(nsIPrincipal* aPrincipal,
|
||||
nsresult& aResult);
|
||||
static PermissionKey* CreateFromURI(nsIURI* aURI,
|
||||
nsresult& aResult);
|
||||
|
||||
explicit PermissionKey(const nsACString& aOrigin)
|
||||
: mOrigin(aOrigin)
|
||||
|
@ -273,12 +276,36 @@ private:
|
|||
PermissionHashKey* GetPermissionHashKey(nsIPrincipal* aPrincipal,
|
||||
uint32_t aType,
|
||||
bool aExactHostMatch);
|
||||
PermissionHashKey* GetPermissionHashKey(nsIURI* aURI,
|
||||
uint32_t aType,
|
||||
bool aExactHostMatch);
|
||||
|
||||
nsresult CommonTestPermission(nsIPrincipal* aPrincipal,
|
||||
const char *aType,
|
||||
uint32_t *aPermission,
|
||||
const char * aType,
|
||||
uint32_t * aPermission,
|
||||
bool aExactHostMatch,
|
||||
bool aIncludingSession)
|
||||
{
|
||||
return CommonTestPermissionInternal(aPrincipal, nullptr, aType,
|
||||
aPermission, aExactHostMatch,
|
||||
aIncludingSession);
|
||||
}
|
||||
nsresult CommonTestPermission(nsIURI * aURI,
|
||||
const char* aType,
|
||||
uint32_t * aPermission,
|
||||
bool aExactHostMatch,
|
||||
bool aIncludingSession);
|
||||
bool aIncludingSession)
|
||||
{
|
||||
return CommonTestPermissionInternal(nullptr, aURI, aType, aPermission,
|
||||
aExactHostMatch, aIncludingSession);
|
||||
}
|
||||
// Only one of aPrincipal or aURI is allowed to be passed in.
|
||||
nsresult CommonTestPermissionInternal(nsIPrincipal* aPrincipal,
|
||||
nsIURI * aURI,
|
||||
const char * aType,
|
||||
uint32_t * aPermission,
|
||||
bool aExactHostMatch,
|
||||
bool aIncludingSession);
|
||||
|
||||
nsresult OpenDatabase(nsIFile* permissionsFile);
|
||||
nsresult InitDB(bool aRemoveFile);
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -13,11 +13,11 @@
|
|||
#include <d3d11.h>
|
||||
#include <dxgi1_2.h>
|
||||
|
||||
struct ShaderBytes;
|
||||
|
||||
namespace mozilla {
|
||||
namespace layers {
|
||||
|
||||
struct ShaderBytes;
|
||||
|
||||
class DeviceAttachmentsD3D11
|
||||
{
|
||||
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DeviceAttachmentsD3D11);
|
||||
|
|
|
@ -0,0 +1,153 @@
|
|||
# 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/.
|
||||
import argparse
|
||||
import codecs
|
||||
import locale
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import yaml
|
||||
|
||||
def shell_main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('-o', '--output', type=str, required=True,
|
||||
help='Output file')
|
||||
parser.add_argument('manifest', type=str,
|
||||
help='Manifest source file')
|
||||
args = parser.parse_args()
|
||||
|
||||
with open(args.output, 'w') as out_file:
|
||||
process_manifest(out_file, args.manifest)
|
||||
|
||||
def main(output_fp, input_filename):
|
||||
return process_manifest(output_fp, input_filename)
|
||||
|
||||
HEADER = """// AUTOGENERATED - DO NOT EDIT
|
||||
namespace mozilla {
|
||||
namespace layers {
|
||||
|
||||
struct ShaderBytes { const void* mData; size_t mLength; };
|
||||
"""
|
||||
FOOTER = """
|
||||
} // namespace layers
|
||||
} // namespace mozilla"""
|
||||
|
||||
def process_manifest(output_fp, manifest_filename):
|
||||
with codecs.open(manifest_filename, 'r', 'UTF-8') as in_fp:
|
||||
manifest = yaml.load(in_fp)
|
||||
shader_folder, _ = os.path.split(manifest_filename)
|
||||
|
||||
output_fp.write(HEADER)
|
||||
|
||||
deps = set()
|
||||
for block in manifest:
|
||||
if 'type' not in block:
|
||||
raise Exception("Expected 'type' key with shader mode")
|
||||
if 'file' not in block:
|
||||
raise Exception("Expected 'file' key with shader file")
|
||||
if 'shaders' not in block:
|
||||
raise Exception("Expected 'shaders' key with shader name list")
|
||||
|
||||
shader_file = os.path.join(shader_folder, block['file'])
|
||||
deps.add(shader_file)
|
||||
|
||||
shader_model = block['type']
|
||||
for shader_name in block['shaders']:
|
||||
new_deps = run_fxc(
|
||||
shader_model = shader_model,
|
||||
shader_file = shader_file,
|
||||
shader_name = shader_name,
|
||||
output_fp = output_fp)
|
||||
deps |= new_deps
|
||||
|
||||
output_fp.write(FOOTER)
|
||||
return deps
|
||||
|
||||
def run_fxc(shader_model,
|
||||
shader_file,
|
||||
shader_name,
|
||||
output_fp):
|
||||
argv = [
|
||||
'fxc',
|
||||
'-nologo',
|
||||
'-T{0}'.format(shader_model),
|
||||
shader_file,
|
||||
'-E{0}'.format(shader_name),
|
||||
'-Vn{0}'.format(shader_name),
|
||||
'-Vi',
|
||||
]
|
||||
if shader_model.startswith('vs_'):
|
||||
argv += ['-DVERTEX_SHADER']
|
||||
elif shader_model.startswith('ps_'):
|
||||
argv += ['-DPIXEL_SHADER']
|
||||
|
||||
deps = None
|
||||
with ScopedTempFilename() as temp_filename:
|
||||
argv += ['-Fh{0}'.format(temp_filename)]
|
||||
|
||||
sys.stdout.write('{0}\n'.format(' '.join(argv)))
|
||||
proc_stdout = subprocess.check_output(argv)
|
||||
proc_stdout = decode_console_text(sys.stdout, proc_stdout)
|
||||
deps = find_dependencies(proc_stdout)
|
||||
assert len(deps) > 0
|
||||
|
||||
with open(temp_filename, 'r') as temp_fp:
|
||||
output_fp.write(temp_fp.read())
|
||||
|
||||
output_fp.write("ShaderBytes s{0} = {{ {0}, sizeof({0}) }};\n".format(
|
||||
shader_name))
|
||||
return deps
|
||||
|
||||
def find_dependencies(fxc_output):
|
||||
# Dependencies look like this:
|
||||
# Resolved to [<path>]
|
||||
#
|
||||
# Microsoft likes to change output strings based on the user's language, so
|
||||
# instead of pattern matching on that string, we take everything in between
|
||||
# brackets. We filter out potentially bogus strings later.
|
||||
deps = set()
|
||||
for line in fxc_output.split('\n'):
|
||||
m = re.search(r"\[([^\]]+)\]", line)
|
||||
if m is None:
|
||||
continue
|
||||
dep_path = m.group(1)
|
||||
dep_path = os.path.normpath(dep_path)
|
||||
if os.path.isfile(dep_path):
|
||||
deps.add(dep_path)
|
||||
return deps
|
||||
|
||||
# Python reads the raw bytes from stdout, so we need to try our best to
|
||||
# capture that as a valid Python string.
|
||||
def decode_console_text(pipe, text):
|
||||
try:
|
||||
if pipe.encoding:
|
||||
return text.decode(pipe.encoding, 'replace')
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
return text.decode(locale.getpreferredencoding(), 'replace')
|
||||
except:
|
||||
return text.decode('utf8', 'replace')
|
||||
|
||||
# Allocate a temporary file name and delete it when done. We need an extra
|
||||
# wrapper for this since TemporaryNamedFile holds the file open.
|
||||
class ScopedTempFilename(object):
|
||||
def __init__(self):
|
||||
self.name = None
|
||||
def __enter__(self):
|
||||
with tempfile.NamedTemporaryFile(delete = False) as tmp:
|
||||
self.name = tmp.name
|
||||
return self.name
|
||||
def __exit__(self, type, value, traceback):
|
||||
if not self.name:
|
||||
return
|
||||
try:
|
||||
os.unlink(self.name)
|
||||
except:
|
||||
pass
|
||||
|
||||
if __name__ == '__main__':
|
||||
shell_main()
|
|
@ -1,56 +0,0 @@
|
|||
# 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/.
|
||||
|
||||
tempfile=tmpShaderHeader
|
||||
|
||||
FXC_DEBUG_FLAGS="-Zi -Fd shaders.pdb"
|
||||
FXC_FLAGS=""
|
||||
|
||||
# If DEBUG is in the environment, then rebuild with debug info
|
||||
if [ "$DEBUG" != "" ] ; then
|
||||
FXC_FLAGS="$FXC_DEBUG_FLAGS"
|
||||
fi
|
||||
|
||||
makeShaderVS() {
|
||||
fxc -nologo $FXC_FLAGS -Tvs_4_0_level_9_3 $SRC -E$1 -Vn$1 -Fh$tempfile
|
||||
echo "ShaderBytes s$1 = { $1, sizeof($1) };" >> $tempfile;
|
||||
cat $tempfile >> $DEST
|
||||
}
|
||||
|
||||
makeShaderPS() {
|
||||
fxc -nologo $FXC_FLAGS -Tps_4_0_level_9_3 $SRC -E$1 -Vn$1 -Fh$tempfile
|
||||
echo "ShaderBytes s$1 = { $1, sizeof($1) };" >> $tempfile;
|
||||
cat $tempfile >> $DEST
|
||||
}
|
||||
|
||||
SRC=CompositorD3D11.hlsl
|
||||
DEST=CompositorD3D11Shaders.h
|
||||
|
||||
rm -f $DEST
|
||||
echo "struct ShaderBytes { const void* mData; size_t mLength; };" >> $DEST;
|
||||
makeShaderVS LayerQuadVS
|
||||
makeShaderVS LayerDynamicVS
|
||||
makeShaderPS SolidColorShader
|
||||
makeShaderPS RGBShader
|
||||
makeShaderPS RGBAShader
|
||||
makeShaderPS ComponentAlphaShader
|
||||
makeShaderPS YCbCrShader
|
||||
makeShaderPS NV12Shader
|
||||
makeShaderVS LayerQuadMaskVS
|
||||
makeShaderVS LayerDynamicMaskVS
|
||||
makeShaderPS SolidColorShaderMask
|
||||
makeShaderPS RGBShaderMask
|
||||
makeShaderPS RGBAShaderMask
|
||||
makeShaderPS YCbCrShaderMask
|
||||
makeShaderPS NV12ShaderMask
|
||||
makeShaderPS ComponentAlphaShaderMask
|
||||
|
||||
# Mix-blend shaders
|
||||
makeShaderVS LayerQuadBlendVS
|
||||
makeShaderVS LayerQuadBlendMaskVS
|
||||
makeShaderVS LayerDynamicBlendVS
|
||||
makeShaderVS LayerDynamicBlendMaskVS
|
||||
makeShaderPS BlendShader
|
||||
|
||||
rm $tempfile
|
|
@ -0,0 +1,28 @@
|
|||
- type: vs_4_0_level_9_3
|
||||
file: CompositorD3D11.hlsl
|
||||
shaders:
|
||||
- LayerQuadVS
|
||||
- LayerDynamicVS
|
||||
- LayerQuadMaskVS
|
||||
- LayerDynamicMaskVS
|
||||
- LayerQuadBlendVS
|
||||
- LayerQuadBlendMaskVS
|
||||
- LayerDynamicBlendVS
|
||||
- LayerDynamicBlendMaskVS
|
||||
|
||||
- type: ps_4_0_level_9_3
|
||||
file: CompositorD3D11.hlsl
|
||||
shaders:
|
||||
- SolidColorShader
|
||||
- RGBShader
|
||||
- RGBAShader
|
||||
- ComponentAlphaShader
|
||||
- YCbCrShader
|
||||
- NV12Shader
|
||||
- SolidColorShaderMask
|
||||
- RGBShaderMask
|
||||
- RGBAShaderMask
|
||||
- YCbCrShaderMask
|
||||
- NV12ShaderMask
|
||||
- ComponentAlphaShaderMask
|
||||
- BlendShader
|
|
@ -464,6 +464,15 @@ IPDL_SOURCES += [
|
|||
|
||||
include('/ipc/chromium/chromium-config.mozbuild')
|
||||
|
||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
|
||||
GENERATED_FILES = [
|
||||
'CompositorD3D11Shaders.h',
|
||||
]
|
||||
|
||||
d3d11_shaders = GENERATED_FILES['CompositorD3D11Shaders.h']
|
||||
d3d11_shaders.script = 'd3d11/genshaders.py'
|
||||
d3d11_shaders.inputs = ['d3d11/shaders.manifest']
|
||||
|
||||
LOCAL_INCLUDES += [
|
||||
'/docshell/base', # for nsDocShell.h
|
||||
'/layout/base', # for TouchManager.h
|
||||
|
|
|
@ -42,9 +42,13 @@
|
|||
*/
|
||||
|
||||
// See CompositorD3D11Shaders.h
|
||||
namespace mozilla {
|
||||
namespace layers {
|
||||
struct ShaderBytes { const void* mData; size_t mLength; };
|
||||
extern ShaderBytes sRGBShader;
|
||||
extern ShaderBytes sLayerQuadVS;
|
||||
} // namespace layers
|
||||
} // namespace mozilla
|
||||
#ifndef M_PI
|
||||
# define M_PI 3.14159265358979323846
|
||||
#endif
|
||||
|
@ -1504,4 +1508,4 @@ VRSystemManagerOculus::RemoveControllers()
|
|||
|
||||
mOculusController.Clear();
|
||||
mControllerCount = 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -774,6 +774,7 @@ MessageChannel::Open(Transport* aTransport, MessageLoop* aIOLoop, Side aSide)
|
|||
mWorkerLoop = MessageLoop::current();
|
||||
mWorkerLoopID = mWorkerLoop->id();
|
||||
mWorkerLoop->AddDestructionObserver(this);
|
||||
mListener->SetIsMainThreadProtocol();
|
||||
|
||||
if (!AbstractThread::GetCurrent()) {
|
||||
mWorkerLoop->AddDestructionObserver(
|
||||
|
@ -859,6 +860,7 @@ MessageChannel::CommonThreadOpenInit(MessageChannel *aTargetChan, Side aSide)
|
|||
mWorkerLoop = MessageLoop::current();
|
||||
mWorkerLoopID = mWorkerLoop->id();
|
||||
mWorkerLoop->AddDestructionObserver(this);
|
||||
mListener->SetIsMainThreadProtocol();
|
||||
|
||||
if (!AbstractThread::GetCurrent()) {
|
||||
mWorkerLoop->AddDestructionObserver(
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "mozilla/ipc/MessageChannel.h"
|
||||
#include "mozilla/ipc/Transport.h"
|
||||
#include "mozilla/StaticMutex.h"
|
||||
#include "mozilla/SystemGroup.h"
|
||||
#include "mozilla/Unused.h"
|
||||
#include "nsPrintfCString.h"
|
||||
|
||||
|
@ -815,6 +816,13 @@ IToplevelProtocol::ShmemDestroyed(const Message& aMsg)
|
|||
already_AddRefed<nsIEventTarget>
|
||||
IToplevelProtocol::GetMessageEventTarget(const Message& aMsg)
|
||||
{
|
||||
if (IsMainThreadProtocol() && SystemGroup::Initialized()) {
|
||||
if (aMsg.type() == SHMEM_CREATED_MESSAGE_TYPE ||
|
||||
aMsg.type() == SHMEM_DESTROYED_MESSAGE_TYPE) {
|
||||
return do_AddRef(SystemGroup::EventTargetFor(TaskCategory::Other));
|
||||
}
|
||||
}
|
||||
|
||||
int32_t route = aMsg.routing_id();
|
||||
|
||||
Maybe<MutexAutoLock> lock;
|
||||
|
|
|
@ -386,6 +386,10 @@ public:
|
|||
GetActorEventTarget();
|
||||
|
||||
virtual void OnChannelReceivedMessage(const Message& aMsg) {}
|
||||
|
||||
bool IsMainThreadProtocol() const { return mIsMainThreadProtocol; }
|
||||
void SetIsMainThreadProtocol() { mIsMainThreadProtocol = NS_IsMainThread(); }
|
||||
|
||||
protected:
|
||||
// Override this method in top-level protocols to change the event target
|
||||
// for a new actor (and its sub-actors).
|
||||
|
@ -413,6 +417,7 @@ protected:
|
|||
int32_t mLastRouteId;
|
||||
IDMap<Shmem::SharedMemory*> mShmemMap;
|
||||
Shmem::id_t mLastShmemId;
|
||||
bool mIsMainThreadProtocol;
|
||||
|
||||
Mutex mEventTargetMutex;
|
||||
IDMap<nsCOMPtr<nsIEventTarget>> mEventTargetMap;
|
||||
|
|
|
@ -1080,8 +1080,6 @@ description =
|
|||
description =
|
||||
[PCookieService::GetCookieString]
|
||||
description =
|
||||
[PPrinting::ShowProgress]
|
||||
description =
|
||||
[PPrinting::SavePrintSettings]
|
||||
description =
|
||||
[PHandlerService::FillHandlerInfo]
|
||||
|
|
|
@ -432,13 +432,8 @@ if args.variant in ('tsan', 'msan'):
|
|||
print >> outfh, "%d %s" % (count, location)
|
||||
print(open(summary_filename, 'rb').read())
|
||||
|
||||
max_allowed = None
|
||||
if 'max-errors' in variant:
|
||||
max_allowed = variant['max-errors']
|
||||
elif 'expect-errors' in variant:
|
||||
max_allowed = len(variant['expect-errors'])
|
||||
|
||||
if max_allowed is not None:
|
||||
print("Found %d errors out of %d allowed" % (len(sites), max_allowed))
|
||||
if len(sites) > max_allowed:
|
||||
results.append(1)
|
||||
|
@ -467,12 +462,18 @@ if args.variant in ('tsan', 'msan'):
|
|||
# expect-errors is an array of (filename, function) tuples.
|
||||
expect = tuple(expect)
|
||||
if remaining[expect] == 0:
|
||||
print("Did not see expected error in %s function %s" % expect)
|
||||
print("Did not see known error in %s function %s" % expect)
|
||||
else:
|
||||
remaining[expect] -= 1
|
||||
|
||||
status = 0
|
||||
for filename, function in (e for e, c in remaining.items() if c > 0):
|
||||
print("*** tsan error in %s function %s" % (filename, function))
|
||||
if AUTOMATION:
|
||||
print("TinderboxPrint: tsan error<br/>%s function %s" % (filename, function))
|
||||
status = 1
|
||||
else:
|
||||
print("*** tsan error in %s function %s" % (filename, function))
|
||||
results.append(status)
|
||||
|
||||
# Gather individual results into a tarball. Note that these are
|
||||
# distinguished only by pid of the JS process running within each test, so
|
||||
|
|
|
@ -1,10 +1,14 @@
|
|||
# Skip tests that rely on wasm signal handlers.
|
||||
asm.js/testTimeout1.js
|
||||
asm.js/testTimeout2.js
|
||||
asm.js/testTimeout3.js
|
||||
asm.js/testTimeout4.js
|
||||
asm.js/testTimeout5.js
|
||||
asm.js/testTimeout6.js
|
||||
basic/spread-call-maxarg.js
|
||||
basic/spread-call-near-maxarg.js
|
||||
ion/iloop.js
|
||||
wasm/timeout
|
||||
|
||||
# Skip tests that run too slowly under tsan.
|
||||
basic/spread-call-maxarg.js
|
||||
basic/spread-call-near-maxarg.js
|
||||
arrays/too-long-array-splice.js
|
||||
|
|
|
@ -9,27 +9,36 @@
|
|||
"JSTESTS_EXTRA_ARGS": "--exclude-file={DIR}/cgc-jstests-slow.txt",
|
||||
"TSAN_OPTIONS": "exitcode=0 log_path={OUTDIR}/sanitize_log"
|
||||
},
|
||||
"[comment on expect-errors]": "Note that expect-errors may contain duplicates. These indicate that tsan reports errors as two distinct line numbers. We cannot just insert line numbers, because they will shift around between versions.",
|
||||
"[comment on expect-errors]": "Note that expect-errors may contain duplicates. These indicate that tsan reports errors as two distinct line numbers in the same function. (Line number shift around, so we cannot just include them here.)",
|
||||
"expect-errors": [
|
||||
[ "Shape.h", "inDictionary" ],
|
||||
[ "jsfriendapi.h", "GetObjectClass" ],
|
||||
[ "Shape.h", "maybeSlot" ],
|
||||
[ "Barrier.h", "set" ],
|
||||
[ "jitprofiling.c", "iJIT_GetNewMethodID" ],
|
||||
[ "Statistics.h", "count" ],
|
||||
[ "Shape.h", "slotSpan" ],
|
||||
[ "Shape.h", "setSlotWithType" ],
|
||||
[ "Shape.h", "search<js::MaybeAdding::NotAdding>" ],
|
||||
[ "Shape.h", "setOverwritten" ],
|
||||
[ "TestingFunctions.cpp", "js::DefineTestingFunctions(JSContext*, JS::Handle<JSObject*>, bool, bool)" ],
|
||||
[ "TestingFunctions.cpp", "js::DefineTestingFunctions(JSContext*, JS::Handle<JSObject*>, bool, bool)" ],
|
||||
[ "OSObject.cpp", "js::shell::DefineOS(JSContext*, JS::Handle<JSObject*>, bool, js::shell::RCFile**, js::shell::RCFile**)" ],
|
||||
[ "OSObject.cpp", "js::shell::DefineOS(JSContext*, JS::Handle<JSObject*>, bool, js::shell::RCFile**, js::shell::RCFile**)" ],
|
||||
[ "ObjectGroup.h", "addendumKind" ],
|
||||
[ "jsfriendapi.h", "numFixedSlots" ],
|
||||
[ "Marking.cpp", "js::GCMarker::reset()" ],
|
||||
[ "jsfun.h", "setResolvedLength" ],
|
||||
[ "Shape.h", "incrementNumLinearSearches" ],
|
||||
[ "Shape.h", "isBigEnoughForAShapeTable" ],
|
||||
[ "Shape.h", "js::jit::CodeGenerator::emitGetPropertyPolymorphic(js::jit::LInstruction*, js::jit::Register, js::jit::Register, js::jit::TypedOrValueRegister const&)" ],
|
||||
[ "ProtectedData.h", "operator=<js::CooperatingContext>" ],
|
||||
[ "ProtectedData.h", "js::ZoneGroup::leave()" ],
|
||||
[ "jsfriendapi.h", "GetObjectClass" ],
|
||||
[ "jsfriendapi.h", "numFixedSlots" ],
|
||||
[ "jsfriendapi.h", "numDynamicSlots" ],
|
||||
[ "jsfriendapi.h", "EmulatesUndefined" ],
|
||||
[ "jitprofiling.c", "iJIT_GetNewMethodID" ],
|
||||
[ "Marking.cpp", "js::GCMarker::reset()" ],
|
||||
[ "Statistics.h", "js::gc::GCRuntime::pickChunk(js::AutoLockGC const&, js::gc::AutoMaybeStartBackgroundAllocation&)" ],
|
||||
[ "jsfun.h", "needsSomeEnvironmentObject" ],
|
||||
[ "Statistics.h", "js::gc::GCRuntime::getOrAllocChunk(js::AutoLockGC const&, js::gc::AutoMaybeStartBackgroundAllocation&)" ],
|
||||
[ "Barrier.h", "set" ],
|
||||
[ "Stack.h", "context" ],
|
||||
[ "Stack.h", "js::HelperThread::handleIonWorkload(js::AutoLockHelperThreadState&)" ],
|
||||
[ "ObjectGroup.h", "addendumKind" ],
|
||||
[ "ObjectGroup.h", "generation" ],
|
||||
[ "ObjectGroup.h", "js::jit::MObjectState::New(js::jit::TempAllocator&, js::jit::MDefinition*)" ],
|
||||
[ "TypeInference-inl.h", "setBasePropertyCount" ],
|
||||
[ "Statistics.h", "js::gc::GCRuntime::getOrAllocChunk(js::AutoLockGC const&, js::gc::AutoMaybeStartBackgroundAllocation&)" ]
|
||||
[ "jsscript.h", "decref" ],
|
||||
[ "jsfun.h", "setResolvedLength" ],
|
||||
[ "jsfun.h", "needsSomeEnvironmentObject" ]
|
||||
]
|
||||
}
|
||||
|
|
|
@ -5422,7 +5422,14 @@ BytecodeEmitter::emitIteratorClose(IteratorKind iterKind /* = IteratorKind::Sync
|
|||
checkTypeSet(JSOP_CALL);
|
||||
|
||||
if (iterKind == IteratorKind::Async) {
|
||||
if (!emitAwait()) // ... ... RESULT
|
||||
if (completionKind != CompletionKind::Throw) {
|
||||
// Await clobbers rval, so save the current rval.
|
||||
if (!emit1(JSOP_GETRVAL)) // ... ... RESULT RVAL
|
||||
return false;
|
||||
if (!emit1(JSOP_SWAP)) // ... ... RVAL RESULT
|
||||
return false;
|
||||
}
|
||||
if (!emitAwait()) // ... ... RVAL? RESULT
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -5450,8 +5457,15 @@ BytecodeEmitter::emitIteratorClose(IteratorKind iterKind /* = IteratorKind::Sync
|
|||
if (!emitPopN(2)) // ... RESULT
|
||||
return false;
|
||||
} else {
|
||||
if (!emitCheckIsObj(CheckIsObjectKind::IteratorReturn)) // ... RESULT
|
||||
if (!emitCheckIsObj(CheckIsObjectKind::IteratorReturn)) // ... RVAL? RESULT
|
||||
return false;
|
||||
|
||||
if (iterKind == IteratorKind::Async) {
|
||||
if (!emit1(JSOP_SWAP)) // ... RESULT RVAL
|
||||
return false;
|
||||
if (!emit1(JSOP_SETRVAL)) // ... RESULT
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ifReturnMethodIsDefined.emitElse())
|
||||
|
|
|
@ -241,7 +241,10 @@ def main(argv):
|
|||
|
||||
if options.exclude_from:
|
||||
with open(options.exclude_from) as fh:
|
||||
options.exclude += [_.strip() for _ in fh]
|
||||
for line in fh:
|
||||
line = line.strip()
|
||||
if not line.startswith("#") and len(line):
|
||||
options.exclude.append(line)
|
||||
|
||||
if options.exclude:
|
||||
exclude_list = []
|
||||
|
|
|
@ -507,17 +507,11 @@ skip script test262/language/statements/for-await-of/async-func-dstr-let-ary-ptr
|
|||
skip script test262/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-iter-step-err.js
|
||||
skip script test262/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elision-step-err.js
|
||||
skip script test262/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-iter-step-err.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision-iter-close.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision-step-err.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-iter-close.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-iter-step-err.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision-iter-close.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision-step-err.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-iter-step-err.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-iter-close.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision-iter-close.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision-step-err.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-iter-close.js
|
||||
skip script test262/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-iter-step-err.js
|
||||
|
||||
# Missing expression statement restriction for "async function"
|
||||
|
|
|
@ -8009,6 +8009,13 @@ PresShell::HandleEventInternal(WidgetEvent* aEvent,
|
|||
bool touchIsNew = false;
|
||||
bool isHandlingUserInput = false;
|
||||
|
||||
if (mCurrentEventContent && aEvent->IsTargetedAtFocusedWindow()) {
|
||||
nsFocusManager* fm = nsFocusManager::GetFocusManager();
|
||||
if (fm) {
|
||||
fm->FlushBeforeEventHandlingIfNeeded(mCurrentEventContent);
|
||||
}
|
||||
}
|
||||
|
||||
// XXX How about IME events and input events for plugins?
|
||||
if (aEvent->IsTrusted()) {
|
||||
switch (aEvent->mMessage) {
|
||||
|
|
|
@ -879,10 +879,6 @@ pref("dom.push.maxRecentMessageIDsPerSubscription", 0);
|
|||
pref("dom.push.enabled", true);
|
||||
#endif
|
||||
|
||||
// Maximum number of setTimeout()/setInterval() callbacks to run in a single
|
||||
// event loop runnable. Minimum value of 1.
|
||||
pref("dom.timeout.max_consecutive_callbacks", 3);
|
||||
|
||||
// The remote content URL where FxAccountsWebChannel messages originate. Must use HTTPS.
|
||||
pref("identity.fxaccounts.remote.webchannel.uri", "https://accounts.firefox.com");
|
||||
|
||||
|
|
|
@ -4824,6 +4824,7 @@ pref("xpinstall.signatures.required", false);
|
|||
pref("extensions.alwaysUnpack", false);
|
||||
pref("extensions.minCompatiblePlatformVersion", "2.0");
|
||||
pref("extensions.webExtensionsMinPlatformVersion", "42.0a1");
|
||||
pref("extensions.legacy.enabled", true);
|
||||
pref("extensions.allow-non-mpc-extensions", true);
|
||||
|
||||
// Other webextensions prefs
|
||||
|
@ -5716,9 +5717,9 @@ pref("dom.IntersectionObserver.enabled", true);
|
|||
// Whether module scripts (<script type="module">) are enabled for content.
|
||||
pref("dom.moduleScripts.enabled", false);
|
||||
|
||||
// Maximum number of setTimeout()/setInterval() callbacks to run in a single
|
||||
// event loop runnable. Minimum value of 1.
|
||||
pref("dom.timeout.max_consecutive_callbacks", 5);
|
||||
// Maximum amount of time in milliseconds consecutive setTimeout()/setInterval()
|
||||
// callback are allowed to run before yielding the event loop.
|
||||
pref("dom.timeout.max_consecutive_callbacks_ms", 4);
|
||||
|
||||
#ifdef FUZZING
|
||||
pref("fuzzing.enabled", false);
|
||||
|
|
|
@ -21,12 +21,10 @@ sync protocol PPrinting
|
|||
manages PRemotePrintJob;
|
||||
|
||||
parent:
|
||||
sync ShowProgress(PBrowser browser,
|
||||
PPrintProgressDialog printProgressDialog,
|
||||
nullable PRemotePrintJob remotePrintJob,
|
||||
bool isForPrinting)
|
||||
returns(bool notifyOnOpen,
|
||||
nsresult rv);
|
||||
async ShowProgress(PBrowser browser,
|
||||
PPrintProgressDialog printProgressDialog,
|
||||
nullable PRemotePrintJob remotePrintJob,
|
||||
bool isForPrinting);
|
||||
|
||||
async ShowPrintDialog(PPrintSettingsDialog dialog,
|
||||
nullable PBrowser browser,
|
||||
|
|
|
@ -33,24 +33,13 @@ mozilla::ipc::IPCResult
|
|||
PrintingParent::RecvShowProgress(PBrowserParent* parent,
|
||||
PPrintProgressDialogParent* printProgressDialog,
|
||||
PRemotePrintJobParent* remotePrintJob,
|
||||
const bool& isForPrinting,
|
||||
bool* notifyOnOpen,
|
||||
nsresult* result)
|
||||
const bool& isForPrinting)
|
||||
{
|
||||
*result = NS_ERROR_FAILURE;
|
||||
*notifyOnOpen = false;
|
||||
bool notifyOnOpen = false;
|
||||
|
||||
nsCOMPtr<nsPIDOMWindowOuter> parentWin = DOMWindowFromBrowserParent(parent);
|
||||
if (!parentWin) {
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIPrintingPromptService> pps(do_GetService("@mozilla.org/embedcomp/printingprompt-service;1"));
|
||||
|
||||
if (!pps) {
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
PrintProgressDialogParent* dialogParent =
|
||||
static_cast<PrintProgressDialogParent*>(printProgressDialog);
|
||||
nsCOMPtr<nsIObserver> observer = do_QueryInterface(dialogParent);
|
||||
|
@ -58,24 +47,42 @@ PrintingParent::RecvShowProgress(PBrowserParent* parent,
|
|||
nsCOMPtr<nsIWebProgressListener> printProgressListener;
|
||||
nsCOMPtr<nsIPrintProgressParams> printProgressParams;
|
||||
|
||||
*result = pps->ShowProgress(parentWin, nullptr, nullptr, observer,
|
||||
isForPrinting,
|
||||
getter_AddRefs(printProgressListener),
|
||||
getter_AddRefs(printProgressParams),
|
||||
notifyOnOpen);
|
||||
NS_ENSURE_SUCCESS(*result, IPC_OK());
|
||||
|
||||
if (remotePrintJob) {
|
||||
// If we have a RemotePrintJob use that as a more general forwarder for
|
||||
// print progress listeners.
|
||||
static_cast<RemotePrintJobParent*>(remotePrintJob)
|
||||
->RegisterListener(printProgressListener);
|
||||
} else {
|
||||
dialogParent->SetWebProgressListener(printProgressListener);
|
||||
nsresult rv = NS_ERROR_INVALID_ARG;
|
||||
if (parentWin && pps) {
|
||||
rv = pps->ShowProgress(parentWin, nullptr, nullptr, observer,
|
||||
isForPrinting,
|
||||
getter_AddRefs(printProgressListener),
|
||||
getter_AddRefs(printProgressParams),
|
||||
¬ifyOnOpen);
|
||||
}
|
||||
|
||||
dialogParent->SetPrintProgressParams(printProgressParams);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
if (remotePrintJob) {
|
||||
// If we have a RemotePrintJob use that as a more general forwarder for
|
||||
// print progress listeners.
|
||||
static_cast<RemotePrintJobParent*>(remotePrintJob)
|
||||
->RegisterListener(printProgressListener);
|
||||
} else {
|
||||
dialogParent->SetWebProgressListener(printProgressListener);
|
||||
}
|
||||
|
||||
dialogParent->SetPrintProgressParams(printProgressParams);
|
||||
}
|
||||
|
||||
// NOTE: If we aren't going to observe an event on our observer, we need to
|
||||
// fake one. This takes the form of sending the SendDialogOpened message. This
|
||||
// is safe because the child process proxy will always return `true` for
|
||||
// notifyOnOpen, as the request will always be async when performed across
|
||||
// process boundaries.
|
||||
//
|
||||
// We can pass nullptr for all of the arguments, as all consumers of this
|
||||
// observer don't care about the subject, topic, or data.
|
||||
//
|
||||
// If notifyOnOpen is true, then the ShowProgress call will handle notifying
|
||||
// our observer for us.
|
||||
if (!notifyOnOpen) {
|
||||
observer->Observe(nullptr, nullptr, nullptr);
|
||||
}
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
|
|
|
@ -33,9 +33,7 @@ public:
|
|||
RecvShowProgress(PBrowserParent* parent,
|
||||
PPrintProgressDialogParent* printProgressDialog,
|
||||
PRemotePrintJobParent* remotePrintJob,
|
||||
const bool& isForPrinting,
|
||||
bool* notifyOnOpen,
|
||||
nsresult* result);
|
||||
const bool& isForPrinting);
|
||||
virtual mozilla::ipc::IPCResult
|
||||
RecvShowPrintDialog(PPrintSettingsDialogParent* aDialog,
|
||||
PBrowserParent* aParent,
|
||||
|
|
|
@ -166,12 +166,12 @@ nsPrintingProxy::ShowProgress(mozIDOMWindowProxy* parent,
|
|||
}
|
||||
}
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
// NOTE: We set notifyOnOpen to true unconditionally. If the parent process
|
||||
// would get `false` for notifyOnOpen, then it will synthesize a notification
|
||||
// which will be sent asynchronously down to the child.
|
||||
*notifyOnOpen = true;
|
||||
mozilla::Unused << SendShowProgress(pBrowser, dialogChild, remotePrintJob,
|
||||
isForPrinting, notifyOnOpen, &rv);
|
||||
if (NS_FAILED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
isForPrinting);
|
||||
|
||||
// If we have a RemotePrintJob that will be being used as a more general
|
||||
// forwarder for print progress listeners. Once we always have one we can
|
||||
|
|
|
@ -246,6 +246,13 @@ this.AppConstants = Object.freeze({
|
|||
false,
|
||||
#endif
|
||||
|
||||
MOZ_ADDON_SIGNING:
|
||||
#ifdef MOZ_ADDON_SIGNING
|
||||
true,
|
||||
#else
|
||||
false,
|
||||
#endif
|
||||
|
||||
MOZ_REQUIRE_SIGNING:
|
||||
#ifdef MOZ_REQUIRE_SIGNING
|
||||
true,
|
||||
|
@ -253,6 +260,13 @@ this.AppConstants = Object.freeze({
|
|||
false,
|
||||
#endif
|
||||
|
||||
MOZ_ALLOW_LEGACY_EXTENSIONS:
|
||||
#ifdef MOZ_ALLOW_LEGACY_EXTENSIONS
|
||||
true,
|
||||
#else
|
||||
false,
|
||||
#endif
|
||||
|
||||
INSTALL_COMPACT_THEMES:
|
||||
#ifdef INSTALL_COMPACT_THEMES
|
||||
true,
|
||||
|
|
|
@ -538,6 +538,10 @@ project_flag('MOZ_ANDROID_HISTORY',
|
|||
help='Enable Android History instead of Places',
|
||||
set_as_define=True)
|
||||
|
||||
project_flag('MOZ_ALLOW_LEGACY_EXTENSIONS',
|
||||
help='Allow legacy browser extensions',
|
||||
default=True, set_as_define=True)
|
||||
|
||||
option(env='MOZ_PHOTON_ANIMATIONS',
|
||||
help='Enable Photon UI animations',
|
||||
default=milestone.is_nightly)
|
||||
|
|
|
@ -19,6 +19,7 @@ Cu.import("resource://gre/modules/DownloadUtils.jsm");
|
|||
Cu.import("resource://gre/modules/AddonManager.jsm");
|
||||
Cu.import("resource://gre/modules/AppConstants.jsm");
|
||||
Cu.import("resource://gre/modules/addons/AddonRepository.jsm");
|
||||
Cu.import("resource://gre/modules/addons/AddonSettings.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "E10SUtils", "resource:///modules/E10SUtils.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "Extension",
|
||||
|
@ -28,11 +29,6 @@ XPCOMUtils.defineLazyModuleGetter(this, "ExtensionParent",
|
|||
XPCOMUtils.defineLazyModuleGetter(this, "Preferences",
|
||||
"resource://gre/modules/Preferences.jsm");
|
||||
|
||||
const CONSTANTS = {};
|
||||
Cu.import("resource://gre/modules/addons/AddonConstants.jsm", CONSTANTS);
|
||||
const SIGNING_REQUIRED = CONSTANTS.REQUIRE_SIGNING ?
|
||||
true :
|
||||
Services.prefs.getBoolPref("xpinstall.signatures.required");
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "PluralForm",
|
||||
"resource://gre/modules/PluralForm.jsm");
|
||||
|
@ -2916,7 +2912,7 @@ var gListView = {
|
|||
filterDisabledUnsigned(aFilter = true) {
|
||||
let foundDisabledUnsigned = false;
|
||||
|
||||
if (SIGNING_REQUIRED) {
|
||||
if (AddonSettings.REQUIRE_SIGNING) {
|
||||
for (let item of this._listBox.childNodes) {
|
||||
if (!isCorrectlySigned(item.mAddon))
|
||||
foundDisabledUnsigned = true;
|
||||
|
@ -3396,7 +3392,7 @@ var gDetailView = {
|
|||
errorLink.value = gStrings.ext.GetStringFromName("details.notification.blocked.link");
|
||||
errorLink.href = this._addon.blocklistURL;
|
||||
errorLink.hidden = false;
|
||||
} else if (!isCorrectlySigned(this._addon) && SIGNING_REQUIRED) {
|
||||
} else if (!isCorrectlySigned(this._addon) && AddonSettings.REQUIRE_SIGNING) {
|
||||
this.node.setAttribute("notification", "error");
|
||||
document.getElementById("detail-error").textContent = gStrings.ext.formatStringFromName(
|
||||
"details.notification.unsignedAndDisabled", [this._addon.name, gStrings.brandShortName], 2
|
||||
|
|
|
@ -1302,7 +1302,8 @@
|
|||
this._errorLink.value = gStrings.ext.GetStringFromName("notification.blocked.link");
|
||||
this._errorLink.href = this.mAddon.blocklistURL;
|
||||
this._errorLink.hidden = false;
|
||||
} else if (!isUpgrade && !isCorrectlySigned(this.mAddon) && SIGNING_REQUIRED) {
|
||||
} else if (!isUpgrade && !isCorrectlySigned(this.mAddon) &&
|
||||
AddonSettings.REQUIRE_SIGNING) {
|
||||
this.setAttribute("notification", "error");
|
||||
this._error.textContent = gStrings.ext.formatStringFromName(
|
||||
"notification.unsignedAndDisabled", [this.mAddon.name, gStrings.brandShortName], 2
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
/* 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/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
this.EXPORTED_SYMBOLS = [ "ADDON_SIGNING", "REQUIRE_SIGNING" ];
|
||||
|
||||
// Make these non-changable properties so they can't be manipulated from other
|
||||
// code in the app.
|
||||
Object.defineProperty(this, "ADDON_SIGNING", {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: false,
|
||||
#ifdef MOZ_ADDON_SIGNING
|
||||
value: true,
|
||||
#else
|
||||
value: false,
|
||||
#endif
|
||||
});
|
||||
|
||||
Object.defineProperty(this, "REQUIRE_SIGNING", {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: false,
|
||||
#ifdef MOZ_REQUIRE_SIGNING
|
||||
value: true,
|
||||
#else
|
||||
value: false,
|
||||
#endif
|
||||
});
|
|
@ -0,0 +1,44 @@
|
|||
/* 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/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
|
||||
|
||||
this.EXPORTED_SYMBOLS = [ "AddonSettings" ];
|
||||
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Cu.import("resource://gre/modules/AppConstants.jsm");
|
||||
|
||||
const PREF_SIGNATURES_REQUIRED = "xpinstall.signatures.required";
|
||||
const PREF_ALLOW_LEGACY = "extensions.legacy.enabled";
|
||||
|
||||
this.AddonSettings = {};
|
||||
|
||||
// Make a non-changable property that can't be manipulated from other
|
||||
// code in the app.
|
||||
function makeConstant(name, value) {
|
||||
Object.defineProperty(AddonSettings, name, {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: false,
|
||||
value,
|
||||
});
|
||||
}
|
||||
|
||||
makeConstant("ADDON_SIGNING", AppConstants.MOZ_ADDON_SIGNING);
|
||||
|
||||
if (AppConstants.MOZ_REQUIRE_SIGNING && !Cu.isInAutomation) {
|
||||
makeConstant("REQUIRE_SIGNING", true);
|
||||
} else {
|
||||
XPCOMUtils.defineLazyPreferenceGetter(AddonSettings, "REQUIRE_SIGNING",
|
||||
PREF_SIGNATURES_REQUIRED, false);
|
||||
}
|
||||
|
||||
if (AppConstants.MOZ_ALLOW_LEGACY_EXTENSIONS || Cu.isInAutomation) {
|
||||
XPCOMUtils.defineLazyPreferenceGetter(AddonSettings, "ALLOW_LEGACY_EXTENSIONS",
|
||||
PREF_ALLOW_LEGACY, true);
|
||||
} else {
|
||||
makeConstant("ALLOW_LEGACY_EXTENSIONS", false);
|
||||
}
|
|
@ -11,10 +11,6 @@ const Cu = Components.utils;
|
|||
|
||||
this.EXPORTED_SYMBOLS = ["XPIProvider"];
|
||||
|
||||
const CONSTANTS = {};
|
||||
Cu.import("resource://gre/modules/addons/AddonConstants.jsm", CONSTANTS);
|
||||
const { ADDON_SIGNING, REQUIRE_SIGNING } = CONSTANTS
|
||||
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Cu.import("resource://gre/modules/AddonManager.jsm");
|
||||
|
@ -22,6 +18,10 @@ Cu.import("resource://gre/modules/Preferences.jsm");
|
|||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "AddonRepository",
|
||||
"resource://gre/modules/addons/AddonRepository.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "AddonSettings",
|
||||
"resource://gre/modules/addons/AddonSettings.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
|
||||
"resource://gre/modules/AppConstants.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "ChromeManifestParser",
|
||||
"resource://gre/modules/ChromeManifestParser.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "LightweightThemeManager",
|
||||
|
@ -229,6 +229,7 @@ const PREF_E10S_BLOCK_ENABLE = "extensions.e10sBlocksEnabling";
|
|||
const PREF_E10S_ADDON_BLOCKLIST = "extensions.e10s.rollout.blocklist";
|
||||
const PREF_E10S_ADDON_POLICY = "extensions.e10s.rollout.policy";
|
||||
const PREF_E10S_HAS_NONEXEMPT_ADDON = "extensions.e10s.rollout.hasAddon";
|
||||
const PREF_ALLOW_LEGACY = "extensions.legacy.enabled";
|
||||
const PREF_ALLOW_NON_MPC = "extensions.allow-non-mpc-extensions";
|
||||
|
||||
const PREF_EM_MIN_COMPAT_APP_VERSION = "extensions.minCompatibleAppVersion";
|
||||
|
@ -415,8 +416,7 @@ function mustSign(aType) {
|
|||
if (!SIGNED_TYPES.has(aType))
|
||||
return false;
|
||||
|
||||
return ((REQUIRE_SIGNING && !Cu.isInAutomation) ||
|
||||
Preferences.get(PREF_XPI_SIGNATURES_REQUIRED, false));
|
||||
return AddonSettings.REQUIRE_SIGNING;
|
||||
}
|
||||
|
||||
// Keep track of where we are in startup for telemetry
|
||||
|
@ -465,7 +465,7 @@ function loadLazyObjects() {
|
|||
});
|
||||
|
||||
Object.assign(scope, {
|
||||
ADDON_SIGNING,
|
||||
ADDON_SIGNING: AddonSettings.ADDON_SIGNING,
|
||||
SIGNED_TYPES,
|
||||
BOOTSTRAP_REASONS,
|
||||
DB_SCHEMA,
|
||||
|
@ -937,6 +937,13 @@ function isUsableAddon(aAddon) {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!AddonSettings.ALLOW_LEGACY_EXTENSIONS &&
|
||||
aAddon.type == "extension" && !aAddon.isSystem &&
|
||||
aAddon.signedState !== AddonManager.SIGNEDSTATE_PRIVILEGED) {
|
||||
logger.warn(`disabling legacy extension ${aAddon.id}`);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ALLOW_NON_MPC && aAddon.type == "extension" &&
|
||||
aAddon.multiprocessCompatible !== true) {
|
||||
logger.warn(`disabling ${aAddon.id} since it is not multiprocess compatible`);
|
||||
|
@ -1963,7 +1970,7 @@ function shouldVerifySignedState(aAddon) {
|
|||
|
||||
// Otherwise only check signatures if signing is enabled and the add-on is one
|
||||
// of the signed types.
|
||||
return ADDON_SIGNING && SIGNED_TYPES.has(aAddon.type);
|
||||
return AddonSettings.ADDON_SIGNING && SIGNED_TYPES.has(aAddon.type);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1986,7 +1993,7 @@ function verifyZipSignedState(aFile, aAddon) {
|
|||
});
|
||||
|
||||
let root = Ci.nsIX509CertDB.AddonsPublicRoot;
|
||||
if (!REQUIRE_SIGNING && Preferences.get(PREF_XPI_SIGNATURES_DEV_ROOT, false))
|
||||
if (!AppConstants.MOZ_REQUIRE_SIGNING && Preferences.get(PREF_XPI_SIGNATURES_DEV_ROOT, false))
|
||||
root = Ci.nsIX509CertDB.AddonsStageRoot;
|
||||
|
||||
return new Promise(resolve => {
|
||||
|
@ -2028,7 +2035,7 @@ function verifyDirSignedState(aDir, aAddon) {
|
|||
});
|
||||
|
||||
let root = Ci.nsIX509CertDB.AddonsPublicRoot;
|
||||
if (!REQUIRE_SIGNING && Preferences.get(PREF_XPI_SIGNATURES_DEV_ROOT, false))
|
||||
if (!AppConstants.MOZ_REQUIRE_SIGNING && Preferences.get(PREF_XPI_SIGNATURES_DEV_ROOT, false))
|
||||
root = Ci.nsIX509CertDB.AddonsStageRoot;
|
||||
|
||||
return new Promise(resolve => {
|
||||
|
@ -3253,8 +3260,9 @@ this.XPIProvider = {
|
|||
Services.prefs.addObserver(PREF_EM_MIN_COMPAT_PLATFORM_VERSION, this);
|
||||
Services.prefs.addObserver(PREF_E10S_ADDON_BLOCKLIST, this);
|
||||
Services.prefs.addObserver(PREF_E10S_ADDON_POLICY, this);
|
||||
if (!REQUIRE_SIGNING || Cu.isInAutomation)
|
||||
if (!AppConstants.MOZ_REQUIRE_SIGNING || Cu.isInAutomation)
|
||||
Services.prefs.addObserver(PREF_XPI_SIGNATURES_REQUIRED, this);
|
||||
Services.prefs.addObserver(PREF_ALLOW_LEGACY, this);
|
||||
Services.prefs.addObserver(PREF_ALLOW_NON_MPC, this);
|
||||
Services.obs.addObserver(this, NOTIFICATION_FLUSH_PERMISSIONS);
|
||||
|
||||
|
@ -4993,6 +5001,7 @@ this.XPIProvider = {
|
|||
this.updateAddonAppDisabledStates();
|
||||
break;
|
||||
case PREF_XPI_SIGNATURES_REQUIRED:
|
||||
case PREF_ALLOW_LEGACY:
|
||||
case PREF_ALLOW_NON_MPC:
|
||||
this.updateAddonAppDisabledStates();
|
||||
break;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
EXTRA_JS_MODULES.addons += [
|
||||
'AddonRepository.jsm',
|
||||
'AddonRepository_SQLiteMigrator.jsm',
|
||||
'AddonSettings.jsm',
|
||||
'AddonUpdateChecker.jsm',
|
||||
'APIExtensionBootstrap.js',
|
||||
'Content.js',
|
||||
|
@ -29,7 +30,3 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'android':
|
|||
EXTRA_JS_MODULES.addons += [
|
||||
'PluginProvider.jsm',
|
||||
]
|
||||
|
||||
EXTRA_PP_JS_MODULES.addons += [
|
||||
'AddonConstants.jsm',
|
||||
]
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
// Tests various aspects of the details view
|
||||
|
||||
const { REQUIRE_SIGNING } = Components.utils.import("resource://gre/modules/addons/AddonConstants.jsm", {});
|
||||
Components.utils.import("resource://gre/modules/AppConstants.jsm");
|
||||
|
||||
const PREF_AUTOUPDATE_DEFAULT = "extensions.update.autoUpdateDefault";
|
||||
const PREF_GETADDONS_GETSEARCHRESULTS = "extensions.getAddons.search.url";
|
||||
|
@ -710,7 +710,7 @@ add_test(function() {
|
|||
});
|
||||
|
||||
// These tests are only appropriate when signing can be turned off
|
||||
if (!REQUIRE_SIGNING) {
|
||||
if (!AppConstants.MOZ_REQUIRE_SIGNING) {
|
||||
// Opens and tests the details view for add-on 9
|
||||
add_test(function() {
|
||||
open_details("addon9@tests.mozilla.org", "extension", function() {
|
||||
|
@ -774,7 +774,7 @@ add_test(function() {
|
|||
});
|
||||
|
||||
// These tests are only appropriate when signing can be turned off
|
||||
if (!REQUIRE_SIGNING) {
|
||||
if (!AppConstants.REQUIRE_SIGNING) {
|
||||
// Opens and tests the details view for add-on 10
|
||||
add_test(function() {
|
||||
open_details("addon10@tests.mozilla.org", "extension", function() {
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
var tempScope = {};
|
||||
Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", tempScope);
|
||||
var LightweightThemeManager = tempScope.LightweightThemeManager;
|
||||
const { REQUIRE_SIGNING } = Components.utils.import("resource://gre/modules/addons/AddonConstants.jsm", {});
|
||||
Components.utils.import("resource://gre/modules/AppConstants.jsm");
|
||||
|
||||
var gProvider;
|
||||
var gManagerWindow;
|
||||
|
@ -418,7 +418,7 @@ add_task(async function() {
|
|||
is_element_hidden(get_node(addon, "pending"), "Pending message should be hidden");
|
||||
|
||||
// These tests are only appropriate when signing can be turned off
|
||||
if (!REQUIRE_SIGNING) {
|
||||
if (!AppConstants.MOZ_REQUIRE_SIGNING) {
|
||||
info("Addon 10");
|
||||
addon = items["Test add-on 10"];
|
||||
addon.parentNode.ensureElementIsVisible(addon);
|
||||
|
|
|
@ -3,7 +3,7 @@ gUseRealCertChecks = true;
|
|||
// Disable update security
|
||||
Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
|
||||
|
||||
const {REQUIRE_SIGNING} = AM_Cu.import("resource://gre/modules/addons/AddonConstants.jsm", {});
|
||||
Components.utils.import("resource://gre/modules/AppConstants.jsm");
|
||||
const PREF_XPI_SIGNATURES_DEV_ROOT = "xpinstall.signatures.dev-root";
|
||||
|
||||
const DATA = "data/signing_checks/";
|
||||
|
@ -226,7 +226,7 @@ add_task(async function() {
|
|||
// Try to install an add-on with the "Mozilla Extensions" OU
|
||||
add_task(async function() {
|
||||
// Remove the REQUIRE_SIGNING and DEV_ROOT stuff when bug 1357948 is fixed.
|
||||
if (REQUIRE_SIGNING) {
|
||||
if (AppConstants.MOZ_REQUIRE_SIGNING) {
|
||||
return;
|
||||
}
|
||||
Services.prefs.setBoolPref(PREF_XPI_SIGNATURES_DEV_ROOT, true);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
const {ADDON_SIGNING} = AM_Cu.import("resource://gre/modules/addons/AddonConstants.jsm", {});
|
||||
Components.utils.import("resource://gre/modules/addons/AddonSettings.jsm")
|
||||
|
||||
function run_test() {
|
||||
run_next_test();
|
||||
|
@ -26,7 +26,7 @@ const IMPLICIT_ID_ID = "webext_implicit_id@tests.mozilla.org";
|
|||
add_task(async function test_implicit_id() {
|
||||
// This test needs to read the xpi certificate which only works
|
||||
// if signing is enabled.
|
||||
ok(ADDON_SIGNING, "Add-on signing is enabled");
|
||||
ok(AddonSettings.ADDON_SIGNING, "Add-on signing is enabled");
|
||||
|
||||
let addon = await promiseAddonByID(IMPLICIT_ID_ID);
|
||||
equal(addon, null, "Add-on is not installed");
|
||||
|
@ -49,7 +49,7 @@ add_task(async function test_implicit_id() {
|
|||
add_task(async function test_implicit_id_temp() {
|
||||
// This test needs to read the xpi certificate which only works
|
||||
// if signing is enabled.
|
||||
ok(ADDON_SIGNING, "Add-on signing is enabled");
|
||||
ok(AddonSettings.ADDON_SIGNING, "Add-on signing is enabled");
|
||||
|
||||
let addon = await promiseAddonByID(IMPLICIT_ID_ID);
|
||||
equal(addon, null, "Add-on is not installed");
|
||||
|
|
|
@ -57,10 +57,19 @@ public:
|
|||
SchedulerGroup* mPrevRunningDispatcher;
|
||||
};
|
||||
|
||||
// This function returns true if it's currently safe to run code associated
|
||||
// with this SchedulerGroup. It will return true either if we're inside an
|
||||
// unlabeled runnable or if we're inside a runnable labeled with this
|
||||
// SchedulerGroup.
|
||||
bool IsSafeToRun() const
|
||||
{
|
||||
return !sRunningDispatcher || mAccessValid;
|
||||
}
|
||||
|
||||
// Ensure that it's valid to access the TabGroup at this time.
|
||||
void ValidateAccess() const
|
||||
{
|
||||
MOZ_ASSERT(!sRunningDispatcher || mAccessValid);
|
||||
MOZ_ASSERT(IsSafeToRun());
|
||||
}
|
||||
|
||||
class Runnable final : public mozilla::Runnable
|
||||
|
|
|
@ -22,6 +22,8 @@ public:
|
|||
static void ShutdownStatic();
|
||||
static SystemGroupImpl* Get();
|
||||
|
||||
static bool Initialized() { return !!sSingleton; }
|
||||
|
||||
NS_METHOD_(MozExternalRefCountType) AddRef(void)
|
||||
{
|
||||
return 2;
|
||||
|
@ -76,6 +78,12 @@ SystemGroup::Shutdown()
|
|||
SystemGroupImpl::ShutdownStatic();
|
||||
}
|
||||
|
||||
bool
|
||||
SystemGroup::Initialized()
|
||||
{
|
||||
return SystemGroupImpl::Initialized();
|
||||
}
|
||||
|
||||
/* static */ nsresult
|
||||
SystemGroup::Dispatch(const char* aName,
|
||||
TaskCategory aCategory,
|
||||
|
|
|
@ -34,6 +34,9 @@ class SystemGroup
|
|||
|
||||
static void InitStatic();
|
||||
static void Shutdown();
|
||||
|
||||
// Returns true if SystemGroup has been initialized.
|
||||
static bool Initialized();
|
||||
};
|
||||
|
||||
} // namespace mozilla
|
||||
|
|
Загрузка…
Ссылка в новой задаче