Loading core/java/android/webkit/WebSettings.java +170 −0 Original line number Original line Diff line number Diff line Loading @@ -16,15 +16,27 @@ package android.webkit; package android.webkit; import android.content.ContentValues; import android.content.Context; import android.content.Context; import android.content.SharedPreferences; import android.os.Build; import android.os.Build; import android.os.Handler; import android.os.Handler; import android.os.Message; import android.os.Message; import android.preference.PreferenceManager; import android.provider.Checkin; import android.provider.Checkin; import android.provider.Settings; import android.util.Log; import java.io.File; import java.lang.SecurityException; import java.lang.SecurityException; import android.content.SharedPreferences.Editor; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteStatement; import java.util.HashSet; import java.util.Locale; import java.util.Locale; /** /** Loading Loading @@ -185,6 +197,43 @@ public class WebSettings { private boolean mAppCacheEnabled = false; private boolean mAppCacheEnabled = false; private boolean mDomStorageEnabled = false; private boolean mDomStorageEnabled = false; // Donut-specific hack to keep Gears permissions in sync with the // system location setting. // TODO: Make sure this hack is removed in Eclair, when Gears // is also removed. // Used to remember if we checked the Gears permissions already. static boolean mCheckedGearsPermissions = false; // The Gears permissions database directory. private final static String GEARS_DATABASE_DIR = "gears"; // The Gears permissions database file name. private final static String GEARS_DATABASE_FILE = "permissions.db"; // The Gears location permissions table. private final static String GEARS_LOCATION_ACCESS_TABLE_NAME = "LocationAccess"; // The Gears storage access permissions table. private final static String GEARS_STORAGE_ACCESS_TABLE_NAME = "Access"; // The Gears permissions db schema version table. private final static String GEARS_SCHEMA_VERSION_TABLE_NAME = "VersionInfo"; // The shared pref name. private static final String LAST_KNOWN_LOCATION_SETTING = "lastKnownLocationSystemSetting"; // The Browser package name. private static final String BROWSER_PACKAGE_NAME = "com.android.browser"; // The Google URLs whitelisted for Gears location access. private static HashSet<String> sGearsWhiteList; static { sGearsWhiteList = new HashSet<String>(); // NOTE: DO NOT ADD A "/" AT THE END! sGearsWhiteList.add("http://www.google.com"); sGearsWhiteList.add("http://www.google.co.uk"); } private static final String LOGTAG = "webcore"; static final boolean DEBUG = false; static final boolean LOGV_ENABLED = DEBUG; // Class to handle messages before WebCore is ready. // Class to handle messages before WebCore is ready. private class EventHandler { private class EventHandler { // Message id for syncing // Message id for syncing Loading @@ -205,6 +254,7 @@ public class WebSettings { switch (msg.what) { switch (msg.what) { case SYNC: case SYNC: synchronized (WebSettings.this) { synchronized (WebSettings.this) { checkGearsPermissions(); if (mBrowserFrame.mNativeFrame != 0) { if (mBrowserFrame.mNativeFrame != 0) { nativeSync(mBrowserFrame.mNativeFrame); nativeSync(mBrowserFrame.mNativeFrame); } } Loading Loading @@ -1277,6 +1327,126 @@ public class WebSettings { return size; return size; } } private void checkGearsPermissions() { // Did we already check the permissions? if (mCheckedGearsPermissions) { return; } // Are we running in the browser? if (!BROWSER_PACKAGE_NAME.equals(mContext.getPackageName())) { return; } // Is the pluginsPath sane? if (mPluginsPath == null || mPluginsPath.length() == 0) { // We don't yet have a meaningful plugin path, so // we can't do anything about the Gears permissions. return; } // Remember we checked the Gears permissions. mCheckedGearsPermissions = true; // Get the current system settings. int setting = Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.USE_LOCATION_FOR_SERVICES, -1); // Check if we need to set the Gears permissions. if (setting != -1 && locationSystemSettingChanged(setting)) { setGearsPermissionForGoogleDomains(setting); } } private boolean locationSystemSettingChanged(int newSetting) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); int oldSetting = 0; oldSetting = prefs.getInt(LAST_KNOWN_LOCATION_SETTING, oldSetting); if (oldSetting == newSetting) { return false; } Editor ed = prefs.edit(); ed.putInt(LAST_KNOWN_LOCATION_SETTING, newSetting); ed.commit(); return true; } private void setGearsPermissionForGoogleDomains(int systemPermission) { // Transform the system permission into a Gears permission int gearsPermission = (systemPermission == 1 ? 1 : 2); // Build the path to the Gears library. File file = new File(mPluginsPath).getParentFile(); if (file == null) { return; } // Build the Gears database file name. file = new File(file.getAbsolutePath() + File.separator + GEARS_DATABASE_DIR + File.separator + GEARS_DATABASE_FILE); // Remember whether or not we need to create the LocationAccess table. boolean needToCreateTables = !file.exists(); // Try opening the Gears database. SQLiteDatabase permissions; try { permissions = SQLiteDatabase.openOrCreateDatabase(file, null); } catch (SQLiteException e) { if (LOGV_ENABLED) { Log.v(LOGTAG, "Could not open Gears permission DB: " + e.getMessage()); } // Just bail out. return; } // We now have a database open. Begin a transaction. permissions.beginTransaction(); try { if (needToCreateTables) { // Create the tables. Note that this creates the // Gears tables for the permissions DB schema version 2. // The Gears schema upgrade process will take care of the rest. // First, the storage access table. SQLiteStatement statement = permissions.compileStatement( "CREATE TABLE IF NOT EXISTS " + GEARS_STORAGE_ACCESS_TABLE_NAME + " (Name TEXT UNIQUE, Value)"); statement.execute(); // Next the location access table. statement = permissions.compileStatement( "CREATE TABLE IF NOT EXISTS " + GEARS_LOCATION_ACCESS_TABLE_NAME + " (Name TEXT UNIQUE, Value)"); statement.execute(); // Finally, the schema version table. statement = permissions.compileStatement( "CREATE TABLE IF NOT EXISTS " + GEARS_SCHEMA_VERSION_TABLE_NAME + " (Name TEXT UNIQUE, Value)"); statement.execute(); // Set the schema version to 2. ContentValues schema = new ContentValues(); schema.put("Name", "Version"); schema.put("Value", 2); permissions.insert(GEARS_SCHEMA_VERSION_TABLE_NAME, null, schema); } ContentValues permissionValues = new ContentValues(); for (String url : sGearsWhiteList) { permissionValues.put("Name", url); permissionValues.put("Value", gearsPermission); permissions.replace(GEARS_LOCATION_ACCESS_TABLE_NAME, null, permissionValues); permissionValues.clear(); } // Commit the transaction. permissions.setTransactionSuccessful(); } catch (SQLiteException e) { if (LOGV_ENABLED) { Log.v(LOGTAG, "Could not set the Gears permissions: " + e.getMessage()); } } finally { permissions.endTransaction(); permissions.close(); } } /* Post a SYNC message to handle syncing the native settings. */ /* Post a SYNC message to handle syncing the native settings. */ private synchronized void postSync() { private synchronized void postSync() { // Only post if a sync is not pending // Only post if a sync is not pending Loading Loading
core/java/android/webkit/WebSettings.java +170 −0 Original line number Original line Diff line number Diff line Loading @@ -16,15 +16,27 @@ package android.webkit; package android.webkit; import android.content.ContentValues; import android.content.Context; import android.content.Context; import android.content.SharedPreferences; import android.os.Build; import android.os.Build; import android.os.Handler; import android.os.Handler; import android.os.Message; import android.os.Message; import android.preference.PreferenceManager; import android.provider.Checkin; import android.provider.Checkin; import android.provider.Settings; import android.util.Log; import java.io.File; import java.lang.SecurityException; import java.lang.SecurityException; import android.content.SharedPreferences.Editor; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteStatement; import java.util.HashSet; import java.util.Locale; import java.util.Locale; /** /** Loading Loading @@ -185,6 +197,43 @@ public class WebSettings { private boolean mAppCacheEnabled = false; private boolean mAppCacheEnabled = false; private boolean mDomStorageEnabled = false; private boolean mDomStorageEnabled = false; // Donut-specific hack to keep Gears permissions in sync with the // system location setting. // TODO: Make sure this hack is removed in Eclair, when Gears // is also removed. // Used to remember if we checked the Gears permissions already. static boolean mCheckedGearsPermissions = false; // The Gears permissions database directory. private final static String GEARS_DATABASE_DIR = "gears"; // The Gears permissions database file name. private final static String GEARS_DATABASE_FILE = "permissions.db"; // The Gears location permissions table. private final static String GEARS_LOCATION_ACCESS_TABLE_NAME = "LocationAccess"; // The Gears storage access permissions table. private final static String GEARS_STORAGE_ACCESS_TABLE_NAME = "Access"; // The Gears permissions db schema version table. private final static String GEARS_SCHEMA_VERSION_TABLE_NAME = "VersionInfo"; // The shared pref name. private static final String LAST_KNOWN_LOCATION_SETTING = "lastKnownLocationSystemSetting"; // The Browser package name. private static final String BROWSER_PACKAGE_NAME = "com.android.browser"; // The Google URLs whitelisted for Gears location access. private static HashSet<String> sGearsWhiteList; static { sGearsWhiteList = new HashSet<String>(); // NOTE: DO NOT ADD A "/" AT THE END! sGearsWhiteList.add("http://www.google.com"); sGearsWhiteList.add("http://www.google.co.uk"); } private static final String LOGTAG = "webcore"; static final boolean DEBUG = false; static final boolean LOGV_ENABLED = DEBUG; // Class to handle messages before WebCore is ready. // Class to handle messages before WebCore is ready. private class EventHandler { private class EventHandler { // Message id for syncing // Message id for syncing Loading @@ -205,6 +254,7 @@ public class WebSettings { switch (msg.what) { switch (msg.what) { case SYNC: case SYNC: synchronized (WebSettings.this) { synchronized (WebSettings.this) { checkGearsPermissions(); if (mBrowserFrame.mNativeFrame != 0) { if (mBrowserFrame.mNativeFrame != 0) { nativeSync(mBrowserFrame.mNativeFrame); nativeSync(mBrowserFrame.mNativeFrame); } } Loading Loading @@ -1277,6 +1327,126 @@ public class WebSettings { return size; return size; } } private void checkGearsPermissions() { // Did we already check the permissions? if (mCheckedGearsPermissions) { return; } // Are we running in the browser? if (!BROWSER_PACKAGE_NAME.equals(mContext.getPackageName())) { return; } // Is the pluginsPath sane? if (mPluginsPath == null || mPluginsPath.length() == 0) { // We don't yet have a meaningful plugin path, so // we can't do anything about the Gears permissions. return; } // Remember we checked the Gears permissions. mCheckedGearsPermissions = true; // Get the current system settings. int setting = Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.USE_LOCATION_FOR_SERVICES, -1); // Check if we need to set the Gears permissions. if (setting != -1 && locationSystemSettingChanged(setting)) { setGearsPermissionForGoogleDomains(setting); } } private boolean locationSystemSettingChanged(int newSetting) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); int oldSetting = 0; oldSetting = prefs.getInt(LAST_KNOWN_LOCATION_SETTING, oldSetting); if (oldSetting == newSetting) { return false; } Editor ed = prefs.edit(); ed.putInt(LAST_KNOWN_LOCATION_SETTING, newSetting); ed.commit(); return true; } private void setGearsPermissionForGoogleDomains(int systemPermission) { // Transform the system permission into a Gears permission int gearsPermission = (systemPermission == 1 ? 1 : 2); // Build the path to the Gears library. File file = new File(mPluginsPath).getParentFile(); if (file == null) { return; } // Build the Gears database file name. file = new File(file.getAbsolutePath() + File.separator + GEARS_DATABASE_DIR + File.separator + GEARS_DATABASE_FILE); // Remember whether or not we need to create the LocationAccess table. boolean needToCreateTables = !file.exists(); // Try opening the Gears database. SQLiteDatabase permissions; try { permissions = SQLiteDatabase.openOrCreateDatabase(file, null); } catch (SQLiteException e) { if (LOGV_ENABLED) { Log.v(LOGTAG, "Could not open Gears permission DB: " + e.getMessage()); } // Just bail out. return; } // We now have a database open. Begin a transaction. permissions.beginTransaction(); try { if (needToCreateTables) { // Create the tables. Note that this creates the // Gears tables for the permissions DB schema version 2. // The Gears schema upgrade process will take care of the rest. // First, the storage access table. SQLiteStatement statement = permissions.compileStatement( "CREATE TABLE IF NOT EXISTS " + GEARS_STORAGE_ACCESS_TABLE_NAME + " (Name TEXT UNIQUE, Value)"); statement.execute(); // Next the location access table. statement = permissions.compileStatement( "CREATE TABLE IF NOT EXISTS " + GEARS_LOCATION_ACCESS_TABLE_NAME + " (Name TEXT UNIQUE, Value)"); statement.execute(); // Finally, the schema version table. statement = permissions.compileStatement( "CREATE TABLE IF NOT EXISTS " + GEARS_SCHEMA_VERSION_TABLE_NAME + " (Name TEXT UNIQUE, Value)"); statement.execute(); // Set the schema version to 2. ContentValues schema = new ContentValues(); schema.put("Name", "Version"); schema.put("Value", 2); permissions.insert(GEARS_SCHEMA_VERSION_TABLE_NAME, null, schema); } ContentValues permissionValues = new ContentValues(); for (String url : sGearsWhiteList) { permissionValues.put("Name", url); permissionValues.put("Value", gearsPermission); permissions.replace(GEARS_LOCATION_ACCESS_TABLE_NAME, null, permissionValues); permissionValues.clear(); } // Commit the transaction. permissions.setTransactionSuccessful(); } catch (SQLiteException e) { if (LOGV_ENABLED) { Log.v(LOGTAG, "Could not set the Gears permissions: " + e.getMessage()); } } finally { permissions.endTransaction(); permissions.close(); } } /* Post a SYNC message to handle syncing the native settings. */ /* Post a SYNC message to handle syncing the native settings. */ private synchronized void postSync() { private synchronized void postSync() { // Only post if a sync is not pending // Only post if a sync is not pending Loading