1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 | var modulemapper = require('cordova/modulemapper');
|
25 |
|
26 | var origOpenFunc = modulemapper.getOriginalSymbol(window, 'window.open');
|
27 | var browserWrap;
|
28 |
|
29 | var IABExecs = {
|
30 |
|
31 | close: function (win, lose) {
|
32 | if (browserWrap) {
|
33 | browserWrap.parentNode.removeChild(browserWrap);
|
34 | browserWrap = null;
|
35 | if (typeof(win) == "function") win({type:'exit'});
|
36 | }
|
37 | },
|
38 |
|
39 | |
40 |
|
41 |
|
42 | show: function (win, lose) {
|
43 | console.error('[FirefoxOS] show not implemented');
|
44 | },
|
45 |
|
46 | hide: function (win, lose) {
|
47 | console.error('[FirefoxOS] hide not implemented');
|
48 | },
|
49 |
|
50 | open: function (win, lose, args) {
|
51 | var strUrl = args[0],
|
52 | target = args[1],
|
53 | features_string = args[2] || "location=yes",
|
54 | features = {};
|
55 |
|
56 | var features_list = features_string.split(',');
|
57 | features_list.forEach(function(feature) {
|
58 | var tup = feature.split('=');
|
59 | if (tup[1] == 'yes') {
|
60 | tup[1] = true;
|
61 | } else if (tup[1] == 'no') {
|
62 | tup[1] = false;
|
63 | } else {
|
64 | var number = parseInt(tup[1]);
|
65 | if (!isNaN(number)) {
|
66 | tup[1] = number;
|
67 | }
|
68 | }
|
69 | features[tup[0]] = tup[1];
|
70 | });
|
71 |
|
72 | function updateIframeSizeNoLocation() {
|
73 | browserWrap.style.width = window.innerWidth + 'px';
|
74 | browserWrap.style.height = window.innerHeight + 'px';
|
75 | browserWrap.style.zIndex = '999999999';
|
76 | browserWrap.browser.style.height = (window.innerHeight - 60) + 'px';
|
77 | browserWrap.browser.style.width = browserWrap.style.width;
|
78 | }
|
79 |
|
80 | if (target === '_system') {
|
81 | origOpenFunc.apply(window, [strUrl, '_blank']);
|
82 | } else if (target === '_blank') {
|
83 | var browserElem = document.createElement('iframe');
|
84 | browserElem.setAttribute('mozbrowser', true);
|
85 |
|
86 | browserElem.setAttribute('remote', true);
|
87 | browserElem.setAttribute('src', strUrl);
|
88 | if (browserWrap) {
|
89 | document.body.removeChild(browserWrap);
|
90 | }
|
91 | browserWrap = document.createElement('div');
|
92 |
|
93 | browserWrap.browser = browserElem;
|
94 |
|
95 | browserWrap.classList.add('inAppBrowserWrap');
|
96 |
|
97 | browserWrap.style.position = 'fixed';
|
98 | browserElem.style.position = 'absolute';
|
99 | browserElem.style.border = 0;
|
100 | browserElem.style.top = '60px';
|
101 | browserElem.style.left = '0px';
|
102 | updateIframeSizeNoLocation();
|
103 |
|
104 | var menu = document.createElement('menu');
|
105 | menu.setAttribute('type', 'toolbar');
|
106 | var close = document.createElement('li');
|
107 | var back = document.createElement('li');
|
108 | var forward = document.createElement('li');
|
109 |
|
110 | close.appendChild(document.createTextNode('×'));
|
111 | back.appendChild(document.createTextNode('<'));
|
112 | forward.appendChild(document.createTextNode('>'));
|
113 |
|
114 | close.classList.add('inAppBrowserClose');
|
115 | back.classList.add('inAppBrowserBack');
|
116 | forward.classList.add('inAppBrowserForward');
|
117 |
|
118 | var checkForwardBackward = function () {
|
119 | var backReq = browserElem.getCanGoBack();
|
120 | backReq.onsuccess = function() {
|
121 | if (this.result) {
|
122 | back.classList.remove('disabled');
|
123 | } else {
|
124 | back.classList.add('disabled');
|
125 | }
|
126 | };
|
127 | var forwardReq = browserElem.getCanGoForward();
|
128 | forwardReq.onsuccess = function() {
|
129 | if (this.result) {
|
130 | forward.classList.remove('disabled');
|
131 | } else {
|
132 | forward.classList.add('disabled');
|
133 | }
|
134 | };
|
135 | };
|
136 |
|
137 | browserElem.addEventListener('mozbrowserloadend', checkForwardBackward);
|
138 |
|
139 | close.addEventListener('click', function () {
|
140 | setTimeout(function () {
|
141 | IABExecs.close(win, lose);
|
142 | }, 0);
|
143 | }, false);
|
144 |
|
145 | back.addEventListener('click', function () {
|
146 | browserElem.goBack();
|
147 | }, false);
|
148 |
|
149 | forward.addEventListener('click', function () {
|
150 | browserElem.goForward();
|
151 | }, false);
|
152 |
|
153 | menu.appendChild(back);
|
154 | menu.appendChild(forward);
|
155 | menu.appendChild(close);
|
156 |
|
157 | browserWrap.appendChild(menu);
|
158 | browserWrap.appendChild(browserElem);
|
159 | document.body.appendChild(browserWrap);
|
160 |
|
161 |
|
162 | browserElem.addEventListener('mozbrowserlocationchange', function(e){
|
163 | win({
|
164 | type:'loadstart',
|
165 | url : e.detail
|
166 | });
|
167 | }, false);
|
168 | browserElem.addEventListener('mozbrowserloadend', function(e){
|
169 | win({type:'loadstop'});
|
170 | }, false);
|
171 | browserElem.addEventListener('mozbrowsererror', function(e){
|
172 | win({type:'loaderror'});
|
173 | }, false);
|
174 | browserElem.addEventListener('mozbrowserclose', function(e){
|
175 | win({type:'exit'});
|
176 | }, false);
|
177 | } else {
|
178 | window.location = strUrl;
|
179 | }
|
180 | },
|
181 | injectScriptCode: function (code, bCB) {
|
182 | console.error('[FirefoxOS] injectScriptCode not implemented');
|
183 | },
|
184 | injectScriptFile: function (file, bCB) {
|
185 | console.error('[FirefoxOS] injectScriptFile not implemented');
|
186 | }
|
187 | };
|
188 |
|
189 | module.exports = IABExecs;
|
190 |
|
191 | require('cordova/exec/proxy').add('InAppBrowser', module.exports);
|