| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv
ed. |
| 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| 4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
| 5 * Copyright (C) 2008 Alp Toker <alp@atoker.com> | 5 * Copyright (C) 2008 Alp Toker <alp@atoker.com> |
| 6 * Copyright (C) Research In Motion Limited 2009. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2009. All rights reserved. |
| 7 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> | 7 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> |
| 8 * Copyright (C) 2011 Google Inc. All rights reserved. | 8 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 9 * | 9 * |
| 10 * Redistribution and use in source and binary forms, with or without | 10 * Redistribution and use in source and binary forms, with or without |
| (...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1034 loadURL(resourceRequest, request.frameName(), loadType, event, formState.get
()); | 1034 loadURL(resourceRequest, request.frameName(), loadType, event, formState.get
()); |
| 1035 | 1035 |
| 1036 // FIXME: It's possible this targetFrame will not be the same frame that was
targeted by the actual | 1036 // FIXME: It's possible this targetFrame will not be the same frame that was
targeted by the actual |
| 1037 // load if frame names have changed. | 1037 // load if frame names have changed. |
| 1038 Frame* sourceFrame = formState ? formState->sourceDocument()->frame() : m_fr
ame; | 1038 Frame* sourceFrame = formState ? formState->sourceDocument()->frame() : m_fr
ame; |
| 1039 if (!sourceFrame) | 1039 if (!sourceFrame) |
| 1040 sourceFrame = m_frame; | 1040 sourceFrame = m_frame; |
| 1041 Frame* targetFrame = sourceFrame->loader()->findFrameForNavigation(request.f
rameName()); | 1041 Frame* targetFrame = sourceFrame->loader()->findFrameForNavigation(request.f
rameName()); |
| 1042 if (targetFrame && targetFrame != sourceFrame) { | 1042 if (targetFrame && targetFrame != sourceFrame) { |
| 1043 if (Page* page = targetFrame->page()) | 1043 if (Page* page = targetFrame->page()) |
| 1044 page->chrome()->focus(); | 1044 page->chrome().focus(); |
| 1045 } | 1045 } |
| 1046 } | 1046 } |
| 1047 | 1047 |
| 1048 void FrameLoader::loadURL(const ResourceRequest& request, const String& frameNam
e, FrameLoadType newLoadType, | 1048 void FrameLoader::loadURL(const ResourceRequest& request, const String& frameNam
e, FrameLoadType newLoadType, |
| 1049 PassRefPtr<Event> event, PassRefPtr<FormState> formState) | 1049 PassRefPtr<Event> event, PassRefPtr<FormState> formState) |
| 1050 { | 1050 { |
| 1051 if (m_inStopAllLoaders) | 1051 if (m_inStopAllLoaders) |
| 1052 return; | 1052 return; |
| 1053 | 1053 |
| 1054 bool isFormSubmission = formState; | 1054 bool isFormSubmission = formState; |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1417 setProvisionalDocumentLoader(0); | 1417 setProvisionalDocumentLoader(0); |
| 1418 | 1418 |
| 1419 if (pdl != m_documentLoader) { | 1419 if (pdl != m_documentLoader) { |
| 1420 ASSERT(m_state == FrameStateComplete); | 1420 ASSERT(m_state == FrameStateComplete); |
| 1421 return; | 1421 return; |
| 1422 } | 1422 } |
| 1423 | 1423 |
| 1424 setState(FrameStateCommittedPage); | 1424 setState(FrameStateCommittedPage); |
| 1425 | 1425 |
| 1426 if (isLoadingMainFrame()) | 1426 if (isLoadingMainFrame()) |
| 1427 m_frame->page()->chrome()->client()->needTouchEvents(false); | 1427 m_frame->page()->chrome().client()->needTouchEvents(false); |
| 1428 | 1428 |
| 1429 history()->updateForCommit(); | 1429 history()->updateForCommit(); |
| 1430 m_client->transitionToCommittedForNewPage(); | 1430 m_client->transitionToCommittedForNewPage(); |
| 1431 | 1431 |
| 1432 if (!m_stateMachine.creatingInitialEmptyDocument() && !m_stateMachine.commit
tedFirstRealDocumentLoad()) | 1432 if (!m_stateMachine.creatingInitialEmptyDocument() && !m_stateMachine.commit
tedFirstRealDocumentLoad()) |
| 1433 m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmpty
DocumentPostCommit); | 1433 m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmpty
DocumentPostCommit); |
| 1434 } | 1434 } |
| 1435 | 1435 |
| 1436 void FrameLoader::clientRedirectCancelledOrFinished() | 1436 void FrameLoader::clientRedirectCancelledOrFinished() |
| 1437 { | 1437 { |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2024 | 2024 |
| 2025 view->scrollToFragment(url); | 2025 view->scrollToFragment(url); |
| 2026 | 2026 |
| 2027 if (boundaryFrame) | 2027 if (boundaryFrame) |
| 2028 boundaryFrame->view()->setSafeToPropagateScrollToParent(true); | 2028 boundaryFrame->view()->setSafeToPropagateScrollToParent(true); |
| 2029 } | 2029 } |
| 2030 | 2030 |
| 2031 bool FrameLoader::shouldClose() | 2031 bool FrameLoader::shouldClose() |
| 2032 { | 2032 { |
| 2033 Page* page = m_frame->page(); | 2033 Page* page = m_frame->page(); |
| 2034 Chrome* chrome = page ? page->chrome() : 0; | 2034 if (!page || !page->chrome().canRunBeforeUnloadConfirmPanel()) |
| 2035 if (!chrome || !chrome->canRunBeforeUnloadConfirmPanel()) | |
| 2036 return true; | 2035 return true; |
| 2037 | 2036 |
| 2038 // Store all references to each subframe in advance since beforeunload's eve
nt handler may modify frame | 2037 // Store all references to each subframe in advance since beforeunload's eve
nt handler may modify frame |
| 2039 Vector<RefPtr<Frame> > targetFrames; | 2038 Vector<RefPtr<Frame> > targetFrames; |
| 2040 targetFrames.append(m_frame); | 2039 targetFrames.append(m_frame); |
| 2041 for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tre
e()->traverseNext(m_frame)) | 2040 for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tre
e()->traverseNext(m_frame)) |
| 2042 targetFrames.append(child); | 2041 targetFrames.append(child); |
| 2043 | 2042 |
| 2044 bool shouldClose = false; | 2043 bool shouldClose = false; |
| 2045 { | 2044 { |
| 2046 NavigationDisablerForBeforeUnload navigationDisabler; | 2045 NavigationDisablerForBeforeUnload navigationDisabler; |
| 2047 size_t i; | 2046 size_t i; |
| 2048 | 2047 |
| 2049 for (i = 0; i < targetFrames.size(); i++) { | 2048 for (i = 0; i < targetFrames.size(); i++) { |
| 2050 if (!targetFrames[i]->tree()->isDescendantOf(m_frame)) | 2049 if (!targetFrames[i]->tree()->isDescendantOf(m_frame)) |
| 2051 continue; | 2050 continue; |
| 2052 if (!targetFrames[i]->loader()->fireBeforeUnloadEvent(chrome)) | 2051 if (!targetFrames[i]->loader()->fireBeforeUnloadEvent(page->chrome()
)) |
| 2053 break; | 2052 break; |
| 2054 } | 2053 } |
| 2055 | 2054 |
| 2056 if (i == targetFrames.size()) | 2055 if (i == targetFrames.size()) |
| 2057 shouldClose = true; | 2056 shouldClose = true; |
| 2058 } | 2057 } |
| 2059 | 2058 |
| 2060 if (!shouldClose) | 2059 if (!shouldClose) |
| 2061 m_submittedFormURL = KURL(); | 2060 m_submittedFormURL = KURL(); |
| 2062 | 2061 |
| 2063 return shouldClose; | 2062 return shouldClose; |
| 2064 } | 2063 } |
| 2065 | 2064 |
| 2066 bool FrameLoader::fireBeforeUnloadEvent(Chrome* chrome) | 2065 bool FrameLoader::fireBeforeUnloadEvent(Chrome& chrome) |
| 2067 { | 2066 { |
| 2068 DOMWindow* domWindow = m_frame->document()->domWindow(); | 2067 DOMWindow* domWindow = m_frame->document()->domWindow(); |
| 2069 if (!domWindow) | 2068 if (!domWindow) |
| 2070 return true; | 2069 return true; |
| 2071 | 2070 |
| 2072 RefPtr<Document> document = m_frame->document(); | 2071 RefPtr<Document> document = m_frame->document(); |
| 2073 if (!document->body()) | 2072 if (!document->body()) |
| 2074 return true; | 2073 return true; |
| 2075 | 2074 |
| 2076 RefPtr<BeforeUnloadEvent> beforeUnloadEvent = BeforeUnloadEvent::create(); | 2075 RefPtr<BeforeUnloadEvent> beforeUnloadEvent = BeforeUnloadEvent::create(); |
| 2077 m_pageDismissalEventBeingDispatched = BeforeUnloadDismissal; | 2076 m_pageDismissalEventBeingDispatched = BeforeUnloadDismissal; |
| 2078 domWindow->dispatchEvent(beforeUnloadEvent.get(), domWindow->document()); | 2077 domWindow->dispatchEvent(beforeUnloadEvent.get(), domWindow->document()); |
| 2079 m_pageDismissalEventBeingDispatched = NoDismissal; | 2078 m_pageDismissalEventBeingDispatched = NoDismissal; |
| 2080 | 2079 |
| 2081 if (!beforeUnloadEvent->defaultPrevented()) | 2080 if (!beforeUnloadEvent->defaultPrevented()) |
| 2082 document->defaultEventHandler(beforeUnloadEvent.get()); | 2081 document->defaultEventHandler(beforeUnloadEvent.get()); |
| 2083 if (beforeUnloadEvent->result().isNull()) | 2082 if (beforeUnloadEvent->result().isNull()) |
| 2084 return true; | 2083 return true; |
| 2085 | 2084 |
| 2086 String text = document->displayStringModifiedByEncoding(beforeUnloadEvent->r
esult()); | 2085 String text = document->displayStringModifiedByEncoding(beforeUnloadEvent->r
esult()); |
| 2087 return chrome->runBeforeUnloadConfirmPanel(text, m_frame); | 2086 return chrome.runBeforeUnloadConfirmPanel(text, m_frame); |
| 2088 } | 2087 } |
| 2089 | 2088 |
| 2090 void FrameLoader::checkNavigationPolicyAndContinueLoad(PassRefPtr<FormState> for
mState) | 2089 void FrameLoader::checkNavigationPolicyAndContinueLoad(PassRefPtr<FormState> for
mState) |
| 2091 { | 2090 { |
| 2092 // If we loaded an alternate page to replace an unreachableURL, we'll get in
here with a | 2091 // If we loaded an alternate page to replace an unreachableURL, we'll get in
here with a |
| 2093 // nil policyDataSource because loading the alternate page will have passed | 2092 // nil policyDataSource because loading the alternate page will have passed |
| 2094 // through this method already, nested; otherwise, policyDataSource should s
till be set. | 2093 // through this method already, nested; otherwise, policyDataSource should s
till be set. |
| 2095 ASSERT(m_policyDocumentLoader || !m_provisionalDocumentLoader->unreachableUR
L().isEmpty()); | 2094 ASSERT(m_policyDocumentLoader || !m_provisionalDocumentLoader->unreachableUR
L().isEmpty()); |
| 2096 | 2095 |
| 2097 // stopAllLoaders can detach the Frame, so protect it. | 2096 // stopAllLoaders can detach the Frame, so protect it. |
| (...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2558 } | 2557 } |
| 2559 | 2558 |
| 2560 Frame* createWindow(Frame* openerFrame, Frame* lookupFrame, const FrameLoadReque
st& request, const WindowFeatures& features, bool& created) | 2559 Frame* createWindow(Frame* openerFrame, Frame* lookupFrame, const FrameLoadReque
st& request, const WindowFeatures& features, bool& created) |
| 2561 { | 2560 { |
| 2562 ASSERT(!features.dialog || request.frameName().isEmpty()); | 2561 ASSERT(!features.dialog || request.frameName().isEmpty()); |
| 2563 | 2562 |
| 2564 if (!request.frameName().isEmpty() && request.frameName() != "_blank") { | 2563 if (!request.frameName().isEmpty() && request.frameName() != "_blank") { |
| 2565 if (Frame* frame = lookupFrame->loader()->findFrameForNavigation(request
.frameName(), openerFrame->document())) { | 2564 if (Frame* frame = lookupFrame->loader()->findFrameForNavigation(request
.frameName(), openerFrame->document())) { |
| 2566 if (request.frameName() != "_self") { | 2565 if (request.frameName() != "_self") { |
| 2567 if (Page* page = frame->page()) | 2566 if (Page* page = frame->page()) |
| 2568 page->chrome()->focus(); | 2567 page->chrome().focus(); |
| 2569 } | 2568 } |
| 2570 created = false; | 2569 created = false; |
| 2571 return frame; | 2570 return frame; |
| 2572 } | 2571 } |
| 2573 } | 2572 } |
| 2574 | 2573 |
| 2575 // Sandboxed frames cannot open new auxiliary browsing contexts. | 2574 // Sandboxed frames cannot open new auxiliary browsing contexts. |
| 2576 if (isDocumentSandboxed(openerFrame, SandboxPopups)) { | 2575 if (isDocumentSandboxed(openerFrame, SandboxPopups)) { |
| 2577 // FIXME: This message should be moved off the console once a solution t
o https://bugs.webkit.org/show_bug.cgi?id=103274 exists. | 2576 // FIXME: This message should be moved off the console once a solution t
o https://bugs.webkit.org/show_bug.cgi?id=103274 exists. |
| 2578 openerFrame->document()->addConsoleMessage(SecurityMessageSource, ErrorM
essageLevel, "Blocked opening '" + request.resourceRequest().url().elidedString(
) + "' in a new window because the request was made in a sandboxed frame whose '
allow-popups' permission is not set."); | 2577 openerFrame->document()->addConsoleMessage(SecurityMessageSource, ErrorM
essageLevel, "Blocked opening '" + request.resourceRequest().url().elidedString(
) + "' in a new window because the request was made in a sandboxed frame whose '
allow-popups' permission is not set."); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2589 if (openerFrame->settings() && !openerFrame->settings()->supportsMultipleWin
dows()) { | 2588 if (openerFrame->settings() && !openerFrame->settings()->supportsMultipleWin
dows()) { |
| 2590 created = false; | 2589 created = false; |
| 2591 return openerFrame; | 2590 return openerFrame; |
| 2592 } | 2591 } |
| 2593 | 2592 |
| 2594 Page* oldPage = openerFrame->page(); | 2593 Page* oldPage = openerFrame->page(); |
| 2595 if (!oldPage) | 2594 if (!oldPage) |
| 2596 return 0; | 2595 return 0; |
| 2597 | 2596 |
| 2598 NavigationAction action(requestWithReferrer.resourceRequest()); | 2597 NavigationAction action(requestWithReferrer.resourceRequest()); |
| 2599 Page* page = oldPage->chrome()->createWindow(openerFrame, requestWithReferre
r, features, action); | 2598 Page* page = oldPage->chrome().createWindow(openerFrame, requestWithReferrer
, features, action); |
| 2600 if (!page) | 2599 if (!page) |
| 2601 return 0; | 2600 return 0; |
| 2602 | 2601 |
| 2603 Frame* frame = page->mainFrame(); | 2602 Frame* frame = page->mainFrame(); |
| 2604 | 2603 |
| 2605 frame->loader()->forceSandboxFlags(openerFrame->document()->sandboxFlags()); | 2604 frame->loader()->forceSandboxFlags(openerFrame->document()->sandboxFlags()); |
| 2606 | 2605 |
| 2607 if (request.frameName() != "_blank") | 2606 if (request.frameName() != "_blank") |
| 2608 frame->tree()->setName(request.frameName()); | 2607 frame->tree()->setName(request.frameName()); |
| 2609 | 2608 |
| 2610 page->chrome()->setToolbarsVisible(features.toolBarVisible || features.locat
ionBarVisible); | 2609 page->chrome().setToolbarsVisible(features.toolBarVisible || features.locati
onBarVisible); |
| 2611 page->chrome()->setStatusbarVisible(features.statusBarVisible); | 2610 page->chrome().setStatusbarVisible(features.statusBarVisible); |
| 2612 page->chrome()->setScrollbarsVisible(features.scrollbarsVisible); | 2611 page->chrome().setScrollbarsVisible(features.scrollbarsVisible); |
| 2613 page->chrome()->setMenubarVisible(features.menuBarVisible); | 2612 page->chrome().setMenubarVisible(features.menuBarVisible); |
| 2614 page->chrome()->setResizable(features.resizable); | 2613 page->chrome().setResizable(features.resizable); |
| 2615 | 2614 |
| 2616 // 'x' and 'y' specify the location of the window, while 'width' and 'height
' | 2615 // 'x' and 'y' specify the location of the window, while 'width' and 'height
' |
| 2617 // specify the size of the viewport. We can only resize the window, so adjus
t | 2616 // specify the size of the viewport. We can only resize the window, so adjus
t |
| 2618 // for the difference between the window size and the viewport size. | 2617 // for the difference between the window size and the viewport size. |
| 2619 | 2618 |
| 2620 FloatRect windowRect = page->chrome()->windowRect(); | 2619 FloatRect windowRect = page->chrome().windowRect(); |
| 2621 FloatSize viewportSize = page->chrome()->pageRect().size(); | 2620 FloatSize viewportSize = page->chrome().pageRect().size(); |
| 2622 | 2621 |
| 2623 if (features.xSet) | 2622 if (features.xSet) |
| 2624 windowRect.setX(features.x); | 2623 windowRect.setX(features.x); |
| 2625 if (features.ySet) | 2624 if (features.ySet) |
| 2626 windowRect.setY(features.y); | 2625 windowRect.setY(features.y); |
| 2627 if (features.widthSet) | 2626 if (features.widthSet) |
| 2628 windowRect.setWidth(features.width + (windowRect.width() - viewportSize.
width())); | 2627 windowRect.setWidth(features.width + (windowRect.width() - viewportSize.
width())); |
| 2629 if (features.heightSet) | 2628 if (features.heightSet) |
| 2630 windowRect.setHeight(features.height + (windowRect.height() - viewportSi
ze.height())); | 2629 windowRect.setHeight(features.height + (windowRect.height() - viewportSi
ze.height())); |
| 2631 | 2630 |
| 2632 // Ensure non-NaN values, minimum size as well as being within valid screen
area. | 2631 // Ensure non-NaN values, minimum size as well as being within valid screen
area. |
| 2633 FloatRect newWindowRect = DOMWindow::adjustWindowRect(page, windowRect); | 2632 FloatRect newWindowRect = DOMWindow::adjustWindowRect(page, windowRect); |
| 2634 | 2633 |
| 2635 page->chrome()->setWindowRect(newWindowRect); | 2634 page->chrome().setWindowRect(newWindowRect); |
| 2636 page->chrome()->show(); | 2635 page->chrome().show(); |
| 2637 | 2636 |
| 2638 created = true; | 2637 created = true; |
| 2639 return frame; | 2638 return frame; |
| 2640 } | 2639 } |
| 2641 | 2640 |
| 2642 } // namespace WebCore | 2641 } // namespace WebCore |
| OLD | NEW |