f2b64e6dbacdc9d8fe5685e4535e1d4b4a073c59
[WebKit-https.git] / WebCore / page / Chrome.cpp
1 // -*- mode: c++; c-basic-offset: 4 -*-
2 /*
3  * Copyright (C) 2006 Apple Computer, Inc.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #include "config.h"
22 #include "Chrome.h"
23
24 #include "ChromeClient.h"
25 #include "FloatRect.h"
26 #include "Page.h"
27 #include "ResourceHandle.h"
28 #include <wtf/PassRefPtr.h>
29 #include <wtf/RefPtr.h>
30 #include <wtf/Vector.h>
31
32 namespace WebCore {
33
34 Chrome::Chrome(Page* page, ChromeClient* client)
35     : m_page(page)
36     , m_client(client)
37 {
38     ASSERT(m_client);
39 }
40
41 Chrome::~Chrome()
42 {
43     m_client->chromeDestroyed();
44 }
45
46 void Chrome::setWindowRect(const FloatRect& rect) const
47 {
48     m_client->setWindowRect(rect);
49 }
50
51 FloatRect Chrome::windowRect() const
52 {
53     return m_client->windowRect();
54 }
55
56 FloatRect Chrome::pageRect() const
57 {
58     return m_client->pageRect();
59 }
60         
61 float Chrome::scaleFactor()
62 {
63     return m_client->scaleFactor();
64 }
65     
66 void Chrome::focus() const
67 {
68     m_client->focus();
69 }
70
71 void Chrome::unfocus() const
72 {
73     m_client->unfocus();
74 }
75
76 Page* Chrome::createWindow(const FrameLoadRequest& request) const
77 {
78     return m_client->createWindow(request);
79 }
80
81 Page* Chrome::createModalDialog(const FrameLoadRequest& request) const
82 {
83     return m_client->createModalDialog(request);
84 }
85
86 void Chrome::show() const
87 {
88     m_client->show();
89 }
90
91 bool Chrome::canRunModal() const
92 {
93     return m_client->canRunModal();
94 }
95
96 bool Chrome::canRunModalNow() const
97 {
98     // If loads are blocked, we can't run modal because the contents
99     // of the modal dialog will never show up!
100     return canRunModal() && !ResourceHandle::loadsBlocked();
101 }
102
103 void Chrome::runModal() const
104 {
105     if (m_page->defersLoading()) {
106         LOG_ERROR("Tried to run modal in a page when it was deferring loading -- should never happen.");
107         return;
108     }
109
110     // Defer callbacks in all the other pages in this group, so we don't try to run JavaScript
111     // in a way that could interact with this view.
112     Vector<Page*> pagesToDefer;
113     if (const HashSet<Page*>* group = m_page->frameNamespace()) {
114         HashSet<Page*>::const_iterator end = group->end();
115         for (HashSet<Page*>::const_iterator it = group->begin(); it != end; ++it) {
116             Page* otherPage = *it;
117             if (otherPage != m_page && !otherPage->defersLoading())
118                 pagesToDefer.append(otherPage);
119         }
120     }
121     size_t count = pagesToDefer.size();
122     for (size_t i = 0; i < count; ++i)
123         pagesToDefer[i]->setDefersLoading(true);
124
125     // Go run the modal event loop.
126     m_client->runModal();
127     
128     // Restore loading for any views that we shut down.
129     for (size_t i = 0; i < count; ++i)
130         pagesToDefer[i]->setDefersLoading(false);
131 }
132
133 void Chrome::setToolbarsVisible(bool b) const
134 {
135     m_client->setToolbarsVisible(b);
136 }
137
138 bool Chrome::toolbarsVisible() const
139 {
140     return m_client->toolbarsVisible();
141 }
142
143 void Chrome::setStatusbarVisible(bool b) const
144 {
145     m_client->setStatusbarVisible(b);
146 }
147
148 bool Chrome::statusbarVisible() const
149 {
150     return m_client->statusbarVisible();
151 }
152
153 void Chrome::setScrollbarsVisible(bool b) const
154 {
155     m_client->setScrollbarsVisible(b);
156 }
157
158 bool Chrome::scrollbarsVisible() const
159 {
160     return m_client->scrollbarsVisible();
161 }
162
163 void Chrome::setMenubarVisible(bool b) const
164 {
165     m_client->setMenubarVisible(b);
166 }
167
168 bool Chrome::menubarVisible() const
169 {
170     return m_client->menubarVisible();
171 }
172
173 void Chrome::setResizable(bool b) const
174 {
175     m_client->setResizable(b);
176 }
177
178 void Chrome::addMessageToConsole(const String &message, unsigned lineNumber, const String &sourceURL)
179 {
180     m_client->addMessageToConsole(message, lineNumber, sourceURL);
181 }
182
183 } // namespace WebCore
184