-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdynamic_mode_switch.js
More file actions
218 lines (188 loc) · 8.28 KB
/
Copy pathdynamic_mode_switch.js
File metadata and controls
218 lines (188 loc) · 8.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/**
* 动态模式切换脚本
* 解决设置页面和content script之间的同步问题
* 实现即时模式切换,无需重载插件
*/
class DynamicModeSwitcher {
constructor() {
this.init();
}
init() {
// console.log('动态模式切换器已初始化');
this.setupModeSync();
}
/**
* 设置模式同步机制
*/
setupModeSync() {
// 监听来自插件的消息通知
if (typeof chrome !== 'undefined' && chrome.runtime && chrome.runtime.onMessage) {
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === 'SETTINGS_CHANGED') {
// console.log('【成功监听到】检测到设置变化,重新加载设置...');
// 同步设置到localStorage
localStorage.setItem('smartFormFillerSettings', JSON.stringify(request.settings));
// 执行重新加载逻辑
this.reloadSettings();
}
});
}
// 主要方案:页面第一次加载时,优先从插件的local存储里初始化设置(解决插件重装时的模式同步问题)
if (typeof chrome !== 'undefined' && chrome.storage && chrome.storage.local) {
chrome.storage.local.get(['smartFormFillerSettings'], (result) => {
if (result.smartFormFillerSettings) {
// console.log('从chrome.storage.local初始化设置');
localStorage.setItem('smartFormFillerSettings', JSON.stringify(result.smartFormFillerSettings));
this.reloadSettings();
} else {
// 如果chrome.storage.local也没有设置,则检查localStorage是否有设置
const stored = localStorage.getItem('smartFormFillerSettings');
if (stored) {
// console.log('从localStorage加载设置');
this.reloadSettings();
}
}
});
} else {
// 如果没有chrome.storage支持,回退到localStorage
const stored = localStorage.getItem('smartFormFillerSettings');
if (stored) {
// console.log('从localStorage加载设置(无chrome.storage支持)');
this.reloadSettings();
}
}
// 保留原有的localStorage监听作为备用方案
window.addEventListener('storage', (e) => {
if (e.key === 'smartFormFillerSettings') {
// console.log('检测到localStorage设置变化,重新加载设置...');
this.reloadSettings();
}
});
// 定期检查设置变化(备用方案)
this.startPeriodicCheck();
}
/**
* 重新加载设置
*/
reloadSettings() {
try {
const stored = localStorage.getItem('smartFormFillerSettings');
if (stored) {
const settings = JSON.parse(stored);
// console.log('重新加载设置:', settings.dataMode);
// 更新SettingsManager
if (globalThis.settingsManager) {
const oldMode = globalThis.settingsManager.settings.dataMode;
globalThis.settingsManager.updateSettings(settings);
if (oldMode !== settings.dataMode) {
// console.log(`模式已从 ${oldMode} 切换到 ${settings.dataMode}`);
this.notifyModeChange(settings.dataMode);
}
}
}
} catch (error) {
console.error('重新加载设置失败:', error);
}
}
/**
* 通知模式变化
*/
notifyModeChange(newMode) {
// console.log(`模式已切换到: ${newMode}`);
// 触发重新扫描表单元素
if (globalThis.floatingWidget && globalThis.floatingWidget.scanFormElements) {
setTimeout(() => {
globalThis.floatingWidget.scanFormElements();
}, 100);
}
}
/**
* 开始定期检查
*/
startPeriodicCheck() {
let lastSettings = localStorage.getItem('smartFormFillerSettings');
setInterval(() => {
const currentSettings = localStorage.getItem('smartFormFillerSettings');
if (currentSettings !== lastSettings) {
// console.log('检测到设置变化(定期检查)');
lastSettings = currentSettings;
this.reloadSettings();
}
}, 2000); // 每2秒检查一次
}
/**
* 强制切换到指定模式
*/
forceSwitchMode(mode) {
if (!['basic', 'advanced'].includes(mode)) {
// console.error('无效的模式:', mode);
return false;
}
try {
// 更新localStorage
const currentSettings = JSON.parse(localStorage.getItem('smartFormFillerSettings') || '{}');
currentSettings.dataMode = mode;
localStorage.setItem('smartFormFillerSettings', JSON.stringify(currentSettings));
// 触发storage事件(跨页面同步)
window.dispatchEvent(new StorageEvent('storage', {
key: 'smartFormFillerSettings',
oldValue: localStorage.getItem('smartFormFillerSettings'),
newValue: JSON.stringify(currentSettings)
}));
// console.log(`已强制切换到 ${mode} 模式`);
return true;
} catch (error) {
console.error('强制切换模式失败:', error);
return false;
}
}
/**
* 获取当前模式状态
*/
getCurrentModeInfo() {
const info = {
localStorageMode: 'unknown',
settingsManagerMode: 'unknown',
actualGenerator: 'unknown',
syncStatus: 'unknown'
};
try {
// 从localStorage获取
const stored = localStorage.getItem('smartFormFillerSettings');
if (stored) {
const settings = JSON.parse(stored);
info.localStorageMode = settings.dataMode || 'basic';
}
// 从SettingsManager获取
if (globalThis.settingsManager) {
info.settingsManagerMode = globalThis.settingsManager.settings.dataMode;
const generator = globalThis.settingsManager.getDataGenerator();
// 使用注册表模式检测
if (globalThis.generatorRegistry) {
info.actualGenerator = generator === globalThis.generatorRegistry['basic'] ? 'basic' :
generator === globalThis.generatorRegistry['advanced'] ? 'advanced' : 'unknown';
} else {
// 降级到旧的检测方式
info.actualGenerator = generator === globalThis.mockDataGenerator ? 'basic' :
generator === globalThis.advancedMockDataGenerator ? 'advanced' : 'unknown';
}
info.syncStatus = info.localStorageMode === info.settingsManagerMode ? 'synced' : 'out-of-sync';
}
} catch (error) {
console.error('获取模式信息失败:', error);
}
return info;
}
}
// 初始化动态模式切换器
if (typeof globalThis.dynamicModeSwitcher === 'undefined') {
globalThis.dynamicModeSwitcher = new DynamicModeSwitcher();
}
// 导出便捷函数
globalThis.switchToBasicMode = () => globalThis.dynamicModeSwitcher.forceSwitchMode('basic');
globalThis.switchToAdvancedMode = () => globalThis.dynamicModeSwitcher.forceSwitchMode('advanced');
globalThis.getModeInfo = () => globalThis.dynamicModeSwitcher.getCurrentModeInfo();
// console.log('动态模式切换器已就绪');
// console.log('使用 switchToBasicMode() 切换到基础模式');
// console.log('使用 switchToAdvancedMode() 切换到高级模式');
// console.log('使用 getModeInfo() 查看当前模式状态');