| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 #include "wtf/text/WTFString.h" | 105 #include "wtf/text/WTFString.h" |
| 106 #include <algorithm> | 106 #include <algorithm> |
| 107 | 107 |
| 108 using std::min; | 108 using std::min; |
| 109 using std::max; | 109 using std::max; |
| 110 | 110 |
| 111 namespace WebCore { | 111 namespace WebCore { |
| 112 | 112 |
| 113 class PostMessageTimer FINAL : public SuspendableTimer { | 113 class PostMessageTimer FINAL : public SuspendableTimer { |
| 114 public: | 114 public: |
| 115 PostMessageTimer(DOMWindow* window, PassRefPtr<SerializedScriptValue> messag
e, const String& sourceOrigin, PassRefPtr<DOMWindow> source, PassOwnPtr<MessageP
ortChannelArray> channels, SecurityOrigin* targetOrigin, PassRefPtr<ScriptCallSt
ack> stackTrace) | 115 PostMessageTimer(DOMWindow& window, PassRefPtr<SerializedScriptValue> messag
e, const String& sourceOrigin, PassRefPtr<DOMWindow> source, PassOwnPtr<MessageP
ortChannelArray> channels, SecurityOrigin* targetOrigin, PassRefPtr<ScriptCallSt
ack> stackTrace) |
| 116 : SuspendableTimer(window->document()) | 116 : SuspendableTimer(window.document()) |
| 117 , m_window(window) | 117 , m_window(window) |
| 118 , m_message(message) | 118 , m_message(message) |
| 119 , m_origin(sourceOrigin) | 119 , m_origin(sourceOrigin) |
| 120 , m_source(source) | 120 , m_source(source) |
| 121 , m_channels(channels) | 121 , m_channels(channels) |
| 122 , m_targetOrigin(targetOrigin) | 122 , m_targetOrigin(targetOrigin) |
| 123 , m_stackTrace(stackTrace) | 123 , m_stackTrace(stackTrace) |
| 124 { | 124 { |
| 125 } | 125 } |
| 126 | 126 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 { | 245 { |
| 246 return windowsWithUnloadEventListeners().count(const_cast<DOMWindow*>(this))
; | 246 return windowsWithUnloadEventListeners().count(const_cast<DOMWindow*>(this))
; |
| 247 } | 247 } |
| 248 | 248 |
| 249 // This function: | 249 // This function: |
| 250 // 1) Validates the pending changes are not changing any value to NaN; in that c
ase keep original value. | 250 // 1) Validates the pending changes are not changing any value to NaN; in that c
ase keep original value. |
| 251 // 2) Constrains the window rect to the minimum window size and no bigger than t
he float rect's dimensions. | 251 // 2) Constrains the window rect to the minimum window size and no bigger than t
he float rect's dimensions. |
| 252 // 3) Constrains the window rect to within the top and left boundaries of the av
ailable screen rect. | 252 // 3) Constrains the window rect to within the top and left boundaries of the av
ailable screen rect. |
| 253 // 4) Constrains the window rect to within the bottom and right boundaries of th
e available screen rect. | 253 // 4) Constrains the window rect to within the bottom and right boundaries of th
e available screen rect. |
| 254 // 5) Translate the window rect coordinates to be within the coordinate space of
the screen. | 254 // 5) Translate the window rect coordinates to be within the coordinate space of
the screen. |
| 255 FloatRect DOMWindow::adjustWindowRect(LocalFrame* frame, const FloatRect& pendin
gChanges) | 255 FloatRect DOMWindow::adjustWindowRect(LocalFrame& frame, const FloatRect& pendin
gChanges) |
| 256 { | 256 { |
| 257 ASSERT(frame); | 257 FrameHost* host = frame.host(); |
| 258 FrameHost* host = frame->host(); | |
| 259 ASSERT(host); | 258 ASSERT(host); |
| 260 | 259 |
| 261 FloatRect screen = screenAvailableRect(frame->view()); | 260 FloatRect screen = screenAvailableRect(frame.view()); |
| 262 FloatRect window = host->chrome().windowRect(); | 261 FloatRect window = host->chrome().windowRect(); |
| 263 | 262 |
| 264 // Make sure we're in a valid state before adjusting dimensions. | 263 // Make sure we're in a valid state before adjusting dimensions. |
| 265 ASSERT(std::isfinite(screen.x())); | 264 ASSERT(std::isfinite(screen.x())); |
| 266 ASSERT(std::isfinite(screen.y())); | 265 ASSERT(std::isfinite(screen.y())); |
| 267 ASSERT(std::isfinite(screen.width())); | 266 ASSERT(std::isfinite(screen.width())); |
| 268 ASSERT(std::isfinite(screen.height())); | 267 ASSERT(std::isfinite(screen.height())); |
| 269 ASSERT(std::isfinite(window.x())); | 268 ASSERT(std::isfinite(window.x())); |
| 270 ASSERT(std::isfinite(window.y())); | 269 ASSERT(std::isfinite(window.y())); |
| 271 ASSERT(std::isfinite(window.width())); | 270 ASSERT(std::isfinite(window.width())); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 288 if (window.height()) | 287 if (window.height()) |
| 289 window.setHeight(min(max(minimumSize.height(), window.height()), screen.
height())); | 288 window.setHeight(min(max(minimumSize.height(), window.height()), screen.
height())); |
| 290 | 289 |
| 291 // Constrain the window position within the valid screen area. | 290 // Constrain the window position within the valid screen area. |
| 292 window.setX(max(screen.x(), min(window.x(), screen.maxX() - window.width()))
); | 291 window.setX(max(screen.x(), min(window.x(), screen.maxX() - window.width()))
); |
| 293 window.setY(max(screen.y(), min(window.y(), screen.maxY() - window.height())
)); | 292 window.setY(max(screen.y(), min(window.y(), screen.maxY() - window.height())
)); |
| 294 | 293 |
| 295 return window; | 294 return window; |
| 296 } | 295 } |
| 297 | 296 |
| 298 bool DOMWindow::allowPopUp(LocalFrame* firstFrame) | 297 bool DOMWindow::allowPopUp(LocalFrame& firstFrame) |
| 299 { | 298 { |
| 300 ASSERT(firstFrame); | |
| 301 | |
| 302 if (UserGestureIndicator::processingUserGesture()) | 299 if (UserGestureIndicator::processingUserGesture()) |
| 303 return true; | 300 return true; |
| 304 | 301 |
| 305 Settings* settings = firstFrame->settings(); | 302 Settings* settings = firstFrame.settings(); |
| 306 return settings && settings->javaScriptCanOpenWindowsAutomatically(); | 303 return settings && settings->javaScriptCanOpenWindowsAutomatically(); |
| 307 } | 304 } |
| 308 | 305 |
| 309 bool DOMWindow::allowPopUp() | 306 bool DOMWindow::allowPopUp() |
| 310 { | 307 { |
| 311 return m_frame && allowPopUp(m_frame); | 308 return m_frame && allowPopUp(*m_frame); |
| 312 } | 309 } |
| 313 | 310 |
| 314 DOMWindow::DOMWindow(LocalFrame* frame) | 311 DOMWindow::DOMWindow(LocalFrame& frame) |
| 315 : FrameDestructionObserver(frame) | 312 : FrameDestructionObserver(&frame) |
| 316 , m_shouldPrintWhenFinishedLoading(false) | 313 , m_shouldPrintWhenFinishedLoading(false) |
| 317 { | 314 { |
| 318 ASSERT(frame); | |
| 319 ScriptWrappable::init(this); | 315 ScriptWrappable::init(this); |
| 320 } | 316 } |
| 321 | 317 |
| 322 void DOMWindow::clearDocument() | 318 void DOMWindow::clearDocument() |
| 323 { | 319 { |
| 324 if (!m_document) | 320 if (!m_document) |
| 325 return; | 321 return; |
| 326 | 322 |
| 327 if (m_document->isActive()) { | 323 if (m_document->isActive()) { |
| 328 // FIXME: We don't call willRemove here. Why is that OK? | 324 // FIXME: We don't call willRemove here. Why is that OK? |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 { | 440 { |
| 445 enqueueWindowEvent(HashChangeEvent::create(oldURL, newURL)); | 441 enqueueWindowEvent(HashChangeEvent::create(oldURL, newURL)); |
| 446 } | 442 } |
| 447 | 443 |
| 448 void DOMWindow::enqueuePopstateEvent(PassRefPtr<SerializedScriptValue> stateObje
ct) | 444 void DOMWindow::enqueuePopstateEvent(PassRefPtr<SerializedScriptValue> stateObje
ct) |
| 449 { | 445 { |
| 450 if (!ContextFeatures::pushStateEnabled(document())) | 446 if (!ContextFeatures::pushStateEnabled(document())) |
| 451 return; | 447 return; |
| 452 | 448 |
| 453 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=36202 Popstate event needs
to fire asynchronously | 449 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=36202 Popstate event needs
to fire asynchronously |
| 454 dispatchEvent(PopStateEvent::create(stateObject, history())); | 450 dispatchEvent(PopStateEvent::create(stateObject, &history())); |
| 455 } | 451 } |
| 456 | 452 |
| 457 void DOMWindow::statePopped(PassRefPtr<SerializedScriptValue> stateObject) | 453 void DOMWindow::statePopped(PassRefPtr<SerializedScriptValue> stateObject) |
| 458 { | 454 { |
| 459 if (!frame()) | 455 if (!frame()) |
| 460 return; | 456 return; |
| 461 | 457 |
| 462 // Per step 11 of section 6.5.9 (history traversal) of the HTML5 spec, we | 458 // Per step 11 of section 6.5.9 (history traversal) of the HTML5 spec, we |
| 463 // defer firing of popstate until we're in the complete state. | 459 // defer firing of popstate until we're in the complete state. |
| 464 if (document()->isLoadCompleted()) | 460 if (document()->isLoadCompleted()) |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 int DOMWindow::orientation() const | 592 int DOMWindow::orientation() const |
| 597 { | 593 { |
| 598 ASSERT(RuntimeEnabledFeatures::orientationEventEnabled()); | 594 ASSERT(RuntimeEnabledFeatures::orientationEventEnabled()); |
| 599 | 595 |
| 600 if (!m_frame) | 596 if (!m_frame) |
| 601 return 0; | 597 return 0; |
| 602 | 598 |
| 603 return m_frame->orientation(); | 599 return m_frame->orientation(); |
| 604 } | 600 } |
| 605 | 601 |
| 606 Screen* DOMWindow::screen() const | 602 Screen& DOMWindow::screen() const |
| 607 { | 603 { |
| 608 if (!m_screen) | 604 if (!m_screen) |
| 609 m_screen = Screen::create(m_frame); | 605 m_screen = Screen::create(m_frame); |
| 610 return m_screen.get(); | 606 return *m_screen; |
| 611 } | 607 } |
| 612 | 608 |
| 613 History* DOMWindow::history() const | 609 History& DOMWindow::history() const |
| 614 { | 610 { |
| 615 if (!m_history) | 611 if (!m_history) |
| 616 m_history = History::create(m_frame); | 612 m_history = History::create(m_frame); |
| 617 return m_history.get(); | 613 return *m_history; |
| 618 } | 614 } |
| 619 | 615 |
| 620 BarProp* DOMWindow::locationbar() const | 616 BarProp& DOMWindow::locationbar() const |
| 621 { | 617 { |
| 622 UseCounter::count(document(), UseCounter::BarPropLocationbar); | 618 UseCounter::count(document(), UseCounter::BarPropLocationbar); |
| 623 if (!m_locationbar) | 619 if (!m_locationbar) |
| 624 m_locationbar = BarProp::create(m_frame, BarProp::Locationbar); | 620 m_locationbar = BarProp::create(m_frame, BarProp::Locationbar); |
| 625 return m_locationbar.get(); | 621 return *m_locationbar; |
| 626 } | 622 } |
| 627 | 623 |
| 628 BarProp* DOMWindow::menubar() const | 624 BarProp& DOMWindow::menubar() const |
| 629 { | 625 { |
| 630 UseCounter::count(document(), UseCounter::BarPropMenubar); | 626 UseCounter::count(document(), UseCounter::BarPropMenubar); |
| 631 if (!m_menubar) | 627 if (!m_menubar) |
| 632 m_menubar = BarProp::create(m_frame, BarProp::Menubar); | 628 m_menubar = BarProp::create(m_frame, BarProp::Menubar); |
| 633 return m_menubar.get(); | 629 return *m_menubar; |
| 634 } | 630 } |
| 635 | 631 |
| 636 BarProp* DOMWindow::personalbar() const | 632 BarProp& DOMWindow::personalbar() const |
| 637 { | 633 { |
| 638 UseCounter::count(document(), UseCounter::BarPropPersonalbar); | 634 UseCounter::count(document(), UseCounter::BarPropPersonalbar); |
| 639 if (!m_personalbar) | 635 if (!m_personalbar) |
| 640 m_personalbar = BarProp::create(m_frame, BarProp::Personalbar); | 636 m_personalbar = BarProp::create(m_frame, BarProp::Personalbar); |
| 641 return m_personalbar.get(); | 637 return *m_personalbar; |
| 642 } | 638 } |
| 643 | 639 |
| 644 BarProp* DOMWindow::scrollbars() const | 640 BarProp& DOMWindow::scrollbars() const |
| 645 { | 641 { |
| 646 UseCounter::count(document(), UseCounter::BarPropScrollbars); | 642 UseCounter::count(document(), UseCounter::BarPropScrollbars); |
| 647 if (!m_scrollbars) | 643 if (!m_scrollbars) |
| 648 m_scrollbars = BarProp::create(m_frame, BarProp::Scrollbars); | 644 m_scrollbars = BarProp::create(m_frame, BarProp::Scrollbars); |
| 649 return m_scrollbars.get(); | 645 return *m_scrollbars; |
| 650 } | 646 } |
| 651 | 647 |
| 652 BarProp* DOMWindow::statusbar() const | 648 BarProp& DOMWindow::statusbar() const |
| 653 { | 649 { |
| 654 UseCounter::count(document(), UseCounter::BarPropStatusbar); | 650 UseCounter::count(document(), UseCounter::BarPropStatusbar); |
| 655 if (!m_statusbar) | 651 if (!m_statusbar) |
| 656 m_statusbar = BarProp::create(m_frame, BarProp::Statusbar); | 652 m_statusbar = BarProp::create(m_frame, BarProp::Statusbar); |
| 657 return m_statusbar.get(); | 653 return *m_statusbar; |
| 658 } | 654 } |
| 659 | 655 |
| 660 BarProp* DOMWindow::toolbar() const | 656 BarProp& DOMWindow::toolbar() const |
| 661 { | 657 { |
| 662 UseCounter::count(document(), UseCounter::BarPropToolbar); | 658 UseCounter::count(document(), UseCounter::BarPropToolbar); |
| 663 if (!m_toolbar) | 659 if (!m_toolbar) |
| 664 m_toolbar = BarProp::create(m_frame, BarProp::Toolbar); | 660 m_toolbar = BarProp::create(m_frame, BarProp::Toolbar); |
| 665 return m_toolbar.get(); | 661 return *m_toolbar; |
| 666 } | 662 } |
| 667 | 663 |
| 668 Console* DOMWindow::console() const | 664 Console& DOMWindow::console() const |
| 669 { | 665 { |
| 670 if (!m_console) | 666 if (!m_console) |
| 671 m_console = Console::create(m_frame); | 667 m_console = Console::create(m_frame); |
| 672 return m_console.get(); | 668 return *m_console; |
| 673 } | 669 } |
| 674 | 670 |
| 675 PageConsole* DOMWindow::pageConsole() const | 671 PageConsole* DOMWindow::pageConsole() const |
| 676 { | 672 { |
| 677 if (!isCurrentlyDisplayedInFrame()) | 673 if (!isCurrentlyDisplayedInFrame()) |
| 678 return 0; | 674 return 0; |
| 679 return m_frame->host() ? &m_frame->host()->console() : 0; | 675 return m_frame->host() ? &m_frame->host()->console() : 0; |
| 680 } | 676 } |
| 681 | 677 |
| 682 ApplicationCache* DOMWindow::applicationCache() const | 678 ApplicationCache* DOMWindow::applicationCache() const |
| 683 { | 679 { |
| 684 if (!isCurrentlyDisplayedInFrame()) | 680 if (!isCurrentlyDisplayedInFrame()) |
| 685 return 0; | 681 return 0; |
| 686 if (!m_applicationCache) | 682 if (!m_applicationCache) |
| 687 m_applicationCache = ApplicationCache::create(m_frame); | 683 m_applicationCache = ApplicationCache::create(m_frame); |
| 688 return m_applicationCache.get(); | 684 return m_applicationCache.get(); |
| 689 } | 685 } |
| 690 | 686 |
| 691 Navigator* DOMWindow::navigator() const | 687 Navigator& DOMWindow::navigator() const |
| 692 { | 688 { |
| 693 if (!m_navigator) | 689 if (!m_navigator) |
| 694 m_navigator = Navigator::create(m_frame); | 690 m_navigator = Navigator::create(m_frame); |
| 695 return m_navigator.get(); | 691 return *m_navigator; |
| 696 } | 692 } |
| 697 | 693 |
| 698 Performance* DOMWindow::performance() const | 694 Performance& DOMWindow::performance() const |
| 699 { | 695 { |
| 700 if (!m_performance) | 696 if (!m_performance) |
| 701 m_performance = Performance::create(m_frame); | 697 m_performance = Performance::create(m_frame); |
| 702 return m_performance.get(); | 698 return *m_performance; |
| 703 } | 699 } |
| 704 | 700 |
| 705 Location* DOMWindow::location() const | 701 Location& DOMWindow::location() const |
| 706 { | 702 { |
| 707 if (!m_location) | 703 if (!m_location) |
| 708 m_location = Location::create(m_frame); | 704 m_location = Location::create(m_frame); |
| 709 return m_location.get(); | 705 return *m_location; |
| 710 } | 706 } |
| 711 | 707 |
| 712 Storage* DOMWindow::sessionStorage(ExceptionState& exceptionState) const | 708 Storage* DOMWindow::sessionStorage(ExceptionState& exceptionState) const |
| 713 { | 709 { |
| 714 if (!isCurrentlyDisplayedInFrame()) | 710 if (!isCurrentlyDisplayedInFrame()) |
| 715 return 0; | 711 return 0; |
| 716 | 712 |
| 717 Document* document = this->document(); | 713 Document* document = this->document(); |
| 718 if (!document) | 714 if (!document) |
| 719 return 0; | 715 return 0; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 827 if (!sourceDocument) | 823 if (!sourceDocument) |
| 828 return; | 824 return; |
| 829 String sourceOrigin = sourceDocument->securityOrigin()->toString(); | 825 String sourceOrigin = sourceDocument->securityOrigin()->toString(); |
| 830 | 826 |
| 831 // Capture stack trace only when inspector front-end is loaded as it may be
time consuming. | 827 // Capture stack trace only when inspector front-end is loaded as it may be
time consuming. |
| 832 RefPtr<ScriptCallStack> stackTrace; | 828 RefPtr<ScriptCallStack> stackTrace; |
| 833 if (InspectorInstrumentation::consoleAgentEnabled(sourceDocument)) | 829 if (InspectorInstrumentation::consoleAgentEnabled(sourceDocument)) |
| 834 stackTrace = createScriptCallStack(ScriptCallStack::maxCallStackSizeToCa
pture, true); | 830 stackTrace = createScriptCallStack(ScriptCallStack::maxCallStackSizeToCa
pture, true); |
| 835 | 831 |
| 836 // Schedule the message. | 832 // Schedule the message. |
| 837 PostMessageTimer* timer = new PostMessageTimer(this, message, sourceOrigin,
source, channels.release(), target.get(), stackTrace.release()); | 833 PostMessageTimer* timer = new PostMessageTimer(*this, message, sourceOrigin,
source, channels.release(), target.get(), stackTrace.release()); |
| 838 timer->startOneShot(0); | 834 timer->startOneShot(0); |
| 839 timer->suspendIfNeeded(); | 835 timer->suspendIfNeeded(); |
| 840 } | 836 } |
| 841 | 837 |
| 842 void DOMWindow::postMessageTimerFired(PassOwnPtr<PostMessageTimer> t) | 838 void DOMWindow::postMessageTimerFired(PassOwnPtr<PostMessageTimer> t) |
| 843 { | 839 { |
| 844 OwnPtr<PostMessageTimer> timer(t); | 840 OwnPtr<PostMessageTimer> timer(t); |
| 845 | 841 |
| 846 if (!isCurrentlyDisplayedInFrame()) | 842 if (!isCurrentlyDisplayedInFrame()) |
| 847 return; | 843 return; |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1258 return 0; | 1254 return 0; |
| 1259 | 1255 |
| 1260 return m_frame->tree().top()->domWindow(); | 1256 return m_frame->tree().top()->domWindow(); |
| 1261 } | 1257 } |
| 1262 | 1258 |
| 1263 Document* DOMWindow::document() const | 1259 Document* DOMWindow::document() const |
| 1264 { | 1260 { |
| 1265 return m_document.get(); | 1261 return m_document.get(); |
| 1266 } | 1262 } |
| 1267 | 1263 |
| 1268 PassRefPtr<StyleMedia> DOMWindow::styleMedia() const | 1264 StyleMedia& DOMWindow::styleMedia() const |
| 1269 { | 1265 { |
| 1270 if (!m_media) | 1266 if (!m_media) |
| 1271 m_media = StyleMedia::create(m_frame); | 1267 m_media = StyleMedia::create(m_frame); |
| 1272 return m_media.get(); | 1268 return *m_media; |
| 1273 } | 1269 } |
| 1274 | 1270 |
| 1275 PassRefPtr<CSSStyleDeclaration> DOMWindow::getComputedStyle(Element* elt, const
String& pseudoElt) const | 1271 PassRefPtr<CSSStyleDeclaration> DOMWindow::getComputedStyle(Element* elt, const
String& pseudoElt) const |
| 1276 { | 1272 { |
| 1277 if (!elt) | 1273 if (!elt) |
| 1278 return nullptr; | 1274 return nullptr; |
| 1279 | 1275 |
| 1280 return CSSComputedStyleDeclaration::create(elt, false, pseudoElt); | 1276 return CSSComputedStyleDeclaration::create(elt, false, pseudoElt); |
| 1281 } | 1277 } |
| 1282 | 1278 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1397 if (!m_frame || !m_frame->isMainFrame()) | 1393 if (!m_frame || !m_frame->isMainFrame()) |
| 1398 return; | 1394 return; |
| 1399 | 1395 |
| 1400 FrameHost* host = m_frame->host(); | 1396 FrameHost* host = m_frame->host(); |
| 1401 if (!host) | 1397 if (!host) |
| 1402 return; | 1398 return; |
| 1403 | 1399 |
| 1404 FloatRect windowRect = host->chrome().windowRect(); | 1400 FloatRect windowRect = host->chrome().windowRect(); |
| 1405 windowRect.move(x, y); | 1401 windowRect.move(x, y); |
| 1406 // Security check (the spec talks about UniversalBrowserWrite to disable thi
s check...) | 1402 // Security check (the spec talks about UniversalBrowserWrite to disable thi
s check...) |
| 1407 host->chrome().setWindowRect(adjustWindowRect(m_frame, windowRect)); | 1403 host->chrome().setWindowRect(adjustWindowRect(*m_frame, windowRect)); |
| 1408 } | 1404 } |
| 1409 | 1405 |
| 1410 void DOMWindow::moveTo(float x, float y) const | 1406 void DOMWindow::moveTo(float x, float y) const |
| 1411 { | 1407 { |
| 1412 if (!m_frame || !m_frame->isMainFrame()) | 1408 if (!m_frame || !m_frame->isMainFrame()) |
| 1413 return; | 1409 return; |
| 1414 | 1410 |
| 1415 FrameHost* host = m_frame->host(); | 1411 FrameHost* host = m_frame->host(); |
| 1416 if (!host) | 1412 if (!host) |
| 1417 return; | 1413 return; |
| 1418 | 1414 |
| 1419 FloatRect windowRect = host->chrome().windowRect(); | 1415 FloatRect windowRect = host->chrome().windowRect(); |
| 1420 windowRect.setLocation(FloatPoint(x, y)); | 1416 windowRect.setLocation(FloatPoint(x, y)); |
| 1421 // Security check (the spec talks about UniversalBrowserWrite to disable thi
s check...) | 1417 // Security check (the spec talks about UniversalBrowserWrite to disable thi
s check...) |
| 1422 host->chrome().setWindowRect(adjustWindowRect(m_frame, windowRect)); | 1418 host->chrome().setWindowRect(adjustWindowRect(*m_frame, windowRect)); |
| 1423 } | 1419 } |
| 1424 | 1420 |
| 1425 void DOMWindow::resizeBy(float x, float y) const | 1421 void DOMWindow::resizeBy(float x, float y) const |
| 1426 { | 1422 { |
| 1427 if (!m_frame || !m_frame->isMainFrame()) | 1423 if (!m_frame || !m_frame->isMainFrame()) |
| 1428 return; | 1424 return; |
| 1429 | 1425 |
| 1430 FrameHost* host = m_frame->host(); | 1426 FrameHost* host = m_frame->host(); |
| 1431 if (!host) | 1427 if (!host) |
| 1432 return; | 1428 return; |
| 1433 | 1429 |
| 1434 FloatRect fr = host->chrome().windowRect(); | 1430 FloatRect fr = host->chrome().windowRect(); |
| 1435 FloatSize dest = fr.size() + FloatSize(x, y); | 1431 FloatSize dest = fr.size() + FloatSize(x, y); |
| 1436 FloatRect update(fr.location(), dest); | 1432 FloatRect update(fr.location(), dest); |
| 1437 host->chrome().setWindowRect(adjustWindowRect(m_frame, update)); | 1433 host->chrome().setWindowRect(adjustWindowRect(*m_frame, update)); |
| 1438 } | 1434 } |
| 1439 | 1435 |
| 1440 void DOMWindow::resizeTo(float width, float height) const | 1436 void DOMWindow::resizeTo(float width, float height) const |
| 1441 { | 1437 { |
| 1442 if (!m_frame || !m_frame->isMainFrame()) | 1438 if (!m_frame || !m_frame->isMainFrame()) |
| 1443 return; | 1439 return; |
| 1444 | 1440 |
| 1445 FrameHost* host = m_frame->host(); | 1441 FrameHost* host = m_frame->host(); |
| 1446 if (!host) | 1442 if (!host) |
| 1447 return; | 1443 return; |
| 1448 | 1444 |
| 1449 FloatRect fr = host->chrome().windowRect(); | 1445 FloatRect fr = host->chrome().windowRect(); |
| 1450 FloatSize dest = FloatSize(width, height); | 1446 FloatSize dest = FloatSize(width, height); |
| 1451 FloatRect update(fr.location(), dest); | 1447 FloatRect update(fr.location(), dest); |
| 1452 host->chrome().setWindowRect(adjustWindowRect(m_frame, update)); | 1448 host->chrome().setWindowRect(adjustWindowRect(*m_frame, update)); |
| 1453 } | 1449 } |
| 1454 | 1450 |
| 1455 int DOMWindow::requestAnimationFrame(PassOwnPtr<RequestAnimationFrameCallback> c
allback) | 1451 int DOMWindow::requestAnimationFrame(PassOwnPtr<RequestAnimationFrameCallback> c
allback) |
| 1456 { | 1452 { |
| 1457 callback->m_useLegacyTimeBase = false; | 1453 callback->m_useLegacyTimeBase = false; |
| 1458 if (Document* d = document()) | 1454 if (Document* d = document()) |
| 1459 return d->requestAnimationFrame(callback); | 1455 return d->requestAnimationFrame(callback); |
| 1460 return 0; | 1456 return 0; |
| 1461 } | 1457 } |
| 1462 | 1458 |
| 1463 int DOMWindow::webkitRequestAnimationFrame(PassOwnPtr<RequestAnimationFrameCallb
ack> callback) | 1459 int DOMWindow::webkitRequestAnimationFrame(PassOwnPtr<RequestAnimationFrameCallb
ack> callback) |
| 1464 { | 1460 { |
| 1465 callback->m_useLegacyTimeBase = true; | 1461 callback->m_useLegacyTimeBase = true; |
| 1466 if (Document* d = document()) | 1462 if (Document* d = document()) |
| 1467 return d->requestAnimationFrame(callback); | 1463 return d->requestAnimationFrame(callback); |
| 1468 return 0; | 1464 return 0; |
| 1469 } | 1465 } |
| 1470 | 1466 |
| 1471 void DOMWindow::cancelAnimationFrame(int id) | 1467 void DOMWindow::cancelAnimationFrame(int id) |
| 1472 { | 1468 { |
| 1473 if (Document* d = document()) | 1469 if (Document* d = document()) |
| 1474 d->cancelAnimationFrame(id); | 1470 d->cancelAnimationFrame(id); |
| 1475 } | 1471 } |
| 1476 | 1472 |
| 1477 DOMWindowCSS* DOMWindow::css() | 1473 DOMWindowCSS& DOMWindow::css() const |
| 1478 { | 1474 { |
| 1479 if (!m_css) | 1475 if (!m_css) |
| 1480 m_css = DOMWindowCSS::create(); | 1476 m_css = DOMWindowCSS::create(); |
| 1481 return m_css.get(); | 1477 return *m_css; |
| 1482 } | 1478 } |
| 1483 | 1479 |
| 1484 static void didAddStorageEventListener(DOMWindow* window) | 1480 static void didAddStorageEventListener(DOMWindow* window) |
| 1485 { | 1481 { |
| 1486 // Creating these WebCore::Storage objects informs the system that we'd like
to receive | 1482 // Creating these WebCore::Storage objects informs the system that we'd like
to receive |
| 1487 // notifications about storage events that might be triggered in other proce
sses. Rather | 1483 // notifications about storage events that might be triggered in other proce
sses. Rather |
| 1488 // than subscribe to these notifications explicitly, we subscribe to them im
plicitly to | 1484 // than subscribe to these notifications explicitly, we subscribe to them im
plicitly to |
| 1489 // simplify the work done by the system. | 1485 // simplify the work done by the system. |
| 1490 window->localStorage(IGNORE_EXCEPTION); | 1486 window->localStorage(IGNORE_EXCEPTION); |
| 1491 window->sessionStorage(IGNORE_EXCEPTION); | 1487 window->sessionStorage(IGNORE_EXCEPTION); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1624 return; | 1620 return; |
| 1625 | 1621 |
| 1626 LocalFrame* firstFrame = enteredWindow->frame(); | 1622 LocalFrame* firstFrame = enteredWindow->frame(); |
| 1627 if (!firstFrame) | 1623 if (!firstFrame) |
| 1628 return; | 1624 return; |
| 1629 | 1625 |
| 1630 KURL completedURL = firstFrame->document()->completeURL(urlString); | 1626 KURL completedURL = firstFrame->document()->completeURL(urlString); |
| 1631 if (completedURL.isNull()) | 1627 if (completedURL.isNull()) |
| 1632 return; | 1628 return; |
| 1633 | 1629 |
| 1634 if (isInsecureScriptAccess(callingWindow, completedURL)) | 1630 if (isInsecureScriptAccess(*callingWindow, completedURL)) |
| 1635 return; | 1631 return; |
| 1636 | 1632 |
| 1637 // We want a new history item if we are processing a user gesture. | 1633 // We want a new history item if we are processing a user gesture. |
| 1638 m_frame->navigationScheduler().scheduleLocationChange(activeDocument, | 1634 m_frame->navigationScheduler().scheduleLocationChange(activeDocument, |
| 1639 // FIXME: What if activeDocument()->frame() is 0? | 1635 // FIXME: What if activeDocument()->frame() is 0? |
| 1640 completedURL, Referrer(activeDocument->outgoingReferrer(), activeDocumen
t->referrerPolicy()), | 1636 completedURL, Referrer(activeDocument->outgoingReferrer(), activeDocumen
t->referrerPolicy()), |
| 1641 locking != LockHistoryBasedOnGestureState); | 1637 locking != LockHistoryBasedOnGestureState); |
| 1642 } | 1638 } |
| 1643 | 1639 |
| 1644 void DOMWindow::printErrorMessage(const String& message) | 1640 void DOMWindow::printErrorMessage(const String& message) |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1710 return message + "The frame requesting access set \"document.domain\" to
\"" + activeOrigin->domain() + "\", the frame being accessed set it to \"" + ta
rgetOrigin->domain() + "\". Both must set \"document.domain\" to the same value
to allow access."; | 1706 return message + "The frame requesting access set \"document.domain\" to
\"" + activeOrigin->domain() + "\", the frame being accessed set it to \"" + ta
rgetOrigin->domain() + "\". Both must set \"document.domain\" to the same value
to allow access."; |
| 1711 if (activeOrigin->domainWasSetInDOM()) | 1707 if (activeOrigin->domainWasSetInDOM()) |
| 1712 return message + "The frame requesting access set \"document.domain\" to
\"" + activeOrigin->domain() + "\", but the frame being accessed did not. Both
must set \"document.domain\" to the same value to allow access."; | 1708 return message + "The frame requesting access set \"document.domain\" to
\"" + activeOrigin->domain() + "\", but the frame being accessed did not. Both
must set \"document.domain\" to the same value to allow access."; |
| 1713 if (targetOrigin->domainWasSetInDOM()) | 1709 if (targetOrigin->domainWasSetInDOM()) |
| 1714 return message + "The frame being accessed set \"document.domain\" to \"
" + targetOrigin->domain() + "\", but the frame requesting access did not. Both
must set \"document.domain\" to the same value to allow access."; | 1710 return message + "The frame being accessed set \"document.domain\" to \"
" + targetOrigin->domain() + "\", but the frame requesting access did not. Both
must set \"document.domain\" to the same value to allow access."; |
| 1715 | 1711 |
| 1716 // Default. | 1712 // Default. |
| 1717 return message + "Protocols, domains, and ports must match."; | 1713 return message + "Protocols, domains, and ports must match."; |
| 1718 } | 1714 } |
| 1719 | 1715 |
| 1720 bool DOMWindow::isInsecureScriptAccess(DOMWindow* callingWindow, const String& u
rlString) | 1716 bool DOMWindow::isInsecureScriptAccess(DOMWindow& callingWindow, const String& u
rlString) |
| 1721 { | 1717 { |
| 1722 if (!protocolIsJavaScript(urlString)) | 1718 if (!protocolIsJavaScript(urlString)) |
| 1723 return false; | 1719 return false; |
| 1724 | 1720 |
| 1725 // If this DOMWindow isn't currently active in the LocalFrame, then there's
no | 1721 // If this DOMWindow isn't currently active in the LocalFrame, then there's
no |
| 1726 // way we should allow the access. | 1722 // way we should allow the access. |
| 1727 // FIXME: Remove this check if we're able to disconnect DOMWindow from | 1723 // FIXME: Remove this check if we're able to disconnect DOMWindow from |
| 1728 // LocalFrame on navigation: https://bugs.webkit.org/show_bug.cgi?id=62054 | 1724 // LocalFrame on navigation: https://bugs.webkit.org/show_bug.cgi?id=62054 |
| 1729 if (isCurrentlyDisplayedInFrame()) { | 1725 if (isCurrentlyDisplayedInFrame()) { |
| 1730 // FIXME: Is there some way to eliminate the need for a separate "callin
gWindow == this" check? | 1726 // FIXME: Is there some way to eliminate the need for a separate "callin
gWindow == this" check? |
| 1731 if (callingWindow == this) | 1727 if (&callingWindow == this) |
| 1732 return false; | 1728 return false; |
| 1733 | 1729 |
| 1734 // FIXME: The name canAccess seems to be a roundabout way to ask "can ex
ecute script". | 1730 // FIXME: The name canAccess seems to be a roundabout way to ask "can ex
ecute script". |
| 1735 // Can we name the SecurityOrigin function better to make this more clea
r? | 1731 // Can we name the SecurityOrigin function better to make this more clea
r? |
| 1736 if (callingWindow->document()->securityOrigin()->canAccess(document()->s
ecurityOrigin())) | 1732 if (callingWindow.document()->securityOrigin()->canAccess(document()->se
curityOrigin())) |
| 1737 return false; | 1733 return false; |
| 1738 } | 1734 } |
| 1739 | 1735 |
| 1740 printErrorMessage(crossDomainAccessErrorMessage(callingWindow)); | 1736 printErrorMessage(crossDomainAccessErrorMessage(&callingWindow)); |
| 1741 return true; | 1737 return true; |
| 1742 } | 1738 } |
| 1743 | 1739 |
| 1744 PassRefPtr<DOMWindow> DOMWindow::open(const String& urlString, const AtomicStrin
g& frameName, const String& windowFeaturesString, | 1740 PassRefPtr<DOMWindow> DOMWindow::open(const String& urlString, const AtomicStrin
g& frameName, const String& windowFeaturesString, |
| 1745 DOMWindow* callingWindow, DOMWindow* enteredWindow) | 1741 DOMWindow* callingWindow, DOMWindow* enteredWindow) |
| 1746 { | 1742 { |
| 1747 if (!isCurrentlyDisplayedInFrame()) | 1743 if (!isCurrentlyDisplayedInFrame()) |
| 1748 return nullptr; | 1744 return nullptr; |
| 1749 Document* activeDocument = callingWindow->document(); | 1745 Document* activeDocument = callingWindow->document(); |
| 1750 if (!activeDocument) | 1746 if (!activeDocument) |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1770 targetFrame = parent; | 1766 targetFrame = parent; |
| 1771 else | 1767 else |
| 1772 targetFrame = m_frame; | 1768 targetFrame = m_frame; |
| 1773 } | 1769 } |
| 1774 if (targetFrame) { | 1770 if (targetFrame) { |
| 1775 if (!activeDocument->canNavigate(targetFrame)) | 1771 if (!activeDocument->canNavigate(targetFrame)) |
| 1776 return nullptr; | 1772 return nullptr; |
| 1777 | 1773 |
| 1778 KURL completedURL = firstFrame->document()->completeURL(urlString); | 1774 KURL completedURL = firstFrame->document()->completeURL(urlString); |
| 1779 | 1775 |
| 1780 if (targetFrame->domWindow()->isInsecureScriptAccess(callingWindow, comp
letedURL)) | 1776 if (targetFrame->domWindow()->isInsecureScriptAccess(*callingWindow, com
pletedURL)) |
| 1781 return targetFrame->domWindow(); | 1777 return targetFrame->domWindow(); |
| 1782 | 1778 |
| 1783 if (urlString.isEmpty()) | 1779 if (urlString.isEmpty()) |
| 1784 return targetFrame->domWindow(); | 1780 return targetFrame->domWindow(); |
| 1785 | 1781 |
| 1786 // For whatever reason, Firefox uses the first window rather than the ac
tive window to | 1782 // For whatever reason, Firefox uses the first window rather than the ac
tive window to |
| 1787 // determine the outgoing referrer. We replicate that behavior here. | 1783 // determine the outgoing referrer. We replicate that behavior here. |
| 1788 targetFrame->navigationScheduler().scheduleLocationChange( | 1784 targetFrame->navigationScheduler().scheduleLocationChange( |
| 1789 activeDocument, | 1785 activeDocument, |
| 1790 completedURL, | 1786 completedURL, |
| 1791 Referrer(firstFrame->document()->outgoingReferrer(), firstFrame->doc
ument()->referrerPolicy()), | 1787 Referrer(firstFrame->document()->outgoingReferrer(), firstFrame->doc
ument()->referrerPolicy()), |
| 1792 false); | 1788 false); |
| 1793 return targetFrame->domWindow(); | 1789 return targetFrame->domWindow(); |
| 1794 } | 1790 } |
| 1795 | 1791 |
| 1796 WindowFeatures windowFeatures(windowFeaturesString); | 1792 WindowFeatures windowFeatures(windowFeaturesString); |
| 1797 LocalFrame* result = createWindow(urlString, frameName, windowFeatures, call
ingWindow, firstFrame, m_frame); | 1793 LocalFrame* result = createWindow(urlString, frameName, windowFeatures, *cal
lingWindow, *firstFrame, *m_frame); |
| 1798 return result ? result->domWindow() : 0; | 1794 return result ? result->domWindow() : 0; |
| 1799 } | 1795 } |
| 1800 | 1796 |
| 1801 DOMWindow* DOMWindow::anonymousIndexedGetter(uint32_t index) | 1797 DOMWindow* DOMWindow::anonymousIndexedGetter(uint32_t index) |
| 1802 { | 1798 { |
| 1803 LocalFrame* frame = this->frame(); | 1799 LocalFrame* frame = this->frame(); |
| 1804 if (!frame) | 1800 if (!frame) |
| 1805 return 0; | 1801 return 0; |
| 1806 | 1802 |
| 1807 LocalFrame* child = frame->tree().scopedChild(index); | 1803 LocalFrame* child = frame->tree().scopedChild(index); |
| 1808 if (child) | 1804 if (child) |
| 1809 return child->domWindow(); | 1805 return child->domWindow(); |
| 1810 | 1806 |
| 1811 return 0; | 1807 return 0; |
| 1812 } | 1808 } |
| 1813 | 1809 |
| 1814 DOMWindowLifecycleNotifier& DOMWindow::lifecycleNotifier() | 1810 DOMWindowLifecycleNotifier& DOMWindow::lifecycleNotifier() |
| 1815 { | 1811 { |
| 1816 return static_cast<DOMWindowLifecycleNotifier&>(LifecycleContext<DOMWindow>:
:lifecycleNotifier()); | 1812 return static_cast<DOMWindowLifecycleNotifier&>(LifecycleContext<DOMWindow>:
:lifecycleNotifier()); |
| 1817 } | 1813 } |
| 1818 | 1814 |
| 1819 PassOwnPtr<LifecycleNotifier<DOMWindow> > DOMWindow::createLifecycleNotifier() | 1815 PassOwnPtr<LifecycleNotifier<DOMWindow> > DOMWindow::createLifecycleNotifier() |
| 1820 { | 1816 { |
| 1821 return DOMWindowLifecycleNotifier::create(this); | 1817 return DOMWindowLifecycleNotifier::create(this); |
| 1822 } | 1818 } |
| 1823 | 1819 |
| 1824 | 1820 |
| 1825 } // namespace WebCore | 1821 } // namespace WebCore |
| OLD | NEW |