const DG_BACKGROUND = "/desktop/gnome/background";
const DG_IMAGE_KEY = DG_BACKGROUND + "/picture_filename";
const DG_OPTION_KEY = DG_BACKGROUND + "/picture_options";
const DG_DRAW_BG_KEY = DG_BACKGROUND + "/draw_background";

const GS_BG_SCHEMA = "org.gnome.desktop.background";
const GS_IMAGE_KEY = "picture-uri";
const GS_OPTION_KEY = "picture-options";
const GS_DRAW_BG_KEY = "draw-background";

add_task(async function () {
  await BrowserTestUtils.withNewTab(
    {
      gBrowser,
      url: "about:logo",
    },
    browser => {
      var brandName = Services.strings
        .createBundle("chrome://branding/locale/brand.properties")
        .GetStringFromName("brandShortName");

      var dirSvc = Cc["@mozilla.org/file/directory_service;1"].getService(
        Ci.nsIDirectoryServiceProvider
      );
      var homeDir = dirSvc.getFile("Home", {});

      var wpFile = homeDir.clone();
      wpFile.append(brandName + "_wallpaper.png");

      // Backup the existing wallpaper so that this test doesn't change the user's
      // settings.
      var wpFileBackup = homeDir.clone();
      wpFileBackup.append(brandName + "_wallpaper.png.backup");

      if (wpFileBackup.exists()) {
        wpFileBackup.remove(false);
      }

      if (wpFile.exists()) {
        wpFile.copyTo(null, wpFileBackup.leafName);
      }

      var shell = Cc["@mozilla.org/browser/shell-service;1"].getService(
        Ci.nsIShellService
      );

      // For simplicity, we're going to reach in and access the image on the
      // page directly, which means the page shouldn't be running in a remote
      // browser. Thankfully, about:logo runs in the parent process for now.
      Assert.ok(
        !gBrowser.selectedBrowser.isRemoteBrowser,
        "image can be accessed synchronously from the parent process"
      );

      var image = content.document.images[0];

      let checkWallpaper, restoreSettings;
      try {
        // Try via GSettings first
        const gsettings = Cc["@mozilla.org/gsettings-service;1"]
          .getService(Ci.nsIGSettingsService)
          .getCollectionForSchema(GS_BG_SCHEMA);

        const prevImage = gsettings.getString(GS_IMAGE_KEY);
        const prevOption = gsettings.getString(GS_OPTION_KEY);
        const prevDrawBG = gsettings.getBoolean(GS_DRAW_BG_KEY);

        checkWallpaper = function (position, expectedGSettingsPosition) {
          shell.setDesktopBackground(image, position, "");
          ok(wpFile.exists(), "Wallpaper was written to disk");
          is(
            gsettings.getString(GS_IMAGE_KEY),
            encodeURI("file://" + wpFile.path),
            "Wallpaper file GSettings key is correct"
          );
          is(
            gsettings.getString(GS_OPTION_KEY),
            expectedGSettingsPosition,
            "Wallpaper position GSettings key is correct"
          );
        };

        restoreSettings = function () {
          gsettings.setString(GS_IMAGE_KEY, prevImage);
          gsettings.setString(GS_OPTION_KEY, prevOption);
          gsettings.setBoolean(GS_DRAW_BG_KEY, prevDrawBG);
        };
      } catch (e) {}

      checkWallpaper(Ci.nsIShellService.BACKGROUND_TILE, "wallpaper");
      checkWallpaper(Ci.nsIShellService.BACKGROUND_STRETCH, "stretched");
      checkWallpaper(Ci.nsIShellService.BACKGROUND_CENTER, "centered");
      checkWallpaper(Ci.nsIShellService.BACKGROUND_FILL, "zoom");
      checkWallpaper(Ci.nsIShellService.BACKGROUND_FIT, "scaled");
      checkWallpaper(Ci.nsIShellService.BACKGROUND_SPAN, "spanned");

      restoreSettings();

      // Restore files
      if (wpFileBackup.exists()) {
        wpFileBackup.moveTo(null, wpFile.leafName);
      }
    }
  );
});
