feat: add StartupDataStorage

This class will let scripts retrieve and modify the startup data object.

Change-Id: I83298612425ab8a87ce5b83c7b83c62088af56ac
diff --git a/src/scripts/Scripts.ts b/src/scripts/Scripts.ts
index 5696ddb..2f4db19 100644
--- a/src/scripts/Scripts.ts
+++ b/src/scripts/Scripts.ts
@@ -4,10 +4,14 @@
 import MWI18nServerScript from './mainWorldServers/MWI18nServerScript.script';
 import MWOptionsWatcherServerScript from './mainWorldServers/MWOptionsWatcherServerScript.script';
 import OptionsProviderSetUpScript from './optionsProvider/optionsProvider.script';
+import ApplyStartupDataModificationsOnMainScript from './startupDataStorage/applyStartupDataModificationsOnMain.script';
+import ApplyStartupDataModificationsOnStartScript from './startupDataStorage/applyStartupDataModificationsOnStart.script';
 import XHRInterceptorScript from './xhrInterceptor/xhrInterceptor.script';
 
 export default class StandaloneScripts extends ScriptFilterListProvider {
   private scripts: ConcreteScript[] = [
+    ApplyStartupDataModificationsOnMainScript,
+    ApplyStartupDataModificationsOnStartScript,
     InjectLitComponentsScript,
     MWI18nServerScript,
     MWOptionsWatcherServerScript,
diff --git a/src/scripts/startupDataStorage/applyStartupDataModificationsOnMain.script.ts b/src/scripts/startupDataStorage/applyStartupDataModificationsOnMain.script.ts
new file mode 100644
index 0000000..2b9642d
--- /dev/null
+++ b/src/scripts/startupDataStorage/applyStartupDataModificationsOnMain.script.ts
@@ -0,0 +1,10 @@
+import { ScriptRunPhase } from '../../common/architecture/scripts/Script';
+import BaseApplyStartupDataModificationsScript from './baseApplyStartupDataModifications.script';
+
+/**
+ * Applies pending startup data modifications which have been added by other
+ * scripts at the main run phase.
+ */
+export default class ApplyStartupDataModificationsOnMainScript extends BaseApplyStartupDataModificationsScript {
+  runPhase = ScriptRunPhase.Main;
+}
diff --git a/src/scripts/startupDataStorage/applyStartupDataModificationsOnStart.script.ts b/src/scripts/startupDataStorage/applyStartupDataModificationsOnStart.script.ts
new file mode 100644
index 0000000..0903e1b
--- /dev/null
+++ b/src/scripts/startupDataStorage/applyStartupDataModificationsOnStart.script.ts
@@ -0,0 +1,10 @@
+import { ScriptRunPhase } from '../../common/architecture/scripts/Script';
+import BaseApplyStartupDataModificationsScript from './baseApplyStartupDataModifications.script';
+
+/**
+ * Applies pending startup data modifications which have been added by other
+ * scripts at the start run phase.
+ */
+export default class ApplyStartupDataModificationsOnStartScript extends BaseApplyStartupDataModificationsScript {
+  runPhase = ScriptRunPhase.Start;
+}
diff --git a/src/scripts/startupDataStorage/baseApplyStartupDataModifications.script.ts b/src/scripts/startupDataStorage/baseApplyStartupDataModifications.script.ts
new file mode 100644
index 0000000..1686b77
--- /dev/null
+++ b/src/scripts/startupDataStorage/baseApplyStartupDataModifications.script.ts
@@ -0,0 +1,26 @@
+import DependenciesProviderSingleton, {
+  StartupDataStorageDependency,
+} from '../../common/architecture/dependenciesProvider/DependenciesProvider';
+import Script, {
+  ScriptEnvironment,
+  ScriptPage,
+} from '../../common/architecture/scripts/Script';
+
+/**
+ * Base class which applies pending startup data modifications which have been
+ * added by other scripts.
+ */
+export default abstract class BaseApplyStartupDataModificationsScript extends Script {
+  priority = 2 ** 32;
+
+  page = ScriptPage.CommunityConsole;
+  environment = ScriptEnvironment.ContentScript;
+
+  execute() {
+    const dependenciesProvider = DependenciesProviderSingleton.getInstance();
+    const startupDataStoarge = dependenciesProvider.getDependency(
+      StartupDataStorageDependency,
+    );
+    startupDataStoarge.applyModifications();
+  }
+}