Index: components/html_viewer/html_frame.cc |
diff --git a/components/html_viewer/html_frame.cc b/components/html_viewer/html_frame.cc |
deleted file mode 100644 |
index 6ae4ca7902c960efff5715eac4ac2c5e1591f288..0000000000000000000000000000000000000000 |
--- a/components/html_viewer/html_frame.cc |
+++ /dev/null |
@@ -1,1050 +0,0 @@ |
-// 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. |
- |
-#include "components/html_viewer/html_frame.h" |
- |
-#include <stddef.h> |
-#include <algorithm> |
-#include <limits> |
-#include <utility> |
- |
-#include "base/bind.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/stl_util.h" |
-#include "base/strings/string_util.h" |
-#include "base/thread_task_runner_handle.h" |
-#include "cc/blink/web_layer_impl.h" |
-#include "cc/surfaces/surface_id.h" |
-#include "components/html_viewer/ax_provider_impl.h" |
-#include "components/html_viewer/blink_basic_type_converters.h" |
-#include "components/html_viewer/blink_find_type_converters.h" |
-#include "components/html_viewer/blink_text_input_type_converters.h" |
-#include "components/html_viewer/blink_url_request_type_converters.h" |
-#include "components/html_viewer/devtools_agent_impl.h" |
-#include "components/html_viewer/geolocation_client_impl.h" |
-#include "components/html_viewer/global_state.h" |
-#include "components/html_viewer/html_factory.h" |
-#include "components/html_viewer/html_frame_delegate.h" |
-#include "components/html_viewer/html_frame_properties.h" |
-#include "components/html_viewer/html_frame_tree_manager.h" |
-#include "components/html_viewer/html_widget.h" |
-#include "components/html_viewer/media_factory.h" |
-#include "components/html_viewer/stats_collection_controller.h" |
-#include "components/html_viewer/touch_handler.h" |
-#include "components/html_viewer/web_layer_tree_view_impl.h" |
-#include "components/html_viewer/web_storage_namespace_impl.h" |
-#include "components/html_viewer/web_url_loader_impl.h" |
-#include "components/mus/public/cpp/scoped_window_ptr.h" |
-#include "components/mus/public/cpp/window.h" |
-#include "components/mus/public/cpp/window_tree_connection.h" |
-#include "components/mus/ws/ids.h" |
-#include "mojo/common/common_type_converters.h" |
-#include "mojo/converters/blink/blink_input_events_type_converters.h" |
-#include "mojo/converters/geometry/geometry_type_converters.h" |
-#include "mojo/shell/public/cpp/shell.h" |
-#include "third_party/WebKit/public/platform/Platform.h" |
-#include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h" |
-#include "third_party/WebKit/public/platform/WebSecurityOrigin.h" |
-#include "third_party/WebKit/public/platform/WebSize.h" |
-#include "third_party/WebKit/public/web/WebConsoleMessage.h" |
-#include "third_party/WebKit/public/web/WebDocument.h" |
-#include "third_party/WebKit/public/web/WebElement.h" |
-#include "third_party/WebKit/public/web/WebFindOptions.h" |
-#include "third_party/WebKit/public/web/WebFrameOwnerProperties.h" |
-#include "third_party/WebKit/public/web/WebInputEvent.h" |
-#include "third_party/WebKit/public/web/WebKit.h" |
-#include "third_party/WebKit/public/web/WebLocalFrame.h" |
-#include "third_party/WebKit/public/web/WebNavigationPolicy.h" |
-#include "third_party/WebKit/public/web/WebRemoteFrame.h" |
-#include "third_party/WebKit/public/web/WebRemoteFrameClient.h" |
-#include "third_party/WebKit/public/web/WebScriptSource.h" |
-#include "third_party/WebKit/public/web/WebView.h" |
-#include "ui/gfx/geometry/dip_util.h" |
-#include "ui/gfx/geometry/size.h" |
-#include "url/gurl.h" |
-#include "url/origin.h" |
-#include "url/url_constants.h" |
- |
-using mojo::AxProvider; |
-using mojo::Rect; |
-using mojo::ServiceProviderPtr; |
-using mojo::URLResponsePtr; |
-using web_view::mojom::HTMLMessageEvent; |
-using web_view::mojom::HTMLMessageEventPtr; |
- |
-namespace html_viewer { |
-namespace { |
- |
-const size_t kMaxTitleChars = 4 * 1024; |
- |
-web_view::mojom::NavigationTargetType WebNavigationPolicyToNavigationTarget( |
- blink::WebNavigationPolicy policy) { |
- switch (policy) { |
- case blink::WebNavigationPolicyCurrentTab: |
- return web_view::mojom::NavigationTargetType::EXISTING_FRAME; |
- case blink::WebNavigationPolicyNewBackgroundTab: |
- case blink::WebNavigationPolicyNewForegroundTab: |
- case blink::WebNavigationPolicyNewWindow: |
- case blink::WebNavigationPolicyNewPopup: |
- return web_view::mojom::NavigationTargetType::NEW_FRAME; |
- default: |
- return web_view::mojom::NavigationTargetType::NO_PREFERENCE; |
- } |
-} |
- |
-HTMLFrame* GetPreviousSibling(HTMLFrame* frame) { |
- DCHECK(frame->parent()); |
- auto iter = std::find(frame->parent()->children().begin(), |
- frame->parent()->children().end(), frame); |
- return (iter == frame->parent()->children().begin()) ? nullptr : *(--iter); |
-} |
- |
-// See surface_layer.h for a description of this callback. |
-void SatisfyCallback(cc::SurfaceSequence sequence) { |
- // TODO(fsamuel): Implement this. |
-} |
- |
-// See surface_layer.h for a description of this callback. |
-void RequireCallback(cc::SurfaceId surface_id, |
- cc::SurfaceSequence sequence) { |
- // TODO(fsamuel): Implement this. |
-} |
- |
-} // namespace |
- |
-HTMLFrame::HTMLFrame(CreateParams* params) |
- : frame_tree_manager_(params->manager), |
- parent_(params->parent), |
- window_(nullptr), |
- id_(params->id), |
- web_frame_(nullptr), |
- delegate_(params->delegate), |
- pending_navigation_(false), |
- weak_factory_(this) { |
- TRACE_EVENT0("html_viewer", "HTMLFrame::HTMLFrame"); |
- if (parent_) |
- parent_->children_.push_back(this); |
- |
- if (params->window && params->window->id() == id_) |
- SetWindow(params->window); |
- |
- SetReplicatedFrameStateFromClientProperties(params->properties, &state_); |
- |
- if (!parent_) { |
- CreateRootWebWidget(); |
- |
- // This is the root of the tree (aka the main frame). |
- // Expected order for creating webframes is: |
- // . Create local webframe (first webframe must always be local). |
- // . Set as main frame on WebView. |
- // . Swap to remote (if not local). |
- blink::WebLocalFrame* local_web_frame = |
- blink::WebLocalFrame::create(state_.tree_scope, this); |
- // We need to set the main frame before creating children so that state is |
- // properly set up in blink. |
- web_view()->setMainFrame(local_web_frame); |
- |
- // The resize and setDeviceScaleFactor() needs to be after setting the main |
- // frame. |
- const gfx::Size size_in_pixels(params->window->bounds().size()); |
- const gfx::Size size_in_dips = gfx::ConvertSizeToDIP( |
- params->window->viewport_metrics().device_pixel_ratio, size_in_pixels); |
- web_view()->resize(size_in_dips); |
- web_frame_ = local_web_frame; |
- web_view()->setDeviceScaleFactor(global_state()->device_pixel_ratio()); |
- if (id_ != params->window->id()) { |
- blink::WebRemoteFrame* remote_web_frame = |
- blink::WebRemoteFrame::create(state_.tree_scope, this); |
- local_web_frame->swap(remote_web_frame); |
- web_frame_ = remote_web_frame; |
- } else { |
- // Setup a DevTools agent if this is the local main frame and the browser |
- // side has set relevant client properties. |
- mojo::Array<uint8_t> devtools_id = |
- GetValueFromClientProperties("devtools-id", params->properties); |
- if (!devtools_id.is_null()) { |
- mojo::Array<uint8_t> devtools_state = |
- GetValueFromClientProperties("devtools-state", params->properties); |
- std::string devtools_state_str = devtools_state.To<std::string>(); |
- devtools_agent_.reset(new DevToolsAgentImpl( |
- web_frame_->toWebLocalFrame(), devtools_id.To<std::string>(), |
- devtools_state.is_null() ? nullptr : &devtools_state_str)); |
- } |
- |
- // Collect startup perf data for local main frames in test environments. |
- // Child frames aren't tracked, and tracking remote frames is redundant. |
- startup_performance_data_collector_ = |
- StatsCollectionController::Install(web_frame_, GetShell()); |
- } |
- } else if (!params->is_local_create_child && params->window && |
- id_ == params->window->id()) { |
- // Frame represents the local frame, and it isn't the root of the tree. |
- HTMLFrame* previous_sibling = GetPreviousSibling(this); |
- blink::WebFrame* previous_web_frame = |
- previous_sibling ? previous_sibling->web_frame() : nullptr; |
- CHECK(!parent_->IsLocal()); |
- web_frame_ = parent_->web_frame()->toWebRemoteFrame()->createLocalChild( |
- state_.tree_scope, state_.name, state_.sandbox_flags, this, |
- previous_web_frame, |
- // TODO(lazyboy): Replicate WebFrameOwnerProperties where needed. |
- blink::WebFrameOwnerProperties()); |
- CreateLocalRootWebWidget(web_frame_->toWebLocalFrame()); |
- } else if (!parent_->IsLocal()) { |
- web_frame_ = parent_->web_frame()->toWebRemoteFrame()->createRemoteChild( |
- state_.tree_scope, state_.name, state_.sandbox_flags, this); |
- } else { |
- CHECK(params->is_local_create_child); |
- |
- blink::WebLocalFrame* child_web_frame = |
- blink::WebLocalFrame::create(state_.tree_scope, this); |
- web_frame_ = child_web_frame; |
- parent_->web_frame_->appendChild(child_web_frame); |
- } |
- |
- DVLOG(2) << "HTMLFrame init this=" << this << " id=" << id_ |
- << " local=" << IsLocal() |
- << " parent=" << (parent_ ? parent_->id_ : 0u); |
- |
- if (!IsLocal()) { |
- blink::WebRemoteFrame* remote_web_frame = web_frame_->toWebRemoteFrame(); |
- if (remote_web_frame) { |
- remote_web_frame->setReplicatedOrigin(state_.origin); |
- remote_web_frame->setReplicatedName(state_.name); |
- } |
- } |
-} |
- |
-void HTMLFrame::Close() { |
- if (GetWebWidget()) { |
- // Closing the root widget (WebView) implicitly detaches. For children |
- // (which have a WebFrameWidget) a detach() is required. Use a temporary |
- // as if 'this' is the root the call to GetWebWidget()->close() deletes |
- // 'this'. |
- const bool is_child = parent_ != nullptr; |
- GetWebWidget()->close(); |
- if (is_child) |
- web_frame_->detach(); |
- } else { |
- web_frame_->detach(); |
- } |
-} |
- |
-const HTMLFrame* HTMLFrame::FindFrame(uint32_t id) const { |
- if (id == id_) |
- return this; |
- |
- for (const HTMLFrame* child : children_) { |
- const HTMLFrame* match = child->FindFrame(id); |
- if (match) |
- return match; |
- } |
- return nullptr; |
-} |
- |
-blink::WebView* HTMLFrame::web_view() { |
- blink::WebWidget* web_widget = |
- html_widget_ ? html_widget_->GetWidget() : nullptr; |
- return web_widget && web_widget->isWebView() |
- ? static_cast<blink::WebView*>(web_widget) |
- : nullptr; |
-} |
- |
-blink::WebWidget* HTMLFrame::GetWebWidget() { |
- return html_widget_ ? html_widget_->GetWidget() : nullptr; |
-} |
- |
-bool HTMLFrame::IsLocal() const { |
- return web_frame_->isWebLocalFrame(); |
-} |
- |
-bool HTMLFrame::HasLocalDescendant() const { |
- if (IsLocal()) |
- return true; |
- |
- for (HTMLFrame* child : children_) { |
- if (child->HasLocalDescendant()) |
- return true; |
- } |
- return false; |
-} |
- |
-void HTMLFrame::LoadRequest(const blink::WebURLRequest& request, |
- base::TimeTicks navigation_start_time) { |
- TRACE_EVENT1("html_viewer", "HTMLFrame::LoadRequest", |
- "url", request.url().string().utf8()); |
- |
- DCHECK(IsLocal()); |
- |
- DVLOG(2) << "HTMLFrame::LoadRequest this=" << this << " id=" << id_ |
- << " URL=" << GURL(request.url()); |
- |
- pending_navigation_ = false; |
- navigation_start_time_ = navigation_start_time; |
- web_frame_->toWebLocalFrame()->loadRequest(request); |
-} |
- |
-HTMLFrame::~HTMLFrame() { |
- DVLOG(2) << "~HTMLFrame this=" << this << " id=" << id_; |
- |
- DCHECK(children_.empty()); |
- |
- if (parent_) { |
- auto iter = |
- std::find(parent_->children_.begin(), parent_->children_.end(), this); |
- parent_->children_.erase(iter); |
- } |
- parent_ = nullptr; |
- |
- frame_tree_manager_->OnFrameDestroyed(this); |
- |
- if (delegate_) |
- delegate_->OnFrameDestroyed(); |
- |
- if (window_) { |
- window_->RemoveObserver(this); |
- mus::ScopedWindowPtr::DeleteWindowOrWindowManager(window_); |
- } |
-} |
- |
-blink::WebMediaPlayer* HTMLFrame::createMediaPlayer( |
- blink::WebLocalFrame* frame, |
- blink::WebMediaPlayer::LoadType load_type, |
- const blink::WebURL& url, |
- blink::WebMediaPlayerClient* client, |
- blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, |
- blink::WebContentDecryptionModule* initial_cdm, |
- const blink::WebString& sink_id, |
- blink::WebMediaSession* media_session) { |
- return global_state()->media_factory()->CreateMediaPlayer( |
- frame, url, client, encrypted_client, initial_cdm, GetShell()); |
-} |
- |
-blink::WebFrame* HTMLFrame::createChildFrame( |
- blink::WebLocalFrame* parent, |
- blink::WebTreeScopeType scope, |
- const blink::WebString& frame_name, |
- blink::WebSandboxFlags sandbox_flags, |
- const blink::WebFrameOwnerProperties& frame_owner_properties) { |
- DCHECK(IsLocal()); // Can't create children of remote frames. |
- DCHECK_EQ(parent, web_frame_); |
- DCHECK(window_); // If we're local we have to have a window. |
- // Create the window that will house the frame now. We embed once we know the |
- // url (see decidePolicyForNavigation()). |
- mus::Window* child_window = window_->connection()->NewWindow(); |
- ReplicatedFrameState child_state; |
- child_state.name = frame_name; |
- child_state.tree_scope = scope; |
- child_state.sandbox_flags = sandbox_flags; |
- mojo::Map<mojo::String, mojo::Array<uint8_t>> client_properties; |
- client_properties.mark_non_null(); |
- ClientPropertiesFromReplicatedFrameState(child_state, &client_properties); |
- |
- child_window->SetVisible(true); |
- window_->AddChild(child_window); |
- |
- HTMLFrame::CreateParams params(frame_tree_manager_, this, child_window->id(), |
- child_window, client_properties, nullptr); |
- params.is_local_create_child = true; |
- HTMLFrame* child_frame = GetFirstAncestorWithDelegate() |
- ->delegate_->GetHTMLFactory() |
- ->CreateHTMLFrame(¶ms); |
- child_frame->owned_window_.reset(new mus::ScopedWindowPtr(child_window)); |
- |
- web_view::mojom::FrameClientPtr client_ptr; |
- child_frame->frame_client_binding_.reset( |
- new mojo::Binding<web_view::mojom::FrameClient>( |
- child_frame, mojo::GetProxy(&client_ptr))); |
- server_->OnCreatedFrame(GetProxy(&(child_frame->server_)), |
- std::move(client_ptr), child_window->id(), |
- std::move(client_properties)); |
- return child_frame->web_frame_; |
-} |
- |
-void HTMLFrame::frameDetached(blink::WebFrame* web_frame, |
- blink::WebFrameClient::DetachType type) { |
- if (type == blink::WebFrameClient::DetachType::Swap) { |
- web_frame->close(); |
- return; |
- } |
- |
- DCHECK(type == blink::WebFrameClient::DetachType::Remove); |
- FrameDetachedImpl(web_frame); |
-} |
- |
-blink::WebCookieJar* HTMLFrame::cookieJar(blink::WebLocalFrame* frame) { |
- // TODO(darin): Blink does not fallback to the Platform provided WebCookieJar. |
- // Either it should, as it once did, or we should find another solution here. |
- return blink::Platform::current()->cookieJar(); |
-} |
- |
-blink::WebNavigationPolicy HTMLFrame::decidePolicyForNavigation( |
- const NavigationPolicyInfo& info) { |
- // If we have extraData() it means we already have the url response |
- // (presumably because we are being called via Navigate()). In that case we |
- // can go ahead and navigate locally. |
- if (info.urlRequest.extraData()) { |
- DCHECK_EQ(blink::WebNavigationPolicyCurrentTab, info.defaultPolicy); |
- return blink::WebNavigationPolicyCurrentTab; |
- } |
- |
- // about:blank is treated as the same origin and is always allowed for frames. |
- if (parent_ && info.urlRequest.url() == GURL(url::kAboutBlankURL) && |
- info.defaultPolicy == blink::WebNavigationPolicyCurrentTab) { |
- return blink::WebNavigationPolicyCurrentTab; |
- } |
- |
- // Ask the Frame to handle the navigation. Returning |
- // WebNavigationPolicyHandledByClient to inform blink that the navigation is |
- // being handled. |
- DVLOG(2) << "HTMLFrame::decidePolicyForNavigation calls " |
- << "Frame::RequestNavigate this=" << this << " id=" << id_ |
- << " URL=" << GURL(info.urlRequest.url()); |
- |
- mojo::URLRequestPtr url_request = mojo::URLRequest::From(info.urlRequest); |
- url_request->originating_time_ticks = |
- base::TimeTicks::Now().ToInternalValue(); |
- server_->RequestNavigate( |
- WebNavigationPolicyToNavigationTarget(info.defaultPolicy), id_, |
- std::move(url_request)); |
- |
- // TODO(yzshen): crbug.com/532556 If the server side drops the request, |
- // this frame will be in permenant-loading state. We should send a |
- // notification to mark this frame as not loading in that case. We also need |
- // to better keep track of multiple pending navigations. |
- pending_navigation_ = true; |
- return blink::WebNavigationPolicyHandledByClient; |
-} |
- |
-bool HTMLFrame::hasPendingNavigation(blink::WebLocalFrame* frame) { |
- return pending_navigation_; |
-} |
- |
-void HTMLFrame::didHandleOnloadEvents(blink::WebLocalFrame* frame) { |
- DVLOG(2) << "XXX HTMLFrame::didHandleOnloadEvents id=" << id_; |
- static bool recorded = false; |
- if (!recorded && startup_performance_data_collector_) { |
- startup_performance_data_collector_->SetFirstWebContentsMainFrameLoadTicks( |
- base::TimeTicks::Now().ToInternalValue()); |
- recorded = true; |
- } |
-} |
- |
-void HTMLFrame::didAddMessageToConsole(const blink::WebConsoleMessage& message, |
- const blink::WebString& source_name, |
- unsigned source_line, |
- const blink::WebString& stack_trace) { |
- VLOG(1) << "[" << source_name.utf8() << "(" << source_line << ")] " |
- << message.text.utf8(); |
-} |
- |
-void HTMLFrame::didFinishLoad(blink::WebLocalFrame* frame) { |
- if (GetFirstAncestorWithDelegate() == this) |
- delegate_->OnFrameDidFinishLoad(); |
-} |
- |
-void HTMLFrame::didNavigateWithinPage(blink::WebLocalFrame* frame, |
- const blink::WebHistoryItem& history_item, |
- blink::WebHistoryCommitType commit_type) { |
- server_->DidNavigateLocally(history_item.urlString().utf8()); |
-} |
- |
-blink::WebGeolocationClient* HTMLFrame::geolocationClient() { |
- if (!geolocation_client_impl_) |
- geolocation_client_impl_.reset(new GeolocationClientImpl); |
- return geolocation_client_impl_.get(); |
-} |
- |
-blink::WebEncryptedMediaClient* HTMLFrame::encryptedMediaClient() { |
- return global_state()->media_factory()->GetEncryptedMediaClient(); |
-} |
- |
-void HTMLFrame::didStartLoading(bool to_different_document) { |
- server_->LoadingStateChanged(true, 0.0); |
-} |
- |
-void HTMLFrame::didStopLoading() { |
- server_->LoadingStateChanged(false, 1.0); |
-} |
- |
-void HTMLFrame::didChangeLoadProgress(double load_progress) { |
- server_->LoadingStateChanged(true, load_progress); |
-} |
- |
-void HTMLFrame::dispatchLoad() { |
- // According to comments of WebFrameClient::dispatchLoad(), this should only |
- // be called when the parent frame is remote. |
- DCHECK(parent_ && !parent_->IsLocal()); |
- server_->DispatchLoadEventToParent(); |
-} |
- |
-void HTMLFrame::didChangeName(blink::WebLocalFrame* frame, |
- const blink::WebString& name) { |
- state_.name = name; |
- server_->SetClientProperty(kPropertyFrameName, |
- FrameNameToClientProperty(name)); |
-} |
- |
-void HTMLFrame::didCommitProvisionalLoad( |
- blink::WebLocalFrame* frame, |
- const blink::WebHistoryItem& item, |
- blink::WebHistoryCommitType commit_type) { |
- state_.origin = FrameOrigin(frame); |
- server_->SetClientProperty(kPropertyFrameOrigin, |
- FrameOriginToClientProperty(frame)); |
- |
- // TODO(erg): We need to pass way more information from here through to the |
- // other side. See FrameHostMsg_DidCommitProvisionalLoad_Params. It is a grab |
- // bag of everything and it looks like a combination of |
- // NavigatorImpl::DidNavigate and |
- // NavigationControllerImpl::RendererDidNavigate use everything passed |
- // through. |
- server_->DidCommitProvisionalLoad(); |
- |
- if (!navigation_start_time_.is_null()) { |
- frame->dataSource()->setNavigationStartTime( |
- navigation_start_time_.ToInternalValue() / |
- static_cast<double>(base::Time::kMicrosecondsPerSecond)); |
- navigation_start_time_ = base::TimeTicks(); |
- } |
-} |
- |
-void HTMLFrame::didReceiveTitle(blink::WebLocalFrame* frame, |
- const blink::WebString& title, |
- blink::WebTextDirection direction) { |
- // TODO(beng): handle |direction|. |
- mojo::String formatted; |
- if (!title.isNull()) { |
- formatted = |
- mojo::String::From(base::string16(title).substr(0, kMaxTitleChars)); |
- } |
- server_->TitleChanged(formatted); |
-} |
- |
-void HTMLFrame::reportFindInFrameMatchCount(int identifier, |
- int count, |
- bool finalUpdate) { |
- server_->OnFindInFrameCountUpdated(identifier, count, finalUpdate); |
-} |
- |
-void HTMLFrame::reportFindInPageSelection(int identifier, |
- int activeMatchOrdinal, |
- const blink::WebRect& selection) { |
- server_->OnFindInPageSelectionUpdated(identifier, activeMatchOrdinal); |
-} |
- |
-bool HTMLFrame::shouldSearchSingleFrame() { |
- return true; |
-} |
- |
-void HTMLFrame::Bind( |
- web_view::mojom::FramePtr frame, |
- mojo::InterfaceRequest<web_view::mojom::FrameClient> frame_client_request) { |
- DCHECK(IsLocal()); |
- server_ = std::move(frame); |
- server_.set_connection_error_handler( |
- base::Bind(&HTMLFrame::Close, base::Unretained(this))); |
- frame_client_binding_.reset(new mojo::Binding<web_view::mojom::FrameClient>( |
- this, std::move(frame_client_request))); |
-} |
- |
-void HTMLFrame::SetValueFromClientProperty(const std::string& name, |
- mojo::Array<uint8_t> new_data) { |
- if (IsLocal()) |
- return; |
- |
- // Only the name and origin dynamically change. |
- if (name == kPropertyFrameOrigin) { |
- state_.origin = FrameOriginFromClientProperty(new_data); |
- web_frame_->toWebRemoteFrame()->setReplicatedOrigin(state_.origin); |
- } else if (name == kPropertyFrameName) { |
- state_.name = FrameNameFromClientProperty(new_data); |
- web_frame_->toWebRemoteFrame()->setReplicatedName(state_.name); |
- } |
-} |
- |
-HTMLFrame* HTMLFrame::GetFirstAncestorWithDelegate() { |
- HTMLFrame* frame = this; |
- while (frame && !frame->delegate_) |
- frame = frame->parent_; |
- return frame; |
-} |
- |
-mojo::Shell* HTMLFrame::GetShell() { |
- return GetFirstAncestorWithDelegate()->delegate_->GetShell(); |
-} |
- |
-web_view::mojom::Frame* HTMLFrame::GetServerFrame() { |
- // Prefer an ancestor with a server Frame. |
- for (HTMLFrame* frame = this; frame; frame = frame->parent_) { |
- if (frame->server_.get()) |
- return frame->server_.get(); |
- } |
- |
- // We're a remote frame with no local frame ancestors. Use the server Frame |
- // from the local frame of the HTMLFrameTreeManager. |
- return frame_tree_manager_->local_frame_->server_.get(); |
-} |
- |
-void HTMLFrame::SetWindow(mus::Window* window) { |
- if (window_) { |
- window_->set_input_event_handler(nullptr); |
- window_->RemoveObserver(this); |
- } |
- window_ = window; |
- if (window_) { |
- window_->AddObserver(this); |
- window_->set_input_event_handler(this); |
- } |
-} |
- |
-void HTMLFrame::CreateRootWebWidget() { |
- DCHECK(!html_widget_); |
- if (window_) { |
- HTMLWidgetRootLocal::CreateParams create_params(GetShell(), global_state(), |
- window_); |
- html_widget_.reset( |
- delegate_->GetHTMLFactory()->CreateHTMLWidgetRootLocal(&create_params)); |
- } else { |
- html_widget_.reset(new HTMLWidgetRootRemote(global_state())); |
- } |
-} |
- |
-void HTMLFrame::CreateLocalRootWebWidget(blink::WebLocalFrame* local_frame) { |
- DCHECK(!html_widget_); |
- DCHECK(IsLocal()); |
- html_widget_.reset(new HTMLWidgetLocalRoot(GetShell(), global_state(), |
- window_, local_frame)); |
-} |
- |
-void HTMLFrame::UpdateFocus() { |
- blink::WebWidget* web_widget = GetWebWidget(); |
- if (!web_widget || !window_) |
- return; |
- const bool is_focused = window_ && window_->HasFocus(); |
- web_widget->setFocus(is_focused); |
- if (web_widget->isWebView()) |
- static_cast<blink::WebView*>(web_widget)->setIsActive(is_focused); |
-} |
- |
-void HTMLFrame::SwapToRemote() { |
- TRACE_EVENT0("html_viewer", "HTMLFrame::SwapToRemote"); |
- |
- DVLOG(2) << "HTMLFrame::SwapToRemote this=" << this << " id=" << id_; |
- |
- DCHECK(IsLocal()); |
- |
- HTMLFrameDelegate* delegate = delegate_; |
- delegate_ = nullptr; |
- |
- blink::WebRemoteFrame* remote_frame = |
- blink::WebRemoteFrame::create(state_.tree_scope, this); |
- remote_frame->initializeFromFrame(web_frame_->toWebLocalFrame()); |
- // swap() ends up calling us back and we then close the frame, which deletes |
- // it. |
- web_frame_->swap(remote_frame); |
- if (owned_window_) { |
- surface_layer_ = |
- cc::SurfaceLayer::Create(cc_blink::WebLayerImpl::LayerSettings(), |
- base::Bind(&SatisfyCallback), |
- base::Bind(&RequireCallback)); |
- surface_layer_->SetSurfaceId(cc::SurfaceId(owned_window_->window()->id()), |
- global_state()->device_pixel_ratio(), |
- owned_window_->window()->bounds().size()); |
- |
- web_layer_.reset(new cc_blink::WebLayerImpl(surface_layer_)); |
- } |
- remote_frame->setRemoteWebLayer(web_layer_.get()); |
- remote_frame->setReplicatedName(state_.name); |
- remote_frame->setReplicatedOrigin(state_.origin); |
- remote_frame->setReplicatedSandboxFlags(state_.sandbox_flags); |
- |
- // Tell the frame that it is actually loading. This prevents its parent |
- // from prematurely dispatching load event. |
- remote_frame->didStartLoading(); |
- pending_navigation_ = false; |
- |
- web_frame_ = remote_frame; |
- SetWindow(nullptr); |
- server_.reset(); |
- frame_client_binding_.reset(); |
- if (delegate) |
- delegate->OnFrameSwappedToRemote(); |
-} |
- |
-void HTMLFrame::SwapToLocal( |
- HTMLFrameDelegate* delegate, |
- mus::Window* window, |
- const mojo::Map<mojo::String, mojo::Array<uint8_t>>& properties) { |
- TRACE_EVENT0("html_viewer", "HTMLFrame::SwapToLocal"); |
- DVLOG(2) << "HTMLFrame::SwapToLocal this=" << this << " id=" << id_; |
- CHECK(!IsLocal()); |
- // It doesn't make sense for the root to swap to local. |
- CHECK(parent_); |
- delegate_ = delegate; |
- SetWindow(window); |
- SetReplicatedFrameStateFromClientProperties(properties, &state_); |
- blink::WebLocalFrame* local_web_frame = |
- blink::WebLocalFrame::createProvisional( |
- this, web_frame_->toWebRemoteFrame(), state_.sandbox_flags, |
- // TODO(lazyboy): Figure out replicating WebFrameOwnerProperties. |
- blink::WebFrameOwnerProperties()); |
- // The swap() ends up calling to frameDetached() and deleting the old. |
- web_frame_->swap(local_web_frame); |
- web_frame_ = local_web_frame; |
- |
- web_layer_.reset(); |
-} |
- |
-void HTMLFrame::SwapDelegate(HTMLFrameDelegate* delegate) { |
- DCHECK(IsLocal()); |
- HTMLFrameDelegate* old_delegate = delegate_; |
- delegate_ = delegate; |
- delegate->OnSwap(this, old_delegate); |
-} |
- |
-blink::WebElement HTMLFrame::GetFocusedElement() { |
- if (!web_view()) |
- return blink::WebElement(); |
- |
- HTMLFrame* frame = this; |
- while (frame) { |
- if (frame->web_view()) { |
- if (frame->web_view()->focusedFrame() == web_frame_) { |
- blink::WebDocument doc = web_frame_->document(); |
- if (!doc.isNull()) |
- return doc.focusedElement(); |
- } |
- return blink::WebElement(); |
- } |
- frame = frame->parent(); |
- } |
- |
- return blink::WebElement(); |
-} |
- |
-HTMLFrame* HTMLFrame::FindFrameWithWebFrame(blink::WebFrame* web_frame) { |
- if (web_frame_ == web_frame) |
- return this; |
- for (HTMLFrame* child_frame : children_) { |
- HTMLFrame* result = child_frame->FindFrameWithWebFrame(web_frame); |
- if (result) |
- return result; |
- } |
- return nullptr; |
-} |
- |
-void HTMLFrame::FrameDetachedImpl(blink::WebFrame* web_frame) { |
- DCHECK_EQ(web_frame_, web_frame); |
- |
- while (!children_.empty()) { |
- HTMLFrame* child = children_.front(); |
- child->Close(); |
- DCHECK(children_.empty() || children_.front() != child); |
- } |
- |
- if (web_frame->parent()) |
- web_frame->parent()->removeChild(web_frame); |
- |
- delete this; |
-} |
- |
-void HTMLFrame::OnWindowBoundsChanged(mus::Window* window, |
- const gfx::Rect& old_bounds, |
- const gfx::Rect& new_bounds) { |
- DCHECK_EQ(window, window_); |
- if (html_widget_) |
- html_widget_->OnWindowBoundsChanged(window); |
-} |
- |
-void HTMLFrame::OnWindowDestroyed(mus::Window* window) { |
- DCHECK_EQ(window, window_); |
- window_->RemoveObserver(this); |
- window_ = nullptr; |
- Close(); |
-} |
- |
-void HTMLFrame::OnWindowFocusChanged(mus::Window* gained_focus, |
- mus::Window* lost_focus) { |
- UpdateFocus(); |
-} |
- |
-void HTMLFrame::OnWindowInputEvent(mus::Window* window, |
- mus::mojom::EventPtr event, |
- scoped_ptr<base::Closure>* ack_callback) { |
- if (event->pointer_data && event->pointer_data->location) { |
- // Blink expects coordintes to be in DIPs. |
- event->pointer_data->location->x /= global_state()->device_pixel_ratio(); |
- event->pointer_data->location->y /= global_state()->device_pixel_ratio(); |
- event->pointer_data->location->screen_x /= |
- global_state()->device_pixel_ratio(); |
- event->pointer_data->location->screen_y /= |
- global_state()->device_pixel_ratio(); |
- } |
- |
- blink::WebWidget* web_widget = GetWebWidget(); |
- |
- if (!touch_handler_ && web_widget) |
- touch_handler_.reset(new TouchHandler(web_widget)); |
- |
- if (touch_handler_ && |
- (event->action == mus::mojom::EventType::POINTER_DOWN || |
- event->action == mus::mojom::EventType::POINTER_UP || |
- event->action == mus::mojom::EventType::POINTER_CANCEL || |
- event->action == mus::mojom::EventType::POINTER_MOVE) && |
- event->pointer_data && |
- event->pointer_data->kind == mus::mojom::PointerKind::TOUCH) { |
- touch_handler_->OnTouchEvent(*event); |
- return; |
- } |
- |
- if (!web_widget) |
- return; |
- |
- scoped_ptr<blink::WebInputEvent> web_event = |
- event.To<scoped_ptr<blink::WebInputEvent>>(); |
- if (web_event) |
- web_widget->handleInputEvent(*web_event); |
-} |
- |
-void HTMLFrame::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) { |
- // This is called if this frame is created by way of OnCreatedFrame(). |
- callback.Run(); |
-} |
- |
-void HTMLFrame::OnFrameAdded(uint32_t change_id, |
- web_view::mojom::FrameDataPtr frame_data) { |
- frame_tree_manager_->ProcessOnFrameAdded(this, change_id, |
- std::move(frame_data)); |
-} |
- |
-void HTMLFrame::OnFrameRemoved(uint32_t change_id, uint32_t frame_id) { |
- frame_tree_manager_->ProcessOnFrameRemoved(this, change_id, frame_id); |
-} |
- |
-void HTMLFrame::OnFrameClientPropertyChanged(uint32_t frame_id, |
- const mojo::String& name, |
- mojo::Array<uint8_t> new_value) { |
- frame_tree_manager_->ProcessOnFrameClientPropertyChanged( |
- this, frame_id, name, std::move(new_value)); |
-} |
- |
-void HTMLFrame::OnPostMessageEvent(uint32_t source_frame_id, |
- uint32_t target_frame_id, |
- HTMLMessageEventPtr serialized_event) { |
- NOTIMPLEMENTED(); // For message ports. |
- |
- HTMLFrame* target = frame_tree_manager_->root_->FindFrame(target_frame_id); |
- HTMLFrame* source = frame_tree_manager_->root_->FindFrame(source_frame_id); |
- if (!target || !source) { |
- DVLOG(1) << "Invalid source or target for PostMessage"; |
- return; |
- } |
- |
- if (!target->IsLocal()) { |
- DVLOG(1) << "Target for PostMessage is not lot local"; |
- return; |
- } |
- |
- blink::WebLocalFrame* target_web_frame = |
- target->web_frame_->toWebLocalFrame(); |
- |
- blink::WebSerializedScriptValue serialized_script_value; |
- serialized_script_value = blink::WebSerializedScriptValue::fromString( |
- serialized_event->data.To<blink::WebString>()); |
- |
- // We must pass in the target_origin to do the security check on this side, |
- // since it may have changed since the original postMessage call was made. |
- blink::WebSecurityOrigin target_origin; |
- if (!serialized_event->target_origin.is_null()) { |
- target_origin = blink::WebSecurityOrigin::createFromString( |
- serialized_event->target_origin.To<blink::WebString>()); |
- } |
- |
- // TODO(esprehn): Shouldn't this also fill in channels like RenderFrameImpl? |
- blink::WebMessagePortChannelArray channels; |
- blink::WebDOMMessageEvent msg_event(serialized_script_value, |
- serialized_event->source_origin.To<blink::WebString>(), |
- source->web_frame_, target_web_frame->document(), channels); |
- |
- target_web_frame->dispatchMessageEventWithOriginCheck(target_origin, |
- msg_event); |
-} |
- |
-void HTMLFrame::OnWillNavigate(const mojo::String& origin, |
- const OnWillNavigateCallback& callback) { |
- bool should_swap = true; |
- |
- if (this == frame_tree_manager_->local_frame_) { |
- HTMLFrame* new_local_frame = frame_tree_manager_->FindNewLocalFrame(); |
- if (!new_local_frame) { |
- // All local frames are descendants of |this|. In this case, the whole |
- // frame tree in the current process is going to be deleted very soon. We |
- // don't have to swap. |
- should_swap = false; |
- } else { |
- frame_tree_manager_->local_frame_ = new_local_frame; |
- } |
- } |
- |
- DVLOG(2) << "HTMLFrame::OnWillNavigate this=" << this << " id=" << id_ |
- << " local=" << IsLocal() << " should_swap=" << should_swap; |
- callback.Run(); |
- if (should_swap) { |
- SwapToRemote(); |
- const blink::WebSecurityOrigin security_origin( |
- blink::WebSecurityOrigin::createFromString( |
- blink::WebString::fromUTF8(origin))); |
- web_frame_->toWebRemoteFrame()->setReplicatedOrigin(security_origin); |
- } |
-} |
- |
-void HTMLFrame::OnFrameLoadingStateChanged(uint32_t frame_id, bool loading) { |
- HTMLFrame* frame = frame_tree_manager_->root_->FindFrame(frame_id); |
- // TODO(yzshen): (Apply to this method and the one below.) Is it possible that |
- // at this point the frame is already hosting a different document? |
- if (frame && !frame->IsLocal()) { |
- if (loading) |
- frame->web_frame_->toWebRemoteFrame()->didStartLoading(); |
- else |
- frame->web_frame_->toWebRemoteFrame()->didStopLoading(); |
- } |
-} |
- |
-void HTMLFrame::OnDispatchFrameLoadEvent(uint32_t frame_id) { |
- HTMLFrame* frame = frame_tree_manager_->root_->FindFrame(frame_id); |
- if (frame && !frame->IsLocal()) |
- frame->web_frame_->toWebRemoteFrame()->DispatchLoadEventForFrameOwner(); |
-} |
- |
-void HTMLFrame::Find(int32_t request_id, |
- const mojo::String& search_text, |
- web_view::mojom::FindOptionsPtr options, |
- bool wrap_within_frame, |
- const FindCallback& callback) { |
- blink::WebRect selection_rect; |
- bool result = web_frame_->toWebLocalFrame()->find( |
- request_id, search_text.To<blink::WebString>(), |
- options.To<blink::WebFindOptions>(), wrap_within_frame, &selection_rect); |
- |
- if (!result) { |
- // don't leave text selected as you move to the next frame. |
- web_frame_->executeCommand(blink::WebString::fromUTF8("Unselect"), |
- GetFocusedElement()); |
- } |
- |
- callback.Run(result); |
-} |
- |
-void HTMLFrame::StopFinding(bool clear_selection) { |
- // TODO(erg): |clear_selection| isn't correct; this should be a state enum |
- // that lets us STOP_FIND_ACTION_ACTIVATE_SELECTION, too. |
- if (clear_selection) { |
- blink::WebElement focused_element = GetFocusedElement(); |
- if (!focused_element.isNull()) { |
- web_frame_->executeCommand(blink::WebString::fromUTF8("Unselect"), |
- focused_element); |
- } |
- } |
- |
- web_frame_->toWebLocalFrame()->stopFinding(clear_selection); |
-} |
- |
-void HTMLFrame::HighlightFindResults(int32_t request_id, |
- const mojo::String& search_text, |
- web_view::mojom::FindOptionsPtr options, |
- bool reset) { |
- web_frame_->toWebLocalFrame()->scopeStringMatches( |
- request_id, search_text.To<blink::WebString>(), |
- options.To<blink::WebFindOptions>(), reset); |
-} |
- |
-void HTMLFrame::StopHighlightingFindResults() { |
- web_frame_->toWebLocalFrame()->resetMatchCount(); |
- web_frame_->toWebLocalFrame()->cancelPendingScopingEffort(); |
-} |
- |
-void HTMLFrame::frameDetached(blink::WebRemoteFrameClient::DetachType type) { |
- if (type == blink::WebRemoteFrameClient::DetachType::Swap) { |
- web_frame_->close(); |
- return; |
- } |
- |
- DCHECK(type == blink::WebRemoteFrameClient::DetachType::Remove); |
- FrameDetachedImpl(web_frame_); |
-} |
- |
-void HTMLFrame::postMessageEvent(blink::WebLocalFrame* source_web_frame, |
- blink::WebRemoteFrame* target_web_frame, |
- blink::WebSecurityOrigin target_origin, |
- blink::WebDOMMessageEvent web_event) { |
- NOTIMPLEMENTED(); // message_ports aren't implemented yet. |
- |
- HTMLFrame* source_frame = |
- frame_tree_manager_->root_->FindFrameWithWebFrame(source_web_frame); |
- DCHECK(source_frame); |
- HTMLFrame* target_frame = |
- frame_tree_manager_->root_->FindFrameWithWebFrame(target_web_frame); |
- DCHECK(target_frame); |
- |
- HTMLMessageEventPtr event(HTMLMessageEvent::New()); |
- event->data = mojo::Array<uint8_t>::From(web_event.data().toString()); |
- event->source_origin = mojo::String::From(web_event.origin()); |
- if (!target_origin.isNull()) |
- event->target_origin = mojo::String::From(target_origin.toString()); |
- |
- source_frame->server_->PostMessageEventToFrame(target_frame->id_, |
- std::move(event)); |
-} |
- |
-void HTMLFrame::initializeChildFrame(const blink::WebRect& frame_rect, |
- float scale_factor) { |
- // NOTE: |scale_factor| is always 1. |
- const gfx::Rect rect_in_dip(frame_rect.x, frame_rect.y, frame_rect.width, |
- frame_rect.height); |
- const gfx::Rect rect_in_pixels(gfx::ConvertRectToPixel( |
- global_state()->device_pixel_ratio(), rect_in_dip)); |
- window_->SetBounds(rect_in_pixels); |
-} |
- |
-void HTMLFrame::navigate(const blink::WebURLRequest& request, |
- bool should_replace_current_entry) { |
- // TODO: support |should_replace_current_entry|. |
- NOTIMPLEMENTED(); // for |should_replace_current_entry |
- mojo::URLRequestPtr url_request = mojo::URLRequest::From(request); |
- GetServerFrame()->RequestNavigate( |
- web_view::mojom::NavigationTargetType::EXISTING_FRAME, id_, |
- std::move(url_request)); |
-} |
- |
-void HTMLFrame::reload(bool ignore_cache, bool is_client_redirect) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void HTMLFrame::frameRectsChanged(const blink::WebRect& frame_rect) { |
- // Only the owner of window can update its size. |
- if (!owned_window_) |
- return; |
- |
- const gfx::Rect rect_in_dip(frame_rect.x, frame_rect.y, frame_rect.width, |
- frame_rect.height); |
- const gfx::Rect rect_in_pixels(gfx::ConvertRectToPixel( |
- global_state()->device_pixel_ratio(), rect_in_dip)); |
- owned_window_->window()->SetBounds(rect_in_pixels); |
- |
- if (!surface_layer_) |
- return; |
- |
- surface_layer_->SetSurfaceId(cc::SurfaceId(owned_window_->window()->id()), |
- global_state()->device_pixel_ratio(), |
- owned_window_->window()->bounds().size()); |
-} |
- |
-} // namespace mojo |