mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 941357 - (Part 2) Update BrowserProvider to use PerProfileDatases. r=rnewman
This commit is contained in:
parent
4c1903ffde
commit
c70ac95274
@ -19,6 +19,7 @@ import org.mozilla.gecko.db.BrowserContract.Schema;
|
|||||||
import org.mozilla.gecko.db.BrowserContract.SyncColumns;
|
import org.mozilla.gecko.db.BrowserContract.SyncColumns;
|
||||||
import org.mozilla.gecko.db.BrowserContract.Thumbnails;
|
import org.mozilla.gecko.db.BrowserContract.Thumbnails;
|
||||||
import org.mozilla.gecko.db.BrowserContract.URLColumns;
|
import org.mozilla.gecko.db.BrowserContract.URLColumns;
|
||||||
|
import org.mozilla.gecko.db.PerProfileDatabases.DatabaseHelperFactory;
|
||||||
import org.mozilla.gecko.gfx.BitmapUtils;
|
import org.mozilla.gecko.gfx.BitmapUtils;
|
||||||
import org.mozilla.gecko.mozglue.RobocopTarget;
|
import org.mozilla.gecko.mozglue.RobocopTarget;
|
||||||
import org.mozilla.gecko.sync.Utils;
|
import org.mozilla.gecko.sync.Utils;
|
||||||
@ -67,6 +68,8 @@ public class BrowserProvider extends ContentProvider {
|
|||||||
private static final String LOGTAG = "GeckoBrowserProvider";
|
private static final String LOGTAG = "GeckoBrowserProvider";
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
|
|
||||||
|
private PerProfileDatabases<BrowserDatabaseHelper> mDatabases;
|
||||||
|
|
||||||
static final String DATABASE_NAME = "browser.db";
|
static final String DATABASE_NAME = "browser.db";
|
||||||
|
|
||||||
static final int DATABASE_VERSION = 17;
|
static final int DATABASE_VERSION = 17;
|
||||||
@ -313,8 +316,6 @@ public class BrowserProvider extends ContentProvider {
|
|||||||
SEARCH_SUGGEST_PROJECTION_MAP = Collections.unmodifiableMap(map);
|
SEARCH_SUGGEST_PROJECTION_MAP = Collections.unmodifiableMap(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
private HashMap<String, DatabaseHelper> mDatabasePerProfile;
|
|
||||||
|
|
||||||
private interface BookmarkMigrator {
|
private interface BookmarkMigrator {
|
||||||
public void updateForNewTable(ContentValues bookmark);
|
public void updateForNewTable(ContentValues bookmark);
|
||||||
}
|
}
|
||||||
@ -364,8 +365,8 @@ public class BrowserProvider extends ContentProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class DatabaseHelper extends SQLiteOpenHelper {
|
final class BrowserDatabaseHelper extends SQLiteOpenHelper {
|
||||||
public DatabaseHelper(Context context, String databasePath) {
|
public BrowserDatabaseHelper(Context context, String databasePath) {
|
||||||
super(context, databasePath, null, DATABASE_VERSION);
|
super(context, databasePath, null, DATABASE_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1953,63 +1954,9 @@ public class BrowserProvider extends ContentProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private DatabaseHelper getDatabaseHelperForProfile(String profile, boolean isTest) {
|
|
||||||
// Each profile has a separate browser.db database. The target
|
|
||||||
// profile is provided using a URI query argument in each request
|
|
||||||
// to our content provider.
|
|
||||||
|
|
||||||
// Always fallback to default profile if none has been provided.
|
|
||||||
if (TextUtils.isEmpty(profile)) {
|
|
||||||
profile = GeckoProfile.get(mContext).getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
DatabaseHelper dbHelper;
|
|
||||||
synchronized (this) {
|
|
||||||
dbHelper = mDatabasePerProfile.get(profile);
|
|
||||||
if (dbHelper != null) {
|
|
||||||
return dbHelper;
|
|
||||||
}
|
|
||||||
|
|
||||||
String databasePath = getDatabasePath(profile, isTest);
|
|
||||||
|
|
||||||
// Before bug 768532, the database was located outside if the
|
|
||||||
// profile on Android 2.2. Make sure it is moved inside the profile
|
|
||||||
// directory.
|
|
||||||
if (Build.VERSION.SDK_INT == 8) {
|
|
||||||
File oldPath = mContext.getDatabasePath("browser-" + profile + ".db");
|
|
||||||
if (oldPath.exists()) {
|
|
||||||
oldPath.renameTo(new File(databasePath));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dbHelper = new DatabaseHelper(getContext(), databasePath);
|
|
||||||
mDatabasePerProfile.put(profile, dbHelper);
|
|
||||||
|
|
||||||
DBUtils.ensureDatabaseIsNotLocked(dbHelper, databasePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
debug("Created database helper for profile: " + profile);
|
|
||||||
return dbHelper;
|
|
||||||
}
|
|
||||||
|
|
||||||
@RobocopTarget
|
@RobocopTarget
|
||||||
public String getDatabasePath(String profile, boolean isTest) {
|
public String getDatabasePath(String profile, boolean isTest) {
|
||||||
trace("Getting database path for profile: " + profile);
|
return mDatabases.getDatabasePathForProfile(profile, isTest);
|
||||||
|
|
||||||
if (isTest) {
|
|
||||||
return DATABASE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
File profileDir = GeckoProfile.get(mContext, profile).getDir();
|
|
||||||
if (profileDir == null) {
|
|
||||||
debug("Couldn't find directory for profile: " + profile);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
String databasePath = new File(profileDir, DATABASE_NAME).getAbsolutePath();
|
|
||||||
debug("Successfully created database path for profile: " + databasePath);
|
|
||||||
|
|
||||||
return databasePath;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private SQLiteDatabase getReadableDatabase(Uri uri) {
|
private SQLiteDatabase getReadableDatabase(Uri uri) {
|
||||||
@ -2020,7 +1967,7 @@ public class BrowserProvider extends ContentProvider {
|
|||||||
if (uri != null)
|
if (uri != null)
|
||||||
profile = uri.getQueryParameter(BrowserContract.PARAM_PROFILE);
|
profile = uri.getQueryParameter(BrowserContract.PARAM_PROFILE);
|
||||||
|
|
||||||
return getDatabaseHelperForProfile(profile, isTest(uri)).getReadableDatabase();
|
return mDatabases.getDatabaseHelperForProfile(profile, isTest(uri)).getReadableDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
private SQLiteDatabase getWritableDatabase(Uri uri) {
|
private SQLiteDatabase getWritableDatabase(Uri uri) {
|
||||||
@ -2031,7 +1978,7 @@ public class BrowserProvider extends ContentProvider {
|
|||||||
if (uri != null)
|
if (uri != null)
|
||||||
profile = uri.getQueryParameter(BrowserContract.PARAM_PROFILE);
|
profile = uri.getQueryParameter(BrowserContract.PARAM_PROFILE);
|
||||||
|
|
||||||
return getDatabaseHelperForProfile(profile, isTest(uri)).getWritableDatabase();
|
return mDatabases.getDatabaseHelperForProfile(profile, isTest(uri)).getWritableDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cleanupSomeDeletedRecords(Uri fromUri, Uri targetUri, String tableName) {
|
private void cleanupSomeDeletedRecords(Uri fromUri, Uri targetUri, String tableName) {
|
||||||
@ -2178,7 +2125,13 @@ public class BrowserProvider extends ContentProvider {
|
|||||||
|
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
mContext = getContext();
|
mContext = getContext();
|
||||||
mDatabasePerProfile = new HashMap<String, DatabaseHelper>();
|
mDatabases = new PerProfileDatabases<BrowserDatabaseHelper>(
|
||||||
|
getContext(), DATABASE_NAME, new DatabaseHelperFactory<BrowserDatabaseHelper>() {
|
||||||
|
@Override
|
||||||
|
public BrowserDatabaseHelper makeDatabaseHelper(Context context, String databasePath) {
|
||||||
|
return new BrowserDatabaseHelper(context, databasePath);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -35,6 +35,14 @@ public class PerProfileDatabases<T extends SQLiteOpenHelper> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getDatabasePathForProfile(String profile) {
|
public String getDatabasePathForProfile(String profile) {
|
||||||
|
return getDatabasePathForProfile(profile, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDatabasePathForProfile(String profile, boolean isTest) {
|
||||||
|
if (isTest) {
|
||||||
|
return mDatabaseName;
|
||||||
|
}
|
||||||
|
|
||||||
final File profileDir = GeckoProfile.get(mContext, profile).getDir();
|
final File profileDir = GeckoProfile.get(mContext, profile).getDir();
|
||||||
if (profileDir == null) {
|
if (profileDir == null) {
|
||||||
return null;
|
return null;
|
||||||
@ -44,6 +52,10 @@ public class PerProfileDatabases<T extends SQLiteOpenHelper> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public T getDatabaseHelperForProfile(String profile) {
|
public T getDatabaseHelperForProfile(String profile) {
|
||||||
|
return getDatabaseHelperForProfile(profile, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getDatabaseHelperForProfile(String profile, boolean isTest) {
|
||||||
// Always fall back to default profile if none has been provided.
|
// Always fall back to default profile if none has been provided.
|
||||||
if (TextUtils.isEmpty(profile)) {
|
if (TextUtils.isEmpty(profile)) {
|
||||||
profile = GeckoProfile.get(mContext).getName();
|
profile = GeckoProfile.get(mContext).getName();
|
||||||
@ -54,7 +66,7 @@ public class PerProfileDatabases<T extends SQLiteOpenHelper> {
|
|||||||
return mStorages.get(profile);
|
return mStorages.get(profile);
|
||||||
}
|
}
|
||||||
|
|
||||||
final String databasePath = getDatabasePathForProfile(profile);
|
final String databasePath = getDatabasePathForProfile(profile, isTest);
|
||||||
if (databasePath == null) {
|
if (databasePath == null) {
|
||||||
throw new IllegalStateException("Database path is null for profile: " + profile);
|
throw new IllegalStateException("Database path is null for profile: " + profile);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user