You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by pu...@apache.org on 2013/01/23 01:22:04 UTC

[13/16] wp7 commit: adding config.xml, and inappbrowser support

adding config.xml, and inappbrowser support


Project: http://git-wip-us.apache.org/repos/asf/cordova-wp7/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-wp7/commit/2a94c127
Tree: http://git-wip-us.apache.org/repos/asf/cordova-wp7/tree/2a94c127
Diff: http://git-wip-us.apache.org/repos/asf/cordova-wp7/diff/2a94c127

Branch: refs/heads/master
Commit: 2a94c1279d929191857ebb2fefca00359823d3ea
Parents: 8dac142
Author: Jesse MacFadyen <pu...@gmail.com>
Authored: Tue Jan 22 15:01:37 2013 -0800
Committer: Jesse MacFadyen <pu...@gmail.com>
Committed: Tue Jan 22 15:01:37 2013 -0800

----------------------------------------------------------------------
 example/CordovaExample.csproj                      |    1 +
 example/config.xml                                 |   49 +++
 framework/WPCordovaClassLib.csproj                 |    6 +
 templates/full/CordovaLib/WPCordovaClassLib.dll    |  Bin 0 -> 163840 bytes
 .../standalone/cordovalib/Commands/InAppBrowser.cs |  266 +++++++++++++++
 templates/standalone/cordovalib/ConfigHandler.cs   |  249 ++++++++++++++
 .../standalone/cordovalib/CordovaView.xaml.cs      |   38 ++-
 7 files changed, 606 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-wp7/blob/2a94c127/example/CordovaExample.csproj
----------------------------------------------------------------------
diff --git a/example/CordovaExample.csproj b/example/CordovaExample.csproj
index 0f2e49b..aba325c 100644
--- a/example/CordovaExample.csproj
+++ b/example/CordovaExample.csproj
@@ -96,6 +96,7 @@
     </Page>
   </ItemGroup>
   <ItemGroup>
+    <Content Include="config.xml" />
     <Content Include="CordovaSourceDictionary.xml">
       <SubType>Designer</SubType>
     </Content>

http://git-wip-us.apache.org/repos/asf/cordova-wp7/blob/2a94c127/example/config.xml
----------------------------------------------------------------------
diff --git a/example/config.xml b/example/config.xml
new file mode 100644
index 0000000..cac0c09
--- /dev/null
+++ b/example/config.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+-->
+<cordova>
+
+  <plugins>
+    <plugin name="Device"/>
+    <plugin name="Logger"/>
+    <plugin name="Compass"/>
+    <plugin name="Accelerometer"/>
+    <plugin name="Camera"/>
+    <plugin name="NetworkStatus"/>
+    <plugin name="Contacts"/>
+    <plugin name="DebugConsole" />
+    <plugin name="Echo"/>
+    <plugin name="File"/>
+    <plugin name="FileTransfer"/>
+    <plugin name="Geolocation"/>
+    <plugin name="Notification"/>
+    <plugin name="Media"/>
+    <plugin name="Capture"/>
+    <plugin name="SplashScreen"/>
+    <plugin name="Battery"/>
+    <plugin name="Globalization"/>
+    <plugin name="InAppBrowser"/>
+  </plugins>
+
+
+  <access origin="*"/>
+
+</cordova>

http://git-wip-us.apache.org/repos/asf/cordova-wp7/blob/2a94c127/framework/WPCordovaClassLib.csproj
----------------------------------------------------------------------
diff --git a/framework/WPCordovaClassLib.csproj b/framework/WPCordovaClassLib.csproj
index 5b4ac1e..27cc0b1 100644
--- a/framework/WPCordovaClassLib.csproj
+++ b/framework/WPCordovaClassLib.csproj
@@ -128,6 +128,9 @@
     <Compile Include="..\templates\standalone\cordovalib\Commands\ImageExifHelper.cs">
       <Link>CordovaLib\Commands\ImageExifHelper.cs</Link>
     </Compile>
+    <Compile Include="..\templates\standalone\cordovalib\Commands\InAppBrowser.cs">
+      <Link>CordovaLib\Commands\InAppBrowser.cs</Link>
+    </Compile>
     <Compile Include="..\templates\standalone\cordovalib\Commands\Media.cs">
       <Link>CordovaLib\Commands\Media.cs</Link>
     </Compile>
@@ -140,6 +143,9 @@
     <Compile Include="..\templates\standalone\cordovalib\Commands\Notification.cs">
       <Link>CordovaLib\Commands\Notification.cs</Link>
     </Compile>
+    <Compile Include="..\templates\standalone\cordovalib\ConfigHandler.cs">
+      <Link>CordovaLib\ConfigHandler.cs</Link>
+    </Compile>
     <Compile Include="..\templates\standalone\cordovalib\CordovaCommandCall.cs">
       <Link>CordovaLib\CordovaCommandCall.cs</Link>
     </Compile>

http://git-wip-us.apache.org/repos/asf/cordova-wp7/blob/2a94c127/templates/full/CordovaLib/WPCordovaClassLib.dll
----------------------------------------------------------------------
diff --git a/templates/full/CordovaLib/WPCordovaClassLib.dll b/templates/full/CordovaLib/WPCordovaClassLib.dll
new file mode 100644
index 0000000..73fd83a
Binary files /dev/null and b/templates/full/CordovaLib/WPCordovaClassLib.dll differ

http://git-wip-us.apache.org/repos/asf/cordova-wp7/blob/2a94c127/templates/standalone/cordovalib/Commands/InAppBrowser.cs
----------------------------------------------------------------------
diff --git a/templates/standalone/cordovalib/Commands/InAppBrowser.cs b/templates/standalone/cordovalib/Commands/InAppBrowser.cs
new file mode 100644
index 0000000..7408421
--- /dev/null
+++ b/templates/standalone/cordovalib/Commands/InAppBrowser.cs
@@ -0,0 +1,266 @@
+using System;
+using System.Net;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Ink;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Shapes;
+using Microsoft.Phone.Controls;
+using System.Diagnostics;
+using System.Runtime.Serialization;
+using WPCordovaClassLib.Cordova;
+using WPCordovaClassLib.Cordova.Commands;
+using WPCordovaClassLib.Cordova.JSON;
+using Microsoft.Phone.Shell;
+using Microsoft.Phone.Tasks;
+
+namespace WPCordovaClassLib.Cordova.Commands
+{
+    [DataContract]
+    public class BrowserOptions
+    {
+        [DataMember]
+        public string url;
+
+        [DataMember]
+        public bool isGeolocationEnabled;
+    }
+
+    public class InAppBrowser : BaseCommand
+    {
+
+        private static WebBrowser browser;
+        private static ApplicationBarIconButton backButton;
+        private static ApplicationBarIconButton fwdButton;
+
+        public void open(string options)
+        {
+            string[] args = JSON.JsonHelper.Deserialize<string[]>(options);
+            //BrowserOptions opts = JSON.JsonHelper.Deserialize<BrowserOptions>(options);
+            string urlLoc = args[0];
+            string target = args[1];
+/*
+    _self - opens in the Cordova WebView if url is in the white-list, else it opens in the InAppBrowser 
+    _blank - always open in the InAppBrowser 
+    _system - always open in the system web browser 
+*/
+            switch (target) 
+            {
+                case "_blank" :
+                    ShowInAppBrowser(urlLoc);
+                    break;
+                case "_self" :
+                    ShowCordovaBrowser(urlLoc);
+                    break;
+                case "_system" :
+                    ShowSystemBrowser(urlLoc);
+                    break;
+            }
+
+
+        }
+
+        private void ShowCordovaBrowser(string url)
+        {
+            Uri loc = new Uri(url,UriKind.RelativeOrAbsolute);
+            Deployment.Current.Dispatcher.BeginInvoke(() =>
+            {
+                PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
+                if (frame != null)
+                {
+                    PhoneApplicationPage page = frame.Content as PhoneApplicationPage;
+                    if (page != null)
+                    {
+                        CordovaView cView = page.FindName("CordovaView") as CordovaView;
+                        if(cView != null)
+                        {
+                            WebBrowser br = cView.Browser;
+                            br.Navigate(loc);
+                        }
+                    }
+
+                }
+            });
+        }
+
+        private void ShowSystemBrowser(string url)
+        {
+            WebBrowserTask webBrowserTask = new WebBrowserTask();
+            webBrowserTask.Uri = new Uri(url, UriKind.Absolute);
+            webBrowserTask.Show();
+        }
+
+
+        // Display an inderminate progress indicator
+        private void ShowInAppBrowser(string url)
+        {
+            Uri loc = new Uri(url);
+
+            Deployment.Current.Dispatcher.BeginInvoke(() =>
+            {
+                if (browser != null)
+                {
+                    //browser.IsGeolocationEnabled = opts.isGeolocationEnabled;
+                    browser.Navigate(loc);
+                }
+                else
+                {
+                    PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
+                    if (frame != null)
+                    {
+                        PhoneApplicationPage page = frame.Content as PhoneApplicationPage;
+                        WebBrowser br = (page.FindName("CordovaView") as CordovaView).Browser;
+
+                        if (page != null)
+                        {
+                            Grid grid = page.FindName("LayoutRoot") as Grid;
+                            if (grid != null)
+                            {
+                                browser = new WebBrowser();
+                                browser.Navigate(loc);
+
+                                browser.LoadCompleted += new System.Windows.Navigation.LoadCompletedEventHandler(browser_LoadCompleted);
+
+                                browser.Navigating += new EventHandler<NavigatingEventArgs>(browser_Navigating);
+                                browser.NavigationFailed += new System.Windows.Navigation.NavigationFailedEventHandler(browser_NavigationFailed);
+                                browser.Navigated += new EventHandler<System.Windows.Navigation.NavigationEventArgs>(browser_Navigated);
+                                browser.IsScriptEnabled = true;
+                                //browser.IsGeolocationEnabled = opts.isGeolocationEnabled;
+                                grid.Children.Add(browser);
+                            }
+
+                            ApplicationBar bar = new ApplicationBar();
+                            bar.BackgroundColor = Colors.Gray;
+                            bar.IsMenuEnabled = false;
+
+                            backButton = new ApplicationBarIconButton();
+                            backButton.Text = "Back";
+                            backButton.IconUri = new Uri("/Images/appbar.back.rest.png", UriKind.Relative);
+                            backButton.Click += new EventHandler(backButton_Click);
+                            //backButton.IsEnabled = false;
+                            bar.Buttons.Add(backButton);
+
+
+                            fwdButton = new ApplicationBarIconButton();
+                            fwdButton.Text = "Forward";
+                            fwdButton.IconUri = new Uri("/Images/appbar.next.rest.png", UriKind.Relative);
+                            fwdButton.Click += new EventHandler(fwdButton_Click);
+                            //fwdButton.IsEnabled = false;
+                            bar.Buttons.Add(fwdButton);
+
+                            ApplicationBarIconButton closeBtn = new ApplicationBarIconButton();
+                            closeBtn.Text = "Close";
+                            closeBtn.IconUri = new Uri("/Images/appbar.close.rest.png", UriKind.Relative);
+                            closeBtn.Click += new EventHandler(closeBtn_Click);
+                            bar.Buttons.Add(closeBtn);
+
+                            page.ApplicationBar = bar;
+                        }
+
+                    }
+                }
+            });
+        }
+
+        void browser_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
+        {
+            
+        }
+
+        void fwdButton_Click(object sender, EventArgs e)
+        {
+            if (browser != null)
+            {
+                try
+                {
+                    //browser.GoForward();
+                    browser.InvokeScript("execScript", "history.forward();");
+                }
+                catch(Exception)
+                {
+
+                }
+            }
+        }
+
+        void backButton_Click(object sender, EventArgs e)
+        {
+            if (browser != null)
+            {
+                try
+                {
+                    //browser.GoBack();
+                    browser.InvokeScript("execScript", "history.back();");
+                }
+                catch (Exception)
+                {
+
+                }
+            }
+        }
+
+        void closeBtn_Click(object sender, EventArgs e)
+        {
+            this.close();
+        }
+
+
+        public void close(string options="")
+        {
+            if (browser != null)
+            {
+                Deployment.Current.Dispatcher.BeginInvoke(() =>
+                {
+                    PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
+                    if (frame != null)
+                    {
+                        PhoneApplicationPage page = frame.Content as PhoneApplicationPage;
+                        if (page != null)
+                        {
+                            Grid grid = page.FindName("LayoutRoot") as Grid;
+                            if (grid != null)
+                            {
+                                grid.Children.Remove(browser);
+                            }
+                            page.ApplicationBar = null;
+                        }
+                    }
+                    browser = null;
+                });
+            }
+        }
+
+        void browser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
+        {
+            //if (browser != null)
+            //{
+            //    backButton.IsEnabled = browser.CanGoBack;
+            //    fwdButton.IsEnabled = browser.CanGoForward;
+            //}
+            string message = "{\"type\":\"locationChanged\", \"location\":\"" + e.Uri.AbsoluteUri + "\"}";
+            PluginResult result = new PluginResult(PluginResult.Status.OK, message);
+            result.KeepCallback = true;
+            this.DispatchCommandResult(result);
+        }
+
+        void browser_NavigationFailed(object sender, System.Windows.Navigation.NavigationFailedEventArgs e)
+        {
+            string message = "{\"type\":\"navigationError\",\"location\":\"" + e.Uri.AbsoluteUri + "\"}";
+            PluginResult result = new PluginResult(PluginResult.Status.ERROR, message);
+            result.KeepCallback = true;
+            this.DispatchCommandResult(result);
+        }
+
+        void browser_Navigating(object sender, NavigatingEventArgs e)
+        {
+            string message = "{\"type\":\"locationAboutToChange\",\"location\":\"" + e.Uri.AbsoluteUri + "\"}";
+            PluginResult result = new PluginResult(PluginResult.Status.OK, message);
+            result.KeepCallback = true;
+            this.DispatchCommandResult(result);
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/cordova-wp7/blob/2a94c127/templates/standalone/cordovalib/ConfigHandler.cs
----------------------------------------------------------------------
diff --git a/templates/standalone/cordovalib/ConfigHandler.cs b/templates/standalone/cordovalib/ConfigHandler.cs
new file mode 100644
index 0000000..d90e9b5
--- /dev/null
+++ b/templates/standalone/cordovalib/ConfigHandler.cs
@@ -0,0 +1,249 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Windows;
+using System.Windows.Resources;
+using System.Xml.Linq;
+
+namespace WPCordovaClassLib.CordovaLib
+{
+    class ConfigHandler
+    {
+        protected List<string> AllowedPlugins;
+        protected List<string> AllowedDomains;
+        protected Dictionary<string, string> Preferences;
+
+        protected bool AllowAllDomains = false;
+        protected bool AllowAllPlugins = false;
+
+        public ConfigHandler()
+        {
+            AllowedPlugins = new List<string>();
+            AllowedDomains = new List<string>();
+            Preferences = new Dictionary<string, string>();
+        }
+
+        public string GetPreference(string key)
+        {
+            return Preferences[key];
+        }
+
+/*
+    - (BOOL)URLIsAllowed:(NSURL*)url
+{
+    if (self.expandedWhitelist == nil) {
+        return NO;
+    }
+
+    if (self.allowAll) {
+        return YES;
+    }
+
+    // iterate through settings ExternalHosts, check for equality
+    NSEnumerator* enumerator = [self.expandedWhitelist objectEnumerator];
+    id regex = nil;
+    NSString* urlHost = [url host];
+
+    // if the url host IS found in the whitelist, load it in the app (however UIWebViewNavigationTypeOther kicks it out to Safari)
+    // if the url host IS NOT found in the whitelist, we do nothing
+    while (regex = [enumerator nextObject]) {
+        NSPredicate* regex_test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
+
+        if ([regex_test evaluateWithObject:urlHost] == YES) {
+            // if it matches at least one rule, return
+            return YES;
+        }
+    }
+
+    NSLog(@"%@", [self errorStringForURL:url]);
+    // if we got here, the url host is not in the white-list, do nothing
+    return NO;
+}*/
+        protected static string[] AllowedSchemes = {"http","https","ftp","ftps"};
+        protected bool SchemeIsAllowed(string scheme)
+        {
+            return AllowedSchemes.Contains(scheme);
+        }
+
+        protected string PathAndQuery(Uri uri)
+        {
+            string result = uri.LocalPath;
+            if (uri.Query.Length > 0)
+            {
+                result +=  uri.Query;
+            }
+            return result;
+        }
+
+        protected void AddWhiteListEntry(string origin, bool allowSubdomains)
+        {
+
+            if (origin == "*")
+            {
+                AllowAllDomains = true;
+            }
+
+            if (AllowAllDomains)
+            {
+                return;
+            }
+
+            string hostMatchingRegex = "";
+            string hostName;
+
+            try
+            {
+
+                Uri uri = new Uri(origin.Replace("*", "replaced-text"), UriKind.Absolute);
+
+                string tempHostName = uri.Host.Replace("replaced-text", "*");
+                //if (uri.HostNameType == UriHostNameType.Dns){}        
+                // starts with wildcard match - we make the first '.' optional (so '*.org.apache.cordova' will match 'org.apache.cordova')
+                if (tempHostName.StartsWith("*."))
+                {    //"(\\s{0}|*.)"
+                    hostName = @"\w*.*" + tempHostName.Substring(2).Replace(".", @"\.").Replace("*", @"\w*");
+                }
+                else
+                {
+                    hostName = tempHostName.Replace(".", @"\.").Replace("*", @"\w*");
+                }
+
+                //  "^https?://"
+                hostMatchingRegex = uri.Scheme + "://" + hostName + PathAndQuery(uri);
+                //Debug.WriteLine("Adding regex :: " + hostMatchingRegex);
+                AllowedDomains.Add(hostMatchingRegex);
+
+            }
+            catch (Exception)
+            {
+                Debug.WriteLine("Invalid Whitelist entry (probably missing the protocol):: " + origin);
+            }
+
+        }
+
+        /**   
+         
+         An access request is granted for a given URI if there exists an item inside the access-request list such that:
+
+            - The URI's scheme component is the same as scheme; and
+            - if subdomains is false or if the URI's host component is not a domain name (as defined in [RFC1034]), the URI's host component is the same as host; or
+            - if subdomains is true, the URI's host component is either the same as host, or is a subdomain of host (as defined in [RFC1034]); and
+            - the URI's port component is the same as port.
+         
+         **/
+
+        public bool URLIsAllowed(string url)
+        {
+            // easy case first
+            if (AllowAllDomains )
+            {
+                return true;
+            }
+            else
+            {
+                // start simple
+                Uri uri = new Uri(url,UriKind.RelativeOrAbsolute);
+                if (uri.IsAbsoluteUri)
+                {
+                    if (this.SchemeIsAllowed(uri.Scheme))
+                    {
+                        // additional test because our pattern will always have a trailing '/'
+                        string matchUrl = url;
+                        if (PathAndQuery(uri) == "/")
+                        {
+                            matchUrl = url + "/";
+                        }
+                        foreach (string pattern in AllowedDomains)
+                        {
+                            if (Regex.IsMatch(matchUrl, pattern))
+                            {
+                                // make sure it is at the start, and not part of the query string
+                                // special case :: http://some.other.domain/page.html?x=1&g=http://build.apache.org/
+                                if ( Regex.IsMatch(uri.Scheme + "://" +  uri.Host + "/", pattern) ||
+                                     (!Regex.IsMatch(PathAndQuery(uri), pattern)))
+                                {
+                                    return true;
+                                }
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public bool IsPluginAllowed(string key)
+        {
+            return AllowAllPlugins || AllowedPlugins.Contains(key);
+        }
+
+
+        public void LoadAppPackageConfig()
+        {
+            StreamResourceInfo streamInfo = Application.GetResourceStream(new Uri("config.xml", UriKind.Relative));
+
+            if (streamInfo != null)
+            {
+                StreamReader sr = new StreamReader(streamInfo.Stream);
+                //This will Read Keys Collection for the xml file
+                XDocument document = XDocument.Parse(sr.ReadToEnd());
+
+                var plugins = from results in document.Descendants("plugin")
+                              select new { name = (string)results.Attribute("name") };
+
+
+                foreach (var plugin in plugins)
+                {
+                    Debug.WriteLine("plugin " + plugin.name);
+                    if (plugin.name == "*")
+                    {
+                        AllowAllPlugins = true;
+                        break;
+                    }
+                    else
+                    {
+                        AllowedPlugins.Add(plugin.name);
+                    }
+                }
+
+                var preferences = from results in document.Descendants("preference")
+                                  select new
+                                  {
+                                      name = (string)results.Attribute("name"),
+                                      value = (string)results.Attribute("value")
+                                  };
+
+                foreach (var pref in preferences)
+                {
+                    Debug.WriteLine("pref" + pref.name + ", " + pref.value);
+                }
+
+                var accessList = from results in document.Descendants("access")
+                                 select new
+                                 {
+                                     origin = (string)results.Attribute("origin"),
+                                     subdomains = (string)results.Attribute("subdomains") == "true"
+                                 };
+
+                foreach (var accessElem in accessList)
+                {
+                    AddWhiteListEntry(accessElem.origin, accessElem.subdomains);
+                }
+            }
+            else
+            {
+                // no config.xml, allow all
+                AllowAllDomains = true;
+                AllowAllPlugins = true;
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cordova-wp7/blob/2a94c127/templates/standalone/cordovalib/CordovaView.xaml.cs
----------------------------------------------------------------------
diff --git a/templates/standalone/cordovalib/CordovaView.xaml.cs b/templates/standalone/cordovalib/CordovaView.xaml.cs
index 27f286f..135d3d9 100644
--- a/templates/standalone/cordovalib/CordovaView.xaml.cs
+++ b/templates/standalone/cordovalib/CordovaView.xaml.cs
@@ -38,6 +38,7 @@ using WPCordovaClassLib.Cordova;
 using System.Threading;
 using Microsoft.Phone.Shell;
 using WPCordovaClassLib.Cordova.JSON;
+using WPCordovaClassLib.CordovaLib;
 
 
 
@@ -77,6 +78,8 @@ namespace WPCordovaClassLib
         protected DOMStorageHelper domStorageHelper;
         protected OrientationHelper orientationHelper;
 
+        private ConfigHandler configHandler;
+
         public System.Windows.Controls.Grid _LayoutRoot
         {
             get
@@ -146,9 +149,12 @@ namespace WPCordovaClassLib
 
             }
 
+            configHandler = new ConfigHandler();
+            configHandler.LoadAppPackageConfig();
+
             // initializes native execution logic
-            this.nativeExecution = new NativeExecution(ref this.CordovaBrowser);
-            this.bmHelper = new BrowserMouseHelper(ref this.CordovaBrowser);
+            nativeExecution = new NativeExecution(ref this.CordovaBrowser);
+            bmHelper = new BrowserMouseHelper(ref this.CordovaBrowser);
         }
 
 
@@ -378,6 +384,12 @@ namespace WPCordovaClassLib
 
         void GapBrowser_Navigating(object sender, NavigatingEventArgs e)
         {
+            if (!configHandler.URLIsAllowed(e.Uri.ToString()))
+            {
+                e.Cancel = true;
+                return;
+            }
+
             this.PageDidChange = true;
             // Debug.WriteLine("GapBrowser_Navigating to :: " + e.Uri.ToString());
             this.nativeExecution.ResetAllCommands();
@@ -429,7 +441,27 @@ namespace WPCordovaClassLib
             }
             else
             {
-                this.nativeExecution.ProcessCommand(commandCallParams);
+                if (configHandler.IsPluginAllowed(commandCallParams.Service))
+                {
+                    nativeExecution.ProcessCommand(commandCallParams);
+                }
+                else
+                {
+                    Debug.WriteLine("Error::Plugin not allowed in config.xml. " + commandCallParams.Service);
+                }
+            }
+        }
+
+        public void LoadPage(string url)
+        {
+            try 
+            {
+                Uri newLoc = new Uri(url,UriKind.RelativeOrAbsolute);
+                CordovaBrowser.Navigate(newLoc);
+            }
+            catch(Exception)
+            {
+
             }
         }