1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/sessions/content/session_tab_helper.h"
#include "base/memory/ptr_util.h"
#include "components/sessions/content/content_serialized_navigation_builder.h"
#include "components/sessions/content/session_tab_helper_delegate.h"
#include "components/sessions/core/serialized_navigation_entry.h"
#include "components/sessions/core/serialized_user_agent_override.h"
#include "content/public/browser/navigation_details.h"
#include "content/public/browser/web_contents.h"
namespace sessions {
SessionTabHelper::SessionTabHelper(content::WebContents* contents,
DelegateLookup lookup)
: content::WebContentsObserver(contents),
content::WebContentsUserData<SessionTabHelper>(*contents),
delegate_lookup_(std::move(lookup)),
session_id_(SessionID::NewUnique()),
window_id_(SessionID::InvalidValue()) {}
SessionTabHelper::~SessionTabHelper() = default;
void SessionTabHelper::SetWindowID(SessionID id) {
window_id_ = id;
window_id_changed_callbacks_.Notify(id);
}
// static
SessionID SessionTabHelper::IdForTab(const content::WebContents* tab) {
const SessionTabHelper* session_tab_helper =
tab ? SessionTabHelper::FromWebContents(tab) : nullptr;
return session_tab_helper ? session_tab_helper->session_id()
: SessionID::InvalidValue();
}
// static
SessionID SessionTabHelper::IdForWindowContainingTab(
const content::WebContents* tab) {
const SessionTabHelper* session_tab_helper =
tab ? SessionTabHelper::FromWebContents(tab) : nullptr;
return session_tab_helper ? session_tab_helper->window_id()
: SessionID::InvalidValue();
}
base::CallbackListSubscription SessionTabHelper::RegisterForWindowIdChanged(
WindowIdChangedCallbackList::CallbackType callback) {
return window_id_changed_callbacks_.Add(std::move(callback));
}
void SessionTabHelper::UserAgentOverrideSet(
const blink::UserAgentOverride& ua_override) {
SessionTabHelperDelegate* delegate = GetDelegate();
if (delegate) {
sessions::SerializedUserAgentOverride serialized_override;
serialized_override.ua_string_override = ua_override.ua_string_override;
serialized_override.opaque_ua_metadata_override =
blink::UserAgentMetadata::Marshal(ua_override.ua_metadata_override);
delegate->SetTabUserAgentOverride(window_id(), session_id(),
serialized_override);
}
}
void SessionTabHelper::NavigationEntryCommitted(
const content::LoadCommittedDetails& load_details) {
SessionTabHelperDelegate* delegate = GetDelegate();
if (!delegate)
return;
int current_entry_index =
web_contents()->GetController().GetCurrentEntryIndex();
delegate->SetSelectedNavigationIndex(window_id(), session_id(),
current_entry_index);
const SerializedNavigationEntry navigation =
ContentSerializedNavigationBuilder::FromNavigationEntry(
current_entry_index,
web_contents()->GetController().GetEntryAtIndex(current_entry_index));
delegate->UpdateTabNavigation(window_id(), session_id(), navigation);
}
void SessionTabHelper::NavigationListPruned(
const content::PrunedDetails& pruned_details) {
SessionTabHelperDelegate* delegate = GetDelegate();
if (!delegate)
return;
delegate->TabNavigationPathPruned(window_id(), session_id(),
pruned_details.index, pruned_details.count);
}
void SessionTabHelper::NavigationEntriesDeleted() {
SessionTabHelperDelegate* delegate = GetDelegate();
if (!delegate)
return;
delegate->TabNavigationPathEntriesDeleted(window_id(), session_id());
}
void SessionTabHelper::NavigationEntryChanged(
const content::EntryChangedDetails& change_details) {
SessionTabHelperDelegate* delegate = GetDelegate();
if (!delegate)
return;
const SerializedNavigationEntry navigation =
ContentSerializedNavigationBuilder::FromNavigationEntry(
change_details.index, change_details.changed_entry);
delegate->UpdateTabNavigation(window_id(), session_id(), navigation);
}
SessionTabHelperDelegate* SessionTabHelper::GetDelegate() {
return delegate_lookup_ ? delegate_lookup_.Run(web_contents()) : nullptr;
}
WEB_CONTENTS_USER_DATA_KEY_IMPL(SessionTabHelper);
} // namespace sessions
|