Serenity Operating System
at master 122 lines 2.9 kB view raw
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}