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