-
Notifications
You must be signed in to change notification settings - Fork 1
/
tabdata.js
executable file
·141 lines (113 loc) · 3.03 KB
/
tabdata.js
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
// Initialize the namespace.
stannum = window.stannum || {}
/**
* A representation of a tab and the resources that have been loaded inside it.
* @param {number} tabId The ID of the tab.
* @constructor
*/
stannum.TabInstance = function(tabId) {
/**
* The ID of the tab.
* @type {number}
*/
this.tabId = tabId;
/**
* A collection of scripts that have been loaded inside the tab.
* @type {!Array}
*/
this.scripts = [];
/**
* A collection of stylesheets that have been loaded inside the tab.
* @type {!Array}
*/
this.stylesheets = [];
/**
* A collection of objects that have been loaded inside the tab.
* @type {!Array}
*/
this.objects = [];
/**
* A collection of XHRs that have been made by the tab.
* @type {!Array}
*/
this.xhrs = [];
/**
* A collection of 'others'.
* TODO(radi/nasko): Define what this is.
* @type {!Array}
*/
this.others = [];
/**
* A collection of script origins, which are temporarily allowed and
* should be blocked once the tab is closed. This array should not be
* cleared on reload, as it must keep all temporary exceptions for the
* lifetime of the tab.
*/
this.tempSciptExceptions = [];
};
stannum.TabInstance.prototype.add = function(objType, uri) {
this[objType].push(uri);
};
stannum.TabInstance.prototype.reset = function() {
for (var prop in this) {
// Skip the temporary exceptions, which are bound to the lifetime of the
// tab.
if (prop === 'tempSciptExceptions')
continue;
if (this[prop] instanceof Array) {
this[prop] = [];
}
}
};
/**
* An object to allow easier management of collections of tab representations.
* @constructor
*/
stannum.TabData = function() {
this.tabs = {};
};
/**
* Register a tab so that its resources can be properly managed.
* @param {!Object} tab The tab to register.
*/
stannum.TabData.prototype.registerTab = function(tab) {
this.tabs[tab.id] = new stannum.TabInstance(tab.id);
};
/**
* Unregister a tab.
* @param {number} tabId The ID of the tab to unregister.
*/
stannum.TabData.prototype.unregisterTab = function(tabId) {
var tab = this.tabs[tabId];
if (tab !== undefined) {
// Block all temporary exceptions for the lifetime of this tab.
tab.tempSciptExceptions.forEach(function(origin) {
stannum.setResourceSetting(origin, 'block');
});
}
delete this.tabs[tabId];
};
/**
* A collection of managed tabs.
* @type {!stannum.TabData}
*/
stannum.tabsHolder = new stannum.TabData();
/**
* Start monitoring the Chrome tabs.
*/
stannum.initTabs = function() {
// Register all existing tabs.
chrome.tabs.query({}, function(tabsArray) {
tabsArray.forEach(function(tab) {
stannum.tabsHolder.registerTab(tab);
});
});
// Register new tabs upon creation.
chrome.tabs.onCreated.addListener(function(tab) {
stannum.tabsHolder.registerTab(tab);
});
// Unregister a tab when it's being closed.
chrome.tabs.onRemoved.addListener(function(tabId) {
stannum.tabsHolder.unregisterTab(tabId);
});
};