15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_RENDERER_CONTENT_SETTINGS_OBSERVER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_RENDERER_CONTENT_SETTINGS_OBSERVER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/content_settings/core/common/content_settings_types.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/renderer/render_frame_observer.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/renderer/render_frame_observer_tracker.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPermissionClient.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebFrame;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebSecurityOrigin;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebURL;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Dispatcher;
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Extension;
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Handles blocking content per content settings for each RenderFrame.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingsObserver
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public content::RenderFrameObserver,
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      public content::RenderFrameObserverTracker<ContentSettingsObserver>,
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      public blink::WebPermissionClient {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ContentSettingsObserver(content::RenderFrame* render_frame,
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          extensions::Dispatcher* extension_dispatcher);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ContentSettingsObserver();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the content setting rules which back |AllowImage()|, |AllowScript()|,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and |AllowScriptFromSource()|. |content_setting_rules| must outlive this
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |ContentSettingsObserver|.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetContentSettingRules(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const RendererContentSettingRules* content_setting_rules);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsPluginTemporarilyAllowed(const std::string& identifier);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends an IPC notification that the specified content type was blocked.
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void DidBlockContentType(ContentSettingsType settings_type);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // blink::WebPermissionClient implementation.
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual bool allowDatabase(const blink::WebString& name,
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                             const blink::WebString& display_name,
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             unsigned long estimated_size) OVERRIDE;
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void requestFileSystemAccessAsync(
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const blink::WebPermissionCallbacks& callbacks) OVERRIDE;
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual bool allowImage(bool enabled_per_settings,
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          const blink::WebURL& image_url) OVERRIDE;
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual bool allowIndexedDB(const blink::WebString& name,
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              const blink::WebSecurityOrigin& origin) OVERRIDE;
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool allowPlugins(bool enabled_per_settings) OVERRIDE;
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool allowScript(bool enabled_per_settings) OVERRIDE;
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual bool allowScriptFromSource(bool enabled_per_settings,
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     const blink::WebURL& script_url) OVERRIDE;
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool allowStorage(bool local) OVERRIDE;
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool allowReadFromClipboard(bool default_value) OVERRIDE;
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool allowWriteToClipboard(bool default_value) OVERRIDE;
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool allowMutationEvents(bool default_value) OVERRIDE;
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool allowPushState() OVERRIDE;
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void didNotAllowPlugins() OVERRIDE;
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void didNotAllowScript() OVERRIDE;
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual bool allowDisplayingInsecureContent(
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      bool allowed_per_settings,
74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      const blink::WebSecurityOrigin& context,
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const blink::WebURL& url) OVERRIDE;
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual bool allowRunningInsecureContent(
77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      bool allowed_per_settings,
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      const blink::WebSecurityOrigin& context,
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const blink::WebURL& url) OVERRIDE;
80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This is used for cases when the NPAPI plugins malfunction if used.
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool AreNPAPIPluginsBlocked() const;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ContentSettingsObserverTest, WhitelistedSchemes);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ChromeRenderViewTest,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ContentSettingsInterstitialPages);
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ChromeRenderViewTest, PluginsTemporarilyAllowed);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // RenderFrameObserver implementation.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidCommitProvisionalLoad(bool is_new_navigation) OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnLoadBlockedPlugins(const std::string& identifier);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetAsInterstitial();
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnNPAPINotSupported();
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnSetAllowDisplayingInsecureContent(bool allow);
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnSetAllowRunningInsecureContent(bool allow);
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnReloadFrame();
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OnRequestFileSystemAccessAsyncResponse(int request_id, bool allowed);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resets the |content_blocked_| array.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearBlockedContentSettings();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Whether the observed RenderFrame is for a platform app.
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool IsPlatformApp();
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If |origin| corresponds to an installed extension, returns that extension.
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Otherwise returns NULL.
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::Extension* GetExtension(
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const blink::WebSecurityOrigin& origin) const;
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helpers.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if |frame| contains content that is white-listed for content settings.
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static bool IsWhitelistedForContentSettings(content::RenderFrame* frame);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsWhitelistedForContentSettings(
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const blink::WebSecurityOrigin& origin,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& document_url);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Owned by ChromeContentRendererClient and outlive us.
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::Dispatcher* extension_dispatcher_;
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Insecure content may be permitted for the duration of this render view.
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool allow_displaying_insecure_content_;
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool allow_running_insecure_content_;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A pointer to content setting rules stored by the renderer. Normally, the
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |RendererContentSettingRules| object is owned by
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |ChromeRenderProcessObserver|. In the tests it is owned by the caller of
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |SetContentSettingRules|.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const RendererContentSettingRules* content_setting_rules_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores if images, scripts, and plugins have actually been blocked.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool content_blocked_[CONTENT_SETTINGS_NUM_TYPES];
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Caches the result of AllowStorage.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::pair<GURL, bool> StoragePermissionsKey;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<StoragePermissionsKey, bool> cached_storage_permissions_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Caches the result of |AllowScript|.
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::map<blink::WebFrame*, bool> cached_script_permissions_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> temporarily_allowed_plugins_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_interstitial_page_;
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool npapi_plugins_blocked_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int current_request_id_;
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef std::map<int, blink::WebPermissionCallbacks> PermissionRequestMap;
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PermissionRequestMap permission_requests_;
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ContentSettingsObserver);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_RENDERER_CONTENT_SETTINGS_OBSERVER_H_
160