зеркало из https://github.com/mozilla/gecko-dev.git
Backed out 2 changesets (bug 1503776) for marionette failures on gfx\tests\marionette\test_pref_rollout_workaround.py. CLOSED TREE
Backed out changeset 56f6234b17fc (bug 1503776) Backed out changeset 838d9917f028 (bug 1503776)
This commit is contained in:
Родитель
581b7d4e3b
Коммит
62d62e3e66
|
@ -1,5 +0,0 @@
|
|||
[DEFAULT]
|
||||
run-if = buildapp == 'browser'
|
||||
|
||||
[test_pref_rollout_workaround.py]
|
||||
skip-if = os != "win" # Bug 1503776, WebRender is only available on Windows at this stage.
|
|
@ -1,111 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# 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/.
|
||||
|
||||
from marionette_driver.by import By
|
||||
from marionette_harness.marionette_test import MarionetteTestCase
|
||||
|
||||
|
||||
gfx_rollout_override = "gfx.webrender.all.qualified.gfxPref-default-override"
|
||||
hw_qualified_override = "gfx.webrender.all.qualified.hardware-override"
|
||||
rollout_pref = 'gfx.webrender.all.qualified'
|
||||
|
||||
class WrPrefRolloutWorkAroundTestCase(MarionetteTestCase):
|
||||
'''Test cases for WebRender gradual pref rollout work around.
|
||||
Normandy sets default prefs when rolling out a pref change, but
|
||||
gfx starts up before Normandy can set the pref's default value
|
||||
so we save the default value on shutdown, and check it on startup.
|
||||
This test verifies that we save and load the default value,
|
||||
and that the right compositor is enabled due to the rollout.
|
||||
'''
|
||||
|
||||
def test_wr_rollout_workaround_on_non_qualifying_hw(self):
|
||||
# Override the gfxPref so that WR is not enabled, as it would be before a rollout.
|
||||
self.marionette.set_pref(pref=gfx_rollout_override, value=False)
|
||||
# Set HW override so we behave as if we on non-qualifying hardware.
|
||||
self.marionette.set_pref(pref=hw_qualified_override, value=False)
|
||||
# Ensure we don't fallback to the basic compositor for some spurious reason.
|
||||
self.marionette.set_pref(pref="layers.acceleration.force-enabled", value=True)
|
||||
|
||||
# Restart browser. Gfx will observe hardware qualification override, and
|
||||
# gfx rollout override prefs. We should then be running in a browser which
|
||||
# behaves as if it's running on hardware that does not qualify for WR,
|
||||
# with WR not rolled out yet.
|
||||
self.marionette.restart(clean=False, in_app=True)
|
||||
|
||||
# Ensure we're not yet using WR; we're not rolled out yet!
|
||||
status, compositor = self.wr_status()
|
||||
print("self.wr_status()={},{}".format(status, compositor))
|
||||
self.assertEqual(status, 'opt-in', 'Should start out as WR opt-in')
|
||||
self.assertTrue(compositor != "webrender", "Before WR rollout on non-qualifying HW, should not be using WR.")
|
||||
|
||||
# Set the rollout pref's default value, as Normandy would do, and restart.
|
||||
# Gfx's shutdown observer should save the default value of the pref. Upon
|
||||
# restart, because we're pretending to be on *non-qualifying* hardware, WR
|
||||
# should be reported as blocked.
|
||||
self.marionette.set_pref(pref=rollout_pref, value=True, default_branch=True)
|
||||
self.marionette.restart(clean=False, in_app=True)
|
||||
status, compositor = self.wr_status()
|
||||
print("self.wr_status()={},{}".format(status, compositor))
|
||||
self.assertEqual(status, 'blocked', 'WR rolled out on non-qualifying hardware should be blocked.')
|
||||
self.assertTrue(compositor != "webrender", "WR rolled out on non-qualifying HW should not be used.")
|
||||
|
||||
# Simulate a rollback of the rollout; set the pref to false at runtime.
|
||||
self.marionette.set_pref(pref=rollout_pref, value=False, default_branch=True)
|
||||
self.marionette.restart(clean=False, in_app=True)
|
||||
status, compositor = self.wr_status()
|
||||
print("self.wr_status()={},{}".format(status, compositor))
|
||||
self.assertEqual(status, 'opt-in', 'WR rollback of rollout should revert to opt-in on non-qualifying hardware.')
|
||||
self.assertTrue(compositor != "webrender", "After roll back on non-qualifying HW, WR should not be used.")
|
||||
|
||||
|
||||
def test_wr_rollout_workaround_on_qualifying_hw(self):
|
||||
# Override the gfxPref so that WR is not enabled, as it would be before a rollout.
|
||||
self.marionette.set_pref(pref=gfx_rollout_override, value=False)
|
||||
# Set HW override so we behave as if we on qualifying hardware.
|
||||
self.marionette.set_pref(pref=hw_qualified_override, value=True)
|
||||
self.marionette.set_pref(pref="layers.acceleration.force-enabled", value=True)
|
||||
|
||||
# Restart browser. Gfx will observe hardware qualification override, and
|
||||
# gfx rollout override prefs. We should then be running in a browser which
|
||||
# behaves as if it's running on *qualifying* hardware, with WR not rolled
|
||||
# out yet.
|
||||
self.marionette.restart(clean=False, in_app=True)
|
||||
|
||||
# Ensure we're not yet using WR; we're not rolled out yet!
|
||||
status, compositor = self.wr_status()
|
||||
print("self.wr_status()={},{}".format(status, compositor))
|
||||
self.assertEqual(status, 'opt-in', 'Should start out as WR opt-in')
|
||||
self.assertTrue(compositor != "webrender", "Before WR rollout on qualifying HW, should not be using WR.")
|
||||
|
||||
# Set the rollout pref's default value, as Normandy would do, and restart.
|
||||
# Gfx's shutdown observer should save the default value of the pref. Upon
|
||||
# restart, because we're pretending to be on *qualifying* hardware, WR
|
||||
# should be reported as available.
|
||||
self.marionette.set_pref(pref=rollout_pref, value=True, default_branch=True)
|
||||
self.marionette.restart(clean=False, in_app=True)
|
||||
status, compositor = self.wr_status()
|
||||
print("self.wr_status()={},{}".format(status, compositor))
|
||||
self.assertEqual(status, 'available', 'WR rolled out on qualifying hardware should report be available #1.')
|
||||
self.assertEqual(compositor, "webrender", "After rollout on qualifying HW, WR should be used.")
|
||||
|
||||
# Simulate a rollback of the rollout; set the pref to false at runtime.
|
||||
self.marionette.set_pref(pref=rollout_pref, value=False, default_branch=True)
|
||||
self.marionette.restart(clean=False, in_app=True)
|
||||
status, compositor = self.wr_status()
|
||||
print("self.wr_status()={},{}".format(status, compositor))
|
||||
self.assertEqual(status, 'opt-in', 'WR rollback of rollout should revert to opt-in on qualifying hardware.')
|
||||
self.assertTrue(compositor != "webrender", "After roll back on qualifying HW, WR should not be used.")
|
||||
|
||||
def wr_status(self):
|
||||
self.marionette.set_context(self.marionette.CONTEXT_CHROME)
|
||||
result = self.marionette.execute_script('''
|
||||
try {
|
||||
const gfxInfo = Components.classes["@mozilla.org/gfx/info;1"].getService(Ci.nsIGfxInfo);
|
||||
return {features: gfxInfo.getFeatures(), log: gfxInfo.getFeatureLog()};
|
||||
} catch (e) {
|
||||
return {}
|
||||
}
|
||||
''')
|
||||
return result['features']['webrender']['status'], result['features']['compositor']
|
|
@ -7,4 +7,3 @@
|
|||
MOCHITEST_MANIFESTS += ['mochitest/mochitest.ini']
|
||||
BROWSER_CHROME_MANIFESTS += ['browser/browser.ini']
|
||||
MOCHITEST_CHROME_MANIFESTS += ['chrome/chrome.ini']
|
||||
MARIONETTE_GFX_MANIFESTS += ['marionette/manifest.ini']
|
|
@ -761,84 +761,6 @@ WebRenderMemoryReporter::CollectReports(nsIHandleReportCallback* aHandleReport,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
static const char* const WR_ROLLOUT_PREF = "gfx.webrender.all.qualified";
|
||||
static const char* const WR_ROLLOUT_PREF_DEFAULT =
|
||||
"gfx.webrender.all.qualified.default";
|
||||
static const char* const WR_ROLLOUT_PREF_OVERRIDE =
|
||||
"gfx.webrender.all.qualified.gfxPref-default-override";
|
||||
static const char* const WR_ROLLOUT_HW_QUALIFIED_OVERRIDE =
|
||||
"gfx.webrender.all.qualified.hardware-override";
|
||||
static const char* const PROFILE_BEFORE_CHANGE_TOPIC = "profile-before-change";
|
||||
|
||||
// If the "gfx.webrender.all.qualified" pref is true we want to enable
|
||||
// WebRender for qualified hardware. This pref may be set by the Normandy
|
||||
// Preference Rollout feature. The Normandy pref rollout code sets default
|
||||
// values on rolled out prefs on every startup. Default pref values are not
|
||||
// persisted; they only exist in memory for that session. Gfx starts up
|
||||
// before Normandy does. So it's too early to observe the WR qualified pref
|
||||
// changed by Normandy rollout on gfx startup. So we add a shutdown observer to
|
||||
// save the default value on shutdown, and read the saved value on startup
|
||||
// instead.
|
||||
class WrRolloutPrefShutdownSaver : public nsIObserver
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD Observe(nsISupports*, const char* aTopic, const char16_t*) override
|
||||
{
|
||||
if (strcmp(PROFILE_BEFORE_CHANGE_TOPIC, aTopic) != 0) {
|
||||
// Not the observer we're looking for, move along.
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
SaveRolloutPref();
|
||||
|
||||
// Shouldn't receive another notification, remove the observer.
|
||||
RefPtr<WrRolloutPrefShutdownSaver> kungFuDeathGrip(this);
|
||||
nsCOMPtr<nsIObserverService> observerService =
|
||||
mozilla::services::GetObserverService();
|
||||
if (NS_WARN_IF(!observerService)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
observerService->RemoveObserver(this, PROFILE_BEFORE_CHANGE_TOPIC);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static void AddShutdownObserver()
|
||||
{
|
||||
MOZ_ASSERT(XRE_IsParentProcess());
|
||||
nsCOMPtr<nsIObserverService> observerService =
|
||||
mozilla::services::GetObserverService();
|
||||
if (NS_WARN_IF(!observerService)) {
|
||||
return;
|
||||
}
|
||||
RefPtr<WrRolloutPrefShutdownSaver> wrRolloutSaver =
|
||||
new WrRolloutPrefShutdownSaver();
|
||||
observerService->AddObserver(
|
||||
wrRolloutSaver, PROFILE_BEFORE_CHANGE_TOPIC, false);
|
||||
}
|
||||
|
||||
private:
|
||||
virtual ~WrRolloutPrefShutdownSaver() = default;
|
||||
|
||||
void SaveRolloutPref()
|
||||
{
|
||||
if (Preferences::HasUserValue(WR_ROLLOUT_PREF) ||
|
||||
Preferences::GetType(WR_ROLLOUT_PREF) == nsIPrefBranch::PREF_INVALID) {
|
||||
// Don't need to create a backup of default value, because either:
|
||||
// 1. the user or the WR SHIELD study has set a user pref value, or
|
||||
// 2. we've not had a default pref set by Normandy that needs to be saved
|
||||
// for reading before Normandy has started up.
|
||||
return;
|
||||
}
|
||||
|
||||
bool defaultValue =
|
||||
Preferences::GetBool(WR_ROLLOUT_PREF, false, PrefValueKind::Default);
|
||||
Preferences::SetBool(WR_ROLLOUT_PREF_DEFAULT, defaultValue);
|
||||
}
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS(WrRolloutPrefShutdownSaver, nsIObserver)
|
||||
|
||||
void
|
||||
gfxPlatform::Init()
|
||||
|
@ -883,10 +805,6 @@ gfxPlatform::Init()
|
|||
}
|
||||
}
|
||||
|
||||
if (XRE_IsParentProcess()) {
|
||||
WrRolloutPrefShutdownSaver::AddShutdownObserver();
|
||||
}
|
||||
|
||||
// Drop a note in the crash report if we end up forcing an option that could
|
||||
// destabilize things. New items should be appended at the end (of an existing
|
||||
// or in a new section), so that we don't have to know the version to interpret
|
||||
|
@ -2760,69 +2678,48 @@ gfxPlatform::WebRenderEnvvarEnabled()
|
|||
return (env && *env == '1');
|
||||
}
|
||||
|
||||
// If the "gfx.webrender.all.qualified" pref is true we want to enable
|
||||
// WebRender for qualifying hardware. The Normandy pref rollout code sets
|
||||
// default values on rolled out prefs on every startup, but Gfx starts up
|
||||
// before Normandy does. So it's too early to observe the WR qualified pref
|
||||
// default value changed by Normandy rollout here yet. So we have a shutdown
|
||||
// observer to save the default value on shutdown, and read the saved default
|
||||
// value here instead, and emulate the behavior of the pref system, with
|
||||
// respect to default/user values of the rollout pref.
|
||||
static bool
|
||||
CalculateWrQualifiedPrefValue()
|
||||
void
|
||||
gfxPlatform::InitWebRenderConfig()
|
||||
{
|
||||
auto clearPrefOnExit = MakeScopeExit([]() {
|
||||
// Clear the mirror of the default value of the rollout pref on scope exit,
|
||||
// if we have one. This ensures the user doesn't mess with the pref.
|
||||
// If we need it again, we'll re-create it on shutdown.
|
||||
Preferences::ClearUser(WR_ROLLOUT_PREF_DEFAULT);
|
||||
});
|
||||
bool prefEnabled = WebRenderPrefEnabled();
|
||||
bool envvarEnabled = WebRenderEnvvarEnabled();
|
||||
|
||||
if (!Preferences::HasUserValue(WR_ROLLOUT_PREF) &&
|
||||
Preferences::HasUserValue(WR_ROLLOUT_PREF_DEFAULT)) {
|
||||
// The user has not set a user pref, and we have a default value set by the
|
||||
// shutdown observer. We should use that instead of the gfxPref's default,
|
||||
// as if Normandy had a chance to set it before startup, that is the value
|
||||
// gfxPrefs would return, rather than the default set by DECL_GFX_PREF.
|
||||
return gfxPrefs::WebRenderAllQualifiedDefault();
|
||||
// On Nightly:
|
||||
// WR? WR+ => means WR was enabled via gfx.webrender.all.qualified
|
||||
// WR! WR+ => means WR was enabled via gfx.webrender.{all,enabled} or envvar
|
||||
// On Beta/Release:
|
||||
// WR? WR+ => means WR was enabled via gfx.webrender.all.qualified on qualified hardware
|
||||
// WR! WR+ => means WR was enabled via envvar, possibly on unqualified hardware.
|
||||
// In all cases WR- means WR was not enabled, for one of many possible reasons.
|
||||
ScopedGfxFeatureReporter reporter("WR", prefEnabled || envvarEnabled);
|
||||
if (!XRE_IsParentProcess()) {
|
||||
// Force-disable WebRender in recording/replaying child processes, which
|
||||
// have their own compositor.
|
||||
if (recordreplay::IsRecordingOrReplaying()) {
|
||||
gfxVars::SetUseWebRender(false);
|
||||
}
|
||||
|
||||
// The parent process runs through all the real decision-making code
|
||||
// later in this function. For other processes we still want to report
|
||||
// the state of the feature for crash reports.
|
||||
if (gfxVars::UseWebRender()) {
|
||||
reporter.SetSuccessful();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// We don't have a user value for the rollout pref, and we don't have the
|
||||
// value of the rollout pref at last shutdown stored. So we should fallback
|
||||
// to using whatever default is stored in the gfxPref. *But* if we're running
|
||||
// under the Marionette pref rollout work-around test, we may want to override
|
||||
// the default value expressed here, so we can test the "default disabled;
|
||||
// rollout pref enabled" case.
|
||||
if (Preferences::HasUserValue(WR_ROLLOUT_PREF_OVERRIDE)) {
|
||||
return Preferences::GetBool(WR_ROLLOUT_PREF_OVERRIDE);
|
||||
}
|
||||
return gfxPrefs::WebRenderAllQualified();
|
||||
}
|
||||
|
||||
static FeatureState&
|
||||
WebRenderHardwareQualificationStatus(bool aHasBattery, nsCString& aOutFailureId)
|
||||
{
|
||||
FeatureState& featureWebRenderQualified = gfxConfig::GetFeature(Feature::WEBRENDER_QUALIFIED);
|
||||
featureWebRenderQualified.EnableByDefault();
|
||||
|
||||
if (Preferences::HasUserValue(WR_ROLLOUT_HW_QUALIFIED_OVERRIDE)) {
|
||||
if (!Preferences::GetBool(WR_ROLLOUT_HW_QUALIFIED_OVERRIDE)) {
|
||||
featureWebRenderQualified.Disable(
|
||||
FeatureStatus::Blocked,
|
||||
"HW qualification pref override",
|
||||
NS_LITERAL_CSTRING("FEATURE_FAILURE_WR_QUALIFICATION_OVERRIDE"));
|
||||
}
|
||||
return featureWebRenderQualified;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIGfxInfo> gfxInfo = services::GetGfxInfo();
|
||||
nsCString failureId;
|
||||
int32_t status;
|
||||
if (NS_SUCCEEDED(gfxInfo->GetFeatureStatus(
|
||||
nsIGfxInfo::FEATURE_WEBRENDER, aOutFailureId, &status))) {
|
||||
if (NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_WEBRENDER,
|
||||
failureId, &status))) {
|
||||
if (status != nsIGfxInfo::FEATURE_STATUS_OK) {
|
||||
featureWebRenderQualified.Disable(
|
||||
FeatureStatus::Blocked, "No qualified hardware", aOutFailureId);
|
||||
} else if (aHasBattery) {
|
||||
featureWebRenderQualified.Disable(FeatureStatus::Blocked,
|
||||
"No qualified hardware",
|
||||
failureId);
|
||||
} else if (HasBattery()) {
|
||||
featureWebRenderQualified.Disable(FeatureStatus::Blocked,
|
||||
"Has battery",
|
||||
NS_LITERAL_CSTRING("FEATURE_FAILURE_WR_HAS_BATTERY"));
|
||||
|
@ -2856,45 +2753,7 @@ WebRenderHardwareQualificationStatus(bool aHasBattery, nsCString& aOutFailureId)
|
|||
"gfxInfo is broken",
|
||||
NS_LITERAL_CSTRING("FEATURE_FAILURE_WR_NO_GFX_INFO"));
|
||||
}
|
||||
return featureWebRenderQualified;
|
||||
}
|
||||
|
||||
void
|
||||
gfxPlatform::InitWebRenderConfig()
|
||||
{
|
||||
bool prefEnabled = WebRenderPrefEnabled();
|
||||
bool envvarEnabled = WebRenderEnvvarEnabled();
|
||||
|
||||
// On Nightly:
|
||||
// WR? WR+ => means WR was enabled via gfx.webrender.all.qualified
|
||||
// WR! WR+ => means WR was enabled via gfx.webrender.{all,enabled} or
|
||||
// envvar
|
||||
// On Beta/Release:
|
||||
// WR? WR+ => means WR was enabled via gfx.webrender.all.qualified on
|
||||
// qualified hardware WR! WR+ => means WR was enabled via envvar, possibly
|
||||
// on unqualified hardware.
|
||||
// In all cases WR- means WR was not enabled, for one of many possible
|
||||
// reasons.
|
||||
ScopedGfxFeatureReporter reporter("WR", prefEnabled || envvarEnabled);
|
||||
if (!XRE_IsParentProcess()) {
|
||||
// Force-disable WebRender in recording/replaying child processes, which
|
||||
// have their own compositor.
|
||||
if (recordreplay::IsRecordingOrReplaying()) {
|
||||
gfxVars::SetUseWebRender(false);
|
||||
}
|
||||
|
||||
// The parent process runs through all the real decision-making code
|
||||
// later in this function. For other processes we still want to report
|
||||
// the state of the feature for crash reports.
|
||||
if (gfxVars::UseWebRender()) {
|
||||
reporter.SetSuccessful();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
nsCString failureId;
|
||||
FeatureState& featureWebRenderQualified =
|
||||
WebRenderHardwareQualificationStatus(HasBattery(), failureId);
|
||||
FeatureState& featureWebRender = gfxConfig::GetFeature(Feature::WEBRENDER);
|
||||
|
||||
featureWebRender.DisableByDefault(
|
||||
|
@ -2902,8 +2761,6 @@ gfxPlatform::InitWebRenderConfig()
|
|||
"WebRender is an opt-in feature",
|
||||
NS_LITERAL_CSTRING("FEATURE_FAILURE_DEFAULT_OFF"));
|
||||
|
||||
const bool wrQualifiedAll = CalculateWrQualifiedPrefValue();
|
||||
|
||||
// envvar works everywhere; we need this for testing in CI. Sadly this allows
|
||||
// beta/release to enable it on unqualified hardware, but at least this is
|
||||
// harder for the average person than flipping a pref.
|
||||
|
@ -2917,7 +2774,7 @@ gfxPlatform::InitWebRenderConfig()
|
|||
#endif
|
||||
|
||||
// gfx.webrender.all.qualified works on all channels
|
||||
} else if (wrQualifiedAll) {
|
||||
} else if (gfxPrefs::WebRenderAllQualified()) {
|
||||
if (featureWebRenderQualified.IsEnabled()) {
|
||||
featureWebRender.UserEnable("Qualified enabled by pref ");
|
||||
} else {
|
||||
|
|
|
@ -524,11 +524,6 @@ private:
|
|||
|
||||
DECL_GFX_PREF(Once, "gfx.webrender.all", WebRenderAll, bool, false);
|
||||
DECL_GFX_PREF(Once, "gfx.webrender.all.qualified", WebRenderAllQualified, bool, true);
|
||||
DECL_GFX_PREF(Once,
|
||||
"gfx.webrender.all.qualified.default",
|
||||
WebRenderAllQualifiedDefault,
|
||||
bool,
|
||||
false);
|
||||
DECL_GFX_PREF(Live, "gfx.webrender.blob-images", WebRenderBlobImages, bool, true);
|
||||
DECL_GFX_PREF(Live, "gfx.webrender.blob.invalidation", WebRenderBlobInvalidation, bool, false);
|
||||
DECL_GFX_PREF(Live, "gfx.webrender.blob.paint-flashing", WebRenderBlobPaintFlashing, bool, false);
|
||||
|
|
|
@ -1849,10 +1849,6 @@ VARIABLES = {
|
|||
"""List of manifest files defining marionette-layout tests.
|
||||
"""),
|
||||
|
||||
'MARIONETTE_GFX_MANIFESTS': (ManifestparserManifestList, list,
|
||||
"""List of manifest files defining marionette-gfx tests.
|
||||
"""),
|
||||
|
||||
'MARIONETTE_UNIT_MANIFESTS': (ManifestparserManifestList, list,
|
||||
"""List of manifest files defining marionette-unit tests.
|
||||
"""),
|
||||
|
|
|
@ -12,6 +12,3 @@
|
|||
|
||||
# xpconnect tests
|
||||
[include:../../../../../js/xpconnect/tests/marionette/manifest.ini]
|
||||
|
||||
# graphics tests
|
||||
[include:../../../../../gfx/tests/marionette/manifest.ini]
|
||||
|
|
Загрузка…
Ссылка в новой задаче