Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1007)

Unified Diff: chrome/browser/guest_view/web_view/web_view_guest.h

Issue 505893002: Revert of Move core web_view code to extensions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/guest_view/web_view/web_view_guest.h
diff --git a/chrome/browser/guest_view/web_view/web_view_guest.h b/chrome/browser/guest_view/web_view/web_view_guest.h
new file mode 100644
index 0000000000000000000000000000000000000000..ba0613f35483fdd266477d66f5b56857bd1c30f0
--- /dev/null
+++ b/chrome/browser/guest_view/web_view/web_view_guest.h
@@ -0,0 +1,360 @@
+// Copyright 2014 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 CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_GUEST_H_
+#define CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_GUEST_H_
+
+#include <vector>
+
+#include "base/observer_list.h"
+#include "chrome/browser/guest_view/web_view/javascript_dialog_helper.h"
+#include "chrome/browser/guest_view/web_view/web_view_find_helper.h"
+#include "chrome/browser/guest_view/web_view/web_view_permission_helper.h"
+#include "chrome/browser/guest_view/web_view/web_view_permission_types.h"
+#include "content/public/browser/javascript_dialog_manager.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
+#include "extensions/browser/guest_view/guest_view.h"
+#include "extensions/browser/guest_view/web_view/web_view_guest_delegate.h"
+#include "extensions/browser/script_executor.h"
+#include "third_party/WebKit/public/web/WebFindOptions.h"
+
+namespace extensions {
+
+class WebViewInternalFindFunction;
+
+// A WebViewGuest provides the browser-side implementation of the <webview> API
+// and manages the dispatch of <webview> extension events. WebViewGuest is
+// created on attachment. That is, when a guest WebContents is associated with
+// a particular embedder WebContents. This happens on either initial navigation
+// or through the use of the New Window API, when a new window is attached to
+// a particular <webview>.
+class WebViewGuest : public GuestView<WebViewGuest>,
+ public content::NotificationObserver {
+ public:
+ static GuestViewBase* Create(content::BrowserContext* browser_context,
+ int guest_instance_id);
+
+ // For WebViewGuest, we create special guest processes, which host the
+ // tag content separately from the main application that embeds the tag.
+ // A <webview> can specify both the partition name and whether the storage
+ // for that partition should be persisted. Each tag gets a SiteInstance with
+ // a specially formatted URL, based on the application it is hosted by and
+ // the partition requested by it. The format for that URL is:
+ // chrome-guest://partition_domain/persist?partition_name
+ static bool GetGuestPartitionConfigForSite(const GURL& site,
+ std::string* partition_domain,
+ std::string* partition_name,
+ bool* in_memory);
+
+ // Returns guestview::kInstanceIDNone if |contents| does not correspond to a
+ // WebViewGuest.
+ static int GetViewInstanceId(content::WebContents* contents);
+
+ static const char Type[];
+
+ // Request navigating the guest to the provided |src| URL.
+ void NavigateGuest(const std::string& src);
+
+ // Shows the context menu for the guest.
+ // |items| acts as a filter. This restricts the current context's default
+ // menu items to contain only the items from |items|.
+ // |items| == NULL means no filtering will be applied.
+ void ShowContextMenu(
+ int request_id,
+ const WebViewGuestDelegate::MenuItemVector* items);
+
+ // Sets the frame name of the guest.
+ void SetName(const std::string& name);
+
+ // Set the zoom factor.
+ void SetZoom(double zoom_factor);
+
+ // GuestViewBase implementation.
+ virtual const char* GetAPINamespace() OVERRIDE;
+ virtual void CreateWebContents(
+ const std::string& embedder_extension_id,
+ int embedder_render_process_id,
+ const base::DictionaryValue& create_params,
+ const WebContentsCreatedCallback& callback) OVERRIDE;
+ virtual void DidAttachToEmbedder() OVERRIDE;
+ virtual void DidInitialize() OVERRIDE;
+ virtual void DidStopLoading() OVERRIDE;
+ virtual void EmbedderDestroyed() OVERRIDE;
+ virtual void GuestDestroyed() OVERRIDE;
+ virtual void GuestReady() OVERRIDE;
+ virtual void GuestSizeChangedDueToAutoSize(
+ const gfx::Size& old_size,
+ const gfx::Size& new_size) OVERRIDE;
+ virtual bool IsAutoSizeSupported() const OVERRIDE;
+ virtual bool IsDragAndDropEnabled() const OVERRIDE;
+ virtual void WillAttachToEmbedder() OVERRIDE;
+ virtual void WillDestroy() OVERRIDE;
+
+ // WebContentsDelegate implementation.
+ virtual bool AddMessageToConsole(content::WebContents* source,
+ int32 level,
+ const base::string16& message,
+ int32 line_no,
+ const base::string16& source_id) OVERRIDE;
+ virtual void LoadProgressChanged(content::WebContents* source,
+ double progress) OVERRIDE;
+ virtual void CloseContents(content::WebContents* source) OVERRIDE;
+ virtual void FindReply(content::WebContents* source,
+ int request_id,
+ int number_of_matches,
+ const gfx::Rect& selection_rect,
+ int active_match_ordinal,
+ bool final_update) OVERRIDE;
+ virtual bool HandleContextMenu(
+ const content::ContextMenuParams& params) OVERRIDE;
+ virtual void HandleKeyboardEvent(
+ content::WebContents* source,
+ const content::NativeWebKeyboardEvent& event) OVERRIDE;
+ virtual void RendererResponsive(content::WebContents* source) OVERRIDE;
+ virtual void RendererUnresponsive(content::WebContents* source) OVERRIDE;
+ virtual void RequestMediaAccessPermission(
+ content::WebContents* source,
+ const content::MediaStreamRequest& request,
+ const content::MediaResponseCallback& callback) OVERRIDE;
+ virtual void CanDownload(content::RenderViewHost* render_view_host,
+ const GURL& url,
+ const std::string& request_method,
+ const base::Callback<void(bool)>& callback) OVERRIDE;
+ virtual content::JavaScriptDialogManager*
+ GetJavaScriptDialogManager() OVERRIDE;
+ virtual content::ColorChooser* OpenColorChooser(
+ content::WebContents* web_contents,
+ SkColor color,
+ const std::vector<content::ColorSuggestion>& suggestions) OVERRIDE;
+ virtual void RunFileChooser(
+ content::WebContents* web_contents,
+ const content::FileChooserParams& params) OVERRIDE;
+ virtual void AddNewContents(content::WebContents* source,
+ content::WebContents* new_contents,
+ WindowOpenDisposition disposition,
+ const gfx::Rect& initial_pos,
+ bool user_gesture,
+ bool* was_blocked) OVERRIDE;
+ virtual content::WebContents* OpenURLFromTab(
+ content::WebContents* source,
+ const content::OpenURLParams& params) OVERRIDE;
+ virtual void WebContentsCreated(content::WebContents* source_contents,
+ int opener_render_frame_id,
+ const base::string16& frame_name,
+ const GURL& target_url,
+ content::WebContents* new_contents) OVERRIDE;
+
+ // BrowserPluginGuestDelegate implementation.
+ virtual content::WebContents* CreateNewGuestWindow(
+ const content::WebContents::CreateParams& create_params) OVERRIDE;
+ virtual void RequestPointerLockPermission(
+ bool user_gesture,
+ bool last_unlocked_by_target,
+ const base::Callback<void(bool)>& callback) OVERRIDE;
+ // NotificationObserver implementation.
+ virtual void Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) OVERRIDE;
+
+ // Returns the current zoom factor.
+ double GetZoom();
+
+ // Begin or continue a find request.
+ void Find(
+ const base::string16& search_text,
+ const blink::WebFindOptions& options,
+ scoped_refptr<WebViewInternalFindFunction> find_function);
+
+ // Conclude a find request to clear highlighting.
+ void StopFinding(content::StopFindAction);
+
+ // If possible, navigate the guest to |relative_index| entries away from the
+ // current navigation entry.
+ void Go(int relative_index);
+
+ // Reload the guest.
+ void Reload();
+
+ typedef base::Callback<void(bool /* allow */,
+ const std::string& /* user_input */)>
+ PermissionResponseCallback;
+ int RequestPermission(
+ WebViewPermissionType permission_type,
+ const base::DictionaryValue& request_info,
+ const PermissionResponseCallback& callback,
+ bool allowed_by_default);
+
+ // Requests Geolocation Permission from the embedder.
+ void RequestGeolocationPermission(int bridge_id,
+ const GURL& requesting_frame,
+ bool user_gesture,
+ const base::Callback<void(bool)>& callback);
+ void CancelGeolocationPermissionRequest(int bridge_id);
+
+ // Called when file system access is requested by the guest content using the
+ // HTML5 file system API in main thread, or a worker thread.
+ // The request is plumbed through the <webview> permission request API. The
+ // request will be:
+ // - Allowed if the embedder explicitly allowed it.
+ // - Denied if the embedder explicitly denied.
+ // - Determined by the guest's content settings if the embedder does not
+ // perform an explicit action.
+ void RequestFileSystemPermission(const GURL& url,
+ bool allowed_by_default,
+ const base::Callback<void(bool)>& callback);
+
+ // Overrides the user agent for this guest.
+ // This affects subsequent guest navigations.
+ void SetUserAgentOverride(const std::string& user_agent_override);
+
+ // Stop loading the guest.
+ void Stop();
+
+ // Kill the guest process.
+ void Terminate();
+
+ // Clears data in the storage partition of this guest.
+ //
+ // Partition data that are newer than |removal_since| will be removed.
+ // |removal_mask| corresponds to bitmask in StoragePartition::RemoveDataMask.
+ bool ClearData(const base::Time remove_since,
+ uint32 removal_mask,
+ const base::Closure& callback);
+
+ ScriptExecutor* script_executor() { return script_executor_.get(); }
+
+ private:
+ friend class WebViewPermissionHelper;
+ WebViewGuest(content::BrowserContext* browser_context,
+ int guest_instance_id);
+
+ virtual ~WebViewGuest();
+
+ void AttachWebViewHelpers(content::WebContents* contents);
+
+ void OnWebViewNewWindowResponse(int new_window_instance_id,
+ bool allow,
+ const std::string& user_input);
+
+ // WebContentsObserver implementation.
+ virtual void DidCommitProvisionalLoadForFrame(
+ content::RenderFrameHost* render_frame_host,
+ const GURL& url,
+ content::PageTransition transition_type) OVERRIDE;
+ virtual void DidFailProvisionalLoad(
+ content::RenderFrameHost* render_frame_host,
+ const GURL& validated_url,
+ int error_code,
+ const base::string16& error_description) OVERRIDE;
+ virtual void DidStartProvisionalLoadForFrame(
+ content::RenderFrameHost* render_frame_host,
+ const GURL& validated_url,
+ bool is_error_page,
+ bool is_iframe_srcdoc) OVERRIDE;
+ virtual void DocumentLoadedInFrame(
+ content::RenderFrameHost* render_frame_host) OVERRIDE;
+ virtual bool OnMessageReceived(
+ const IPC::Message& message,
+ content::RenderFrameHost* render_frame_host) OVERRIDE;
+ virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE;
+ virtual void UserAgentOverrideSet(const std::string& user_agent) OVERRIDE;
+
+ // Informs the embedder of a frame name change.
+ void ReportFrameNameChange(const std::string& name);
+
+ // Called after the load handler is called in the guest's main frame.
+ void LoadHandlerCalled();
+
+ // Called when a redirect notification occurs.
+ void LoadRedirect(const GURL& old_url,
+ const GURL& new_url,
+ bool is_top_level);
+
+ void PushWebViewStateToIOThread();
+ static void RemoveWebViewStateFromIOThread(
+ content::WebContents* web_contents);
+
+ void LoadURLWithParams(const GURL& url,
+ const content::Referrer& referrer,
+ content::PageTransition transition_type,
+ content::WebContents* web_contents);
+
+ void RequestNewWindowPermission(
+ WindowOpenDisposition disposition,
+ const gfx::Rect& initial_bounds,
+ bool user_gesture,
+ content::WebContents* new_contents);
+
+ // Destroy unattached new windows that have been opened by this
+ // WebViewGuest.
+ void DestroyUnattachedWindows();
+
+ // Requests resolution of a potentially relative URL.
+ GURL ResolveURL(const std::string& src);
+
+ // Notification that a load in the guest resulted in abort. Note that |url|
+ // may be invalid.
+ void LoadAbort(bool is_top_level,
+ const GURL& url,
+ const std::string& error_type);
+
+ void OnFrameNameChanged(bool is_top_level, const std::string& name);
+
+ // Creates a new guest window owned by this WebViewGuest.
+ void CreateNewGuestWebViewWindow(const content::OpenURLParams& params);
+
+ void NewGuestWebViewCallback(const content::OpenURLParams& params,
+ content::WebContents* guest_web_contents);
+
+ bool HandleKeyboardShortcuts(const content::NativeWebKeyboardEvent& event);
+
+ void SetUpAutoSize();
+
+ ObserverList<ScriptExecutionObserver> script_observers_;
+ scoped_ptr<ScriptExecutor> script_executor_;
+
+ content::NotificationRegistrar notification_registrar_;
+
+ // True if the user agent is overridden.
+ bool is_overriding_user_agent_;
+
+ // Stores the window name of the main frame of the guest.
+ std::string name_;
+
+ // Handles find requests and replies for the webview find API.
+ WebViewFindHelper find_helper_;
+
+ // Handles the JavaScript dialog requests.
+ JavaScriptDialogHelper javascript_dialog_helper_;
+
+ // Handels permission requests.
+ scoped_ptr<WebViewPermissionHelper> web_view_permission_helper_;
+
+ scoped_ptr<WebViewGuestDelegate> web_view_guest_delegate_;
+
+ friend void WebViewFindHelper::DispatchFindUpdateEvent(bool canceled,
+ bool final_update);
+
+ // Tracks the name, and target URL of the new window. Once the first
+ // navigation commits, we no longer track this information.
+ struct NewWindowInfo {
+ GURL url;
+ std::string name;
+ bool changed;
+ NewWindowInfo(const GURL& url, const std::string& name) :
+ url(url),
+ name(name),
+ changed(false) {}
+ };
+
+ typedef std::map<WebViewGuest*, NewWindowInfo> PendingWindowMap;
+ PendingWindowMap pending_new_windows_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebViewGuest);
+};
+
+} // namespace extensions
+
+#endif // CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_GUEST_H_
« no previous file with comments | « chrome/browser/guest_view/web_view/web_view_find_helper.cc ('k') | chrome/browser/guest_view/web_view/web_view_guest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698