1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 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)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/infobars/insecure_content_infobar_delegate.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/navigation_details.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/navigation_entry.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DEFINE_WEB_CONTENTS_USER_DATA_KEY(InfoBarService);
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing infobars::InfoBar;
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing infobars::InfoBarDelegate;
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing infobars::InfoBarManager;
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// static
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochInfoBarDelegate::NavigationDetails
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    InfoBarService::NavigationDetailsFromLoadCommittedDetails(
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        const content::LoadCommittedDetails& details) {
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  InfoBarDelegate::NavigationDetails navigation_details;
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  navigation_details.entry_id = details.entry->GetUniqueID();
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  navigation_details.is_navigation_to_different_page =
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      details.is_navigation_to_different_page();
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  navigation_details.did_replace_entry = details.did_replace_entry;
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  navigation_details.is_main_frame = details.is_main_frame;
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const content::PageTransition transition = details.entry->GetTransitionType();
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  navigation_details.is_reload =
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      content::PageTransitionStripQualifier(transition) ==
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      content::PAGE_TRANSITION_RELOAD;
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  navigation_details.is_redirect =
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      (transition & content::PAGE_TRANSITION_IS_REDIRECT_MASK) != 0;
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return navigation_details;
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// static
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochcontent::WebContents* InfoBarService::WebContentsFromInfoBar(InfoBar* infobar) {
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!infobar || !infobar->owner())
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return NULL;
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  InfoBarService* infobar_service =
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      static_cast<InfoBarService*>(infobar->owner());
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return infobar_service->web_contents();
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InfoBarService::InfoBarService(content::WebContents* web_contents)
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : content::WebContentsObserver(web_contents) {
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(web_contents);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochInfoBarService::~InfoBarService() {
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ShutDown();
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochint InfoBarService::GetActiveEntryID() {
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  content::NavigationEntry* active_entry =
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      web_contents()->GetController().GetActiveEntry();
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return active_entry ? active_entry->GetUniqueID() : 0;
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid InfoBarService::NotifyInfoBarAdded(InfoBar* infobar) {
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  InfoBarManager::NotifyInfoBarAdded(infobar);
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // TODO(droger): Remove the notifications and have listeners change to be
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // InfoBarManager::Observers instead. See http://crbug.com/354380
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  content::NotificationService::current()->Notify(
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED,
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      content::Source<InfoBarService>(this),
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      content::Details<InfoBar::AddedDetails>(infobar));
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid InfoBarService::NotifyInfoBarRemoved(InfoBar* infobar, bool animate) {
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  InfoBarManager::NotifyInfoBarRemoved(infobar, animate);
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // TODO(droger): Remove the notifications and have listeners change to be
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // InfoBarManager::Observers instead. See http://crbug.com/354380
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  InfoBar::RemovedDetails removed_details(infobar, animate);
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  content::NotificationService::current()->Notify(
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      content::Source<InfoBarService>(this),
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      content::Details<InfoBar::RemovedDetails>(&removed_details));
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InfoBarService::RenderProcessGone(base::TerminationStatus status) {
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  RemoveAllInfoBars(true);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void InfoBarService::NavigationEntryCommitted(
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const content::LoadCommittedDetails& load_details) {
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  OnNavigation(NavigationDetailsFromLoadCommittedDetails(load_details));
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void InfoBarService::WebContentsDestroyed() {
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The WebContents is going away; be aggressively paranoid and delete
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // ourselves lest other parts of the system attempt to add infobars or use
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // us otherwise during the destruction.
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  web_contents()->RemoveUserData(UserDataKey());
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // That was the equivalent of "delete this". This object is now destroyed;
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // returning from this function is the only safe thing to do.
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool InfoBarService::OnMessageReceived(const IPC::Message& message) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(InfoBarService, message)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidBlockDisplayingInsecureContent,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDidBlockDisplayingInsecureContent)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidBlockRunningInsecureContent,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDidBlockRunningInsecureContent)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void InfoBarService::OnDidBlockDisplayingInsecureContent() {
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InsecureContentInfoBarDelegate::Create(
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this, InsecureContentInfoBarDelegate::DISPLAY);
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void InfoBarService::OnDidBlockRunningInsecureContent() {
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InsecureContentInfoBarDelegate::Create(this,
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         InsecureContentInfoBarDelegate::RUN);
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
128