UNPKG

7.04 kBJavaScriptView Raw
1/*
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20*/
21
22// https://developer.mozilla.org/en-US/docs/WebAPI/Browser
23
24var modulemapper = require('cordova/modulemapper');
25
26var origOpenFunc = modulemapper.getOriginalSymbol(window, 'window.open');
27var browserWrap;
28
29var 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 * Reveal browser if opened hidden
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", //location=yes is default
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 // make this loaded in its own child process
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 // assign browser element to browserWrap for future reference
93 browserWrap.browser = browserElem;
94
95 browserWrap.classList.add('inAppBrowserWrap');
96 // position fixed so that it works even when page is scrolled
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 //we use mozbrowserlocationchange instead of mozbrowserloadstart to get the url
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
189module.exports = IABExecs;
190
191require('cordova/exec/proxy').add('InAppBrowser', module.exports);