summaryrefslogtreecommitdiffstats
path: root/core/java/android/webkit
diff options
context:
space:
mode:
authorAndroid (Google) Code Review <android-gerrit@google.com>2009-07-09 12:50:26 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2009-07-09 12:50:26 -0700
commita5f451f3aec0946360b8bf116c0b83955f2e6d79 (patch)
treeaf2f423cca40207100e980e1f687e9d7f1693259 /core/java/android/webkit
parent97b3ed69db6f84a3f06a50b95e0426849f488018 (diff)
parent3bb692338fed7f34f010398fe8b831d0de22c6e8 (diff)
downloadframeworks_base-a5f451f3aec0946360b8bf116c0b83955f2e6d79.zip
frameworks_base-a5f451f3aec0946360b8bf116c0b83955f2e6d79.tar.gz
frameworks_base-a5f451f3aec0946360b8bf116c0b83955f2e6d79.tar.bz2
am 3bb69233: Merge change 6620 into donut
Merge commit '3bb692338fed7f34f010398fe8b831d0de22c6e8' * commit '3bb692338fed7f34f010398fe8b831d0de22c6e8': Keep Gears permissions in sync with system location settings.
Diffstat (limited to 'core/java/android/webkit')
-rw-r--r--core/java/android/webkit/WebSettings.java170
1 files changed, 170 insertions, 0 deletions
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index 0ee3a60..1516eda 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -16,15 +16,27 @@
package android.webkit;
+import android.content.ContentValues;
import android.content.Context;
+import android.content.SharedPreferences;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
+import android.preference.PreferenceManager;
import android.provider.Checkin;
+import android.provider.Settings;
+import android.util.Log;
+import java.io.File;
import java.lang.SecurityException;
+
+import android.content.SharedPreferences.Editor;
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;
/**
@@ -185,6 +197,43 @@ public class WebSettings {
private boolean mAppCacheEnabled = 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.
private class EventHandler {
// Message id for syncing
@@ -205,6 +254,7 @@ public class WebSettings {
switch (msg.what) {
case SYNC:
synchronized (WebSettings.this) {
+ checkGearsPermissions();
if (mBrowserFrame.mNativeFrame != 0) {
nativeSync(mBrowserFrame.mNativeFrame);
}
@@ -1277,6 +1327,126 @@ public class WebSettings {
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. */
private synchronized void postSync() {
// Only post if a sync is not pending