| 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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 #include "core/page/CreateWindow.h" | 71 #include "core/page/CreateWindow.h" |
| 72 #include "core/page/Page.h" | 72 #include "core/page/Page.h" |
| 73 #include "core/page/WindowFeatures.h" | 73 #include "core/page/WindowFeatures.h" |
| 74 #include "core/page/scrolling/ScrollingCoordinator.h" | 74 #include "core/page/scrolling/ScrollingCoordinator.h" |
| 75 #include "platform/EventDispatchForbiddenScope.h" | 75 #include "platform/EventDispatchForbiddenScope.h" |
| 76 #include "platform/weborigin/SecurityOrigin.h" | 76 #include "platform/weborigin/SecurityOrigin.h" |
| 77 #include "platform/weborigin/Suborigin.h" | 77 #include "platform/weborigin/Suborigin.h" |
| 78 #include "public/platform/Platform.h" | 78 #include "public/platform/Platform.h" |
| 79 #include "public/platform/WebFrameScheduler.h" | 79 #include "public/platform/WebFrameScheduler.h" |
| 80 #include "public/platform/WebScreenInfo.h" | 80 #include "public/platform/WebScreenInfo.h" |
| 81 #include "wtf/PassOwnPtr.h" | 81 #include <memory> |
| 82 | 82 |
| 83 namespace blink { | 83 namespace blink { |
| 84 | 84 |
| 85 // Rather than simply inheriting LocalFrameLifecycleObserver like most other | 85 // Rather than simply inheriting LocalFrameLifecycleObserver like most other |
| 86 // classes, LocalDOMWindow hides its LocalFrameLifecycleObserver with | 86 // classes, LocalDOMWindow hides its LocalFrameLifecycleObserver with |
| 87 // composition. This prevents conflicting overloads between DOMWindow, which | 87 // composition. This prevents conflicting overloads between DOMWindow, which |
| 88 // has a frame() accessor that returns Frame* for bindings code, and | 88 // has a frame() accessor that returns Frame* for bindings code, and |
| 89 // LocalFrameLifecycleObserver, which has a frame() accessor that returns a | 89 // LocalFrameLifecycleObserver, which has a frame() accessor that returns a |
| 90 // LocalFrame*. | 90 // LocalFrame*. |
| 91 class LocalDOMWindow::WindowFrameObserver final : public GarbageCollected<LocalD
OMWindow::WindowFrameObserver>, public LocalFrameLifecycleObserver { | 91 class LocalDOMWindow::WindowFrameObserver final : public GarbageCollected<LocalD
OMWindow::WindowFrameObserver>, public LocalFrameLifecycleObserver { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 120 , m_window(window) | 120 , m_window(window) |
| 121 { | 121 { |
| 122 } | 122 } |
| 123 | 123 |
| 124 Member<LocalDOMWindow> m_window; | 124 Member<LocalDOMWindow> m_window; |
| 125 }; | 125 }; |
| 126 | 126 |
| 127 class PostMessageTimer final : public GarbageCollectedFinalized<PostMessageTimer
>, public SuspendableTimer { | 127 class PostMessageTimer final : public GarbageCollectedFinalized<PostMessageTimer
>, public SuspendableTimer { |
| 128 USING_GARBAGE_COLLECTED_MIXIN(PostMessageTimer); | 128 USING_GARBAGE_COLLECTED_MIXIN(PostMessageTimer); |
| 129 public: | 129 public: |
| 130 PostMessageTimer(LocalDOMWindow& window, MessageEvent* event, PassRefPtr<Sec
urityOrigin> targetOrigin, PassOwnPtr<SourceLocation> location, UserGestureToken
* userGestureToken) | 130 PostMessageTimer(LocalDOMWindow& window, MessageEvent* event, PassRefPtr<Sec
urityOrigin> targetOrigin, std::unique_ptr<SourceLocation> location, UserGesture
Token* userGestureToken) |
| 131 : SuspendableTimer(window.document()) | 131 : SuspendableTimer(window.document()) |
| 132 , m_event(event) | 132 , m_event(event) |
| 133 , m_window(&window) | 133 , m_window(&window) |
| 134 , m_targetOrigin(targetOrigin) | 134 , m_targetOrigin(targetOrigin) |
| 135 , m_location(std::move(location)) | 135 , m_location(std::move(location)) |
| 136 , m_userGestureToken(userGestureToken) | 136 , m_userGestureToken(userGestureToken) |
| 137 , m_disposalAllowed(true) | 137 , m_disposalAllowed(true) |
| 138 { | 138 { |
| 139 InspectorInstrumentation::asyncTaskScheduled(window.document(), "postMes
sage", this); | 139 InspectorInstrumentation::asyncTaskScheduled(window.document(), "postMes
sage", this); |
| 140 } | 140 } |
| 141 | 141 |
| 142 MessageEvent* event() const { return m_event; } | 142 MessageEvent* event() const { return m_event; } |
| 143 SecurityOrigin* targetOrigin() const { return m_targetOrigin.get(); } | 143 SecurityOrigin* targetOrigin() const { return m_targetOrigin.get(); } |
| 144 PassOwnPtr<SourceLocation> takeLocation() { return std::move(m_location); } | 144 std::unique_ptr<SourceLocation> takeLocation() { return std::move(m_location
); } |
| 145 UserGestureToken* userGestureToken() const { return m_userGestureToken.get()
; } | 145 UserGestureToken* userGestureToken() const { return m_userGestureToken.get()
; } |
| 146 void stop() override | 146 void stop() override |
| 147 { | 147 { |
| 148 SuspendableTimer::stop(); | 148 SuspendableTimer::stop(); |
| 149 | 149 |
| 150 if (m_disposalAllowed) | 150 if (m_disposalAllowed) |
| 151 dispose(); | 151 dispose(); |
| 152 } | 152 } |
| 153 | 153 |
| 154 // Eager finalization is needed to promptly stop this timer object. | 154 // Eager finalization is needed to promptly stop this timer object. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 177 // Oilpan optimization: unregister as an observer right away. | 177 // Oilpan optimization: unregister as an observer right away. |
| 178 clearContext(); | 178 clearContext(); |
| 179 // Will destroy this object, now or after the next GC depending | 179 // Will destroy this object, now or after the next GC depending |
| 180 // on whether Oilpan is disabled or not. | 180 // on whether Oilpan is disabled or not. |
| 181 m_window->removePostMessageTimer(this); | 181 m_window->removePostMessageTimer(this); |
| 182 } | 182 } |
| 183 | 183 |
| 184 Member<MessageEvent> m_event; | 184 Member<MessageEvent> m_event; |
| 185 Member<LocalDOMWindow> m_window; | 185 Member<LocalDOMWindow> m_window; |
| 186 RefPtr<SecurityOrigin> m_targetOrigin; | 186 RefPtr<SecurityOrigin> m_targetOrigin; |
| 187 OwnPtr<SourceLocation> m_location; | 187 std::unique_ptr<SourceLocation> m_location; |
| 188 RefPtr<UserGestureToken> m_userGestureToken; | 188 RefPtr<UserGestureToken> m_userGestureToken; |
| 189 bool m_disposalAllowed; | 189 bool m_disposalAllowed; |
| 190 }; | 190 }; |
| 191 | 191 |
| 192 static void updateSuddenTerminationStatus(LocalDOMWindow* domWindow, bool addedL
istener, FrameLoaderClient::SuddenTerminationDisablerType disablerType) | 192 static void updateSuddenTerminationStatus(LocalDOMWindow* domWindow, bool addedL
istener, FrameLoaderClient::SuddenTerminationDisablerType disablerType) |
| 193 { | 193 { |
| 194 Platform::current()->suddenTerminationChanged(!addedListener); | 194 Platform::current()->suddenTerminationChanged(!addedListener); |
| 195 if (domWindow->frame() && domWindow->frame()->loader().client()) | 195 if (domWindow->frame() && domWindow->frame()->loader().client()) |
| 196 domWindow->frame()->loader().client()->suddenTerminationDisablerChanged(
addedListener, disablerType); | 196 domWindow->frame()->loader().client()->suddenTerminationDisablerChanged(
addedListener, disablerType); |
| 197 } | 197 } |
| (...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 | 688 |
| 689 event->entangleMessagePorts(document()); | 689 event->entangleMessagePorts(document()); |
| 690 dispatchMessageEventWithOriginCheck(timer->targetOrigin(), event, timer->tak
eLocation()); | 690 dispatchMessageEventWithOriginCheck(timer->targetOrigin(), event, timer->tak
eLocation()); |
| 691 } | 691 } |
| 692 | 692 |
| 693 void LocalDOMWindow::removePostMessageTimer(PostMessageTimer* timer) | 693 void LocalDOMWindow::removePostMessageTimer(PostMessageTimer* timer) |
| 694 { | 694 { |
| 695 m_postMessageTimers.remove(timer); | 695 m_postMessageTimers.remove(timer); |
| 696 } | 696 } |
| 697 | 697 |
| 698 void LocalDOMWindow::dispatchMessageEventWithOriginCheck(SecurityOrigin* intende
dTargetOrigin, Event* event, PassOwnPtr<SourceLocation> location) | 698 void LocalDOMWindow::dispatchMessageEventWithOriginCheck(SecurityOrigin* intende
dTargetOrigin, Event* event, std::unique_ptr<SourceLocation> location) |
| 699 { | 699 { |
| 700 if (intendedTargetOrigin) { | 700 if (intendedTargetOrigin) { |
| 701 // Check target origin now since the target document may have changed si
nce the timer was scheduled. | 701 // Check target origin now since the target document may have changed si
nce the timer was scheduled. |
| 702 SecurityOrigin* securityOrigin = document()->getSecurityOrigin(); | 702 SecurityOrigin* securityOrigin = document()->getSecurityOrigin(); |
| 703 bool validTarget = intendedTargetOrigin->isSameSchemeHostPortAndSuborigi
n(securityOrigin); | 703 bool validTarget = intendedTargetOrigin->isSameSchemeHostPortAndSuborigi
n(securityOrigin); |
| 704 if (securityOrigin->hasSuborigin() && securityOrigin->suborigin()->polic
yContains(Suborigin::SuboriginPolicyOptions::UnsafePostMessageReceive)) | 704 if (securityOrigin->hasSuborigin() && securityOrigin->suborigin()->polic
yContains(Suborigin::SuboriginPolicyOptions::UnsafePostMessageReceive)) |
| 705 validTarget = intendedTargetOrigin->isSameSchemeHostPort(securityOri
gin); | 705 validTarget = intendedTargetOrigin->isSameSchemeHostPort(securityOri
gin); |
| 706 | 706 |
| 707 if (!validTarget) { | 707 if (!validTarget) { |
| 708 String message = ExceptionMessages::failedToExecute("postMessage", "
DOMWindow", "The target origin provided ('" + intendedTargetOrigin->toString() +
"') does not match the recipient window's origin ('" + document()->getSecurityO
rigin()->toString() + "')."); | 708 String message = ExceptionMessages::failedToExecute("postMessage", "
DOMWindow", "The target origin provided ('" + intendedTargetOrigin->toString() +
"') does not match the recipient window's origin ('" + document()->getSecurityO
rigin()->toString() + "')."); |
| (...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1550 { | 1550 { |
| 1551 // If the LocalDOMWindow still has a frame reference, that frame must point | 1551 // If the LocalDOMWindow still has a frame reference, that frame must point |
| 1552 // back to this LocalDOMWindow: otherwise, it's easy to get into a situation | 1552 // back to this LocalDOMWindow: otherwise, it's easy to get into a situation |
| 1553 // where script execution leaks between different LocalDOMWindows. | 1553 // where script execution leaks between different LocalDOMWindows. |
| 1554 if (m_frameObserver->frame()) | 1554 if (m_frameObserver->frame()) |
| 1555 ASSERT_WITH_SECURITY_IMPLICATION(m_frameObserver->frame()->domWindow() =
= this); | 1555 ASSERT_WITH_SECURITY_IMPLICATION(m_frameObserver->frame()->domWindow() =
= this); |
| 1556 return m_frameObserver->frame(); | 1556 return m_frameObserver->frame(); |
| 1557 } | 1557 } |
| 1558 | 1558 |
| 1559 } // namespace blink | 1559 } // namespace blink |
| OLD | NEW |