15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007, 2009, 2011 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012, Samsung Electronics. All rights reserved. 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h" 2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebScreenInfo.h" 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h" 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/ChromeClient.h" 311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/Frame.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PageGroupLoadDeferrer.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PopupOpeningObserver.h" 3602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "core/page/WindowFeatures.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h" 3819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/ColorChooser.h" 3919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/DateTimeChooser.h" 401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/FileChooser.h" 411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatRect.h" 421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/network/DNS.h" 43591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassRefPtr.h" 44591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Vector.h" 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace std; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Chrome::Chrome(Page* page, ChromeClient* client) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_page(page) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_client(client) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_client); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Chrome::~Chrome() 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->chromeDestroyed(); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<Chrome> Chrome::create(Page* page, ChromeClient* client) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptPtr(new Chrome(page, client)); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void Chrome::invalidateContentsAndRootView(const IntRect& updateRect) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_client->invalidateContentsAndRootView(updateRect); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void Chrome::invalidateContentsForSlowScroll(const IntRect& updateRect) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_client->invalidateContentsForSlowScroll(updateRect); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::scroll(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->scroll(scrollDelta, rectToScroll, clipRect); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorInstrumentation::didScroll(m_page); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint Chrome::screenToRootView(const IntPoint& point) const 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->screenToRootView(point); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect Chrome::rootViewToScreen(const IntRect& rect) const 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->rootViewToScreen(rect); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)blink::WebScreenInfo Chrome::screenInfo() const 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return m_client->screenInfo(); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::contentsSizeChanged(Frame* frame, const IntSize& size) const 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->contentsSizeChanged(frame, size); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::layoutUpdated(Frame* frame) const 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->layoutUpdated(frame); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::setWindowRect(const FloatRect& rect) const 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->setWindowRect(rect); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatRect Chrome::windowRect() const 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->windowRect(); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatRect Chrome::pageRect() const 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->pageRect(); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::focus() const 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->focus(); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::unfocus() const 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->unfocus(); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::canTakeFocus(FocusDirection direction) const 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->canTakeFocus(direction); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::takeFocus(FocusDirection direction) const 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->takeFocus(direction); 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::focusedNodeChanged(Node* node) const 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->focusedNodeChanged(node); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 149591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid Chrome::show(NavigationPolicy policy) const 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 151591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_client->show(policy); 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::canRunModal() const 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->canRunModal(); 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool canRunModalIfDuringPageDismissal(Page* page, ChromeClient::DialogType dialog, const String& message) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 161f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) for (Frame* frame = page->mainFrame(); frame; frame = frame->tree().traverseNext()) { 162e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) Document::PageDismissalType dismissal = frame->document()->pageDismissalEventBeingDispatched(); 163e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (dismissal != Document::NoDismissal) 164e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return page->chrome().client().shouldRunModalDialogDuringPageDismissal(dialog, message, dismissal); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::canRunModalNow() const 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return canRunModal() && canRunModalIfDuringPageDismissal(m_page, ChromeClient::HTMLDialog, String()); 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::runModal() const 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Defer callbacks in all the other pages in this group, so we don't try to run JavaScript 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in a way that could interact with this view. 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageGroupLoadDeferrer deferrer(m_page, false); 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TimerBase::fireTimersInNestedEventLoop(); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->runModal(); 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochvoid Chrome::setWindowFeatures(const WindowFeatures& features) const 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 18602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_client->setToolbarsVisible(features.toolBarVisible || features.locationBarVisible); 18702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_client->setStatusbarVisible(features.statusBarVisible); 18802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_client->setScrollbarsVisible(features.scrollbarsVisible); 18902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_client->setMenubarVisible(features.menuBarVisible); 19002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_client->setResizable(features.resizable); 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::toolbarsVisible() const 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->toolbarsVisible(); 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::statusbarVisible() const 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->statusbarVisible(); 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::scrollbarsVisible() const 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->scrollbarsVisible(); 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::menubarVisible() const 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->menubarVisible(); 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::canRunBeforeUnloadConfirmPanel() 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->canRunBeforeUnloadConfirmPanel(); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::runBeforeUnloadConfirmPanel(const String& message, Frame* frame) 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Defer loads in case the client method runs a new event loop that would 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // otherwise cause the load to continue while we're in the middle of executing JavaScript. 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageGroupLoadDeferrer deferrer(m_page, true); 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InspectorInstrumentationCookie cookie = InspectorInstrumentation::willRunJavaScriptDialog(m_page, message); 225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool ok = m_client->runBeforeUnloadConfirmPanel(message, frame); 226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InspectorInstrumentation::didRunJavaScriptDialog(cookie); 227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ok; 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::closeWindowSoon() 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->closeWindowSoon(); 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::runJavaScriptAlert(Frame* frame, const String& message) 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!canRunModalIfDuringPageDismissal(m_page, ChromeClient::AlertDialog, message)) 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Defer loads in case the client method runs a new event loop that would 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // otherwise cause the load to continue while we're in the middle of executing JavaScript. 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageGroupLoadDeferrer deferrer(m_page, true); 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(frame); 245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) notifyPopupOpeningObservers(); 246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) InspectorInstrumentationCookie cookie = InspectorInstrumentation::willRunJavaScriptDialog(m_page, message); 2481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_client->runJavaScriptAlert(frame, message); 249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InspectorInstrumentation::didRunJavaScriptDialog(cookie); 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::runJavaScriptConfirm(Frame* frame, const String& message) 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!canRunModalIfDuringPageDismissal(m_page, ChromeClient::ConfirmDialog, message)) 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Defer loads in case the client method runs a new event loop that would 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // otherwise cause the load to continue while we're in the middle of executing JavaScript. 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageGroupLoadDeferrer deferrer(m_page, true); 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(frame); 262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) notifyPopupOpeningObservers(); 263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) InspectorInstrumentationCookie cookie = InspectorInstrumentation::willRunJavaScriptDialog(m_page, message); 2651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) bool ok = m_client->runJavaScriptConfirm(frame, message); 266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InspectorInstrumentation::didRunJavaScriptDialog(cookie); 267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ok; 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::runJavaScriptPrompt(Frame* frame, const String& prompt, const String& defaultValue, String& result) 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!canRunModalIfDuringPageDismissal(m_page, ChromeClient::PromptDialog, prompt)) 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Defer loads in case the client method runs a new event loop that would 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // otherwise cause the load to continue while we're in the middle of executing JavaScript. 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageGroupLoadDeferrer deferrer(m_page, true); 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(frame); 280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) notifyPopupOpeningObservers(); 281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) InspectorInstrumentationCookie cookie = InspectorInstrumentation::willRunJavaScriptDialog(m_page, prompt); 2831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) bool ok = m_client->runJavaScriptPrompt(frame, prompt, defaultValue, result); 284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InspectorInstrumentation::didRunJavaScriptDialog(cookie); 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ok; 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::setStatusbarText(Frame* frame, const String& status) 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(frame); 2921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_client->setStatusbarText(status); 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect Chrome::windowResizerRect() const 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->windowResizerRect(); 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::mouseDidMoveOverElement(const HitTestResult& result, unsigned modifierFlags) 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (result.innerNode()) { 3038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (result.innerNode()->document().isDNSPrefetchEnabled()) 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prefetchDNS(result.absoluteLinkURL().host()); 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->mouseDidMoveOverElement(result, modifierFlags); 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::setToolTip(const HitTestResult& result) 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // First priority is a potential toolTip representing a spelling or grammar error 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TextDirection toolTipDirection; 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String toolTip = result.spellingToolTip(toolTipDirection); 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Next we'll consider a tooltip for element with "title" attribute 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (toolTip.isEmpty()) 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toolTip = result.title(toolTipDirection); 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Lastly, for <input type="file"> that allow multiple files, we'll consider a tooltip for the selected filenames 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (toolTip.isEmpty()) { 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Node* node = result.innerNonSharedNode()) { 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->hasTagName(inputTag)) { 3235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) HTMLInputElement* input = toHTMLInputElement(node); 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toolTip = input->defaultToolTip(); 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We should obtain text direction of tooltip from 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ChromeClient or platform. As of October 2011, all client 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // implementations don't use text direction information for 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ChromeClient::setToolTip. We'll work on tooltip text 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // direction during bidi cleanup in form inputs. 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toolTipDirection = LTR; 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->setToolTip(toolTip, toolTipDirection); 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::print(Frame* frame) 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: This should have PageGroupLoadDeferrer, like runModal() or runJavaScriptAlert(), becasue it's no different from those. 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->print(frame); 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::enumerateChosenDirectory(FileChooser* fileChooser) 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->enumerateChosenDirectory(fileChooser); 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<ColorChooser> Chrome::createColorChooser(ColorChooserClient* client, const Color& initialColor) 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) notifyPopupOpeningObservers(); 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->createColorChooser(client, initialColor); 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)PassRefPtr<DateTimeChooser> Chrome::openDateTimeChooser(DateTimeChooserClient* client, const DateTimeChooserParameters& parameters) 357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) notifyPopupOpeningObservers(); 359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_client->openDateTimeChooser(client, parameters); 360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 361926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 362e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)void Chrome::openTextDataListChooser(HTMLInputElement& input) 363e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){ 364e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) notifyPopupOpeningObservers(); 365e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) m_client->openTextDataListChooser(input); 366e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)} 367e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> fileChooser) 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) notifyPopupOpeningObservers(); 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->runOpenPanel(frame, fileChooser); 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void Chrome::dispatchViewportPropertiesDidChange(const ViewportDescription& description) const 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_client->dispatchViewportPropertiesDidChange(description); 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::setCursor(const Cursor& cursor) 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->setCursor(cursor); 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Chrome::scheduleAnimation() 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->scheduleAnimation(); 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------- 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Chrome::hasOpenedPopup() const 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client->hasOpenedPopup(); 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)PassRefPtr<PopupMenu> Chrome::createPopupMenu(Frame& frame, PopupMenuClient* client) const 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) notifyPopupOpeningObservers(); 39993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_client->createPopupMenu(frame, client); 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 402926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Chrome::registerPopupOpeningObserver(PopupOpeningObserver* observer) 403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(observer); 405926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_popupOpeningObservers.append(observer); 406926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 407926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 408926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Chrome::unregisterPopupOpeningObserver(PopupOpeningObserver* observer) 409926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 410926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) size_t index = m_popupOpeningObservers.find(observer); 41106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) ASSERT(index != kNotFound); 412926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_popupOpeningObservers.remove(index); 413926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 414926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 415926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Chrome::notifyPopupOpeningObservers() const 416926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 417926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const Vector<PopupOpeningObserver*> observers(m_popupOpeningObservers); 418926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (size_t i = 0; i < observers.size(); ++i) 419926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) observers[i]->willOpenPopup(); 420926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 421926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 423