15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC. 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 30f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PageOverlayList.h" 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPageOverlay.h" 33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PageOverlay.h" 34f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink { 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<PageOverlayList> PageOverlayList::create(WebViewImpl* viewImpl) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptPtr(new PageOverlayList(viewImpl)); 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PageOverlayList::PageOverlayList(WebViewImpl* viewImpl) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_viewImpl(viewImpl) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PageOverlayList::~PageOverlayList() 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool PageOverlayList::add(WebPageOverlay* overlay, int zOrder) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool added = false; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t index = find(overlay); 5606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (index == WTF::kNotFound) { 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<PageOverlay> pageOverlay = PageOverlay::create(m_viewImpl, overlay); 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays.append(pageOverlay.release()); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) index = m_pageOverlays.size() - 1; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) added = true; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageOverlay* pageOverlay = m_pageOverlays[index].get(); 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageOverlay->setZOrder(zOrder); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Adjust page overlay list order based on their z-order numbers. We first 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // check if we need to move the overlay up and do so if needed. Otherwise, 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // check if we need to move it down. 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool zOrderChanged = false; 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = index; i + 1 < m_pageOverlays.size(); ++i) { 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pageOverlays[i]->zOrder() >= m_pageOverlays[i + 1]->zOrder()) { 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays[i].swap(m_pageOverlays[i + 1]); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) zOrderChanged = true; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!zOrderChanged) { 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = index; i >= 1; --i) { 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pageOverlays[i]->zOrder() < m_pageOverlays[i - 1]->zOrder()) { 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays[i].swap(m_pageOverlays[i - 1]); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) zOrderChanged = true; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we did move the overlay, that means z-order is changed and we need to 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // update overlay layers' z-order. Otherwise, just update current overlay. 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (zOrderChanged) { 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < m_pageOverlays.size(); ++i) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays[i]->clear(); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) update(); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageOverlay->update(); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return added; 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool PageOverlayList::remove(WebPageOverlay* overlay) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t index = find(overlay); 10106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (index == WTF::kNotFound) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays[index]->clear(); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays.remove(index); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void PageOverlayList::update() 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < m_pageOverlays.size(); ++i) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays[i]->update(); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 115e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void PageOverlayList::paintWebFrame(GraphicsContext& gc) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < m_pageOverlays.size(); ++i) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays[i]->paintWebFrame(gc); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)size_t PageOverlayList::find(WebPageOverlay* overlay) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < m_pageOverlays.size(); ++i) { 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pageOverlays[i]->overlay() == overlay) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return i; 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) return WTF::kNotFound; 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 130e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)size_t PageOverlayList::findGraphicsLayer(GraphicsLayer* layer) 131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (size_t i = 0; i < m_pageOverlays.size(); ++i) { 133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_pageOverlays[i]->graphicsLayer() == layer) 134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return i; 135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 13606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) return WTF::kNotFound; 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 13951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink 140