summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormlamouri@chromium.org <mlamouri@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-14 13:26:45 +0000
committermlamouri@chromium.org <mlamouri@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-14 13:26:45 +0000
commitace95a2d218e7016a61503e16227169b5ccd4e09 (patch)
treef580f3973815ab89763f144febb2f3bafa0f5255
parent3ab0a113e25728e951472bf68a00b4c631bdc5e7 (diff)
downloadchromium_src-ace95a2d218e7016a61503e16227169b5ccd4e09.zip
chromium_src-ace95a2d218e7016a61503e16227169b5ccd4e09.tar.gz
chromium_src-ace95a2d218e7016a61503e16227169b5ccd4e09.tar.bz2
Expose size() and isEmpty() in ObserverList.
BUG=347558 Review URL: https://codereview.chromium.org/198093004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257094 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--base/android/java/src/org/chromium/base/ObserverList.java36
-rw-r--r--base/android/javatests/src/org/chromium/base/ObserverListTest.java76
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.java13
3 files changed, 110 insertions, 15 deletions
diff --git a/base/android/java/src/org/chromium/base/ObserverList.java b/base/android/java/src/org/chromium/base/ObserverList.java
index 012f475..54f8517 100644
--- a/base/android/java/src/org/chromium/base/ObserverList.java
+++ b/base/android/java/src/org/chromium/base/ObserverList.java
@@ -45,6 +45,7 @@ public class ObserverList<E> implements Iterable<E> {
public final List<E> mObservers = new ArrayList<E>();
private int mIterationDepth = 0;
+ private int mCount = 0;
public ObserverList() {}
@@ -64,7 +65,11 @@ public class ObserverList<E> implements Iterable<E> {
// Structurally modifying the underlying list here. This means we
// cannot use the underlying list's iterator to iterate over the list.
- return mObservers.add(obs);
+ boolean result = mObservers.add(obs);
+ assert result == true;
+
+ ++mCount;
+ return true;
}
/**
@@ -88,6 +93,8 @@ public class ObserverList<E> implements Iterable<E> {
} else {
mObservers.set(index, null);
}
+ --mCount;
+ assert mCount >= 0;
return true;
}
@@ -97,6 +104,8 @@ public class ObserverList<E> implements Iterable<E> {
}
public void clear() {
+ mCount = 0;
+
if (mIterationDepth == 0) {
mObservers.clear();
return;
@@ -123,6 +132,21 @@ public class ObserverList<E> implements Iterable<E> {
}
/**
+ * Returns the number of observers currently registered in the ObserverList.
+ * This is equivalent to the number of non-empty spaces in |mObservers|.
+ */
+ public int size() {
+ return mCount;
+ }
+
+ /**
+ * Returns true if the ObserverList contains no observers.
+ */
+ public boolean isEmpty() {
+ return mCount == 0;
+ }
+
+ /**
* Compact the underlying list be removing null elements.
* <p/>
* Should only be called when mIterationDepth is zero.
@@ -147,7 +171,11 @@ public class ObserverList<E> implements Iterable<E> {
compact();
}
- private int getSize() {
+ /**
+ * Returns the size of the underlying storage of the ObserverList.
+ * It will take into account the empty spaces inside |mObservers|.
+ */
+ private int capacity() {
return mObservers.size();
}
@@ -162,14 +190,14 @@ public class ObserverList<E> implements Iterable<E> {
private ObserverListIterator() {
ObserverList.this.incrementIterationDepth();
- mListEndMarker = ObserverList.this.getSize();
+ mListEndMarker = ObserverList.this.capacity();
}
@Override
public void rewind() {
compactListIfNeeded();
ObserverList.this.incrementIterationDepth();
- mListEndMarker = ObserverList.this.getSize();
+ mListEndMarker = ObserverList.this.capacity();
mIsExhausted = false;
mIndex = 0;
}
diff --git a/base/android/javatests/src/org/chromium/base/ObserverListTest.java b/base/android/javatests/src/org/chromium/base/ObserverListTest.java
index f999168..599534a 100644
--- a/base/android/javatests/src/org/chromium/base/ObserverListTest.java
+++ b/base/android/javatests/src/org/chromium/base/ObserverListTest.java
@@ -252,4 +252,80 @@ public class ObserverListTest extends InstrumentationTestCase {
assertTrue(observerList.removeObserver(a));
assertFalse(observerList.removeObserver(null));
}
+
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testSize() {
+ ObserverList<Object> observerList = new ObserverList<Object>();
+
+ assertEquals(0, observerList.size());
+ assertTrue(observerList.isEmpty());
+
+ observerList.addObserver(null);
+ assertEquals(0, observerList.size());
+ assertTrue(observerList.isEmpty());
+
+ Object a = new Object();
+ observerList.addObserver(a);
+ assertEquals(1, observerList.size());
+ assertFalse(observerList.isEmpty());
+
+ observerList.addObserver(a);
+ assertEquals(1, observerList.size());
+ assertFalse(observerList.isEmpty());
+
+ observerList.addObserver(null);
+ assertEquals(1, observerList.size());
+ assertFalse(observerList.isEmpty());
+
+ Object b = new Object();
+ observerList.addObserver(b);
+ assertEquals(2, observerList.size());
+ assertFalse(observerList.isEmpty());
+
+ observerList.removeObserver(null);
+ assertEquals(2, observerList.size());
+ assertFalse(observerList.isEmpty());
+
+ observerList.removeObserver(new Object());
+ assertEquals(2, observerList.size());
+ assertFalse(observerList.isEmpty());
+
+ observerList.removeObserver(b);
+ assertEquals(1, observerList.size());
+ assertFalse(observerList.isEmpty());
+
+ observerList.removeObserver(b);
+ assertEquals(1, observerList.size());
+ assertFalse(observerList.isEmpty());
+
+ observerList.removeObserver(a);
+ assertEquals(0, observerList.size());
+ assertTrue(observerList.isEmpty());
+
+ observerList.removeObserver(a);
+ observerList.removeObserver(b);
+ observerList.removeObserver(null);
+ observerList.removeObserver(new Object());
+ assertEquals(0, observerList.size());
+ assertTrue(observerList.isEmpty());
+
+ observerList.addObserver(new Object());
+ observerList.addObserver(new Object());
+ observerList.addObserver(new Object());
+ observerList.addObserver(a);
+ assertEquals(4, observerList.size());
+ assertFalse(observerList.isEmpty());
+
+ observerList.clear();
+ assertEquals(0, observerList.size());
+ assertTrue(observerList.isEmpty());
+
+ observerList.removeObserver(a);
+ observerList.removeObserver(b);
+ observerList.removeObserver(null);
+ observerList.removeObserver(new Object());
+ assertEquals(0, observerList.size());
+ assertTrue(observerList.isEmpty());
+ }
}
diff --git a/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.java b/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.java
index 6125b70..b5068aa 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.java
@@ -144,11 +144,6 @@ class ScreenOrientationListener {
private final ObserverList<ScreenOrientationObserver> mObservers =
new ObserverList<ScreenOrientationObserver>();
- // Number of observers currently in |mObservers|.
- // TODO(mlamouri): hopefully, we can get ObserverList to provide that,
- // http://crbug.com/347558
- private int mObserverCount;
-
// mOrientation will be updated every time the orientation changes. When not
// listening for changes, the value will be invalid and will be updated when
// starting to listen again.
@@ -210,10 +205,9 @@ class ScreenOrientationListener {
Log.w(TAG, "Adding an observer that is already present!");
return;
}
- mObserverCount++;
// If we got our first observer, we should start listening.
- if (mObserverCount == 1) {
+ if (mObservers.size() == 1) {
updateOrientation();
mBackend.startListening();
}
@@ -240,14 +234,11 @@ class ScreenOrientationListener {
Log.w(TAG, "Removing an inexistent observer!");
return;
}
- mObserverCount--;
- if (mObserverCount == 0) {
+ if (mObservers.isEmpty()) {
// The last observer was removed, we should just stop listening.
mBackend.stopListening();
}
-
- assert mObserverCount >= 0;
}
/**