diff options
author | mlamouri@chromium.org <mlamouri@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-14 13:26:45 +0000 |
---|---|---|
committer | mlamouri@chromium.org <mlamouri@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-14 13:26:45 +0000 |
commit | ace95a2d218e7016a61503e16227169b5ccd4e09 (patch) | |
tree | f580f3973815ab89763f144febb2f3bafa0f5255 | |
parent | 3ab0a113e25728e951472bf68a00b4c631bdc5e7 (diff) | |
download | chromium_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
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; } /** |