Skip to content

Commit 09a7f2d

Browse files
committed
Add logger
1 parent e71e2bc commit 09a7f2d

34 files changed

+274
-161
lines changed

src/GM/Values/GM_deleteValue.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import logger from '../../utils/logger.js';
12
if (typeof GM_deleteValue === 'undefined') {
23
window.GM_deleteValue = (name) => {
34
try {
45
localStorage.removeItem(`GM_value_${name}`);
56
} catch (e) {
6-
console.error('GM_deleteValue exception:', e);
7+
logger.error('GM_deleteValue exception:', e);
78
}
89
};
910
}

src/GM/Values/GM_getValue.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logger from '../../utils/logger.js';
12
if (typeof GM_getValue === 'undefined') {
23
window.GM_getValue = (name, defaultValue) => {
34
try {
@@ -7,7 +8,7 @@ if (typeof GM_getValue === 'undefined') {
78
}
89
return JSON.parse(raw);
910
} catch (e) {
10-
console.error('GM_getValue exception:', e);
11+
logger.error('GM_getValue exception:', e);
1112
return defaultValue;
1213
}
1314
};

src/GM/Values/GM_listValues.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import logger from '../../utils/logger.js';
12
if (typeof GM_listValues === 'undefined') {
23
window.GM_listValues = () => {
34
try {
45
const keys = Object.keys(localStorage).filter((k) => k.startsWith('GM_value_'));
56
return keys.map((k) => k.replace('GM_value_', ''));
67
} catch (e) {
7-
console.error('GM_listValues exception:', e);
8+
logger.error('GM_listValues exception:', e);
89
return [];
910
}
1011
};

src/GM/Values/GM_setValue.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import logger from '../../utils/logger.js';
12
if (typeof GM_setValue === 'undefined') {
23
window.GM_setValue = (name, value) => {
34
try {
45
localStorage.setItem(`GM_value_${name}`, JSON.stringify(value));
56
} catch (e) {
6-
console.error('GM_setValue exception:', e);
7+
logger.error('GM_setValue exception:', e);
78
}
89
};
910
}

src/GM/gm_api_registry.js

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logger from '../utils/logger.js';
12
(function () {
23
'use strict';
34

@@ -26,7 +27,7 @@
2627
try {
2728
listener(name, oldValue, newValue, remote);
2829
} catch (e) {
29-
console.error('Error in value change listener:', e);
30+
logger.error('Error in value change listener:', e);
3031
}
3132
}
3233
}
@@ -36,7 +37,7 @@
3637

3738
async setValue(name, value) {
3839
if (typeof name !== 'string') {
39-
console.warn('GM_setValue: name must be a string');
40+
logger.warn('GM_setValue: name must be a string');
4041
return;
4142
}
4243
const resolvedValue = value instanceof Promise ? await value : value;
@@ -46,7 +47,7 @@
4647

4748
getValue(name, defaultValue) {
4849
if (typeof name !== 'string') {
49-
console.warn('GM_getValue: name must be a string');
50+
logger.warn('GM_getValue: name must be a string');
5051
return defaultValue;
5152
}
5253
if (this.cache.has(name)) {
@@ -64,7 +65,7 @@
6465

6566
async getValueAsync(name, defaultValue) {
6667
if (typeof name !== 'string') {
67-
console.warn('GM.getValue: name must be a string');
68+
logger.warn('GM.getValue: name must be a string');
6869
return defaultValue;
6970
}
7071
if (this.cache.has(name)) {
@@ -84,7 +85,7 @@
8485

8586
async deleteValue(name) {
8687
if (typeof name !== 'string') {
87-
console.warn('GM_deleteValue: name must be a string');
88+
logger.warn('GM_deleteValue: name must be a string');
8889
return;
8990
}
9091
this.cache.delete(name);
@@ -227,7 +228,7 @@
227228
const details = normalizeDetails(textOrDetails, titleOrOnDone, image);
228229
this.bridge.call('notification', { details }).catch(() => {});
229230
} catch (e) {
230-
console.warn(e.message);
231+
logger.warn(e.message);
231232
}
232233
};
233234
window.GM.notification = (textOrDetails, titleOrOnDone, image) => {
@@ -244,7 +245,7 @@
244245
if (enabled.gmRegisterMenuCommand) {
245246
const fn = (caption, onClick, accessKey) => {
246247
if (typeof caption !== 'string' || typeof onClick !== 'function') {
247-
console.warn(
248+
logger.warn(
248249
'GM_registerMenuCommand: Expected (string caption, function onClick, [string accessKey])'
249250
);
250251
return null;
@@ -266,7 +267,7 @@
266267
if (enabled.gmUnregisterMenuCommand) {
267268
const fn = (commandId) => {
268269
if (typeof commandId !== 'string') {
269-
console.warn('GM_unregisterMenuCommand: Expected string commandId');
270+
logger.warn('GM_unregisterMenuCommand: Expected string commandId');
270271
return;
271272
}
272273

@@ -285,7 +286,7 @@
285286
if (enabled.gmGetResourceText) {
286287
const syncFn = (name) => {
287288
if (typeof name !== 'string' || name === '') {
288-
console.warn('GM_getResourceText: resource name must be a string');
289+
logger.warn('GM_getResourceText: resource name must be a string');
289290
return null;
290291
}
291292
const text = this.resourceManager.getText(name);
@@ -298,7 +299,7 @@
298299
if (enabled.gmGetResourceURL) {
299300
const syncFn = (name) => {
300301
if (typeof name !== 'string' || name === '') {
301-
console.warn('GM_getResourceURL: resource name must be a string');
302+
logger.warn('GM_getResourceURL: resource name must be a string');
302303
return null;
303304
}
304305
const url = this.resourceManager.getURL(name);
@@ -314,7 +315,7 @@
314315
if (enabled.gmAddStyle) {
315316
const fn = (css) => {
316317
if (css == null) {
317-
console.warn('GM_addStyle: css must be a string');
318+
logger.warn('GM_addStyle: css must be a string');
318319
return null;
319320
}
320321
const style = document.createElement('style');
@@ -353,7 +354,7 @@
353354
}
354355

355356
if (!parent || typeof parent.appendChild !== 'function' || typeof tag !== 'string') {
356-
console.warn(
357+
logger.warn(
357358
'GM_addElement: parent must be a valid DOM node and tag must be a string'
358359
);
359360
return null;
@@ -385,7 +386,7 @@
385386
parent.appendChild(el);
386387
return el;
387388
} catch (err) {
388-
console.error('GM_addElement: Failed to create or append element:', err);
389+
logger.error('GM_addElement: Failed to create or append element:', err);
389390
return null;
390391
}
391392
};
@@ -428,13 +429,13 @@
428429

429430
const supportedMethods = ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'];
430431
if (!supportedMethods.includes(normalizedDetails.method)) {
431-
console.warn(`GM_xmlhttpRequest: Unknown method "${normalizedDetails.method}"`);
432+
logger.warn(`GM_xmlhttpRequest: Unknown method "${normalizedDetails.method}"`);
432433
}
433434

434435
// Always use cross-origin handler (via background script) to bypass CORS reliably
435436
return this._handleCrossOriginXmlhttpRequest(normalizedDetails);
436437
} catch (error) {
437-
console.error(
438+
logger.error(
438439
`CodeTweak: GM_xmlhttpRequest failed due to an invalid URL: "${details.url}"`,
439440
error
440441
);
@@ -501,7 +502,7 @@
501502
try {
502503
callback(payload);
503504
} catch (error) {
504-
console.error(`GM_xmlhttpRequest ${callbackName} callback failed:`, error);
505+
logger.error(`GM_xmlhttpRequest ${callbackName} callback failed:`, error);
505506
}
506507
}
507508

@@ -540,7 +541,7 @@
540541
normalized.response = new TextEncoder().encode(serialized).buffer;
541542
}
542543
} catch (error) {
543-
console.error('CodeTweak: Failed to normalize arraybuffer response.', error);
544+
logger.error('CodeTweak: Failed to normalize arraybuffer response.', error);
544545
}
545546
}
546547

@@ -559,7 +560,7 @@
559560
});
560561
}
561562
} catch (error) {
562-
console.error('CodeTweak: Failed to normalize blob response.', error);
563+
logger.error('CodeTweak: Failed to normalize blob response.', error);
563564
}
564565
}
565566

@@ -736,7 +737,7 @@
736737
}
737738

738739
if (enabled.gmLog) {
739-
const fn = (...args) => console.log(...args);
740+
const fn = (...args) => logger.info(...args);
740741
window.GM_log = window.GM.log = fn;
741742
}
742743
}

src/GM/gm_core.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logger from '../utils/logger.js';
12
'use strict';
23

34
import { GMBridge } from './gm_bridge.js';
@@ -144,7 +145,7 @@ if (window.GMBridge === undefined) {
144145
'*'
145146
);
146147
} catch (postError) {
147-
console.error('[GMBridge] Failed to report script error:', postError);
148+
logger.error('[GMBridge] Failed to report script error:', postError);
148149
}
149150
}
150151

@@ -153,7 +154,7 @@ if (window.GMBridge === undefined) {
153154
const message = event.error?.message || event.message || 'Unknown error';
154155
const stack = event.error?.stack || '';
155156

156-
console.error(
157+
logger.error(
157158
`[GMBridge] Error in user script (ID: ${scriptId})`,
158159
`\nMessage: ${message}`,
159160
`\nStack: ${stack}`
@@ -167,7 +168,7 @@ if (window.GMBridge === undefined) {
167168
event.reason?.message || String(event.reason) || 'Unhandled promise rejection';
168169
const stack = event.reason?.stack || '';
169170

170-
console.error(
171+
logger.error(
171172
`[GMBridge] Unhandled rejection in user script (ID: ${scriptId})`,
172173
`\nMessage: ${message}`,
173174
`\nStack: ${stack}`
@@ -191,7 +192,7 @@ if (window.GMBridge === undefined) {
191192
script.remove();
192193
return;
193194
} catch {
194-
console.warn('[GMBridge] Inline script textContent failed, trying Blob URL...');
195+
logger.warn('[GMBridge] Inline script textContent failed, trying Blob URL...');
195196
}
196197

197198
// Fallback to Blob URL
@@ -205,7 +206,7 @@ if (window.GMBridge === undefined) {
205206
blobScript.remove();
206207
};
207208
blobScript.onerror = (err) => {
208-
console.error(
209+
logger.error(
209210
`[GMBridge] Both inline and Blob injection failed for ${scriptId}. This site's CSP is too strict for direct injection.`,
210211
err
211212
);
@@ -229,7 +230,7 @@ if (window.GMBridge === undefined) {
229230
}
230231
}
231232
} catch (error) {
232-
console.error(`[GMBridge] Error executing user script ${scriptId}:`, error);
233+
logger.error(`[GMBridge] Error executing user script ${scriptId}:`, error);
233234
reportScriptError(scriptId, error, 'execution');
234235
} finally {
235236
window.removeEventListener('error', errorHandler);

src/GM/helpers/external_script_loader.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logger from '../../utils/logger.js';
12
import { getTrustedTypesPolicy } from './trusted_types.js';
23

34
export class ExternalScriptLoader {
@@ -13,7 +14,7 @@ export class ExternalScriptLoader {
1314
// Auto-upgrade HTTP to HTTPS
1415
const upgradedUrl = url.replace(/^http:\/\//i, 'https://');
1516
if (upgradedUrl !== url) {
16-
console.info(`[GMBridge] Auto-upgraded ${url} to HTTPS`);
17+
logger.info(`[GMBridge] Auto-upgraded ${url} to HTTPS`);
1718
}
1819

1920
await this.injectScriptTag(upgradedUrl);
@@ -40,7 +41,7 @@ export class ExternalScriptLoader {
4041
try {
4142
trustedSrc = policy.createScriptURL(src);
4243
} catch (error) {
43-
console.error('[GMBridge] Failed to create trusted script URL:', error);
44+
logger.error('[GMBridge] Failed to create trusted script URL:', error);
4445
}
4546
}
4647

@@ -49,7 +50,7 @@ export class ExternalScriptLoader {
4950
scriptElement.onload = resolve;
5051
scriptElement.onerror = () => {
5152
const error = new Error(`Failed to load script: ${src}`);
52-
console.error('[GMBridge]', error.message);
53+
logger.error('[GMBridge]', error.message);
5354
reject(error);
5455
};
5556

src/GM/helpers/trusted_types.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logger from '../../utils/logger.js';
12
let trustedTypesPolicy = null;
23

34
export function getTrustedTypesPolicy() {
@@ -23,7 +24,7 @@ export function getTrustedTypesPolicy() {
2324
});
2425
return trustedTypesPolicy;
2526
} catch (error) {
26-
console.error('[GMBridge] Failed to create Trusted Types policy:', error);
27+
logger.error('[GMBridge] Failed to create Trusted Types policy:', error);
2728
return null;
2829
}
2930
}

src/ai_dom_editor/editor/ai_dom_editor.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logger from '../../utils/logger.js';
12
// AI DOM Editor - Main JavaScript
23
import feather from 'feather-icons';
34
import { ChatManager } from './helpers/chat_manager.js';
@@ -99,7 +100,7 @@ class AIDOMEditor {
99100
await chrome.storage.local.remove(storageKey);
100101
}
101102
} catch (error) {
102-
console.error('Error saving current script state:', error);
103+
logger.error('Error saving current script state:', error);
103104
}
104105
}
105106

@@ -138,7 +139,7 @@ class AIDOMEditor {
138139
}
139140
}
140141
} catch (error) {
141-
console.error('Error restoring current script state:', error);
142+
logger.error('Error restoring current script state:', error);
142143
}
143144
}
144145

@@ -153,7 +154,7 @@ class AIDOMEditor {
153154

154155
return userLanguage;
155156
} catch (error) {
156-
console.error('Error getting language:', error);
157+
logger.error('Error getting language:', error);
157158
return 'en';
158159
}
159160
}
@@ -164,7 +165,7 @@ class AIDOMEditor {
164165
document.documentElement.setAttribute('lang', lang);
165166
await applyTranslations();
166167
} catch (error) {
167-
console.error('Error setting language:', error);
168+
logger.error('Error setting language:', error);
168169
}
169170
await this.apiHandler.loadAPIConfig();
170171
await this.apiHandler.loadAvailableModels();

0 commit comments

Comments
 (0)