1 sdump('D_TRACE','Loading app_shell.js\n');
3 function app_shell_init(p) {
4 sdump('D_TAB',"TESTING: app_shell.js: " + mw.G['main_test_variable'] + '\n');
6 p.w.close_tab = function (t1,t2) { return close_tab(p.w.document,t1,t2); };
7 p.w.find_free_tab = function (tabs) { return find_free_tab(tabs); };
8 p.w.new_tab = function () { return new_tab(p.w.document,p.tabbox); };
9 p.w.replace_tab = function (label,chrome,params) { return replace_tab(p.w.document,p.tabbox,label,chrome,params); };
10 p.w.get_frame_in_tab = function (idx, all_or_vis) { return get_frame_in_tab( p.w.document, p.tabbox, idx, all_or_vis ); };
12 p.w.replace_tab('Tab','chrome://evergreen/content/main/about.xul');
16 spawn_javascript_console(p.w.document,'replace_tab','main_tabbox',{});
19 spawn_javascript_shell(p.w.document,'new_tab','main_tabbox',{});
28 function close_tab( d, t1, t2 ) {
29 // t1 = tabbox or tab, if t1 = tabbox, t2 = tab index, otherwise close current tab
30 sdump('D_TAB',arg_dump(arguments,{1:true,2:true}));
31 if (typeof(t1)!='object')
32 t1 = d.getElementById(t1);
33 if (typeof(t1)!='object')
34 throw('Could not find tab or tabbox. d = ' + d + ' tabbox = ' + t1 + '\n');
38 if (t1.tagName == 'tabbox')
41 tabbox = t1.parentNode.parentNode;
43 var idx = tabbox.selectedIndex;
47 sdump('D_TAB','tabbox.selectedIndex = ' + tabbox.selectedIndex + '\n');
48 var tabs = tabbox.firstChild;
49 var panels = tabbox.lastChild;
53 tabs.advanceSelectedTab(+1);
55 sdump('D_TAB','failed tabs.advanceSelectedTab(+1):'+js2JSON(E) + '\n');
57 tabs.advanceSelectedTab(-1);
59 sdump('D_TAB','failed again tabs.advanceSelectedTab(-1):'+js2JSON(E) + '\n');
64 tabs.advanceSelectedTab(-1);
66 sdump('D_TAB','failed tabs.advanceSelectedTab(-1):'+js2JSON(E) + '\n');
68 tabs.advanceSelectedTab(+1);
70 sdump('D_TAB','failed again tabs.advanceSelectedTab(+1):'+js2JSON(E) + '\n');
76 sdump('D_TAB','\tnew tabbox.selectedIndex = ' + tabbox.selectedIndex + '\n');
78 tabs.childNodes[ idx ].hidden = true;
79 sdump('D_TAB','tabs.childNodes[ ' + idx + ' ].hidden = true;\n');
81 // Make sure we keep at least one tab open.
83 for (var i = 0; i < tabs.childNodes.length; i++) {
84 var tab = tabs.childNodes[i];
92 sdump('D_ERROR',E+'\n');
97 function find_free_tab(tabs) {
98 var last_not_hidden = -1;
99 for (var i = 0; i<tabs.childNodes.length; i++) {
100 var tab = tabs.childNodes[i];
104 if (last_not_hidden == tabs.childNodes.length - 1)
105 last_not_hidden = -1;
106 // If the one next to last_not_hidden is hidden, we want it.
107 // Basically, we fill in tabs after existing tabs for as
109 var idx = last_not_hidden + 1;
110 var candidate = tabs.childNodes[ idx ];
111 if (candidate.hidden)
113 // Alright, find the first hidden then
114 for (var i = 0; i<tabs.childNodes.length; i++) {
115 var tab = tabs.childNodes[i];
122 function get_frame_in_tab( d, tabbox, idx, all_or_visible ) {
123 sdump('D_TAB',arg_dump(arguments));
124 if (typeof(tabbox)!='object')
125 tabbox = d.getElementById(tabbox);
126 if (typeof(tabbox)!='object')
127 throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
128 var tabs = tabbox.firstChild;
129 var panels = tabbox.lastChild;
131 if (all_or_visible == 'visible') {
133 for (var i = 0; i < tabs.childNodes.length; i++) {
134 if (!tabs.childNodes[i].hidden) count++;
135 if (count==idx) return panels.childNodes[i].getElementsByTagName('iframe')[0];
138 return panels.childNodes[ idx ].getElementsByTagName('iframe')[0];
141 sdump('D_ERROR',js2JSON(E) + '\n');
146 function new_tab( d, tabbox ) {
147 sdump('D_TAB',arg_dump(arguments,{1:true}));
148 if (typeof(tabbox)!='object')
149 tabbox = d.getElementById(tabbox);
150 if (typeof(tabbox)!='object')
151 throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
152 var tabs = tabbox.firstChild;
153 var panels = tabbox.lastChild;
154 var tc = find_free_tab(tabs);
155 sdump('D_TAB','find_free_tab returned ' + tc + '\n');
156 if (tc == -1) { return; } // let's only have up to 10 tabs
157 var tab = tabs.childNodes[ tc ];
158 tab.setAttribute('label','Tab ' + (tc + 1) );
161 tabs.selectedIndex = tc;
162 replace_tab(d,tabbox,'Tab','chrome://evergreen/content/main/about.xul');
164 sdump('D_ERROR','+++++++++++++++++++++++++++++' + E + ' : ' + js2JSON(E)+'\n');
168 function replace_tab( d, tabbox, label, chrome, params ) {
169 sdump('D_TAB',arg_dump(arguments,{2:true,3:true,4:true}));
170 if (typeof(tabbox)!='object')
171 tabbox = d.getElementById(tabbox);
172 if (typeof(tabbox)!='object')
173 throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
174 var tabs = tabbox.firstChild;
175 var panels = tabbox.lastChild;
177 var idx = tabs.selectedIndex;
178 var tab = tabs.childNodes[ idx ];
179 var panel = panels.childNodes[ idx ];
182 tab.setAttribute('label',label + ' ' + (idx+1));
184 var frame = d.createElement('iframe');
185 frame.setAttribute('flex','1');
186 frame.setAttribute('src',chrome);
187 panel.appendChild(frame);
188 panel.replaceChild(panel.lastChild,panel.firstChild);
189 frame.setAttribute('id','frame_'+idx);
191 sdump('D_TAB','Created frame : ' + frame.id + ' for index : ' + idx + ' with src=' + frame.getAttribute('src') + '\n');
192 //frame.contentWindow.parentWindow = parentWindow;
193 //frame.contentWindow.tabWindow = this;
194 //dump('replace_tab.tabWindow = ' + this + '\n');
195 frame.contentWindow.mw = mw;
196 //frame.contentWindow.am_i_a_top_level_tab = true;
198 frame.contentWindow.params = params;
200 return frame.contentWindow;
202 sdump('D_ERROR',js2JSON(E)+'\n');
204 //debug_tabs(d,tabbox);