mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 834414 - Stop holding on to a content resolver in Tab, which leaks the Activity instance it is associated with. r=bnicholson
This commit is contained in:
parent
bfdb4ce5ac
commit
54e8f992da
@ -12,7 +12,6 @@ import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.database.ContentObserver;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
@ -54,8 +53,6 @@ public class Tab {
|
||||
private ZoomConstraints mZoomConstraints;
|
||||
private ArrayList<View> mPluginViews;
|
||||
private HashMap<Object, Layer> mPluginLayers;
|
||||
private ContentResolver mContentResolver;
|
||||
private ContentObserver mContentObserver;
|
||||
private int mBackgroundColor = Color.WHITE;
|
||||
private int mState;
|
||||
private Bitmap mThumbnailBitmap;
|
||||
@ -92,17 +89,13 @@ public class Tab {
|
||||
mPluginViews = new ArrayList<View>();
|
||||
mPluginLayers = new HashMap<Object, Layer>();
|
||||
mState = GeckoApp.shouldShowProgress(url) ? STATE_SUCCESS : STATE_LOADING;
|
||||
mContentResolver = Tabs.getInstance().getContentResolver();
|
||||
mContentObserver = new ContentObserver(null) {
|
||||
public void onChange(boolean selfChange) {
|
||||
updateBookmark();
|
||||
}
|
||||
};
|
||||
BrowserDB.registerBookmarkObserver(mContentResolver, mContentObserver);
|
||||
}
|
||||
|
||||
private ContentResolver getContentResolver() {
|
||||
return Tabs.getInstance().getContentResolver();
|
||||
}
|
||||
|
||||
public void onDestroy() {
|
||||
BrowserDB.unregisterContentObserver(mContentResolver, mContentObserver);
|
||||
Tabs.getInstance().notifyListeners(this, Tabs.TabEvents.CLOSED);
|
||||
}
|
||||
|
||||
@ -346,7 +339,7 @@ public class Tab {
|
||||
Tabs.getInstance().notifyListeners(this, Tabs.TabEvents.MENU_UPDATED);
|
||||
}
|
||||
|
||||
private void updateBookmark() {
|
||||
void updateBookmark() {
|
||||
GeckoAppShell.getHandler().post(new Runnable() {
|
||||
public void run() {
|
||||
final String url = getURL();
|
||||
@ -354,8 +347,8 @@ public class Tab {
|
||||
return;
|
||||
|
||||
if (url.equals(getURL())) {
|
||||
mBookmark = BrowserDB.isBookmark(mContentResolver, url);
|
||||
mReadingListItem = BrowserDB.isReadingListItem(mContentResolver, url);
|
||||
mBookmark = BrowserDB.isBookmark(getContentResolver(), url);
|
||||
mReadingListItem = BrowserDB.isReadingListItem(getContentResolver(), url);
|
||||
}
|
||||
|
||||
Tabs.getInstance().notifyListeners(Tab.this, Tabs.TabEvents.MENU_UPDATED);
|
||||
@ -370,7 +363,7 @@ public class Tab {
|
||||
if (url == null)
|
||||
return;
|
||||
|
||||
BrowserDB.addBookmark(mContentResolver, mTitle, url);
|
||||
BrowserDB.addBookmark(getContentResolver(), mTitle, url);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -382,7 +375,7 @@ public class Tab {
|
||||
if (url == null)
|
||||
return;
|
||||
|
||||
BrowserDB.removeBookmarksWithURL(mContentResolver, url);
|
||||
BrowserDB.removeBookmarksWithURL(getContentResolver(), url);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -516,7 +509,7 @@ public class Tab {
|
||||
if (url == null)
|
||||
return;
|
||||
|
||||
BrowserDB.updateThumbnailForUrl(mContentResolver, url, mThumbnail);
|
||||
BrowserDB.updateThumbnailForUrl(getContentResolver(), url, mThumbnail);
|
||||
} catch (Exception e) {
|
||||
// ignore
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ import android.accounts.AccountManager;
|
||||
import android.accounts.OnAccountsUpdateListener;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Intent;
|
||||
import android.database.ContentObserver;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
@ -55,6 +56,7 @@ public class Tabs implements GeckoEventListener {
|
||||
private static AtomicInteger sTabId = new AtomicInteger(0);
|
||||
|
||||
private GeckoApp mActivity;
|
||||
private ContentObserver mContentObserver;
|
||||
|
||||
private Tabs() {
|
||||
registerEventListener("SessionHistory:New");
|
||||
@ -82,6 +84,9 @@ public class Tabs implements GeckoEventListener {
|
||||
persistAllTabs();
|
||||
}
|
||||
}, GeckoAppShell.getHandler(), false);
|
||||
if (mContentObserver != null) {
|
||||
BrowserDB.registerBookmarkObserver(getContentResolver(), mContentObserver);
|
||||
}
|
||||
}
|
||||
|
||||
public void detachFromActivity(GeckoApp activity) {
|
||||
@ -89,13 +94,31 @@ public class Tabs implements GeckoEventListener {
|
||||
mAccountManager.removeOnAccountsUpdatedListener(mAccountListener);
|
||||
mAccountListener = null;
|
||||
}
|
||||
if (mContentObserver != null) {
|
||||
BrowserDB.unregisterContentObserver(getContentResolver(), mContentObserver);
|
||||
}
|
||||
}
|
||||
|
||||
public int getCount() {
|
||||
return mTabs.size();
|
||||
}
|
||||
|
||||
private void lazyRegisterBookmarkObserver() {
|
||||
if (mContentObserver == null) {
|
||||
mContentObserver = new ContentObserver(null) {
|
||||
public void onChange(boolean selfChange) {
|
||||
for (Tab tab : mTabs.values()) {
|
||||
tab.updateBookmark();
|
||||
}
|
||||
}
|
||||
};
|
||||
BrowserDB.registerBookmarkObserver(getContentResolver(), mContentObserver);
|
||||
}
|
||||
}
|
||||
|
||||
private Tab addTab(int id, String url, boolean external, int parentId, String title, boolean isPrivate) {
|
||||
lazyRegisterBookmarkObserver();
|
||||
|
||||
final Tab tab = isPrivate ? new PrivateTab(id, url, external, parentId, title) :
|
||||
new Tab(id, url, external, parentId, title);
|
||||
mTabs.put(id, tab);
|
||||
|
Loading…
Reference in New Issue
Block a user