forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			117 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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 https://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| const lazy = {};
 | |
| ChromeUtils.defineESModuleGetters(lazy, {
 | |
|   RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
 | |
|   Utils: "resource://services-settings/Utils.sys.mjs",
 | |
| });
 | |
| 
 | |
| import {
 | |
|   actionTypes as at,
 | |
|   actionCreators as ac,
 | |
| } from "resource://activity-stream/common/Actions.mjs";
 | |
| 
 | |
| const PREF_WALLPAPERS_ENABLED =
 | |
|   "browser.newtabpage.activity-stream.newtabWallpapers.enabled";
 | |
| 
 | |
| export class WallpaperFeed {
 | |
|   constructor() {
 | |
|     this.loaded = false;
 | |
|     this.wallpaperClient = "";
 | |
|     this.wallpaperDB = "";
 | |
|     this.baseAttachmentURL = "";
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This thin wrapper around global.fetch makes it easier for us to write
 | |
|    * automated tests that simulate responses from this fetch.
 | |
|    */
 | |
|   fetch(...args) {
 | |
|     return fetch(...args);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This thin wrapper around lazy.RemoteSettings makes it easier for us to write
 | |
|    * automated tests that simulate responses from this fetch.
 | |
|    */
 | |
|   RemoteSettings(...args) {
 | |
|     return lazy.RemoteSettings(...args);
 | |
|   }
 | |
| 
 | |
|   async wallpaperSetup(isStartup = false) {
 | |
|     const wallpapersEnabled = Services.prefs.getBoolPref(
 | |
|       PREF_WALLPAPERS_ENABLED
 | |
|     );
 | |
| 
 | |
|     if (wallpapersEnabled) {
 | |
|       if (!this.wallpaperClient) {
 | |
|         this.wallpaperClient = this.RemoteSettings("newtab-wallpapers");
 | |
|       }
 | |
| 
 | |
|       await this.getBaseAttachment();
 | |
|       this.wallpaperClient.on("sync", () => this.updateWallpapers());
 | |
|       this.updateWallpapers(isStartup);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   async getBaseAttachment() {
 | |
|     if (!this.baseAttachmentURL) {
 | |
|       const SERVER = lazy.Utils.SERVER_URL;
 | |
|       const serverInfo = await (
 | |
|         await this.fetch(`${SERVER}/`, {
 | |
|           credentials: "omit",
 | |
|         })
 | |
|       ).json();
 | |
|       const { base_url } = serverInfo.capabilities.attachments;
 | |
|       this.baseAttachmentURL = base_url;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   async updateWallpapers(isStartup = false) {
 | |
|     const records = await this.wallpaperClient.get();
 | |
|     if (!records?.length) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     if (!this.baseAttachmentURL) {
 | |
|       await this.getBaseAttachment();
 | |
|     }
 | |
|     const wallpapers = records.map(record => {
 | |
|       return {
 | |
|         ...record,
 | |
|         wallpaperUrl: `${this.baseAttachmentURL}${record.attachment.location}`,
 | |
|       };
 | |
|     });
 | |
| 
 | |
|     this.store.dispatch(
 | |
|       ac.BroadcastToContent({
 | |
|         type: at.WALLPAPERS_SET,
 | |
|         data: wallpapers,
 | |
|         meta: {
 | |
|           isStartup,
 | |
|         },
 | |
|       })
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   async onAction(action) {
 | |
|     switch (action.type) {
 | |
|       case at.INIT:
 | |
|         await this.wallpaperSetup(true /* isStartup */);
 | |
|         break;
 | |
|       case at.UNINIT:
 | |
|         break;
 | |
|       case at.SYSTEM_TICK:
 | |
|         break;
 | |
|       case at.PREF_CHANGED:
 | |
|         if (action.data.name === "newtabWallpapers.enabled") {
 | |
|           await this.wallpaperSetup(false /* isStartup */);
 | |
|         }
 | |
|         break;
 | |
|       case at.WALLPAPERS_SET:
 | |
|         break;
 | |
|     }
 | |
|   }
 | |
| }
 | 
