Added the localStorage management feature. Please check the option page.
[open-pinnedtab-link:open-pinnedtab-link.git] / background.html
1 <html> <!-- -*- coding: utf-8 ; mode: xml -*-
2  Copyright (C) 2011 Yasuhiro ABE, yasu@yasundial.org.
3  Licensed under the Apache License, Version 2.0.
4 -->
5 <head>
6 <script type="text/javascript">
7
8 var debug = false;
9
10 var opts_enabled_default;
11 var opts_external_link_only_default;
12 var opts_1 = localStorage.getItem("opts_enabled_default");
13 if(opts_1 == undefined || opts_1 == "undefined") {
14   opts_enabled_default = true;
15 } else {
16   opts_enabled_default = JSON.parse(opts_1);
17 }
18 var opts_2 = localStorage.getItem("opts_external_link_only_default");
19 if(opts_2 == undefined || opts_2 == "undefined") {
20   opts_external_link_only_default = false;
21 } else {
22   opts_external_link_only_default = JSON.parse(opts_2);
23 }
24 if(debug) {
25   console.log("typeof(opts_enabled_default) = " + typeof(opts_enabled_default));
26   console.log("typeof(opts_external_link_only_default) = " + typeof(opts_external_link_only_default));
27 }
28 localStorage["opts_enabled_default"] = JSON.stringify(opts_enabled_default);
29 localStorage["opts_external_link_only_default"] = JSON.stringify(opts_external_link_only_default);
30
31 function updateOptions() {
32   opts_enabled_default = JSON.parse(localStorage["opts_enabled_default"]);
33   opts_external_link_only_default = JSON.parse(localStorage["opts_external_link_only_default"]);
34 }
35
36 function execInjection(tabid, host, params) {
37   if(debug) {
38     console.log("execInjection(tabid=" + tabid + ", host=" + host +",params)");
39     console.log("params.enabled: " + params.enabled);
40     console.log("params.external_link_only: " + params.external_link_only);
41   }
42   if(host == undefined || params == undefined) {
43     var s = {code:""};
44     s.code = 'var al = document.getElementsByTagName("a");for(var i=0; i < al.length; i++){    al[i].setAttribute("target","_blank");}';
45     chrome.tabs.executeScript(tabid, s);
46   } else {
47     var s = {code:""};
48     s.code += 'var al = document.getElementsByTagName("a");'
49     s.code += 'for(var i=0; i < al.length; i++){';
50     s.code += '  var a = document.createElement("a");';
51     s.code += '  a.href = "' + host + '";';
52     s.code += '  if(' + params.external_link_only + ') {';
53     s.code += '    if(a.hostname != al[i].hostname) {';
54     s.code += '      al[i].setAttribute("target","_blank");';
55     s.code += '    } else {';
56     s.code += '      al[i].setAttribute("target","");';
57     s.code += '    }';
58     s.code += '  } else {';
59     s.code += '    al[i].setAttribute("target","_blank");';
60     s.code += '  }';
61     s.code += '}';
62     if(debug) { console.log("execInjection: s.code = " + s.code); }
63     chrome.tabs.executeScript(tabid, s);
64   }
65 }
66 function execRemoveTarget(tabid) {
67   chrome.tabs.executeScript(tabid, {file: "scripts/remove_targets.js"});
68 }
69
70 // note: Until loading the page, the menu1 has been always marked checked.
71 var menu1 = chrome.contextMenus.create({"title": chrome.i18n.getMessage("menu_enabled"), "type": "checkbox", "onclick":menu1OnClick, "checked": opts_enabled_default});
72 var menu2 = chrome.contextMenus.create({"title": chrome.i18n.getMessage("menu_exclude"), "type": "checkbox", "onclick":menu2OnClick, "checked": opts_external_link_only_default});
73 function menu1OnClick(info,tab) {
74     if(tab != undefined && tab.pinned == true) {
75         var params = JSON.parse(localStorage.getItem(tab.id));
76         if(params != undefined) {
77             params.enabled = ! params.enabled;
78             if(menu1 != undefined) {
79                 chrome.contextMenus.update(menu1,{"checked": params.enabled});
80             }
81
82             if(params.enabled == true) {
83                 execInjection(tab.id, tab.url, params);
84             } else {
85                 execRemoveTarget(tab.id);
86             }
87             localStorage[tab.id] = JSON.stringify(params);
88         }
89     }
90 }
91 function menu2OnClick(info,tab) {
92     if(tab != undefined && tab.pinned == true) {
93         var params = JSON.parse(localStorage.getItem(tab.id));
94         if(params != undefined) {
95             params.external_link_only = ! params.external_link_only;
96             if(menu2 != undefined) {
97                 chrome.contextMenus.update(menu1,{"checked": params.external_link_only});
98             }
99             execInjection(tab.id, tab.url, params);
100             localStorage[tab.id] = JSON.stringify(params);
101         }
102     }
103 }
104
105 function initParams(tabid) {
106   params = {
107     enabled: opts_enabled_default,
108     external_link_only: opts_external_link_only_default
109   };
110   localStorage[tabid] = JSON.stringify(params);
111 }
112 function updateMenu1(tabid, params) {
113   if(debug) { console.log("updateMenu1(tabid=" + tabid + ",params)"); }
114   if(menu1 != undefined) {
115     if(params != undefined) {
116       if(debug) { console.log("updateMenu1: params != undefined"); }
117       chrome.contextMenus.update(menu1,{"checked": params.enabled});
118     } else {
119       if(debug) { console.log("updateMenu1: params == undefined"); }
120       chrome.contextMenus.update(menu1,{"checked": ! opts_enabled_default});
121     }
122   }
123 }
124 function updateMenu2(tabid, params) {
125   if(debug) { console.log("updateMenu2(tabid=" + tabid + ",params)"); }
126   if(menu1 != undefined) {
127     if(params != undefined) {
128       if(debug) { console.log("updateMenu2: params != undefined"); }
129       chrome.contextMenus.update(menu2,{"checked": params.external_link_only});
130     } else {
131       if(debug) { console.log("updateMenu2: params == undefined"); }
132       chrome.contextMenus.update(menu2,{"checked": opts_external_link_only_default});
133     }
134   }
135 }
136
137 chrome.tabs.onUpdated.addListener(function(id,info,tab) {
138   if(debug) { console.log("onUpdated(id=" + id + ",info,tab.id=" + tab.id + ")"); }
139   var params = JSON.parse(localStorage.getItem(tab.id));
140   if(tab.pinned) {
141     if (params == undefined) {
142       initParams(tab.id);
143       params = JSON.parse(localStorage.getItem(tab.id));
144     }
145     if (params.enabled == true) {
146       execInjection(tab.id, tab.url, params);
147     }
148   } else {
149     if(params != undefined) {
150       localStorage.removeItem(tab.id);
151       execRemoveTarget(tab.id);
152     }
153   }
154   updateMenu1(tab.id, params);
155   updateMenu2(tab.id, params);
156 });
157
158 // when started the main window, the onSelectionChanged is never called.
159 // so, for the first time invocation, you need to define this method as well as onSelectionChanged().
160 // it might be a bug of chrome or my misunderstand about the usage of APIs.
161 chrome.tabs.onCreated.addListener(function(tab) {
162   if(debug) { console.log("onCreated(" + tab.id + ")"); }
163   var params = JSON.parse(localStorage.getItem(tab.id));
164   if(tab.pinned) {
165     if(params == undefined) {
166       initParams(tab.id);
167       params = JSON.parse(localStorage.getItem(tab.id));
168     }
169     if(params.enabled == true) {
170       execInjection(tab.id, tab.url, params);
171     }
172   }
173   updateMenu1(tab.id, params);
174   updateMenu2(tab.id, params);
175 });
176
177 // never create the new item when the params == null
178 // but, it is possible that it will be called at first without calling the onCreated or onUpdated method.
179 chrome.tabs.onSelectionChanged.addListener(function(id,info) {
180   if(debug) { console.log("onSelectionChanged(id=" + id + ",info)"); }
181   var params = JSON.parse(localStorage.getItem(id));
182   updateMenu1(id, params);
183   updateMenu2(id, params);
184   updateOptions();
185 });
186
187 chrome.tabs.onRemoved.addListener(function(id,info) {
188   if(debug) { console.log("onRemoved(id=" + id + ",info)"); }
189   var params = JSON.parse(localStorage.getItem(id));
190   if(params != undefined) {
191     localStorage.removeItem(id);
192   }
193 });
194
195 chrome.tabs.onAttached.addListener(function(id,info) {
196   if(debug) { console.log("onAttached(id=" + id + ",info)"); }
197 });
198 chrome.tabs.onDetached.addListener(function(id,info) {
199   if(debug) { console.log("onDetached(id=" + id + ",info)"); }
200 });
201
202 chrome.windows.onFocusChanged.addListener(function(windid) {
203   if(debug) { console.log("windows.onFocusChanged(windowId=" + windid + ")"); }
204 });
205
206 chrome.windows.onRemoved.addListener(function(windid) {
207   if(debug) { console.log("windows.onRemoved(windowId=" + windid + ")");   }
208
209   localStorage["opts_enabled_default"] = JSON.stringify(opts_enabled_default);
210   localStorage["opts_external_link_only_default"] = JSON.stringify(opts_external_link_only_default);
211 });
212
213 </script>
214 </head>
215 </html>