blob: 3e9e1d36be8b75788f3d2c94b608557878103f8e [file] [log] [blame]
// Copyright 2017 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_SSL_INSECURE_SENSITIVE_INPUT_DRIVER_FACTORY_H_
#define CHROME_BROWSER_SSL_INSECURE_SENSITIVE_INPUT_DRIVER_FACTORY_H_
#include <map>
#include <memory>
#include <set>
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
#include "third_party/WebKit/public/platform/modules/insecure_input/insecure_input_service.mojom.h"
namespace content {
class WebContents;
}
class InsecureSensitiveInputDriver;
// This object updates the NavigationEntry's SSLStatus UserData object when
// sensitive input events occur that may impact Chrome's determination of the
// page's security level.
//
// This class holds a map of InsecureSensitiveInputDrivers, which accept
// mojom::InsecureInputService notifications from renderers. There is at most
// one factory per WebContents, and one driver per render frame.
class InsecureSensitiveInputDriverFactory
: public content::WebContentsObserver,
public content::WebContentsUserData<InsecureSensitiveInputDriverFactory> {
public:
~InsecureSensitiveInputDriverFactory() override;
static InsecureSensitiveInputDriverFactory* GetOrCreateForWebContents(
content::WebContents* web_contents);
// Finds or creates a factory for the |web_contents| and creates an
// |InsecureSensitiveInputDriver| for the target |render_frame_host|.
static void BindDriver(blink::mojom::InsecureInputServiceRequest request,
content::RenderFrameHost* render_frame_host);
// Creates a |InsecureSensitiveInputDriver| for the specified
// |render_frame_host| and adds it to the |frame_driver_map_|.
InsecureSensitiveInputDriver* GetOrCreateDriverForFrame(
content::RenderFrameHost* render_frame_host);
// This method is called when the autofill component detects a credit
// card field was interacted with in a non-secure context.
void DidInteractWithNonsecureCreditCardInput();
// This method is called when there is a message notifying
// the browser process that the renderer has a visible password field.
void RenderFrameHasVisiblePasswordField(
content::RenderFrameHost* render_frame_host);
// This method is called when there is a message notifying the browser
// process that the renderer has no visible password fields anymore.
void RenderFrameHasNoVisiblePasswordFields(
content::RenderFrameHost* render_frame_host);
// This method is called when there is a message notifying the browser
// process that the user edited a field in a non-secure context.
void DidEditFieldInInsecureContext();
// content::WebContentsObserver:
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
private:
explicit InsecureSensitiveInputDriverFactory(
content::WebContents* web_contents);
friend class content::WebContentsUserData<
InsecureSensitiveInputDriverFactory>;
std::map<content::RenderFrameHost*,
std::unique_ptr<InsecureSensitiveInputDriver>>
frame_driver_map_;
std::set<content::RenderFrameHost*> frames_with_visible_password_fields_;
DISALLOW_COPY_AND_ASSIGN(InsecureSensitiveInputDriverFactory);
};
#endif // CHROME_BROWSER_SSL_INSECURE_SENSITIVE_INPUT_DRIVER_FACTORY_H_