1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CHROME_BROWSER_GUESTVIEW_WEBVIEW_WEBVIEW_GUEST_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CHROME_BROWSER_GUESTVIEW_WEBVIEW_WEBVIEW_GUEST_H_
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/observer_list.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/extensions/tab_helper.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/guestview/guestview.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/notification_registrar.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/web_contents_observer.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace extensions {
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ScriptExecutor;
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace extensions
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// A WebViewGuest is a WebContentsObserver on the guest WebContents of a
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// <webview> tag. It provides the browser-side implementation of the <webview>
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// API and manages the lifetime of <webview> extension events. WebViewGuest is
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// created on attachment. That is, when a guest WebContents is associated with
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// a particular embedder WebContents. This happens on either initial navigation
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// or through the use of the New Window API, when a new window is attached to
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// a particular <webview>.
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass WebViewGuest : public GuestView,
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     public content::NotificationObserver,
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     public content::WebContentsObserver {
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  WebViewGuest(content::WebContents* guest_web_contents,
300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)               const std::string& extension_id);
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static WebViewGuest* From(int embedder_process_id, int instance_id);
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static WebViewGuest* FromWebContents(content::WebContents* contents);
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // GuestView implementation.
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Attach(content::WebContents* embedder_web_contents,
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      const base::DictionaryValue& args) OVERRIDE;
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual GuestView::Type GetViewType() const OVERRIDE;
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual WebViewGuest* AsWebView() OVERRIDE;
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual AdViewGuest* AsAdView() OVERRIDE;
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // GuestDelegate implementation.
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AddMessageToConsole(int32 level,
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                   const base::string16& message,
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                   int32 line_no,
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                   const base::string16& source_id) OVERRIDE;
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void LoadProgressed(double progress) OVERRIDE;
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void Close() OVERRIDE;
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void DidAttach() OVERRIDE;
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void EmbedderDestroyed() OVERRIDE;
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void GuestProcessGone(base::TerminationStatus status) OVERRIDE;
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual bool HandleKeyboardEvent(
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const content::NativeWebKeyboardEvent& event) OVERRIDE;
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual bool IsDragAndDropEnabled() OVERRIDE;
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual bool IsOverridingUserAgent() const OVERRIDE;
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void LoadAbort(bool is_top_level,
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         const GURL& url,
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         const std::string& error_type) OVERRIDE;
5958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  virtual void RendererResponsive() OVERRIDE;
6058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  virtual void RendererUnresponsive() OVERRIDE;
61c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  virtual bool RequestPermission(
62c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      BrowserPluginPermissionType permission_type,
63c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      const base::DictionaryValue& request_info,
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const PermissionResponseCallback& callback,
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bool allowed_by_default) OVERRIDE;
660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual GURL ResolveURL(const std::string& src) OVERRIDE;
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void SizeChanged(const gfx::Size& old_size, const gfx::Size& new_size)
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      OVERRIDE;
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // NotificationObserver implementation.
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Observe(int type,
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const content::NotificationSource& source,
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const content::NotificationDetails& details) OVERRIDE;
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // If possible, navigate the guest to |relative_index| entries away from the
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // current navigation entry.
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void Go(int relative_index);
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Reload the guest.
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void Reload();
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  enum PermissionResponseAction {
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DENY,
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ALLOW,
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DEFAULT
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  enum SetPermissionResult {
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SET_PERMISSION_INVALID,
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SET_PERMISSION_ALLOWED,
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SET_PERMISSION_DENIED
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Responds to the permission request |request_id| with |action| and
95c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // |user_input|. Returns whether there was a pending request for the provided
96c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // |request_id|.
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SetPermissionResult SetPermission(int request_id,
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    PermissionResponseAction action,
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    const std::string& user_input);
100c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Overrides the user agent for this guest.
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // This affects subsequent guest navigations.
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void SetUserAgentOverride(const std::string& user_agent_override);
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Stop loading the guest.
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void Stop();
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Kill the guest process.
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void Terminate();
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Clears data in the storage partition of this guest.
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Partition data that are newer than |removal_since| will be removed.
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // |removal_mask| corresponds to bitmask in StoragePartition::RemoveDataMask.
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool ClearData(const base::Time remove_since,
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                 uint32 removal_mask,
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                 const base::Closure& callback);
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  extensions::ScriptExecutor* script_executor() {
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return script_executor_.get();
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~WebViewGuest();
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // A map to store the callback for a request keyed by the request's id.
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct PermissionResponseInfo {
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    PermissionResponseCallback callback;
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    BrowserPluginPermissionType permission_type;
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool allowed_by_default;
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    PermissionResponseInfo();
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    PermissionResponseInfo(const PermissionResponseCallback& callback,
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           BrowserPluginPermissionType permission_type,
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           bool allowed_by_default);
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ~PermissionResponseInfo();
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static void RecordUserInitiatedUMA(const PermissionResponseInfo& info,
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     bool allow);
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // WebContentsObserver implementation.
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DidCommitProvisionalLoadForFrame(
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      int64 frame_id,
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& frame_unique_name,
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      bool is_main_frame,
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const GURL& url,
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      content::PageTransition transition_type,
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      content::RenderViewHost* render_view_host) OVERRIDE;
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidFailProvisionalLoad(
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      int64 frame_id,
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& frame_unique_name,
1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      bool is_main_frame,
1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const GURL& validated_url,
1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      int error_code,
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& error_description,
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      content::RenderViewHost* render_view_host) OVERRIDE;
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DidStartProvisionalLoadForFrame(
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      int64 frame_id,
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      int64 parent_frame_id,
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      bool is_main_frame,
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const GURL& validated_url,
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      bool is_error_page,
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      bool is_iframe_srcdoc,
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      content::RenderViewHost* render_view_host) OVERRIDE;
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DidStopLoading(
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      content::RenderViewHost* render_view_host) OVERRIDE;
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void WebContentsDestroyed(
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      content::WebContents* web_contents) OVERRIDE;
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void UserAgentOverrideSet(const std::string& user_agent) OVERRIDE;
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Called after the load handler is called in the guest's main frame.
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void LoadHandlerCalled();
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Called when a redirect notification occurs.
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void LoadRedirect(const GURL& old_url,
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    const GURL& new_url,
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    bool is_top_level);
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  static bool AllowChromeExtensionURLs();
1790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void AddWebViewToExtensionRendererState();
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static void RemoveWebViewFromExtensionRendererState(
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      content::WebContents* web_contents);
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ObserverList<extensions::TabHelper::ScriptExecutionObserver>
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      script_observers_;
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<extensions::ScriptExecutor> script_executor_;
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::NotificationRegistrar notification_registrar_;
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
190c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // A counter to generate a unique request id for a permission request.
191c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // We only need the ids to be unique for a given WebViewGuest.
192c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  int next_permission_request_id_;
193c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  typedef std::map<int, PermissionResponseInfo> RequestMap;
195c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  RequestMap pending_permission_requests_;
196c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // True if the user agent is overridden.
19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool is_overriding_user_agent_;
19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Indicates that the page needs to be reloaded once it has been attached to
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // an embedder.
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool pending_reload_on_attachment_;
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WebViewGuest);
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CHROME_BROWSER_GUESTVIEW_WEBVIEW_WEBVIEW_GUEST_H_
208