Serenity Operating System
1/*
2 * Copyright (c) 2022, the SerenityOS developers.
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include "CookiesModel.h"
8#include <AK/FuzzyMatch.h>
9
10namespace Browser {
11
12void CookiesModel::set_items(AK::Vector<Web::Cookie::Cookie> items)
13{
14 begin_insert_rows({}, m_cookies.size(), m_cookies.size());
15 m_cookies = move(items);
16 end_insert_rows();
17
18 did_update(DontInvalidateIndices);
19}
20
21void CookiesModel::clear_items()
22{
23 begin_insert_rows({}, m_cookies.size(), m_cookies.size());
24 m_cookies.clear();
25 end_insert_rows();
26
27 did_update(DontInvalidateIndices);
28}
29
30int CookiesModel::row_count(GUI::ModelIndex const& index) const
31{
32 if (!index.is_valid())
33 return m_cookies.size();
34 return 0;
35}
36
37DeprecatedString CookiesModel::column_name(int column) const
38{
39 switch (column) {
40 case Column::Domain:
41 return "Domain";
42 case Column::Path:
43 return "Path";
44 case Column::Name:
45 return "Name";
46 case Column::Value:
47 return "Value";
48 case Column::ExpiryTime:
49 return "Expiry time";
50 case Column::SameSite:
51 return "SameSite";
52 case Column::__Count:
53 return {};
54 }
55
56 return {};
57}
58
59GUI::ModelIndex CookiesModel::index(int row, int column, GUI::ModelIndex const&) const
60{
61 if (static_cast<size_t>(row) < m_cookies.size())
62 return create_index(row, column, &m_cookies.at(row));
63 return {};
64}
65
66GUI::Variant CookiesModel::data(GUI::ModelIndex const& index, GUI::ModelRole role) const
67{
68 if (role != GUI::ModelRole::Display)
69 return {};
70
71 auto const& cookie = m_cookies[index.row()];
72
73 switch (index.column()) {
74 case Column::Domain:
75 return cookie.domain;
76 case Column::Path:
77 return cookie.path;
78 case Column::Name:
79 return cookie.name;
80 case Column::Value:
81 return cookie.value;
82 case Column::ExpiryTime:
83 return cookie.expiry_time_to_string();
84 case Column::SameSite:
85 return Web::Cookie::same_site_to_string(cookie.same_site);
86 }
87
88 VERIFY_NOT_REACHED();
89}
90
91TriState CookiesModel::data_matches(GUI::ModelIndex const& index, GUI::Variant const& term) const
92{
93 auto needle = term.as_string();
94 if (needle.is_empty())
95 return TriState::True;
96
97 auto const& cookie = m_cookies[index.row()];
98 auto haystack = DeprecatedString::formatted("{} {} {} {}", cookie.domain, cookie.path, cookie.name, cookie.value);
99 if (fuzzy_match(needle, haystack).score > 0)
100 return TriState::True;
101 return TriState::False;
102}
103
104Web::Cookie::Cookie CookiesModel::take_cookie(GUI::ModelIndex const& index)
105{
106 VERIFY(index.is_valid());
107
108 auto cookie = m_cookies.take(index.row());
109 did_update(InvalidateAllIndices);
110
111 return cookie;
112}
113
114AK::Vector<Web::Cookie::Cookie> CookiesModel::take_all_cookies()
115{
116 auto cookies = move(m_cookies);
117 did_update(InvalidateAllIndices);
118
119 return cookies;
120}
121
122}