Index: Source/web/PageOverlayList.cpp |
diff --git a/Source/web/PageOverlayList.cpp b/Source/web/PageOverlayList.cpp |
index f5b99ffa5642c655d8af3d766c639b8df0224852..c0355ad0563f35d8fa5d5a1beecc950999833258 100644 |
--- a/Source/web/PageOverlayList.cpp |
+++ b/Source/web/PageOverlayList.cpp |
@@ -51,47 +51,19 @@ PageOverlayList::~PageOverlayList() |
bool PageOverlayList::add(WebPageOverlay* overlay, int zOrder) |
{ |
- bool added = false; |
- size_t index = find(overlay); |
- if (index == WTF::kNotFound) { |
- OwnPtr<PageOverlay> pageOverlay = PageOverlay::create(m_viewImpl, overlay); |
- m_pageOverlays.append(pageOverlay.release()); |
- index = m_pageOverlays.size() - 1; |
- added = true; |
- } |
- |
- PageOverlay* pageOverlay = m_pageOverlays[index].get(); |
- pageOverlay->setZOrder(zOrder); |
- |
- // Adjust page overlay list order based on their z-order numbers. We first |
- // check if we need to move the overlay up and do so if needed. Otherwise, |
- // check if we need to move it down. |
- bool zOrderChanged = false; |
- for (size_t i = index; i + 1 < m_pageOverlays.size(); ++i) { |
- if (m_pageOverlays[i]->zOrder() >= m_pageOverlays[i + 1]->zOrder()) { |
- m_pageOverlays[i].swap(m_pageOverlays[i + 1]); |
- zOrderChanged = true; |
- } |
- } |
- |
- if (!zOrderChanged) { |
- for (size_t i = index; i >= 1; --i) { |
- if (m_pageOverlays[i]->zOrder() < m_pageOverlays[i - 1]->zOrder()) { |
- m_pageOverlays[i].swap(m_pageOverlays[i - 1]); |
- zOrderChanged = true; |
- } |
- } |
- } |
- |
- // If we did move the overlay, that means z-order is changed and we need to |
- // update overlay layers' z-order. Otherwise, just update current overlay. |
- if (zOrderChanged) { |
- for (size_t i = 0; i < m_pageOverlays.size(); ++i) |
- m_pageOverlays[i]->clear(); |
- update(); |
- } else |
- pageOverlay->update(); |
+ bool added; |
+ size_t index = findOrAdd(overlay, added); |
+ m_pageOverlays[index]->setZOrder(zOrder); |
+ updateForZOrder(index); |
+ return added; |
+} |
+bool PageOverlayList::add(PageOverlay::Painter* overlayPainter, int zOrder) |
+{ |
+ bool added; |
+ size_t index = findOrAdd(overlayPainter, added); |
+ m_pageOverlays[index]->setZOrder(zOrder); |
+ updateForZOrder(index); |
return added; |
} |
@@ -106,6 +78,17 @@ bool PageOverlayList::remove(WebPageOverlay* overlay) |
return true; |
} |
+bool PageOverlayList::remove(PageOverlay::Painter* overlayPainter) |
+{ |
+ size_t index = find(overlayPainter); |
+ if (index == WTF::kNotFound) |
+ return false; |
+ |
+ m_pageOverlays[index]->clear(); |
+ m_pageOverlays.remove(index); |
+ return true; |
+} |
+ |
void PageOverlayList::update() |
{ |
for (size_t i = 0; i < m_pageOverlays.size(); ++i) |
@@ -114,12 +97,18 @@ void PageOverlayList::update() |
void PageOverlayList::paintWebFrame(GraphicsContext& gc) |
{ |
+ // If accelerated compositing is active, page overlays are painted through |
+ // their corresponding GraphicsLayer. |
+ ASSERT(!m_viewImpl->isAcceleratedCompositingActive()); |
+ |
for (size_t i = 0; i < m_pageOverlays.size(); ++i) |
m_pageOverlays[i]->paintWebFrame(gc); |
} |
size_t PageOverlayList::find(WebPageOverlay* overlay) |
{ |
+ if (!overlay) |
+ return WTF::kNotFound; |
for (size_t i = 0; i < m_pageOverlays.size(); ++i) { |
if (m_pageOverlays[i]->overlay() == overlay) |
return i; |
@@ -127,6 +116,17 @@ size_t PageOverlayList::find(WebPageOverlay* overlay) |
return WTF::kNotFound; |
} |
+size_t PageOverlayList::find(PageOverlay::Painter* overlayPainter) |
+{ |
+ if (!overlayPainter) |
+ return WTF::kNotFound; |
+ for (size_t i = 0; i < m_pageOverlays.size(); ++i) { |
+ if (m_pageOverlays[i]->overlayPainter() == overlayPainter) |
+ return i; |
+ } |
+ return WTF::kNotFound; |
+} |
+ |
size_t PageOverlayList::findGraphicsLayer(GraphicsLayer* layer) |
{ |
for (size_t i = 0; i < m_pageOverlays.size(); ++i) { |
@@ -136,4 +136,55 @@ size_t PageOverlayList::findGraphicsLayer(GraphicsLayer* layer) |
return WTF::kNotFound; |
} |
+GraphicsLayer* PageOverlayList::graphicsLayerForTesting() const |
+{ |
+ return m_pageOverlays.isEmpty() ? nullptr : m_pageOverlays[0]->graphicsLayer(); |
+} |
+ |
+template <typename T> |
+size_t PageOverlayList::findOrAdd(T* client, bool& added) |
+{ |
+ size_t index = find(client); |
+ if (index != WTF::kNotFound) { |
+ added = false; |
+ return index; |
+ } |
+ m_pageOverlays.append(PageOverlay::create(m_viewImpl, client)); |
+ added = true; |
+ return m_pageOverlays.size() - 1; |
+} |
+ |
+void PageOverlayList::updateForZOrder(size_t indexOfChangedOverlay) |
+{ |
+ // Adjust page overlay list order based on their z-order numbers. We first |
+ // check if we need to move the overlay up and do so if needed. Otherwise, |
+ // check if we need to move it down. |
+ bool zOrderChanged = false; |
+ for (size_t i = indexOfChangedOverlay; i + 1 < m_pageOverlays.size(); ++i) { |
+ if (m_pageOverlays[i]->zOrder() >= m_pageOverlays[i + 1]->zOrder()) { |
+ m_pageOverlays[i].swap(m_pageOverlays[i + 1]); |
+ zOrderChanged = true; |
+ } |
+ } |
+ |
+ if (!zOrderChanged) { |
+ for (size_t i = indexOfChangedOverlay; i >= 1; --i) { |
+ if (m_pageOverlays[i]->zOrder() < m_pageOverlays[i - 1]->zOrder()) { |
+ m_pageOverlays[i].swap(m_pageOverlays[i - 1]); |
+ zOrderChanged = true; |
+ } |
+ } |
+ } |
+ |
+ // If we did move the overlay, that means z-order is changed and we need to |
+ // update overlay layers' z-order. Otherwise, just update current overlay. |
+ if (zOrderChanged) { |
+ for (size_t i = 0; i < m_pageOverlays.size(); ++i) |
+ m_pageOverlays[i]->clear(); |
+ update(); |
+ } else { |
+ m_pageOverlays[indexOfChangedOverlay]->update(); |
+ } |
+} |
+ |
} // namespace blink |