OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. |
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. |
9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 return toRenderWidget(renderer)->widget(); | 304 return toRenderWidget(renderer)->widget(); |
305 } | 305 } |
306 | 306 |
307 static bool acceptsEditingFocus(const Element& element) | 307 static bool acceptsEditingFocus(const Element& element) |
308 { | 308 { |
309 ASSERT(element.rendererIsEditable()); | 309 ASSERT(element.rendererIsEditable()); |
310 | 310 |
311 return element.document().frame() && element.rootEditableElement(); | 311 return element.document().frame() && element.rootEditableElement(); |
312 } | 312 } |
313 | 313 |
314 static bool canAccessAncestor(const SecurityOrigin& activeSecurityOrigin, Frame*
targetFrame) | 314 static bool canAccessAncestor(const SecurityOrigin& activeSecurityOrigin, const
Frame* targetFrame) |
315 { | 315 { |
316 // targetFrame can be 0 when we're trying to navigate a top-level frame | 316 // targetFrame can be 0 when we're trying to navigate a top-level frame |
317 // that has a 0 opener. | 317 // that has a 0 opener. |
318 if (!targetFrame) | 318 if (!targetFrame) |
319 return false; | 319 return false; |
320 | 320 |
321 const bool isLocalActiveOrigin = activeSecurityOrigin.isLocal(); | 321 const bool isLocalActiveOrigin = activeSecurityOrigin.isLocal(); |
322 for (Frame* ancestorFrame = targetFrame; ancestorFrame; ancestorFrame = ance
storFrame->tree().parent()) { | 322 for (const Frame* ancestorFrame = targetFrame; ancestorFrame; ancestorFrame
= ancestorFrame->tree().parent()) { |
323 // FIXME: SecurityOrigins need to be refactored to work with out-of-proc
ess iframes. | 323 // FIXME: SecurityOrigins need to be refactored to work with out-of-proc
ess iframes. |
324 // For now we prevent navigation between cross-process frames. | 324 // For now we prevent navigation between cross-process frames. |
325 if (!ancestorFrame->isLocalFrame()) | 325 if (!ancestorFrame->isLocalFrame()) |
326 return false; | 326 return false; |
327 | 327 |
328 Document* ancestorDocument = toLocalFrame(ancestorFrame)->document(); | 328 Document* ancestorDocument = toLocalFrame(ancestorFrame)->document(); |
329 // FIXME: Should be an ASSERT? Frames should alway have documents. | 329 // FIXME: Should be an ASSERT? Frames should alway have documents. |
330 if (!ancestorDocument) | 330 if (!ancestorDocument) |
331 return true; | 331 return true; |
332 | 332 |
(...skipping 2588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2921 } | 2921 } |
2922 | 2922 |
2923 void Document::disableEval(const String& errorMessage) | 2923 void Document::disableEval(const String& errorMessage) |
2924 { | 2924 { |
2925 if (!frame()) | 2925 if (!frame()) |
2926 return; | 2926 return; |
2927 | 2927 |
2928 frame()->script().disableEval(errorMessage); | 2928 frame()->script().disableEval(errorMessage); |
2929 } | 2929 } |
2930 | 2930 |
2931 bool Document::canNavigate(Frame* targetFrame) | 2931 bool Document::canNavigate(const Frame& targetFrame) |
2932 { | 2932 { |
2933 if (!m_frame) | 2933 if (!m_frame) |
2934 return false; | 2934 return false; |
2935 | 2935 |
2936 // FIXME: We shouldn't call this function without a target frame, but | |
2937 // fast/forms/submit-to-blank-multiple-times.html depends on this function | |
2938 // returning true when supplied with a 0 targetFrame. | |
2939 if (!targetFrame) | |
2940 return true; | |
2941 | |
2942 // Frame-busting is generally allowed, but blocked for sandboxed frames lack
ing the 'allow-top-navigation' flag. | 2936 // Frame-busting is generally allowed, but blocked for sandboxed frames lack
ing the 'allow-top-navigation' flag. |
2943 if (!isSandboxed(SandboxTopNavigation) && targetFrame == m_frame->tree().top
()) | 2937 if (!isSandboxed(SandboxTopNavigation) && targetFrame == m_frame->tree().top
()) |
2944 return true; | 2938 return true; |
2945 | 2939 |
2946 if (isSandboxed(SandboxNavigation)) { | 2940 if (isSandboxed(SandboxNavigation)) { |
2947 if (targetFrame->tree().isDescendantOf(m_frame)) | 2941 if (targetFrame.tree().isDescendantOf(m_frame)) |
2948 return true; | 2942 return true; |
2949 | 2943 |
2950 const char* reason = "The frame attempting navigation is sandboxed, and
is therefore disallowed from navigating its ancestors."; | 2944 const char* reason = "The frame attempting navigation is sandboxed, and
is therefore disallowed from navigating its ancestors."; |
2951 if (isSandboxed(SandboxTopNavigation) && targetFrame == m_frame->tree().
top()) | 2945 if (isSandboxed(SandboxTopNavigation) && targetFrame == m_frame->tree().
top()) |
2952 reason = "The frame attempting navigation of the top-level window is
sandboxed, but the 'allow-top-navigation' flag is not set."; | 2946 reason = "The frame attempting navigation of the top-level window is
sandboxed, but the 'allow-top-navigation' flag is not set."; |
2953 | 2947 |
2954 printNavigationErrorMessage(*toLocalFrameTemporary(targetFrame), url(),
reason); | 2948 printNavigationErrorMessage(toLocalFrameTemporary(targetFrame), url(), r
eason); |
2955 return false; | 2949 return false; |
2956 } | 2950 } |
2957 | 2951 |
2958 ASSERT(securityOrigin()); | 2952 ASSERT(securityOrigin()); |
2959 SecurityOrigin& origin = *securityOrigin(); | 2953 SecurityOrigin& origin = *securityOrigin(); |
2960 | 2954 |
2961 // This is the normal case. A document can navigate its decendant frames, | 2955 // This is the normal case. A document can navigate its decendant frames, |
2962 // or, more generally, a document can navigate a frame if the document is | 2956 // or, more generally, a document can navigate a frame if the document is |
2963 // in the same origin as any of that frame's ancestors (in the frame | 2957 // in the same origin as any of that frame's ancestors (in the frame |
2964 // hierarchy). | 2958 // hierarchy). |
2965 // | 2959 // |
2966 // See http://www.adambarth.com/papers/2008/barth-jackson-mitchell.pdf for | 2960 // See http://www.adambarth.com/papers/2008/barth-jackson-mitchell.pdf for |
2967 // historical information about this security check. | 2961 // historical information about this security check. |
2968 if (canAccessAncestor(origin, targetFrame)) | 2962 if (canAccessAncestor(origin, &targetFrame)) |
2969 return true; | 2963 return true; |
2970 | 2964 |
2971 // Top-level frames are easier to navigate than other frames because they | 2965 // Top-level frames are easier to navigate than other frames because they |
2972 // display their URLs in the address bar (in most browsers). However, there | 2966 // display their URLs in the address bar (in most browsers). However, there |
2973 // are still some restrictions on navigation to avoid nuisance attacks. | 2967 // are still some restrictions on navigation to avoid nuisance attacks. |
2974 // Specifically, a document can navigate a top-level frame if that frame | 2968 // Specifically, a document can navigate a top-level frame if that frame |
2975 // opened the document or if the document is the same-origin with any of | 2969 // opened the document or if the document is the same-origin with any of |
2976 // the top-level frame's opener's ancestors (in the frame hierarchy). | 2970 // the top-level frame's opener's ancestors (in the frame hierarchy). |
2977 // | 2971 // |
2978 // In both of these cases, the document performing the navigation is in | 2972 // In both of these cases, the document performing the navigation is in |
2979 // some way related to the frame being navigate (e.g., by the "opener" | 2973 // some way related to the frame being navigate (e.g., by the "opener" |
2980 // and/or "parent" relation). Requiring some sort of relation prevents a | 2974 // and/or "parent" relation). Requiring some sort of relation prevents a |
2981 // document from navigating arbitrary, unrelated top-level frames. | 2975 // document from navigating arbitrary, unrelated top-level frames. |
2982 if (!targetFrame->tree().parent()) { | 2976 if (!targetFrame.tree().parent()) { |
2983 if (targetFrame == m_frame->loader().opener()) | 2977 if (targetFrame == m_frame->loader().opener()) |
2984 return true; | 2978 return true; |
2985 | 2979 |
2986 // FIXME: We don't have access to RemoteFrame's opener yet. | 2980 // FIXME: We don't have access to RemoteFrame's opener yet. |
2987 if (targetFrame->isLocalFrame() && canAccessAncestor(origin, toLocalFram
e(targetFrame)->loader().opener())) | 2981 if (targetFrame.isLocalFrame() && canAccessAncestor(origin, toLocalFrame
(targetFrame).loader().opener())) |
2988 return true; | 2982 return true; |
2989 } | 2983 } |
2990 | 2984 |
2991 printNavigationErrorMessage(*toLocalFrameTemporary(targetFrame), url(), "The
frame attempting navigation is neither same-origin with the target, nor is it t
he target's parent or opener."); | 2985 printNavigationErrorMessage(toLocalFrameTemporary(targetFrame), url(), "The
frame attempting navigation is neither same-origin with the target, nor is it th
e target's parent or opener."); |
2992 return false; | 2986 return false; |
2993 } | 2987 } |
2994 | 2988 |
2995 LocalFrame* Document::findUnsafeParentScrollPropagationBoundary() | 2989 LocalFrame* Document::findUnsafeParentScrollPropagationBoundary() |
2996 { | 2990 { |
2997 LocalFrame* currentFrame = m_frame; | 2991 LocalFrame* currentFrame = m_frame; |
2998 Frame* ancestorFrame = currentFrame->tree().parent(); | 2992 Frame* ancestorFrame = currentFrame->tree().parent(); |
2999 | 2993 |
3000 while (ancestorFrame) { | 2994 while (ancestorFrame) { |
3001 // FIXME: We don't yet have access to a RemoteFrame's security origin. | 2995 // FIXME: We don't yet have access to a RemoteFrame's security origin. |
(...skipping 2800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5802 visitor->trace(m_timeline); | 5796 visitor->trace(m_timeline); |
5803 visitor->trace(m_compositorPendingAnimations); | 5797 visitor->trace(m_compositorPendingAnimations); |
5804 visitor->registerWeakMembers<Document, &Document::clearWeakMembers>(this); | 5798 visitor->registerWeakMembers<Document, &Document::clearWeakMembers>(this); |
5805 DocumentSupplementable::trace(visitor); | 5799 DocumentSupplementable::trace(visitor); |
5806 TreeScope::trace(visitor); | 5800 TreeScope::trace(visitor); |
5807 ContainerNode::trace(visitor); | 5801 ContainerNode::trace(visitor); |
5808 ExecutionContext::trace(visitor); | 5802 ExecutionContext::trace(visitor); |
5809 } | 5803 } |
5810 | 5804 |
5811 } // namespace WebCore | 5805 } // namespace WebCore |
OLD | NEW |