blob: 97304fe0400dd317385b54eb4b185e516b95d183 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_HTML_VIEWER_DOCUMENT_RESOURCE_WAITER_H_
#define COMPONENTS_HTML_VIEWER_DOCUMENT_RESOURCE_WAITER_H_
#include "base/basictypes.h"
#include "base/time/time.h"
#include "components/html_viewer/html_frame_tree_manager_observer.h"
#include "components/mus/public/cpp/window_observer.h"
#include "components/web_view/public/interfaces/frame.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/services/network/public/interfaces/url_loader.mojom.h"
namespace html_viewer {
class HTMLDocument;
class HTMLFrameTreeManager;
class GlobalState;
// DocumentResourceWaiter waits for the necessary resources needed to load an
// HTMLDocument. Once ready it calls to HTMLDocument::Load(). Once ready it is
// assumed HTMLDocument will call back for the FrameClient and FrameData.
class DocumentResourceWaiter : public web_view::mojom::FrameClient,
public HTMLFrameTreeManagerObserver,
public mus::WindowObserver {
public:
DocumentResourceWaiter(GlobalState* global_state,
mojo::URLResponsePtr response,
HTMLDocument* document);
~DocumentResourceWaiter() override;
// Releases all the resources that have been accumulated.
void Release(mojo::InterfaceRequest<web_view::mojom::FrameClient>*
frame_client_request,
web_view::mojom::FramePtr* frame,
mojo::Array<web_view::mojom::FrameDataPtr>* frame_data,
uint32_t* window_id,
uint32_t* change_id,
web_view::mojom::WindowConnectType* window_connect_type,
OnConnectCallback* on_connect_callback);
uint32_t change_id() const { return change_id_; }
mojo::URLResponsePtr ReleaseURLResponse();
// See class description.
bool is_ready() const { return is_ready_; }
base::TimeTicks navigation_start_time() const {
return navigation_start_time_;
}
void SetRoot(mus::Window* root);
mus::Window* root() { return root_; }
void Bind(mojo::InterfaceRequest<web_view::mojom::FrameClient> request);
private:
// Updates |is_ready_|, and if ready starts the Load() in the document.
void UpdateIsReady();
// web_view::mojom::FrameClient:
void OnConnect(web_view::mojom::FramePtr frame,
uint32_t change_id,
uint32_t window_id,
web_view::mojom::WindowConnectType window_connect_type,
mojo::Array<web_view::mojom::FrameDataPtr> frame_data,
int64_t navigation_start_time_ticks,
const OnConnectCallback& callback) override;
void OnFrameAdded(uint32_t change_id,
web_view::mojom::FrameDataPtr frame_data) override;
void OnFrameRemoved(uint32_t change_id, uint32_t frame_id) override;
void OnFrameClientPropertyChanged(uint32_t frame_id,
const mojo::String& name,
mojo::Array<uint8_t> new_value) override;
void OnPostMessageEvent(uint32_t source_frame_id,
uint32_t target_frame_id,
web_view::mojom::HTMLMessageEventPtr event) override;
void OnWillNavigate(const mojo::String& origin,
const OnWillNavigateCallback& callback) override;
void OnFrameLoadingStateChanged(uint32_t frame_id, bool loading) override;
void OnDispatchFrameLoadEvent(uint32_t frame_id) override;
void Find(int32_t request_id,
const mojo::String& search_text,
web_view::mojom::FindOptionsPtr options,
bool wrap_within_frame,
const FindCallback& callback) override;
void StopFinding(bool clear_selection) override;
void HighlightFindResults(int32_t request_id,
const mojo::String& search_test,
web_view::mojom::FindOptionsPtr options,
bool reset) override;
void StopHighlightingFindResults() override;
// WindowObserver:
void OnWindowViewportMetricsChanged(
mus::Window* window,
const mus::mojom::ViewportMetrics& old_metrics,
const mus::mojom::ViewportMetrics& new_metrics) override;
void OnWindowDestroyed(mus::Window* window) override;
// HTMLFrameTreeManagerObserver:
void OnHTMLFrameTreeManagerChangeIdAdvanced() override;
void OnHTMLFrameTreeManagerDestroyed() override;
GlobalState* global_state_;
HTMLDocument* document_;
mojo::URLResponsePtr response_;
mus::Window* root_;
web_view::mojom::FramePtr frame_;
mojo::Array<web_view::mojom::FrameDataPtr> frame_data_;
uint32_t change_id_;
uint32_t window_id_;
base::TimeTicks navigation_start_time_;
web_view::mojom::WindowConnectType window_connect_type_;
OnConnectCallback on_connect_callback_;
// Once we get OnConnect() we unbind |frame_client_binding_| and put it here.
mojo::InterfaceRequest<web_view::mojom::FrameClient> frame_client_request_;
mojo::Binding<web_view::mojom::FrameClient> frame_client_binding_;
bool is_ready_;
// See comments in UpdateIsReady() for details of this.
//
// While |waiting_for_change_id_| is true DocumentResourceWaiter is an
// HTMLFrameTreeManagerObserver on |target_frame_tree_|.
bool waiting_for_change_id_;
HTMLFrameTreeManager* target_frame_tree_;
DISALLOW_COPY_AND_ASSIGN(DocumentResourceWaiter);
};
} // namespace html_viewer
#endif // COMPONENTS_HTML_VIEWER_DOCUMENT_RESOURCE_WAITER_H_