diff options
Diffstat (limited to 'chromium/extensions/browser/guest_view/web_view/web_view_guest.h')
-rw-r--r-- | chromium/extensions/browser/guest_view/web_view/web_view_guest.h | 389 |
1 files changed, 389 insertions, 0 deletions
diff --git a/chromium/extensions/browser/guest_view/web_view/web_view_guest.h b/chromium/extensions/browser/guest_view/web_view/web_view_guest.h new file mode 100644 index 00000000000..d1baac5b64c --- /dev/null +++ b/chromium/extensions/browser/guest_view/web_view/web_view_guest.h @@ -0,0 +1,389 @@ +// 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 EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_GUEST_H_ +#define EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_GUEST_H_ + +#include <stdint.h> + +#include <vector> + +#include "base/macros.h" +#include "base/observer_list.h" +#include "components/guest_view/browser/guest_view.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/web_view/javascript_dialog_helper.h" +#include "extensions/browser/guest_view/web_view/web_view_find_helper.h" +#include "extensions/browser/guest_view/web_view/web_view_guest_delegate.h" +#include "extensions/browser/guest_view/web_view/web_view_permission_helper.h" +#include "extensions/browser/guest_view/web_view/web_view_permission_types.h" +#include "extensions/browser/script_executor.h" + +namespace blink { +struct WebFindOptions; +} // nanespace blink + +namespace content { +struct GlobalRequestID; +} // namespace content + +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 guest_view::GuestView<WebViewGuest>, + public content::NotificationObserver { + public: + // Clean up state when this GuestView is being destroyed. See + // GuestViewBase::CleanUp(). + static void CleanUp(content::BrowserContext* browser_context, + int embedder_process_id, + int view_instance_id); + + static GuestViewBase* Create(content::WebContents* owner_web_contents); + + // 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 the WebView partition ID associated with the render process + // represented by |render_process_host|, if any. Otherwise, an empty string is + // returned. + static std::string GetPartitionID( + const content::RenderProcessHost* render_process_host); + + static const char Type[]; + + // Returns the stored rules registry ID of the given webview. Will generate + // an ID for the first query. + static int GetOrGenerateRulesRegistryID( + int embedder_process_id, + int web_view_instance_id); + + // Get the current zoom. + double GetZoom() const; + + // Get the current zoom mode. + ui_zoom::ZoomController::ZoomMode GetZoomMode(); + + // Request navigating the guest to the provided |src| URL. + void NavigateGuest(const std::string& src, bool force_navigation); + + // Shows the context menu for the guest. + void ShowContextMenu(int request_id); + + // Sets the frame name of the guest. + void SetName(const std::string& name); + const std::string& name() { return name_; } + + // Set the zoom factor. + void SetZoom(double zoom_factor); + + // Set the zoom mode. + void SetZoomMode(ui_zoom::ZoomController::ZoomMode zoom_mode); + + void SetAllowScaling(bool allow); + bool allow_scaling() const { return allow_scaling_; } + + // Sets the transparency of the guest. + void SetAllowTransparency(bool allow); + bool allow_transparency() const { return allow_transparency_; } + + // Loads a data URL with a specified base URL and virtual URL. + bool LoadDataWithBaseURL(const std::string& data_url, + const std::string& base_url, + const std::string& virtual_url, + std::string* error); + + // Begin or continue a find request. + void StartFind(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. Returns true on success. + bool Go(int relative_index); + + // Reload the guest. + void Reload(); + + // 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_t removal_mask, + const base::Closure& callback); + + ScriptExecutor* script_executor() { return script_executor_.get(); } + + private: + friend class WebViewPermissionHelper; + + explicit WebViewGuest(content::WebContents* owner_web_contents); + + ~WebViewGuest() override; + + void ClearDataInternal(const base::Time remove_since, + uint32_t removal_mask, + const base::Closure& callback); + + void OnWebViewNewWindowResponse(int new_window_instance_id, + bool allow, + const std::string& user_input); + + void OnFullscreenPermissionDecided(bool allowed, + const std::string& user_input); + bool GuestMadeEmbedderFullscreen() const; + void SetFullscreenState(bool is_fullscreen); + + // GuestViewBase implementation. + bool CanRunInDetachedState() const final; + void CreateWebContents(const base::DictionaryValue& create_params, + const WebContentsCreatedCallback& callback) final; + void DidAttachToEmbedder() final; + void DidDropLink(const GURL& url) final; + void DidInitialize(const base::DictionaryValue& create_params) final; + void EmbedderFullscreenToggled(bool entered_fullscreen) final; + void FindReply(content::WebContents* source, + int request_id, + int number_of_matches, + const gfx::Rect& selection_rect, + int active_match_ordinal, + bool final_update) final; + const char* GetAPINamespace() const final; + int GetTaskPrefix() const final; + void GuestDestroyed() final; + void GuestReady() final; + void GuestSizeChangedDueToAutoSize(const gfx::Size& old_size, + const gfx::Size& new_size) final; + void GuestViewDidStopLoading() final; + void GuestZoomChanged(double old_zoom_level, double new_zoom_level) final; + bool IsAutoSizeSupported() const final; + void SetContextMenuPosition(const gfx::Point& position) final; + void SignalWhenReady(const base::Closure& callback) final; + bool ShouldHandleFindRequestsForEmbedder() const final; + void WillAttachToEmbedder() final; + void WillDestroy() final; + + // NotificationObserver implementation. + void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) final; + + // WebContentsDelegate implementation. + bool AddMessageToConsole(content::WebContents* source, + int32_t level, + const base::string16& message, + int32_t line_no, + const base::string16& source_id) final; + void CloseContents(content::WebContents* source) final; + bool HandleContextMenu(const content::ContextMenuParams& params) final; + void HandleKeyboardEvent(content::WebContents* source, + const content::NativeWebKeyboardEvent& event) final; + void LoadProgressChanged(content::WebContents* source, double progress) final; + bool PreHandleGestureEvent(content::WebContents* source, + const blink::WebGestureEvent& event) final; + void RendererResponsive(content::WebContents* source) final; + void RendererUnresponsive(content::WebContents* source) final; + void RequestMediaAccessPermission( + content::WebContents* source, + const content::MediaStreamRequest& request, + const content::MediaResponseCallback& callback) final; + void RequestPointerLockPermission( + bool user_gesture, + bool last_unlocked_by_target, + const base::Callback<void(bool)>& callback) final; + bool CheckMediaAccessPermission(content::WebContents* source, + const GURL& security_origin, + content::MediaStreamType type) final; + void CanDownload(const GURL& url, + const std::string& request_method, + const base::Callback<void(bool)>& callback) final; + content::JavaScriptDialogManager* GetJavaScriptDialogManager( + content::WebContents* source) final; + void AddNewContents(content::WebContents* source, + content::WebContents* new_contents, + WindowOpenDisposition disposition, + const gfx::Rect& initial_rect, + bool user_gesture, + bool* was_blocked) final; + content::WebContents* OpenURLFromTab( + content::WebContents* source, + const content::OpenURLParams& params) final; + void WebContentsCreated(content::WebContents* source_contents, + int opener_render_frame_id, + const std::string& frame_name, + const GURL& target_url, + content::WebContents* new_contents) final; + void EnterFullscreenModeForTab(content::WebContents* web_contents, + const GURL& origin) final; + void ExitFullscreenModeForTab(content::WebContents* web_contents) final; + bool IsFullscreenForTabOrPending( + const content::WebContents* web_contents) const final; + + // WebContentsObserver implementation. + void DidCommitProvisionalLoadForFrame( + content::RenderFrameHost* render_frame_host, + const GURL& url, + ui::PageTransition transition_type) final; + void DidFailProvisionalLoad(content::RenderFrameHost* render_frame_host, + const GURL& validated_url, + int error_code, + const base::string16& error_description, + bool was_ignored_by_handler) final; + void DidStartProvisionalLoadForFrame( + content::RenderFrameHost* render_frame_host, + const GURL& validated_url, + bool is_error_page, + bool is_iframe_srcdoc) final; + void RenderProcessGone(base::TerminationStatus status) final; + void UserAgentOverrideSet(const std::string& user_agent) final; + void FrameNameChanged(content::RenderFrameHost* render_frame_host, + const std::string& name) final; + + // 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); + + // Loads the |url| provided. |force_navigation| indicates whether to reload + // the content if the provided |url| matches the current page of the guest. + void LoadURLWithParams( + const GURL& url, + const content::Referrer& referrer, + ui::PageTransition transition_type, + bool force_navigation); + + void RequestNewWindowPermission( + WindowOpenDisposition disposition, + const gfx::Rect& initial_bounds, + bool user_gesture, + content::WebContents* new_contents); + + // 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, + int error_code, + const std::string& error_type); + + // 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 ApplyAttributes(const base::DictionaryValue& params); + + // Identifies the set of rules registries belonging to this guest. + int rules_registry_id_; + + // Handles find requests and replies for the webview find API. + WebViewFindHelper find_helper_; + + base::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_; + + // Stores whether the contents of the guest can be transparent. + bool allow_transparency_; + + // Stores the src URL of the WebView. + GURL src_; + + // Handles the JavaScript dialog requests. + JavaScriptDialogHelper javascript_dialog_helper_; + + // Handles permission requests. + scoped_ptr<WebViewPermissionHelper> web_view_permission_helper_; + + scoped_ptr<WebViewGuestDelegate> web_view_guest_delegate_; + + // 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) {} + }; + + using PendingWindowMap = std::map<WebViewGuest*, NewWindowInfo>; + PendingWindowMap pending_new_windows_; + + // Determines if this guest accepts pinch-zoom gestures. + bool allow_scaling_; + bool is_guest_fullscreen_; + bool is_embedder_fullscreen_; + bool last_fullscreen_permission_was_allowed_by_embedder_; + + // Tracks whether the webview has a pending zoom from before the first + // navigation. This will be equal to 0 when there is no pending zoom. + double pending_zoom_factor_; + + // This is used to ensure pending tasks will not fire after this object is + // destroyed. + base::WeakPtrFactory<WebViewGuest> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(WebViewGuest); +}; + +} // namespace extensions + +#endif // EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_GUEST_H_ |