aw_render_view_host_ext.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "android_webview/browser/renderer_host/aw_render_view_host_ext.h"
6
7#include "android_webview/browser/aw_browser_context.h"
8#include "android_webview/browser/scoped_allow_wait_for_legacy_web_view_api.h"
9#include "android_webview/common/render_view_messages.h"
10#include "base/android/scoped_java_ref.h"
11#include "base/callback.h"
12#include "base/command_line.h"
13#include "base/logging.h"
14#include "content/public/browser/android/content_view_core.h"
15#include "content/public/browser/render_process_host.h"
16#include "content/public/browser/render_view_host.h"
17#include "content/public/browser/user_metrics.h"
18#include "content/public/browser/web_contents.h"
19#include "content/public/common/frame_navigate_params.h"
20
21namespace android_webview {
22
23AwRenderViewHostExt::AwRenderViewHostExt(
24    AwRenderViewHostExtClient* client, content::WebContents* contents)
25    : content::WebContentsObserver(contents),
26      client_(client),
27      background_color_(SK_ColorWHITE),
28      has_new_hit_test_data_(false) {
29  DCHECK(client_);
30}
31
32AwRenderViewHostExt::~AwRenderViewHostExt() {}
33
34void AwRenderViewHostExt::DocumentHasImages(DocumentHasImagesResult result) {
35  DCHECK(CalledOnValidThread());
36  if (!web_contents()->GetRenderViewHost()) {
37    result.Run(false);
38    return;
39  }
40  static int next_id = 1;
41  int this_id = next_id++;
42  pending_document_has_images_requests_[this_id] = result;
43  Send(new AwViewMsg_DocumentHasImages(web_contents()->GetRoutingID(),
44                                       this_id));
45}
46
47void AwRenderViewHostExt::ClearCache() {
48  DCHECK(CalledOnValidThread());
49  Send(new AwViewMsg_ClearCache);
50}
51
52bool AwRenderViewHostExt::HasNewHitTestData() const {
53  return has_new_hit_test_data_;
54}
55
56void AwRenderViewHostExt::MarkHitTestDataRead() {
57  has_new_hit_test_data_ = false;
58}
59
60void AwRenderViewHostExt::RequestNewHitTestDataAt(int view_x, int view_y) {
61  DCHECK(CalledOnValidThread());
62  Send(new AwViewMsg_DoHitTest(web_contents()->GetRoutingID(),
63                               view_x,
64                               view_y));
65}
66
67const AwHitTestData& AwRenderViewHostExt::GetLastHitTestData() const {
68  DCHECK(CalledOnValidThread());
69  return last_hit_test_data_;
70}
71
72void AwRenderViewHostExt::SetTextZoomFactor(float factor) {
73  DCHECK(CalledOnValidThread());
74  Send(new AwViewMsg_SetTextZoomFactor(web_contents()->GetRoutingID(), factor));
75}
76
77void AwRenderViewHostExt::ResetScrollAndScaleState() {
78  DCHECK(CalledOnValidThread());
79  Send(new AwViewMsg_ResetScrollAndScaleState(web_contents()->GetRoutingID()));
80}
81
82void AwRenderViewHostExt::SetInitialPageScale(double page_scale_factor) {
83  DCHECK(CalledOnValidThread());
84  Send(new AwViewMsg_SetInitialPageScale(web_contents()->GetRoutingID(),
85                                         page_scale_factor));
86}
87
88void AwRenderViewHostExt::SetBackgroundColor(SkColor c) {
89  if (background_color_ == c)
90    return;
91  background_color_ = c;
92  if (web_contents()->GetRenderViewHost()) {
93    Send(new AwViewMsg_SetBackgroundColor(web_contents()->GetRoutingID(),
94                                          background_color_));
95  }
96}
97
98void AwRenderViewHostExt::SetJsOnlineProperty(bool network_up) {
99  Send(new AwViewMsg_SetJsOnlineProperty(network_up));
100}
101
102void AwRenderViewHostExt::RenderViewCreated(
103    content::RenderViewHost* render_view_host) {
104  Send(new AwViewMsg_SetBackgroundColor(web_contents()->GetRoutingID(),
105                                        background_color_));
106}
107
108void AwRenderViewHostExt::RenderProcessGone(base::TerminationStatus status) {
109  DCHECK(CalledOnValidThread());
110  for (std::map<int, DocumentHasImagesResult>::iterator pending_req =
111           pending_document_has_images_requests_.begin();
112       pending_req != pending_document_has_images_requests_.end();
113      ++pending_req) {
114    pending_req->second.Run(false);
115  }
116}
117
118void AwRenderViewHostExt::DidNavigateAnyFrame(
119    const content::LoadCommittedDetails& details,
120    const content::FrameNavigateParams& params) {
121  DCHECK(CalledOnValidThread());
122
123  AwBrowserContext::FromWebContents(web_contents())
124      ->AddVisitedURLs(params.redirects);
125}
126
127bool AwRenderViewHostExt::OnMessageReceived(const IPC::Message& message) {
128  bool handled = true;
129  IPC_BEGIN_MESSAGE_MAP(AwRenderViewHostExt, message)
130    IPC_MESSAGE_HANDLER(AwViewHostMsg_DocumentHasImagesResponse,
131                        OnDocumentHasImagesResponse)
132    IPC_MESSAGE_HANDLER(AwViewHostMsg_UpdateHitTestData,
133                        OnUpdateHitTestData)
134    IPC_MESSAGE_HANDLER(AwViewHostMsg_PageScaleFactorChanged,
135                        OnPageScaleFactorChanged)
136    IPC_MESSAGE_HANDLER(AwViewHostMsg_OnContentsSizeChanged,
137                        OnContentsSizeChanged)
138    IPC_MESSAGE_UNHANDLED(handled = false)
139  IPC_END_MESSAGE_MAP()
140
141  return handled ? true : WebContentsObserver::OnMessageReceived(message);
142}
143
144void AwRenderViewHostExt::OnDocumentHasImagesResponse(int msg_id,
145                                                      bool has_images) {
146  DCHECK(CalledOnValidThread());
147  std::map<int, DocumentHasImagesResult>::iterator pending_req =
148      pending_document_has_images_requests_.find(msg_id);
149  if (pending_req == pending_document_has_images_requests_.end()) {
150    DLOG(WARNING) << "unexpected DocumentHasImages Response: " << msg_id;
151  } else {
152    pending_req->second.Run(has_images);
153    pending_document_has_images_requests_.erase(pending_req);
154  }
155}
156
157void AwRenderViewHostExt::OnUpdateHitTestData(
158    const AwHitTestData& hit_test_data) {
159  DCHECK(CalledOnValidThread());
160  last_hit_test_data_ = hit_test_data;
161  has_new_hit_test_data_ = true;
162}
163
164void AwRenderViewHostExt::OnPageScaleFactorChanged(float page_scale_factor) {
165  client_->OnWebLayoutPageScaleFactorChanged(page_scale_factor);
166}
167
168void AwRenderViewHostExt::OnContentsSizeChanged(
169    const gfx::Size& contents_size) {
170  client_->OnWebLayoutContentsSizeChanged(contents_size);
171}
172
173}  // namespace android_webview
174