void RedirectScheduler::scheduleLocationChange(const String& url, const String& referrer, bool lockHistory, bool lockBackForwardList, bool wasUserGesture) { if (!m_frame->page()) return; if (url.isEmpty()) return; lockBackForwardList = lockBackForwardList || mustLockBackForwardList(m_frame); FrameLoader* loader = m_frame->loader(); // If the URL we're going to navigate to is the same as the current one, except for the // fragment part, we don't need to schedule the location change. KURL parsedURL(ParsedURLString, url); if (parsedURL.hasFragmentIdentifier() && equalIgnoringFragmentIdentifier(loader->url(), parsedURL)) { loader->changeLocation(loader->completeURL(url), referrer, lockHistory, lockBackForwardList, wasUserGesture); return; } // Handle a location change of a page with no document as a special case. // This may happen when a frame changes the location of another frame. bool duringLoad = !loader->committedFirstRealDocumentLoad(); schedule(new ScheduledLocationChange(url, referrer, lockHistory, lockBackForwardList, wasUserGesture, duringLoad)); }
virtual void fire(Frame* frame) { FrameLoader* loader = frame->loader(); if (!m_historySteps) { // Special case for go(0) from a frame -> reload only the frame loader->urlSelected(loader->url(), "", 0, lockHistory(), lockBackForwardList(), false, SendReferrer); return; } // go(i!=0) from a frame navigates into the history of the frame only, // in both IE and NS (but not in Mozilla). We can't easily do that. frame->page()->goBackOrForward(m_historySteps); }
virtual void fire(Frame* frame) { UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture); FrameLoader* loader = frame->loader(); if (!m_historySteps) { // Special case for go(0) from a frame -> reload only the frame // To follow Firefox and IE's behavior, history reload can only navigate the self frame. loader->urlSelected(loader->url(), "_self", 0, lockHistory(), lockBackForwardList(), SendReferrer); return; } // go(i!=0) from a frame navigates into the history of the frame only, // in both IE and NS (but not in Mozilla). We can't easily do that. frame->page()->goBackOrForward(m_historySteps); }
void RedirectScheduler::timerFired(Timer<RedirectScheduler>*) { if (!m_frame->page()) return; if (m_frame->page()->defersLoading()) return; OwnPtr<ScheduledRedirection> redirection(m_scheduledRedirection.release()); FrameLoader* loader = m_frame->loader(); switch (redirection->type) { case ScheduledRedirection::redirection: case ScheduledRedirection::locationChange: loader->changeLocation(KURL(ParsedURLString, redirection->url), redirection->referrer, redirection->lockHistory, redirection->lockBackForwardList, redirection->wasUserGesture, redirection->wasRefresh); return; case ScheduledRedirection::historyNavigation: if (redirection->historySteps == 0) { // Special case for go(0) from a frame -> reload only the frame loader->urlSelected(loader->url(), "", 0, redirection->lockHistory, redirection->lockBackForwardList, redirection->wasUserGesture, SendReferrer); return; } // go(i!=0) from a frame navigates into the history of the frame only, // in both IE and NS (but not in Mozilla). We can't easily do that. m_frame->page()->goBackOrForward(redirection->historySteps); return; case ScheduledRedirection::formSubmission: // The submitForm function will find a target frame before using the redirection timer. // Now that the timer has fired, we need to repeat the security check which normally is done when // selecting a target, in case conditions have changed. Other code paths avoid this by targeting // without leaving a time window. If we fail the check just silently drop the form submission. if (!redirection->formState->sourceFrame()->loader()->shouldAllowNavigation(m_frame)) return; loader->loadFrameRequest(redirection->frameRequest, redirection->lockHistory, redirection->lockBackForwardList, redirection->event, redirection->formState, SendReferrer); return; } ASSERT_NOT_REACHED(); }
void SecurityOrigin::setForFrame(Frame* frame) { clear(); FrameLoader* loader = frame->loader(); const KURL& securityPolicyURL = loader->url(); if (!securityPolicyURL.isEmpty()) { m_protocol = securityPolicyURL.protocol().lower(); m_host = securityPolicyURL.host().lower(); m_port = securityPolicyURL.port(); if (m_port) m_portSet = true; // data: URLs are not allowed access to anything other than themselves. if (m_protocol == "data") { m_noAccess = true; return; } // Only in the case of about:blank or javascript: URLs (which create documents using the "about" // protocol) do we want to use the parent or openers URL as the origin. if (m_protocol != "about") return; } Frame* openerFrame = frame->tree()->parent(); if (!openerFrame) { openerFrame = loader->opener(); if (!openerFrame) return; } Document* openerDocument = openerFrame->document(); if (!openerDocument) return; *this = openerDocument->securityOrigin(); }
void HistoryController::updateForStandardLoad(HistoryUpdateType updateType) { LOG(History, "WebCoreHistory: Updating History for Standard Load in frame %s", m_frame->loader()->documentLoader()->url().string().ascii().data()); FrameLoader* frameLoader = m_frame->loader(); Settings* settings = m_frame->settings(); bool needPrivacy = !settings || settings->privateBrowsingEnabled(); const KURL& historyURL = frameLoader->documentLoader()->urlForHistory(); if (!frameLoader->documentLoader()->isClientRedirect()) { if (!historyURL.isEmpty()) { if (updateType != UpdateAllExceptBackForwardList) updateBackForwardListClippedAtTarget(true); if (!needPrivacy) { frameLoader->client()->updateGlobalHistory(); frameLoader->documentLoader()->setDidCreateGlobalHistoryEntry(true); if (frameLoader->documentLoader()->unreachableURL().isEmpty()) frameLoader->client()->updateGlobalHistoryRedirectLinks(); } if (Page* page = m_frame->page()) page->setGlobalHistoryItem(needPrivacy ? 0 : page->backForward()->currentItem()); } } else if (frameLoader->documentLoader()->unreachableURL().isEmpty() && m_currentItem) { m_currentItem->setURL(frameLoader->documentLoader()->url()); m_currentItem->setFormInfoFromRequest(frameLoader->documentLoader()->request()); } if (!historyURL.isEmpty() && !needPrivacy) { if (Page* page = m_frame->page()) addVisitedLink(page, historyURL); if (!frameLoader->documentLoader()->didCreateGlobalHistoryEntry() && frameLoader->documentLoader()->unreachableURL().isEmpty() && !frameLoader->url().isEmpty()) frameLoader->client()->updateGlobalHistoryRedirectLinks(); } }