|
3 | 3 |
|
4 | 4 | <link id="style" rel="stylesheet" type="text/css" href="popup.css" />
|
5 | 5 |
|
6 |
| -<script type="text/javascript"> |
7 |
| - |
8 |
| -// FEATURE: support drag & drop re-ordering |
9 |
| -// FEATURE: support drag & drop merging |
10 |
| - |
11 |
| -var backgroundPage = chrome.extension.getBackgroundPage(); |
12 |
| -var savedWindowListEl, formEl, nameInput, template; |
13 |
| -var undo = new Object(); |
14 |
| - |
15 |
| - |
16 |
| -function init() { |
17 |
| - // CSS buster - only used when developing locally |
18 |
| - style = document.getElementById("style"); |
19 |
| - style.href = style.href + "?salt=" + Math.random(); |
20 |
| - |
21 |
| - // initialize variables we'll need |
22 |
| - savedWindowListEl = document.getElementById("savedWindowList"); |
23 |
| - formEl = document.getElementById("form"); |
24 |
| - nameInput = document.getElementById("nameInput"); |
25 |
| - template = document.getElementById("template"); |
26 |
| - |
27 |
| - // populate list of windows |
28 |
| - chrome.windows.getCurrent(function(currentWindow) { |
29 |
| - var currentWindowName = backgroundPage.windowIdToName[currentWindow.id]; |
30 |
| - var savedWindows = backgroundPage.savedWindows; |
31 |
| - var savedWindowNames = backgroundPage.savedWindowNames; |
32 |
| - for (var i in savedWindowNames) { |
33 |
| - var name = savedWindowNames[i]; |
34 |
| - var savedWindow = savedWindows[name]; |
35 |
| - appendWindowToList(savedWindow, currentWindowName); |
36 |
| - } |
37 |
| - if (!currentWindowName) { |
38 |
| - if (currentWindow.incognito) { |
39 |
| - document.getElementById("incognitoMsg").style.display = "block"; |
40 |
| - } else { |
41 |
| - nameInput.value = backgroundPage.DEFAULT_NAME; |
42 |
| - formEl.style.display = "block"; |
43 |
| - nameInput.focus(); |
44 |
| - nameInput.select(); |
45 |
| - } |
46 |
| - } |
47 |
| - }); |
48 |
| - |
49 |
| - // decrement update message counter |
50 |
| - var count = backgroundPage.updateMsgCount; |
51 |
| - if (count > 0) { |
52 |
| - backgroundPage.updateMsgCount = count - 1; |
53 |
| - localStorage.updateMsgCount = count - 1; |
54 |
| - document.getElementById("update").style.display = "block"; |
55 |
| - } else { |
56 |
| - backgroundPage.updateBadgeForAllWindows(); |
57 |
| - } |
58 |
| - |
59 |
| - // this does nothing in the packaged extension |
60 |
| - backgroundPage.debug.addDebugUI(document); |
61 |
| -} |
62 |
| - |
63 |
| - |
64 |
| -// add window to HTML list of windows |
65 |
| -function appendWindowToList(savedWindow, currentWindowName) { |
66 |
| - var li = template.cloneNode(true); |
67 |
| - li.removeAttribute("id"); |
68 |
| - li.setAttribute("data-name", savedWindow.name); |
69 |
| - |
70 |
| - var count = savedWindow.tabs.length; |
71 |
| - var text = savedWindow.displayName + " (" + count + ")"; |
72 |
| - if (savedWindow.name == currentWindowName) { |
73 |
| - li.className = "current"; |
74 |
| - li.onclick = null; |
75 |
| - text = "This is <b>" + text + "<\/b>."; |
76 |
| - } else if (savedWindow.id) { |
77 |
| - li.className = "open"; |
78 |
| - li.onclick = function() { focusOpenWindow(savedWindow.id); }; |
79 |
| - } |
80 |
| - setText(li, text); |
81 |
| - |
82 |
| - // FEATURE: add "add to this set" to add current tabs to existing one |
83 |
| - |
84 |
| - savedWindowListEl.insertBefore(li, savedWindowListEl.firstChild); |
85 |
| -} |
86 |
| - |
87 |
| - |
88 |
| -// save window in background page and update display |
89 |
| -function saveWindow() { |
90 |
| - chrome.windows.getCurrent(function(currentWindow) { |
91 |
| - chrome.tabs.getAllInWindow(null, function(tabs) { |
92 |
| - currentWindow.tabs = tabs; |
93 |
| - savedWindow = backgroundPage.saveWindow(currentWindow, nameInput.value); |
94 |
| - formEl.style.display = "none"; |
95 |
| - appendWindowToList(savedWindow, nameInput.value); |
96 |
| - backgroundPage._gaq.push(['_trackEvent', 'popup', 'saveWindow', 'Value is tab count.', savedWindow.tabs.length]); |
97 |
| - }); |
98 |
| - }); |
99 |
| - return false; |
100 |
| -} |
101 |
| - |
102 |
| - |
103 |
| -// open a saved window |
104 |
| -// called when the user clicks the name of a saved window that is closed. |
105 |
| -function openSavedWindow(element) { |
106 |
| - // TODO: refactor to just use name as argument |
107 |
| - name = element.getAttribute("data-name"); |
108 |
| - backgroundPage.openWindow(name); |
109 |
| - |
110 |
| - var savedWindow = backgroundPage.savedWindows[name]; |
111 |
| - backgroundPage._gaq.push(['_trackEvent', 'popup', 'openWindow', 'Value is tab count.', savedWindow.tabs.length]); |
112 |
| -} |
113 |
| - |
114 |
| - |
115 |
| -// focus an open window |
116 |
| -// called when the user clicks the name of a saved window that is open. |
117 |
| -function focusOpenWindow(windowId) { |
118 |
| - chrome.windows.update(windowId, {focused: true}); |
119 |
| - backgroundPage._gaq.push(['_trackEvent', 'popup', 'focusWindow']); |
120 |
| -} |
121 |
| - |
122 |
| - |
123 |
| -// delete a saved window |
124 |
| -// called when the user presses the delete button |
125 |
| -function deleteSavedWindow(event, element) { |
126 |
| - event.stopPropagation(); |
127 |
| - |
128 |
| - // get data |
129 |
| - var li = element.parentNode; |
130 |
| - var name = li.getAttribute("data-name"); |
131 |
| - var savedWindow = backgroundPage.savedWindows[name] |
132 |
| - var text = li.childNodes[1].innerHTML; |
133 |
| - |
134 |
| - // save information for undo |
135 |
| - undo[name] = { |
136 |
| - className: li.className, |
137 |
| - text: text, |
138 |
| - savedWindow: savedWindow, |
139 |
| - id: savedWindow.id |
140 |
| - }; |
141 |
| - // we save this separately since deleteSavedWindow nixes it. |
142 |
| - if (savedWindow.id) { |
143 |
| - undo[name].id = savedWindow.id |
144 |
| - } |
145 |
| - |
146 |
| - // actually perform the deletion |
147 |
| - backgroundPage.deleteSavedWindow(name); |
148 |
| - |
149 |
| - // update display |
150 |
| - li.className = "deleted"; |
151 |
| - setText(li, "<b>" + getDisplayName(savedWindow) + "<\/b> was deleted."); |
152 |
| - // TODO: show the form if current window |
153 |
| - |
154 |
| - backgroundPage._gaq.push(['_trackEvent', 'popup', 'deleteWindow', 'Value is tab count.', savedWindow.tabs.length]); |
155 |
| -} |
156 |
| - |
157 |
| - |
158 |
| -// undo a deletion |
159 |
| -// called when the user presse the undo button |
160 |
| -function undoDeleteSavedWindow(event, element) { |
161 |
| - event.stopPropagation(); |
162 |
| - |
163 |
| - // get data |
164 |
| - var li = element.parentNode; |
165 |
| - var name = li.getAttribute("data-name"); |
166 |
| - var undoInfo = undo[name]; |
167 |
| - var savedWindow = undoInfo.savedWindow; |
168 |
| - |
169 |
| - // restore the window id |
170 |
| - if (undoInfo.id) { |
171 |
| - savedWindow.id = undoInfo.id; |
172 |
| - } |
173 |
| - |
174 |
| - // resave the window |
175 |
| - backgroundPage.saveWindow(savedWindow, name); |
176 |
| - |
177 |
| - // update display |
178 |
| - li.className = undoInfo.className; |
179 |
| - setText(li, undoInfo.text); |
180 |
| - |
181 |
| - // clean up |
182 |
| - delete undo[name]; |
183 |
| - // TODO: hide the form if current window |
184 |
| - |
185 |
| - backgroundPage._gaq.push(['_trackEvent', 'popup', 'undoDeleteWindow', 'Value is tab count.', savedWindow.tabs.length]); |
186 |
| -} |
187 |
| - |
188 |
| - |
189 |
| -// given a list element, sets the text |
190 |
| -function setText(element, text) { |
191 |
| - element.childNodes[1].innerHTML = text; |
192 |
| -} |
193 |
| - |
194 |
| - |
195 |
| -// formats the name for display |
196 |
| -function getDisplayName(savedWindow) { |
197 |
| - return savedWindow.displayName + " (" + savedWindow.tabs.length + ")"; |
198 |
| -} |
199 |
| - |
200 |
| - |
201 |
| -</script> |
| 6 | +<script type="text/javascript" src="popup.js"></script> |
202 | 7 |
|
203 | 8 | </head>
|
204 | 9 |
|
205 | 10 |
|
206 |
| -<body onload="init();"> |
| 11 | +<body> |
207 | 12 |
|
208 | 13 | <div>
|
209 |
| - <form id="form" onsubmit="return saveWindow();"> |
| 14 | + <form id="form"> |
210 | 15 | Save as: <input type="text" id="nameInput" />
|
211 | 16 | </form>
|
212 | 17 | <div id="incognitoMsg">Note: you can't save incognito windows.</div>
|
213 | 18 | <ul id="savedWindowList">
|
214 |
| - <li id="template" onclick="openSavedWindow(this);"> |
| 19 | + <li id="template"> |
215 | 20 | <span class="text">Name</span><!--
|
216 |
| - --><span class="delete" onclick="deleteSavedWindow(event, this);"> |
| 21 | + --><span id="delete" class="delete"> |
217 | 22 | ×
|
218 | 23 | </span><!--
|
219 |
| - --><span class="undo" onclick="undoDeleteSavedWindow(event, this);"> |
| 24 | + --><span id="undo" class="undo"> |
220 | 25 | undo
|
221 | 26 | </span>
|
222 | 27 | </li>
|
223 | 28 | </ul>
|
224 | 29 | <div id="footer">
|
225 |
| - <span id="update"> |
226 |
| - <img src="new.png" /> The extension has been updated (<a href="" onclick="chrome.tabs.create({url: 'https://chrome.google.com/extensions/detail/fpfmklldfnlcblofkhdeoohfppdoejdc'});">details</a>)<br/> |
227 |
| - If you like this extension, please <a href="" onclick="chrome.tabs.create({url: 'https://chrome.google.com/extensions/detail/fpfmklldfnlcblofkhdeoohfppdoejdc'});">rate it</a>. Thanks!<br/> |
| 30 | + <span id="updated"> |
| 31 | + <img src="new.png" /> The extension has been updated (<a id="updated" href="">details</a>)<br/> |
| 32 | + If you like this extension, please <a href="" id="rate">rate it</a>. Thanks!<br/> |
228 | 33 | </span>
|
229 |
| - Bugs or suggestions? <a href="" onclick="chrome.tabs.create({url:'mailto:[email protected]'});" >Contact me. </a> |
| 34 | + Bugs or suggestions? <a href="" id="contact">Contact me.</a> |
230 | 35 | </div>
|
231 | 36 | </div>
|
232 | 37 |
|
|
0 commit comments