Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 79e35d9790 | |||
| 2e0dc26eaa | |||
| 8da5e25eee | |||
| 15a57485c6 | |||
| c3ccb694d3 | |||
| 212e0a34d8 | |||
| 518596a96f | |||
| f326121590 | |||
| 9540f11fcc | |||
| 3a1fea5d8b | |||
| 2fc2658830 | |||
| ce285e8e06 | |||
| 65821f907d | |||
| 290ea0ac9c | |||
| 542536f790 | |||
| 9b576f303b | |||
| 52cfd3216a | |||
| 8142c73c84 | |||
| bc9036d90a |
@@ -172,6 +172,10 @@ opened with `target='_blank'`. The rules might look like these
|
|||||||
|
|
||||||
### Windows Quirks
|
### Windows Quirks
|
||||||
|
|
||||||
|
Windows 8.0, 8.1 and Windows Phone 8.1 don't support remote urls to be opened in the Cordova WebView so remote urls are always showed in the system's web browser if opened with `target='_self'`.
|
||||||
|
|
||||||
|
On Windows 10 if the URL is NOT in the white list and is opened with `target='_self'` it will be showed in the system's web browser instead of InAppBrowser popup.
|
||||||
|
|
||||||
Similar to Firefox OS IAB window visual behaviour can be overridden via `inAppBrowserWrap`/`inAppBrowserWrapFullscreen` CSS classes
|
Similar to Firefox OS IAB window visual behaviour can be overridden via `inAppBrowserWrap`/`inAppBrowserWrapFullscreen` CSS classes
|
||||||
|
|
||||||
### Browser Quirks
|
### Browser Quirks
|
||||||
|
|||||||
@@ -20,6 +20,21 @@
|
|||||||
-->
|
-->
|
||||||
# Release Notes
|
# Release Notes
|
||||||
|
|
||||||
|
### 1.2.0 (Jan 15, 2016)
|
||||||
|
* CB-8180: Changing methods of interception in `WebViewClient` class
|
||||||
|
* CB-10009 Improve `InAppBrowser` toolbar look and feel on **Windows**
|
||||||
|
* Open a new window on the **Browser** platform
|
||||||
|
|
||||||
|
### 1.1.1 (Dec 10, 2015)
|
||||||
|
|
||||||
|
* CB-9445 Improves executeScript callbacks on iOS
|
||||||
|
* CB-10035 Incremented plugin version.
|
||||||
|
* CB-10040 - re-fix: backwards compatible with cordova-ios < 4.0
|
||||||
|
* CB-8534: Allow plugins to respond to onReceivedHttpAuthRequest. This closes #82
|
||||||
|
* CB-3750: Fixes spinner on iOS. This closes #89
|
||||||
|
* CB-7696 Document target=_self behavior for Windows
|
||||||
|
* CB-10040 - Compile Error in InAppBrowser Plugin for iOS - No known instance method for selector 'URLIsWhitelisted:'
|
||||||
|
|
||||||
### 1.1.0 (Nov 18, 2015)
|
### 1.1.0 (Nov 18, 2015)
|
||||||
* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest
|
* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest
|
||||||
* Invoke webview if using local file
|
* Invoke webview if using local file
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "cordova-plugin-inappbrowser",
|
"name": "cordova-plugin-inappbrowser",
|
||||||
"version": "1.1.0",
|
"version": "1.2.1-dev",
|
||||||
"description": "Cordova InAppBrowser Plugin",
|
"description": "Cordova InAppBrowser Plugin",
|
||||||
"cordova": {
|
"cordova": {
|
||||||
"id": "cordova-plugin-inappbrowser",
|
"id": "cordova-plugin-inappbrowser",
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
|
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
|
||||||
id="cordova-plugin-inappbrowser"
|
id="cordova-plugin-inappbrowser"
|
||||||
version="1.1.0">
|
version="1.2.1-dev">
|
||||||
|
|
||||||
<name>InAppBrowser</name>
|
<name>InAppBrowser</name>
|
||||||
<description>Cordova InAppBrowser Plugin</description>
|
<description>Cordova InAppBrowser Plugin</description>
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import android.view.WindowManager.LayoutParams;
|
|||||||
import android.view.inputmethod.EditorInfo;
|
import android.view.inputmethod.EditorInfo;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
import android.webkit.CookieManager;
|
import android.webkit.CookieManager;
|
||||||
|
import android.webkit.HttpAuthHandler;
|
||||||
import android.webkit.WebSettings;
|
import android.webkit.WebSettings;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.webkit.WebViewClient;
|
import android.webkit.WebViewClient;
|
||||||
@@ -52,6 +53,7 @@ import android.widget.RelativeLayout;
|
|||||||
import org.apache.cordova.CallbackContext;
|
import org.apache.cordova.CallbackContext;
|
||||||
import org.apache.cordova.Config;
|
import org.apache.cordova.Config;
|
||||||
import org.apache.cordova.CordovaArgs;
|
import org.apache.cordova.CordovaArgs;
|
||||||
|
import org.apache.cordova.CordovaHttpAuthHandler;
|
||||||
import org.apache.cordova.CordovaPlugin;
|
import org.apache.cordova.CordovaPlugin;
|
||||||
import org.apache.cordova.CordovaWebView;
|
import org.apache.cordova.CordovaWebView;
|
||||||
import org.apache.cordova.LOG;
|
import org.apache.cordova.LOG;
|
||||||
@@ -61,6 +63,7 @@ import org.json.JSONException;
|
|||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
@@ -541,7 +544,7 @@ public class InAppBrowser extends CordovaPlugin {
|
|||||||
actionButtonContainer.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
|
actionButtonContainer.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
|
||||||
actionButtonContainer.setHorizontalGravity(Gravity.LEFT);
|
actionButtonContainer.setHorizontalGravity(Gravity.LEFT);
|
||||||
actionButtonContainer.setVerticalGravity(Gravity.CENTER_VERTICAL);
|
actionButtonContainer.setVerticalGravity(Gravity.CENTER_VERTICAL);
|
||||||
actionButtonContainer.setId(1);
|
actionButtonContainer.setId(Integer.valueOf(1));
|
||||||
|
|
||||||
// Back button
|
// Back button
|
||||||
Button back = new Button(cordova.getActivity());
|
Button back = new Button(cordova.getActivity());
|
||||||
@@ -549,7 +552,7 @@ public class InAppBrowser extends CordovaPlugin {
|
|||||||
backLayoutParams.addRule(RelativeLayout.ALIGN_LEFT);
|
backLayoutParams.addRule(RelativeLayout.ALIGN_LEFT);
|
||||||
back.setLayoutParams(backLayoutParams);
|
back.setLayoutParams(backLayoutParams);
|
||||||
back.setContentDescription("Back Button");
|
back.setContentDescription("Back Button");
|
||||||
back.setId(2);
|
back.setId(Integer.valueOf(2));
|
||||||
Resources activityRes = cordova.getActivity().getResources();
|
Resources activityRes = cordova.getActivity().getResources();
|
||||||
int backResId = activityRes.getIdentifier("ic_action_previous_item", "drawable", cordova.getActivity().getPackageName());
|
int backResId = activityRes.getIdentifier("ic_action_previous_item", "drawable", cordova.getActivity().getPackageName());
|
||||||
Drawable backIcon = activityRes.getDrawable(backResId);
|
Drawable backIcon = activityRes.getDrawable(backResId);
|
||||||
@@ -573,7 +576,7 @@ public class InAppBrowser extends CordovaPlugin {
|
|||||||
forwardLayoutParams.addRule(RelativeLayout.RIGHT_OF, 2);
|
forwardLayoutParams.addRule(RelativeLayout.RIGHT_OF, 2);
|
||||||
forward.setLayoutParams(forwardLayoutParams);
|
forward.setLayoutParams(forwardLayoutParams);
|
||||||
forward.setContentDescription("Forward Button");
|
forward.setContentDescription("Forward Button");
|
||||||
forward.setId(3);
|
forward.setId(Integer.valueOf(3));
|
||||||
int fwdResId = activityRes.getIdentifier("ic_action_next_item", "drawable", cordova.getActivity().getPackageName());
|
int fwdResId = activityRes.getIdentifier("ic_action_next_item", "drawable", cordova.getActivity().getPackageName());
|
||||||
Drawable fwdIcon = activityRes.getDrawable(fwdResId);
|
Drawable fwdIcon = activityRes.getDrawable(fwdResId);
|
||||||
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN)
|
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN)
|
||||||
@@ -596,7 +599,7 @@ public class InAppBrowser extends CordovaPlugin {
|
|||||||
textLayoutParams.addRule(RelativeLayout.RIGHT_OF, 1);
|
textLayoutParams.addRule(RelativeLayout.RIGHT_OF, 1);
|
||||||
textLayoutParams.addRule(RelativeLayout.LEFT_OF, 5);
|
textLayoutParams.addRule(RelativeLayout.LEFT_OF, 5);
|
||||||
edittext.setLayoutParams(textLayoutParams);
|
edittext.setLayoutParams(textLayoutParams);
|
||||||
edittext.setId(4);
|
edittext.setId(Integer.valueOf(4));
|
||||||
edittext.setSingleLine(true);
|
edittext.setSingleLine(true);
|
||||||
edittext.setText(url);
|
edittext.setText(url);
|
||||||
edittext.setInputType(InputType.TYPE_TEXT_VARIATION_URI);
|
edittext.setInputType(InputType.TYPE_TEXT_VARIATION_URI);
|
||||||
@@ -619,7 +622,7 @@ public class InAppBrowser extends CordovaPlugin {
|
|||||||
closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
|
closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
|
||||||
close.setLayoutParams(closeLayoutParams);
|
close.setLayoutParams(closeLayoutParams);
|
||||||
forward.setContentDescription("Close Button");
|
forward.setContentDescription("Close Button");
|
||||||
close.setId(5);
|
close.setId(Integer.valueOf(5));
|
||||||
int closeResId = activityRes.getIdentifier("ic_action_remove", "drawable", cordova.getActivity().getPackageName());
|
int closeResId = activityRes.getIdentifier("ic_action_remove", "drawable", cordova.getActivity().getPackageName());
|
||||||
Drawable closeIcon = activityRes.getDrawable(closeResId);
|
Drawable closeIcon = activityRes.getDrawable(closeResId);
|
||||||
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN)
|
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN)
|
||||||
@@ -639,6 +642,7 @@ public class InAppBrowser extends CordovaPlugin {
|
|||||||
// WebView
|
// WebView
|
||||||
inAppWebView = new WebView(cordova.getActivity());
|
inAppWebView = new WebView(cordova.getActivity());
|
||||||
inAppWebView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
|
inAppWebView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
|
||||||
|
inAppWebView.setId(Integer.valueOf(6));
|
||||||
inAppWebView.setWebChromeClient(new InAppChromeClient(thatWebView));
|
inAppWebView.setWebChromeClient(new InAppChromeClient(thatWebView));
|
||||||
WebViewClient client = new InAppBrowserClient(thatWebView, edittext);
|
WebViewClient client = new InAppBrowserClient(thatWebView, edittext);
|
||||||
inAppWebView.setWebViewClient(client);
|
inAppWebView.setWebViewClient(client);
|
||||||
@@ -665,7 +669,7 @@ public class InAppBrowser extends CordovaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inAppWebView.loadUrl(url);
|
inAppWebView.loadUrl(url);
|
||||||
inAppWebView.setId(6);
|
inAppWebView.setId(Integer.valueOf(6));
|
||||||
inAppWebView.getSettings().setLoadWithOverviewMode(true);
|
inAppWebView.getSettings().setLoadWithOverviewMode(true);
|
||||||
inAppWebView.getSettings().setUseWideViewPort(true);
|
inAppWebView.getSettings().setUseWideViewPort(true);
|
||||||
inAppWebView.requestFocus();
|
inAppWebView.requestFocus();
|
||||||
@@ -753,34 +757,30 @@ public class InAppBrowser extends CordovaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify the host application that a page has started loading.
|
* Override the URL that should be loaded
|
||||||
*
|
*
|
||||||
* @param view The webview initiating the callback.
|
* This handles a small subset of all the URIs that would be encountered.
|
||||||
* @param url The url of the page.
|
*
|
||||||
|
* @param webView
|
||||||
|
* @param url
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void onPageStarted(WebView view, String url, Bitmap favicon) {
|
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
|
||||||
super.onPageStarted(view, url, favicon);
|
if (url.startsWith(WebView.SCHEME_TEL)) {
|
||||||
String newloc = "";
|
|
||||||
if (url.startsWith("http:") || url.startsWith("https:") || url.startsWith("file:")) {
|
|
||||||
newloc = url;
|
|
||||||
}
|
|
||||||
// If dialing phone (tel:5551212)
|
|
||||||
else if (url.startsWith(WebView.SCHEME_TEL)) {
|
|
||||||
try {
|
try {
|
||||||
Intent intent = new Intent(Intent.ACTION_DIAL);
|
Intent intent = new Intent(Intent.ACTION_DIAL);
|
||||||
intent.setData(Uri.parse(url));
|
intent.setData(Uri.parse(url));
|
||||||
cordova.getActivity().startActivity(intent);
|
cordova.getActivity().startActivity(intent);
|
||||||
|
return true;
|
||||||
} catch (android.content.ActivityNotFoundException e) {
|
} catch (android.content.ActivityNotFoundException e) {
|
||||||
LOG.e(LOG_TAG, "Error dialing " + url + ": " + e.toString());
|
LOG.e(LOG_TAG, "Error dialing " + url + ": " + e.toString());
|
||||||
}
|
}
|
||||||
}
|
} else if (url.startsWith("geo:") || url.startsWith(WebView.SCHEME_MAILTO) || url.startsWith("market:")) {
|
||||||
|
|
||||||
else if (url.startsWith("geo:") || url.startsWith(WebView.SCHEME_MAILTO) || url.startsWith("market:")) {
|
|
||||||
try {
|
try {
|
||||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||||
intent.setData(Uri.parse(url));
|
intent.setData(Uri.parse(url));
|
||||||
cordova.getActivity().startActivity(intent);
|
cordova.getActivity().startActivity(intent);
|
||||||
|
return true;
|
||||||
} catch (android.content.ActivityNotFoundException e) {
|
} catch (android.content.ActivityNotFoundException e) {
|
||||||
LOG.e(LOG_TAG, "Error with " + url + ": " + e.toString());
|
LOG.e(LOG_TAG, "Error with " + url + ": " + e.toString());
|
||||||
}
|
}
|
||||||
@@ -795,8 +795,7 @@ public class InAppBrowser extends CordovaPlugin {
|
|||||||
int parmIndex = url.indexOf('?');
|
int parmIndex = url.indexOf('?');
|
||||||
if (parmIndex == -1) {
|
if (parmIndex == -1) {
|
||||||
address = url.substring(4);
|
address = url.substring(4);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
address = url.substring(4, parmIndex);
|
address = url.substring(4, parmIndex);
|
||||||
|
|
||||||
// If body, then set sms body
|
// If body, then set sms body
|
||||||
@@ -812,29 +811,54 @@ public class InAppBrowser extends CordovaPlugin {
|
|||||||
intent.putExtra("address", address);
|
intent.putExtra("address", address);
|
||||||
intent.setType("vnd.android-dir/mms-sms");
|
intent.setType("vnd.android-dir/mms-sms");
|
||||||
cordova.getActivity().startActivity(intent);
|
cordova.getActivity().startActivity(intent);
|
||||||
|
return true;
|
||||||
} catch (android.content.ActivityNotFoundException e) {
|
} catch (android.content.ActivityNotFoundException e) {
|
||||||
LOG.e(LOG_TAG, "Error sending sms " + url + ":" + e.toString());
|
LOG.e(LOG_TAG, "Error sending sms " + url + ":" + e.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* onPageStarted fires the LOAD_START_EVENT
|
||||||
|
*
|
||||||
|
* @param view
|
||||||
|
* @param url
|
||||||
|
* @param favicon
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onPageStarted(WebView view, String url, Bitmap favicon) {
|
||||||
|
super.onPageStarted(view, url, favicon);
|
||||||
|
String newloc = "";
|
||||||
|
if (url.startsWith("http:") || url.startsWith("https:") || url.startsWith("file:")) {
|
||||||
|
newloc = url;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Assume that everything is HTTP at this point, because if we don't specify,
|
||||||
|
// it really should be. Complain loudly about this!!!
|
||||||
|
LOG.e(LOG_TAG, "Possible Uncaught/Unknown URI");
|
||||||
newloc = "http://" + url;
|
newloc = "http://" + url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update the UI if we haven't already
|
||||||
if (!newloc.equals(edittext.getText().toString())) {
|
if (!newloc.equals(edittext.getText().toString())) {
|
||||||
edittext.setText(newloc);
|
edittext.setText(newloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
JSONObject obj = new JSONObject();
|
JSONObject obj = new JSONObject();
|
||||||
obj.put("type", LOAD_START_EVENT);
|
obj.put("type", LOAD_START_EVENT);
|
||||||
obj.put("url", newloc);
|
obj.put("url", newloc);
|
||||||
|
|
||||||
sendUpdate(obj, true);
|
sendUpdate(obj, true);
|
||||||
} catch (JSONException ex) {
|
} catch (JSONException ex) {
|
||||||
Log.d(LOG_TAG, "Should never happen");
|
LOG.e(LOG_TAG, "URI passed in has caused a JSON error.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void onPageFinished(WebView view, String url) {
|
public void onPageFinished(WebView view, String url) {
|
||||||
super.onPageFinished(view, url);
|
super.onPageFinished(view, url);
|
||||||
|
|
||||||
@@ -864,6 +888,39 @@ public class InAppBrowser extends CordovaPlugin {
|
|||||||
Log.d(LOG_TAG, "Should never happen");
|
Log.d(LOG_TAG, "Should never happen");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On received http auth request.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
|
||||||
|
|
||||||
|
// Check if there is some plugin which can resolve this auth challenge
|
||||||
|
PluginManager pluginManager = null;
|
||||||
|
try {
|
||||||
|
Method gpm = webView.getClass().getMethod("getPluginManager");
|
||||||
|
pluginManager = (PluginManager)gpm.invoke(webView);
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pluginManager == null) {
|
||||||
|
try {
|
||||||
|
Field pmf = webView.getClass().getField("pluginManager");
|
||||||
|
pluginManager = (PluginManager)pmf.get(webView);
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pluginManager != null && pluginManager.onReceivedHttpAuthRequest(webView, new CordovaHttpAuthHandler(handler), host, realm)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// By default handle 401 like we'd normally do!
|
||||||
|
super.onReceivedHttpAuthRequest(view, handler, host, realm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
var cordova = require('cordova'),
|
var cordova = require('cordova'),
|
||||||
channel = require('cordova/channel'),
|
channel = require('cordova/channel'),
|
||||||
|
modulemapper = require('cordova/modulemapper'),
|
||||||
urlutil = require('cordova/urlutil');
|
urlutil = require('cordova/urlutil');
|
||||||
|
|
||||||
var browserWrap,
|
var browserWrap,
|
||||||
@@ -71,8 +72,10 @@ var IAB = {
|
|||||||
features = args[2],
|
features = args[2],
|
||||||
url;
|
url;
|
||||||
|
|
||||||
if (target === "_system" || target === "_self" || !target) {
|
if (target === "_self" || !target) {
|
||||||
window.location = strUrl;
|
window.location = strUrl;
|
||||||
|
} else if (target === "_system") {
|
||||||
|
modulemapper.getOriginalSymbol(window, 'window.open').call(window, strUrl, "_blank");
|
||||||
} else {
|
} else {
|
||||||
// "_blank" or anything else
|
// "_blank" or anything else
|
||||||
if (!browserWrap) {
|
if (!browserWrap) {
|
||||||
|
|||||||
@@ -30,7 +30,6 @@
|
|||||||
@class CDVInAppBrowserViewController;
|
@class CDVInAppBrowserViewController;
|
||||||
|
|
||||||
@interface CDVInAppBrowser : CDVPlugin {
|
@interface CDVInAppBrowser : CDVPlugin {
|
||||||
BOOL _injectedIframeBridge;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@property (nonatomic, retain) CDVInAppBrowserViewController* inAppBrowserViewController;
|
@property (nonatomic, retain) CDVInAppBrowserViewController* inAppBrowserViewController;
|
||||||
|
|||||||
+13
-14
@@ -231,16 +231,19 @@
|
|||||||
|
|
||||||
- (void)openInCordovaWebView:(NSURL*)url withOptions:(NSString*)options
|
- (void)openInCordovaWebView:(NSURL*)url withOptions:(NSString*)options
|
||||||
{
|
{
|
||||||
if ([self.commandDelegate URLIsWhitelisted:url]) {
|
NSURLRequest* request = [NSURLRequest requestWithURL:url];
|
||||||
NSURLRequest* request = [NSURLRequest requestWithURL:url];
|
|
||||||
#ifdef __CORDOVA_4_0_0
|
#ifdef __CORDOVA_4_0_0
|
||||||
[self.webViewEngine loadRequest:request];
|
// the webview engine itself will filter for this according to <allow-navigation> policy
|
||||||
|
// in config.xml for cordova-ios-4.0
|
||||||
|
[self.webViewEngine loadRequest:request];
|
||||||
#else
|
#else
|
||||||
|
if ([self.commandDelegate URLIsWhitelisted:url]) {
|
||||||
[self.webView loadRequest:request];
|
[self.webView loadRequest:request];
|
||||||
#endif
|
|
||||||
} else { // this assumes the InAppBrowser can be excepted from the white-list
|
} else { // this assumes the InAppBrowser can be excepted from the white-list
|
||||||
[self openInInAppBrowser:url withOptions:options];
|
[self openInInAppBrowser:url withOptions:options];
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)openInSystem:(NSURL*)url
|
- (void)openInSystem:(NSURL*)url
|
||||||
@@ -263,11 +266,8 @@
|
|||||||
|
|
||||||
- (void)injectDeferredObject:(NSString*)source withWrapper:(NSString*)jsWrapper
|
- (void)injectDeferredObject:(NSString*)source withWrapper:(NSString*)jsWrapper
|
||||||
{
|
{
|
||||||
if (!_injectedIframeBridge) {
|
// Ensure an iframe bridge is created to communicate with the CDVInAppBrowserViewController
|
||||||
_injectedIframeBridge = YES;
|
[self.inAppBrowserViewController.webView stringByEvaluatingJavaScriptFromString:@"(function(d){_cdvIframeBridge=d.getElementById('_cdvIframeBridge');if(!_cdvIframeBridge) {var e = _cdvIframeBridge = d.createElement('iframe');e.id='_cdvIframeBridge'; e.style.display='none';d.body.appendChild(e);}})(document)"];
|
||||||
// Create an iframe bridge in the new document to communicate with the CDVInAppBrowserViewController
|
|
||||||
[self.inAppBrowserViewController.webView stringByEvaluatingJavaScriptFromString:@"(function(d){var e = _cdvIframeBridge = d.createElement('iframe');e.style.display='none';d.body.appendChild(e);})(document)"];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (jsWrapper != nil) {
|
if (jsWrapper != nil) {
|
||||||
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:@[source] options:0 error:nil];
|
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:@[source] options:0 error:nil];
|
||||||
@@ -404,7 +404,6 @@
|
|||||||
|
|
||||||
- (void)webViewDidStartLoad:(UIWebView*)theWebView
|
- (void)webViewDidStartLoad:(UIWebView*)theWebView
|
||||||
{
|
{
|
||||||
_injectedIframeBridge = NO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)webViewDidFinishLoad:(UIWebView*)theWebView
|
- (void)webViewDidFinishLoad:(UIWebView*)theWebView
|
||||||
@@ -512,15 +511,15 @@
|
|||||||
self.webView.scalesPageToFit = NO;
|
self.webView.scalesPageToFit = NO;
|
||||||
self.webView.userInteractionEnabled = YES;
|
self.webView.userInteractionEnabled = YES;
|
||||||
|
|
||||||
self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
|
self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
|
||||||
self.spinner.alpha = 1.000;
|
self.spinner.alpha = 1.000;
|
||||||
self.spinner.autoresizesSubviews = YES;
|
self.spinner.autoresizesSubviews = YES;
|
||||||
self.spinner.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
|
self.spinner.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin);
|
||||||
self.spinner.clearsContextBeforeDrawing = NO;
|
self.spinner.clearsContextBeforeDrawing = NO;
|
||||||
self.spinner.clipsToBounds = NO;
|
self.spinner.clipsToBounds = NO;
|
||||||
self.spinner.contentMode = UIViewContentModeScaleToFill;
|
self.spinner.contentMode = UIViewContentModeScaleToFill;
|
||||||
self.spinner.frame = CGRectMake(454.0, 231.0, 20.0, 20.0);
|
self.spinner.frame = CGRectMake(CGRectGetMidX(self.webView.frame), CGRectGetMidY(self.webView.frame), 20.0, 20.0);
|
||||||
self.spinner.hidden = YES;
|
self.spinner.hidden = NO;
|
||||||
self.spinner.hidesWhenStopped = YES;
|
self.spinner.hidesWhenStopped = YES;
|
||||||
self.spinner.multipleTouchEnabled = NO;
|
self.spinner.multipleTouchEnabled = NO;
|
||||||
self.spinner.opaque = NO;
|
self.spinner.opaque = NO;
|
||||||
|
|||||||
@@ -59,8 +59,17 @@ function attachNavigationEvents(element, callback) {
|
|||||||
|
|
||||||
element.addEventListener("MSWebViewContentLoading", function (e) {
|
element.addEventListener("MSWebViewContentLoading", function (e) {
|
||||||
if (navigationButtonsDiv) {
|
if (navigationButtonsDiv) {
|
||||||
backButton.disabled = !popup.canGoBack;
|
if (popup.canGoBack) {
|
||||||
forwardButton.disabled = !popup.canGoForward;
|
backButton.removeAttribute("disabled");
|
||||||
|
} else {
|
||||||
|
backButton.setAttribute("disabled", "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (popup.canGoForward) {
|
||||||
|
forwardButton.removeAttribute("disabled");
|
||||||
|
} else {
|
||||||
|
forwardButton.setAttribute("disabled", "true");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -156,58 +165,39 @@ var IAB = {
|
|||||||
browserWrap.appendChild(popup);
|
browserWrap.appendChild(popup);
|
||||||
|
|
||||||
if (features.indexOf("location=yes") !== -1 || features.indexOf("location") === -1) {
|
if (features.indexOf("location=yes") !== -1 || features.indexOf("location") === -1) {
|
||||||
popup.style.height = "calc(100% - 60px)";
|
popup.style.height = "calc(100% - 70px)";
|
||||||
|
|
||||||
navigationButtonsDiv = document.createElement("div");
|
navigationButtonsDiv = document.createElement("div");
|
||||||
navigationButtonsDiv.style.height = "60px";
|
navigationButtonsDiv.className = "inappbrowser-app-bar";
|
||||||
navigationButtonsDiv.style.backgroundColor = "#404040";
|
|
||||||
navigationButtonsDiv.style.zIndex = "999";
|
|
||||||
navigationButtonsDiv.onclick = function (e) {
|
navigationButtonsDiv.onclick = function (e) {
|
||||||
e.cancelBubble = true;
|
e.cancelBubble = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
navigationButtonsDivInner = document.createElement("div");
|
navigationButtonsDivInner = document.createElement("div");
|
||||||
navigationButtonsDivInner.style.paddingTop = "10px";
|
navigationButtonsDivInner.className = "inappbrowser-app-bar-inner"
|
||||||
navigationButtonsDivInner.style.height = "50px";
|
|
||||||
navigationButtonsDivInner.style.width = "160px";
|
|
||||||
navigationButtonsDivInner.style.margin = "0 auto";
|
|
||||||
navigationButtonsDivInner.style.backgroundColor = "#404040";
|
|
||||||
navigationButtonsDivInner.style.zIndex = "999";
|
|
||||||
navigationButtonsDivInner.onclick = function (e) {
|
navigationButtonsDivInner.onclick = function (e) {
|
||||||
e.cancelBubble = true;
|
e.cancelBubble = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
backButton = document.createElement("div");
|
||||||
backButton = document.createElement("button");
|
backButton.innerText = "back";
|
||||||
backButton.style.width = "40px";
|
backButton.className = "app-bar-action action-back";
|
||||||
backButton.style.height = "40px";
|
|
||||||
backButton.style.borderRadius = "40px";
|
|
||||||
|
|
||||||
backButton.innerText = "<-";
|
|
||||||
backButton.addEventListener("click", function (e) {
|
backButton.addEventListener("click", function (e) {
|
||||||
if (popup.canGoBack)
|
if (popup.canGoBack)
|
||||||
popup.goBack();
|
popup.goBack();
|
||||||
});
|
});
|
||||||
|
|
||||||
forwardButton = document.createElement("button");
|
forwardButton = document.createElement("div");
|
||||||
forwardButton.style.marginLeft = "20px";
|
forwardButton.innerText = "forward";
|
||||||
forwardButton.style.width = "40px";
|
forwardButton.className = "app-bar-action action-forward";
|
||||||
forwardButton.style.height = "40px";
|
|
||||||
forwardButton.style.borderRadius = "40px";
|
|
||||||
|
|
||||||
forwardButton.innerText = "->";
|
|
||||||
forwardButton.addEventListener("click", function (e) {
|
forwardButton.addEventListener("click", function (e) {
|
||||||
if (popup.canGoForward)
|
if (popup.canGoForward)
|
||||||
popup.goForward();
|
popup.goForward();
|
||||||
});
|
});
|
||||||
|
|
||||||
closeButton = document.createElement("button");
|
closeButton = document.createElement("div");
|
||||||
closeButton.style.marginLeft = "20px";
|
closeButton.innerText = "close";
|
||||||
closeButton.style.width = "40px";
|
closeButton.className = "app-bar-action action-close";
|
||||||
closeButton.style.height = "40px";
|
|
||||||
closeButton.style.borderRadius = "40px";
|
|
||||||
|
|
||||||
closeButton.innerText = "x";
|
|
||||||
closeButton.addEventListener("click", function (e) {
|
closeButton.addEventListener("click", function (e) {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
IAB.close(win);
|
IAB.close(win);
|
||||||
@@ -216,8 +206,8 @@ var IAB = {
|
|||||||
|
|
||||||
if (!isWebViewAvailable) {
|
if (!isWebViewAvailable) {
|
||||||
// iframe navigation is not yet supported
|
// iframe navigation is not yet supported
|
||||||
backButton.disabled = true;
|
backButton.setAttribute("disabled", "true");
|
||||||
forwardButton.disabled = true;
|
forwardButton.setAttribute("disabled", "true");
|
||||||
}
|
}
|
||||||
|
|
||||||
navigationButtonsDivInner.appendChild(backButton);
|
navigationButtonsDivInner.appendChild(backButton);
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
|
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
|
||||||
id="cordova-plugin-inappbrowser-tests"
|
id="cordova-plugin-inappbrowser-tests"
|
||||||
version="1.1.0">
|
version="1.2.1-dev">
|
||||||
<name>Cordova InAppBrowser Plugin Tests</name>
|
<name>Cordova InAppBrowser Plugin Tests</name>
|
||||||
<license>Apache 2.0</license>
|
<license>Apache 2.0</license>
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,78 @@ var isWindows = cordova.platformId == 'windows';
|
|||||||
|
|
||||||
window.alert = window.alert || navigator.notification.alert;
|
window.alert = window.alert || navigator.notification.alert;
|
||||||
|
|
||||||
|
exports.defineAutoTests = function () {
|
||||||
|
|
||||||
|
describe('cordova.InAppBrowser', function () {
|
||||||
|
|
||||||
|
it("inappbrowser.spec.1 should exist", function () {
|
||||||
|
expect(cordova.InAppBrowser).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("inappbrowser.spec.2 should contain open function", function () {
|
||||||
|
expect(cordova.InAppBrowser.open).toBeDefined();
|
||||||
|
expect(typeof cordova.InAppBrowser.open === 'function').toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('open method', function () {
|
||||||
|
|
||||||
|
var iabInsance;
|
||||||
|
var originalTimeout;
|
||||||
|
var url = 'http://apache.org/';
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
// increase timeout to ensure test url could be loaded within test time
|
||||||
|
originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
|
||||||
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
|
||||||
|
|
||||||
|
iabInsance = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
// restore original timeout
|
||||||
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
|
||||||
|
|
||||||
|
if (iabInsance && iabInsance.close) {
|
||||||
|
iabInsance.close();
|
||||||
|
}
|
||||||
|
iabInsance = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
function verifyEvent(evt, type) {
|
||||||
|
expect(evt).toBeDefined();
|
||||||
|
expect(evt.type).toEqual(type);
|
||||||
|
expect(evt.url).toEqual(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
it("inappbrowser.spec.3 should retun InAppBrowser class instance", function () {
|
||||||
|
iabInsance = cordova.InAppBrowser.open(url, '_blank');
|
||||||
|
|
||||||
|
expect(iabInsance).toBeDefined();
|
||||||
|
|
||||||
|
expect(iabInsance.addEventListener).toBeDefined();
|
||||||
|
expect(typeof iabInsance.addEventListener === 'function').toBe(true);
|
||||||
|
expect(iabInsance.close).toBeDefined();
|
||||||
|
expect(typeof iabInsance.close === 'function').toBe(true);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it("inappbrowser.spec.4 should support loadstart and loadstop events", function (done) {
|
||||||
|
var onLoadStart = jasmine.createSpy('loadstart event callback').and.callFake(function (evt) {
|
||||||
|
verifyEvent(evt, 'loadstart');
|
||||||
|
});
|
||||||
|
|
||||||
|
iabInsance = cordova.InAppBrowser.open(url, '_blank');
|
||||||
|
iabInsance.addEventListener('loadstart', onLoadStart);
|
||||||
|
iabInsance.addEventListener('loadstop', function (evt) {
|
||||||
|
verifyEvent(evt, 'loadstop');
|
||||||
|
expect(onLoadStart).toHaveBeenCalled();
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
exports.defineManualTests = function (contentEl, createActionButton) {
|
exports.defineManualTests = function (contentEl, createActionButton) {
|
||||||
|
|
||||||
function doOpen(url, target, params, numExpectedRedirects, useWindowOpen) {
|
function doOpen(url, target, params, numExpectedRedirects, useWindowOpen) {
|
||||||
|
|||||||
@@ -38,3 +38,77 @@
|
|||||||
.inAppBrowserWrapFullscreen {
|
.inAppBrowserWrapFullscreen {
|
||||||
border: 0;
|
border: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.inappbrowser-app-bar {
|
||||||
|
height: 70px;
|
||||||
|
background-color: #404040;
|
||||||
|
z-index: 9999999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inappbrowser-app-bar-inner {
|
||||||
|
padding-top: 10px;
|
||||||
|
height: 60px;
|
||||||
|
width: 155px;
|
||||||
|
margin: 0 auto;
|
||||||
|
background-color: #404040;
|
||||||
|
z-index: 9999999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-bar-action {
|
||||||
|
width: auto;
|
||||||
|
height: 40px;
|
||||||
|
margin-left: 20px;
|
||||||
|
font-family: "Segoe UI Symbol";
|
||||||
|
float: left;
|
||||||
|
color: white;
|
||||||
|
font-size: 12px;
|
||||||
|
text-transform: lowercase;
|
||||||
|
text-align: center;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-bar-action[disabled] {
|
||||||
|
color: gray;
|
||||||
|
/*disable click*/
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-bar-action::before {
|
||||||
|
font-size: 28px;
|
||||||
|
display: block;
|
||||||
|
height: 36px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Back */
|
||||||
|
.action-back {
|
||||||
|
margin-left: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-back::before {
|
||||||
|
content: "\E0BA";
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-back:not([disabled]):hover::before {
|
||||||
|
content: "\E0B3";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Forward */
|
||||||
|
.action-forward::before {
|
||||||
|
content: "\E0AC";
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-forward:not([disabled]):hover::before {
|
||||||
|
content: "\E0AF";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close */
|
||||||
|
.action-close::before {
|
||||||
|
content: "\E0C7";
|
||||||
|
/* close icon is larger so we re-size it to fit other icons */
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-close:not([disabled]):hover::before {
|
||||||
|
content: "\E0CA";
|
||||||
|
}
|
||||||
|
|||||||
+81
-80
@@ -19,92 +19,93 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// special patch to correctly work on Ripple emulator (CB-9760)
|
(function() {
|
||||||
if (window.parent && !!window.parent.ripple) { // https://gist.github.com/triceam/4658021
|
// special patch to correctly work on Ripple emulator (CB-9760)
|
||||||
module.exports = window.open.bind(window); // fallback to default window.open behaviour
|
if (window.parent && !!window.parent.ripple) { // https://gist.github.com/triceam/4658021
|
||||||
return;
|
module.exports = window.open.bind(window); // fallback to default window.open behaviour
|
||||||
}
|
return;
|
||||||
|
|
||||||
var exec = require('cordova/exec');
|
|
||||||
var channel = require('cordova/channel');
|
|
||||||
var modulemapper = require('cordova/modulemapper');
|
|
||||||
var urlutil = require('cordova/urlutil');
|
|
||||||
|
|
||||||
function InAppBrowser() {
|
|
||||||
this.channels = {
|
|
||||||
'loadstart': channel.create('loadstart'),
|
|
||||||
'loadstop' : channel.create('loadstop'),
|
|
||||||
'loaderror' : channel.create('loaderror'),
|
|
||||||
'exit' : channel.create('exit')
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
InAppBrowser.prototype = {
|
|
||||||
_eventHandler: function (event) {
|
|
||||||
if (event && (event.type in this.channels)) {
|
|
||||||
this.channels[event.type].fire(event);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
close: function (eventname) {
|
|
||||||
exec(null, null, "InAppBrowser", "close", []);
|
|
||||||
},
|
|
||||||
show: function (eventname) {
|
|
||||||
exec(null, null, "InAppBrowser", "show", []);
|
|
||||||
},
|
|
||||||
addEventListener: function (eventname,f) {
|
|
||||||
if (eventname in this.channels) {
|
|
||||||
this.channels[eventname].subscribe(f);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
removeEventListener: function(eventname, f) {
|
|
||||||
if (eventname in this.channels) {
|
|
||||||
this.channels[eventname].unsubscribe(f);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
executeScript: function(injectDetails, cb) {
|
|
||||||
if (injectDetails.code) {
|
|
||||||
exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]);
|
|
||||||
} else if (injectDetails.file) {
|
|
||||||
exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]);
|
|
||||||
} else {
|
|
||||||
throw new Error('executeScript requires exactly one of code or file to be specified');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
insertCSS: function(injectDetails, cb) {
|
|
||||||
if (injectDetails.code) {
|
|
||||||
exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]);
|
|
||||||
} else if (injectDetails.file) {
|
|
||||||
exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]);
|
|
||||||
} else {
|
|
||||||
throw new Error('insertCSS requires exactly one of code or file to be specified');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = function(strUrl, strWindowName, strWindowFeatures, callbacks) {
|
|
||||||
// Don't catch calls that write to existing frames (e.g. named iframes).
|
|
||||||
if (window.frames && window.frames[strWindowName]) {
|
|
||||||
var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
|
|
||||||
return origOpenFunc.apply(window, arguments);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
strUrl = urlutil.makeAbsolute(strUrl);
|
var exec = require('cordova/exec');
|
||||||
var iab = new InAppBrowser();
|
var channel = require('cordova/channel');
|
||||||
|
var modulemapper = require('cordova/modulemapper');
|
||||||
|
var urlutil = require('cordova/urlutil');
|
||||||
|
|
||||||
callbacks = callbacks || {};
|
function InAppBrowser() {
|
||||||
for (var callbackName in callbacks) {
|
this.channels = {
|
||||||
iab.addEventListener(callbackName, callbacks[callbackName]);
|
'loadstart': channel.create('loadstart'),
|
||||||
|
'loadstop' : channel.create('loadstop'),
|
||||||
|
'loaderror' : channel.create('loaderror'),
|
||||||
|
'exit' : channel.create('exit')
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
var cb = function(eventname) {
|
InAppBrowser.prototype = {
|
||||||
iab._eventHandler(eventname);
|
_eventHandler: function (event) {
|
||||||
|
if (event && (event.type in this.channels)) {
|
||||||
|
this.channels[event.type].fire(event);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
close: function (eventname) {
|
||||||
|
exec(null, null, "InAppBrowser", "close", []);
|
||||||
|
},
|
||||||
|
show: function (eventname) {
|
||||||
|
exec(null, null, "InAppBrowser", "show", []);
|
||||||
|
},
|
||||||
|
addEventListener: function (eventname,f) {
|
||||||
|
if (eventname in this.channels) {
|
||||||
|
this.channels[eventname].subscribe(f);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
removeEventListener: function(eventname, f) {
|
||||||
|
if (eventname in this.channels) {
|
||||||
|
this.channels[eventname].unsubscribe(f);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
executeScript: function(injectDetails, cb) {
|
||||||
|
if (injectDetails.code) {
|
||||||
|
exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]);
|
||||||
|
} else if (injectDetails.file) {
|
||||||
|
exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]);
|
||||||
|
} else {
|
||||||
|
throw new Error('executeScript requires exactly one of code or file to be specified');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
insertCSS: function(injectDetails, cb) {
|
||||||
|
if (injectDetails.code) {
|
||||||
|
exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]);
|
||||||
|
} else if (injectDetails.file) {
|
||||||
|
exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]);
|
||||||
|
} else {
|
||||||
|
throw new Error('insertCSS requires exactly one of code or file to be specified');
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
strWindowFeatures = strWindowFeatures || "";
|
module.exports = function(strUrl, strWindowName, strWindowFeatures, callbacks) {
|
||||||
|
// Don't catch calls that write to existing frames (e.g. named iframes).
|
||||||
|
if (window.frames && window.frames[strWindowName]) {
|
||||||
|
var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
|
||||||
|
return origOpenFunc.apply(window, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);
|
strUrl = urlutil.makeAbsolute(strUrl);
|
||||||
return iab;
|
var iab = new InAppBrowser();
|
||||||
};
|
|
||||||
|
|
||||||
|
callbacks = callbacks || {};
|
||||||
|
for (var callbackName in callbacks) {
|
||||||
|
iab.addEventListener(callbackName, callbacks[callbackName]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cb = function(eventname) {
|
||||||
|
iab._eventHandler(eventname);
|
||||||
|
};
|
||||||
|
|
||||||
|
strWindowFeatures = strWindowFeatures || "";
|
||||||
|
|
||||||
|
exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);
|
||||||
|
return iab;
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|||||||
Reference in New Issue
Block a user