Fix typo.
[WebKit-https.git] / WebCore / page / DOMWindow.cpp
1 /*
2  * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "DOMWindow.h"
28
29 #include "BarInfo.h"
30 #include "CSSComputedStyleDeclaration.h"
31 #include "CSSRuleList.h"
32 #include "CSSStyleSelector.h"
33 #include "Chrome.h"
34 #include "DOMSelection.h"
35 #include "Document.h"
36 #include "Element.h"
37 #include "Frame.h"
38 #include "FrameLoader.h"
39 #include "FrameTree.h"
40 #include "FrameView.h"
41 #include "History.h"
42 #include "Page.h"
43 #include "PlatformScreen.h"
44 #include "PlatformString.h"
45 #include "Screen.h"
46
47 namespace WebCore {
48
49 DOMWindow::DOMWindow(Frame* frame)
50     : m_frame(frame)
51 {
52 }
53
54 DOMWindow::~DOMWindow()
55 {
56 }
57
58 Frame* DOMWindow::frame()
59 {
60     return m_frame;
61 }
62
63 void DOMWindow::disconnectFrame()
64 {
65     m_frame = 0;
66     clear();
67 }
68
69 void DOMWindow::clear()
70 {
71     if (m_screen)
72         m_screen->disconnectFrame();
73     m_screen = 0;
74
75     if (m_selection)
76         m_selection->disconnectFrame();
77     m_selection = 0;
78
79     if (m_history)
80         m_history->disconnectFrame();
81     m_history = 0;
82
83     if (m_locationbar)
84         m_locationbar->disconnectFrame();
85     m_locationbar = 0;
86
87     if (m_menubar)
88         m_menubar->disconnectFrame();
89     m_menubar = 0;
90
91     if (m_personalbar)
92         m_personalbar->disconnectFrame();
93     m_personalbar = 0;
94
95     if (m_scrollbars)
96         m_scrollbars->disconnectFrame();
97     m_scrollbars = 0;
98
99     if (m_statusbar)
100         m_statusbar->disconnectFrame();
101     m_statusbar = 0;
102
103     if (m_toolbar)
104         m_toolbar->disconnectFrame();
105     m_toolbar = 0;
106 }
107
108 Screen* DOMWindow::screen() const
109 {
110     if (!m_screen)
111         m_screen = new Screen(m_frame);
112     return m_screen.get();
113 }
114
115 History* DOMWindow::history() const
116 {
117     if (!m_history)
118         m_history = new History(m_frame);
119     return m_history.get();
120 }
121
122 BarInfo* DOMWindow::locationbar() const
123 {
124     if (!m_locationbar)
125         m_locationbar = new BarInfo(m_frame, BarInfo::Locationbar);
126     return m_locationbar.get();
127 }
128
129 BarInfo* DOMWindow::menubar() const
130 {
131     if (!m_menubar)
132         m_menubar = new BarInfo(m_frame, BarInfo::Menubar);
133     return m_menubar.get();
134 }
135
136 BarInfo* DOMWindow::personalbar() const
137 {
138     if (!m_personalbar)
139         m_personalbar = new BarInfo(m_frame, BarInfo::Personalbar);
140     return m_personalbar.get();
141 }
142
143 BarInfo* DOMWindow::scrollbars() const
144 {
145     if (!m_scrollbars)
146         m_scrollbars = new BarInfo(m_frame, BarInfo::Scrollbars);
147     return m_scrollbars.get();
148 }
149
150 BarInfo* DOMWindow::statusbar() const
151 {
152     if (!m_statusbar)
153         m_statusbar = new BarInfo(m_frame, BarInfo::Statusbar);
154     return m_statusbar.get();
155 }
156
157 BarInfo* DOMWindow::toolbar() const
158 {
159     if (!m_toolbar)
160         m_toolbar = new BarInfo(m_frame, BarInfo::Toolbar);
161     return m_toolbar.get();
162 }
163
164 DOMSelection* DOMWindow::getSelection()
165 {
166     if (!m_selection)
167         m_selection = new DOMSelection(m_frame);
168     return m_selection.get();
169 }
170
171 Element* DOMWindow::frameElement() const
172 {
173     if (!m_frame)
174         return 0;
175
176     Document* doc = m_frame->document();
177     ASSERT(doc);
178     if (!doc)
179         return 0;
180
181     // FIXME: could this use m_frame->ownerElement() instead of going through the Document.
182     return doc->ownerElement();
183 }
184
185 void DOMWindow::focus()
186 {
187     if (!m_frame)
188         return;
189
190     m_frame->focusWindow();
191 }
192
193 void DOMWindow::blur()
194 {
195     if (!m_frame)
196         return;
197
198     m_frame->unfocusWindow();
199 }
200
201 void DOMWindow::close()
202 {
203     if (!m_frame)
204         return;
205
206     if (m_frame->loader()->openedByDOM() || m_frame->loader()->getHistoryLength() <= 1)
207         m_frame->scheduleClose();
208 }
209
210 void DOMWindow::print()
211 {
212     if (!m_frame)
213         return;
214
215     Page* page = m_frame->page();
216     if (!page)
217         return;
218
219     page->chrome()->print(m_frame);
220 }
221
222 void DOMWindow::stop()
223 {
224     if (!m_frame)
225         return;
226
227     m_frame->loader()->stopForUserCancel();
228 }
229
230 void DOMWindow::alert(const String& message)
231 {
232     if (!m_frame)
233         return;
234
235     Document* doc = m_frame->document();
236     ASSERT(doc);
237     if (doc)
238         doc->updateRendering();
239
240     Page* page = m_frame->page();
241     if (!page)
242         return;
243
244     page->chrome()->runJavaScriptAlert(m_frame, message);
245 }
246
247 bool DOMWindow::confirm(const String& message)
248 {
249     if (!m_frame)
250         return false;
251
252     Document* doc = m_frame->document();
253     ASSERT(doc);
254     if (doc)
255         doc->updateRendering();
256
257     Page* page = m_frame->page();
258     if (!page)
259         return false;
260
261     return page->chrome()->runJavaScriptConfirm(m_frame, message);
262 }
263
264 String DOMWindow::prompt(const String& message, const String& defaultValue)
265 {
266     if (!m_frame)
267         return String();
268
269     Document* doc = m_frame->document();
270     ASSERT(doc);
271     if (doc)
272         doc->updateRendering();
273
274     Page* page = m_frame->page();
275     if (!page)
276         return String();
277
278     String returnValue;
279     if (page->chrome()->runJavaScriptPrompt(m_frame, message, defaultValue, returnValue))
280         return returnValue;
281
282     return String();
283 }
284
285 bool DOMWindow::find(const String& string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const
286 {
287     if (!m_frame)
288         return false;
289
290     // FIXME (13016): Support wholeWord, searchInFrames and showDialog
291     return m_frame->findString(string, !backwards, caseSensitive, wrap, false);
292 }
293
294 bool DOMWindow::offscreenBuffering() const
295 {
296     return true;
297 }
298
299 int DOMWindow::outerHeight() const
300 {
301     if (!m_frame)
302         return 0;
303
304     Page* page = m_frame->page();
305     if (!page)
306         return 0;
307
308     return static_cast<int>(page->chrome()->windowRect().height());
309 }
310
311 int DOMWindow::outerWidth() const
312 {
313     if (!m_frame)
314         return 0;
315
316     Page* page = m_frame->page();
317     if (!page)
318         return 0;
319
320     return static_cast<int>(page->chrome()->windowRect().width());
321 }
322
323 int DOMWindow::innerHeight() const
324 {
325     if (!m_frame)
326         return 0;
327
328     FrameView* view = m_frame->view();
329     if (!view)
330         return 0;
331
332     return view->height();
333 }
334
335 int DOMWindow::innerWidth() const
336 {
337     if (!m_frame)
338         return 0;
339
340     FrameView* view = m_frame->view();
341     if (!view)
342         return 0;
343
344     return view->width();
345 }
346
347 int DOMWindow::screenX() const
348 {
349     if (!m_frame)
350         return 0;
351
352     Page* page = m_frame->page();
353     if (!page)
354         return 0;
355
356     return static_cast<int>(page->chrome()->windowRect().x());
357 }
358
359 int DOMWindow::screenY() const
360 {
361     if (!m_frame)
362         return 0;
363
364     Page* page = m_frame->page();
365     if (!page)
366         return 0;
367
368     return static_cast<int>(page->chrome()->windowRect().y());
369 }
370
371 int DOMWindow::scrollX() const
372 {
373     if (!m_frame)
374         return 0;
375
376     FrameView* view = m_frame->view();
377     if (!view)
378         return 0;
379
380     Document* doc = m_frame->document();
381     ASSERT(doc);
382     if (doc)
383         doc->updateLayoutIgnorePendingStylesheets();
384
385     return view->contentsX();
386 }
387
388 int DOMWindow::scrollY() const
389 {
390     if (!m_frame)
391         return 0;
392
393     FrameView* view = m_frame->view();
394     if (!view)
395         return 0;
396
397     Document* doc = m_frame->document();
398     ASSERT(doc);
399     if (doc)
400         doc->updateLayoutIgnorePendingStylesheets();
401
402     return view->contentsY();
403 }
404
405 bool DOMWindow::closed() const
406 {
407     return !m_frame;
408 }
409
410 unsigned DOMWindow::length() const
411 {
412     if (!m_frame)
413         return 0;
414
415     return m_frame->tree()->childCount();
416 }
417
418 String DOMWindow::name() const
419 {
420     if (!m_frame)
421         return String();
422
423     return m_frame->tree()->name();
424 }
425
426 void DOMWindow::setName(const String& string)
427 {
428     if (!m_frame)
429         return;
430
431     m_frame->tree()->setName(string);
432 }
433
434 String DOMWindow::status() const
435 {
436     if (!m_frame)
437         return String();
438
439     return m_frame->jsStatusBarText();
440 }
441
442 void DOMWindow::setStatus(const String& string)
443 {
444     if (!m_frame)
445         return;
446
447     m_frame->setJSStatusBarText(string);
448 }
449
450 String DOMWindow::defaultStatus() const
451 {
452     if (!m_frame)
453         return String();
454
455     return m_frame->jsDefaultStatusBarText();
456 }
457
458 void DOMWindow::setDefaultStatus(const String& string)
459 {
460     if (!m_frame)
461         return;
462
463     m_frame->setJSDefaultStatusBarText(string);
464 }
465
466 DOMWindow* DOMWindow::self() const
467 {
468     if (!m_frame)
469         return 0;
470
471     return m_frame->domWindow();
472 }
473
474 DOMWindow* DOMWindow::opener() const
475 {
476     if (!m_frame)
477         return 0;
478
479     Frame* opener = m_frame->loader()->opener();
480     if (!opener)
481         return 0;
482
483     return opener->domWindow();
484 }
485
486 DOMWindow* DOMWindow::parent() const
487 {
488     if (!m_frame)
489         return 0;
490
491     Frame* parent = m_frame->tree()->parent();
492     if (parent)
493         return parent->domWindow();
494
495     return m_frame->domWindow();
496 }
497
498 DOMWindow* DOMWindow::top() const
499 {
500     if (!m_frame)
501         return 0;
502
503     Page* page = m_frame->page();
504     if (!page)
505         return 0;
506
507     return page->mainFrame()->domWindow();
508 }
509
510 Document* DOMWindow::document() const
511 {
512     if (!m_frame)
513         return 0;
514
515     ASSERT(m_frame->document());
516     return m_frame->document();
517 }
518
519 PassRefPtr<CSSStyleDeclaration> DOMWindow::getComputedStyle(Element* elt, const String&) const
520 {
521     if (!elt)
522         return 0;
523
524     // FIXME: This needs to work with pseudo elements.
525     return new CSSComputedStyleDeclaration(elt);
526 }
527
528 PassRefPtr<CSSRuleList> DOMWindow::getMatchedCSSRules(Element* elt, const String& pseudoElt, bool authorOnly) const
529 {
530     if (!m_frame)
531         return 0;
532
533     Document* doc = m_frame->document();
534     ASSERT(doc);
535     if (!doc)
536         return 0;
537
538     if (!pseudoElt.isEmpty())
539         return doc->styleSelector()->pseudoStyleRulesForElement(elt, pseudoElt.impl(), authorOnly);
540     return doc->styleSelector()->styleRulesForElement(elt, authorOnly);
541 }
542
543 double DOMWindow::devicePixelRatio() const
544 {
545     if (!m_frame)
546         return 0.0;
547
548     Page* page = m_frame->page();
549     if (!page)
550         return 0.0;
551
552     return page->chrome()->scaleFactor();
553 }
554
555 } // namespace WebCore