/* * Copyright (C) 2006, 2007, 2008, 2009, 2011 Apple Inc. All rights reserved. * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. * (http://www.torchmobile.com/) * Copyright (C) Research In Motion Limited 2009. All rights reserved. * Copyright (C) 2011 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_FRAME_LOADER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_FRAME_LOADER_H_ #include "base/macros.h" #include "third_party/blink/public/common/user_agent/user_agent_metadata.h" #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-shared.h" #include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h" #include "third_party/blink/public/web/web_document_loader.h" #include "third_party/blink/public/web/web_frame_load_type.h" #include "third_party/blink/public/web/web_navigation_type.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/frame/frame_types.h" #include "third_party/blink/renderer/core/frame/sandbox_flags.h" #include "third_party/blink/renderer/core/loader/frame_loader_state_machine.h" #include "third_party/blink/renderer/core/loader/frame_loader_types.h" #include "third_party/blink/renderer/core/loader/history_item.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object.h" #include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h" #include namespace blink { class ContentSecurityPolicy; class Document; class DocumentLoader; class LocalFrame; class Frame; class LocalFrameClient; class ProgressTracker; class ResourceRequest; class TracedValue; struct FrameLoadRequest; struct WebNavigationInfo; struct WebNavigationParams; CORE_EXPORT bool IsBackForwardLoadType(WebFrameLoadType); CORE_EXPORT bool IsReloadLoadType(WebFrameLoadType); class CORE_EXPORT FrameLoader final { DISALLOW_NEW(); public: explicit FrameLoader(LocalFrame*); ~FrameLoader(); void Init(); ResourceRequest ResourceRequestForReload( WebFrameLoadType, ClientRedirectPolicy = ClientRedirectPolicy::kNotClientRedirect); ProgressTracker& Progress() const { return *progress_tracker_; } // Starts a navigation. It will eventually send the navigation to the // browser process, or call LoadInSameDocument for same-document navigation. // For reloads, an appropriate WebFrameLoadType should be given. Otherwise, // kStandard should be used (and the final WebFrameLoadType // will be computed). void StartNavigation(const FrameLoadRequest&, WebFrameLoadType = WebFrameLoadType::kStandard); // Called when the browser process has asked this renderer process to commit // a navigation in this frame. This method skips most of the checks assuming // that browser process has already performed any checks necessary. // See WebNavigationParams for details. void CommitNavigation( std::unique_ptr navigation_params, std::unique_ptr extra_data); // Called before the browser process is asked to navigate this frame, to mark // the frame as loading and save some navigation information for later use. bool WillStartNavigation(const WebNavigationInfo& info, bool is_history_navigation_in_new_frame); // This runs the "stop document loading" algorithm in HTML: // https://html.spec.whatwg.org/C/browsing-the-web.html#stop-document-loading // Note, this function only cancels ongoing navigation handled through // FrameLoader. You might also want to call // LocalFrameClient::AbortClientNavigation() if appropriate. // // Warning: StopAllLoaders() may detach the LocalFrame to which this // FrameLoader belongs. Callers need to be careful about checking the // existence of the frame after StopAllLoaders() returns. void StopAllLoaders(); void ReplaceDocumentWhileExecutingJavaScriptURL(const String& source, Document* owner_document); // Notifies the client that the initial empty document has been accessed, and // thus it is no longer safe to show a provisional URL above the document // without risking a URL spoof. The client must not call back into JavaScript. void DidAccessInitialDocument(); DocumentLoader* GetDocumentLoader() const { return document_loader_.Get(); } void SetDefersLoading(bool); void DidExplicitOpen(); String UserAgent() const; blink::UserAgentMetadata UserAgentMetadata() const; void DispatchDidClearWindowObjectInMainWorld(); void DispatchDidClearDocumentOfWindowObject(); void DispatchDocumentElementAvailable(); void RunScriptsAtDocumentElementAvailable(); // The following sandbox flags will be forced, regardless of changes to the // sandbox attribute of any parent frames. void ForceSandboxFlags(WebSandboxFlags flags) { forced_sandbox_flags_ |= flags; } // Includes the collection of forced, inherited, and FrameOwner's sandbox // flags. Note: with FeaturePolicyForSandbox the frame owner's sandbox flags // only includes the flags which are *not* implemented as feature policies // already present in the FrameOwner's ContainerPolicy. WebSandboxFlags EffectiveSandboxFlags() const; // Modifying itself is done based on |fetch_client_settings_object|. // |document_for_logging| is used only for logging, use counters, // UKM-related things. void ModifyRequestForCSP( ResourceRequest&, const FetchClientSettingsObject* fetch_client_settings_object, Document* document_for_logging, network::mojom::RequestContextFrameType) const; Frame* Opener(); void SetOpener(LocalFrame*); const AtomicString& RequiredCSP() const { return required_csp_; } void RecordLatestRequiredCSP(); void Detach(); void FinishedParsing(); void DidFinishNavigation(); void DidFinishSameDocumentNavigation(const KURL&, WebFrameLoadType, HistoryItem*); // This prepares the FrameLoader for the next commit. It will dispatch unload // events, abort XHR requests and detach the document. Returns true if the // frame is ready to receive the next commit, or false otherwise. bool PrepareForCommit(); void CommitProvisionalLoad(); FrameLoaderStateMachine* StateMachine() const { return &state_machine_; } bool ShouldClose(bool is_reload = false); void DispatchUnloadEvent(); bool AllowPlugins(ReasonForCallingAllowPlugins); void SaveScrollAnchor(); void SaveScrollState(); void RestoreScrollPositionAndViewState(); bool HasProvisionalNavigation() const { return client_navigation_.get() || provisional_document_loader_.Get(); } bool MaybeRenderFallbackContent(); // Like ClearClientNavigation, but also notifies the client to actually cancel // the navigation. void CancelClientNavigation(); void DetachProvisionalDocumentLoader(); void Trace(blink::Visitor*); void DidDropNavigation(); void MarkAsLoading(); ContentSecurityPolicy* GetLastOriginDocumentCSP() { return last_origin_document_csp_.Get(); } bool ShouldReuseDefaultView(const scoped_refptr&, const ContentSecurityPolicy*); bool IsClientNavigationInitialHistoryLoad(); private: bool AllowRequestForThisFrame(const FrameLoadRequest&); WebFrameLoadType DetermineFrameLoadType(const KURL& url, const AtomicString& http_method, Document* origin_document, const KURL& failing_url, WebFrameLoadType); bool ShouldPerformFragmentNavigation(bool is_form_submission, const String& http_method, WebFrameLoadType, const KURL&); void ProcessFragment(const KURL&, WebFrameLoadType, LoadStartType); // Returns whether we should continue with new navigation. bool CancelProvisionalLoaderForNewNavigation(); // Clears any information about client navigation, see client_navigation_. void ClearClientNavigation(); void RestoreScrollPositionAndViewState(WebFrameLoadType, bool is_same_document, const HistoryItem::ViewState&, HistoryScrollRestorationType); void DetachDocumentLoader(Member&, bool flush_microtask_queue = false); std::unique_ptr ToTracedValue() const; void TakeObjectSnapshot() const; LocalFrameClient* Client() const; Member frame_; AtomicString required_csp_; // FIXME: These should be std::unique_ptr to reduce build times and // simplify header dependencies unless performance testing proves otherwise. // Some of these could be lazily created for memory savings on devices. mutable FrameLoaderStateMachine state_machine_; Member progress_tracker_; // Document loaders for the three phases of frame loading. Note that while a // new request is being loaded, the old document loader may still be // referenced. E.g. while a new request is in the "policy" state, the old // document loader may be consulted in particular as it makes sense to imply // certain settings on the new loader. Member document_loader_; Member provisional_document_loader_; // This struct holds information about a navigation, which is being // initiated by the client through the browser process, until the navigation // is either committed or cancelled. struct ClientNavigationState { KURL url; AtomicString http_method; bool is_history_navigation_in_new_frame = false; }; std::unique_ptr client_navigation_; bool in_restore_scroll_; WebSandboxFlags forced_sandbox_flags_; bool dispatching_did_clear_window_object_in_main_world_; bool detached_; WebScopedVirtualTimePauser virtual_time_pauser_; Member last_origin_document_csp_; DISALLOW_COPY_AND_ASSIGN(FrameLoader); }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_FRAME_LOADER_H_