-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbackground.js
More file actions
133 lines (111 loc) · 3.66 KB
/
Copy pathbackground.js
File metadata and controls
133 lines (111 loc) · 3.66 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
const allResourceTypes = Object.values(
chrome.declarativeNetRequest.ResourceType
);
// Get domains from settings with backward compatibility
async function getDomainsFromSettings() {
const savedSettings = await chrome.storage.local.get("tracerSettings");
const settings = savedSettings?.tracerSettings;
if (!settings) return [];
// New format: domains array
if (settings.domains && Array.isArray(settings.domains)) {
return settings.domains;
}
// Old format: single domain (backward compatibility)
if (settings.domain) {
return [settings.domain];
}
return [];
}
// Create rules for all domains with fixed sequential integer IDs
const rules = async (traceID, tabID) => {
const domains = await getDomainsFromSettings();
return domains.map((domain, index) => ({
id: index + 1, // Fixed sequential integers: 1, 2, 3, ...
priority: 1,
action: {
type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,
requestHeaders: [
{
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
header: "x-datadog-trace-id",
value: traceID,
},
{
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
header: "x-datadog-parent-id",
value: "0",
},
{
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
header: "x-datadog-origin",
value: "synthetics-browser",
},
{
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
header: "x-datadog-sampling-priority",
value: "1",
},
],
},
condition: {
urlFilter: `||${domain}`,
resourceTypes: allResourceTypes,
tabIds: [tabID],
},
}));
};
chrome.runtime.onMessage.addListener(async function (
request,
sender,
sendResponse
) {
const tabId = request.tab;
const traceId = request.trace;
if (request.enable) {
if (!traceId) console.error("TRACE ID NOT FOUND!!!!");
const rulesToAdd = await rules(traceId, tabId);
const ruleIds = rulesToAdd.map((rule) => rule.id);
chrome.declarativeNetRequest.updateSessionRules({
removeRuleIds: ruleIds, // remove existing rules with same IDs
addRules: rulesToAdd,
});
// save to local storage with ruleIds for later removal
chrome.storage.local.set({ tracer: { tabId, traceId, ruleIds } });
chrome.tabs.group({ tabIds: tabId }, (groupId) => {
chrome.tabGroups.update(groupId, {
color: "green",
title: "Tracing",
});
});
chrome.action.setBadgeText({ text: "ON", tabId: tabId });
} else {
// Get stored ruleIds for removal
const stored = await chrome.storage.local.get("tracer");
const ruleIds = stored?.tracer?.ruleIds || [tabId]; // fallback for old format
chrome.declarativeNetRequest.updateSessionRules({
removeRuleIds: ruleIds,
});
// save to local storage
chrome.storage.local.remove("tracer");
chrome.tabs.ungroup(tabId);
chrome.action.setBadgeText({ text: "OFF", tabId: tabId });
}
return true; // have to return a promise to avoid errors
});
chrome.runtime.onInstalled.addListener(function () {
chrome.runtime.openOptionsPage();
});
// Clean up when traced tab is closed
chrome.tabs.onRemoved.addListener(async (tabId) => {
const stored = await chrome.storage.local.get("tracer");
// Only clean up if the closed tab was the traced tab
if (stored?.tracer?.tabId === tabId) {
const ruleIds = stored.tracer.ruleIds || [];
if (ruleIds.length > 0) {
chrome.declarativeNetRequest.updateSessionRules({
removeRuleIds: ruleIds,
});
}
chrome.storage.local.remove("tracer");
}
});