import logging from typing import Any, Dict, List import fitz # PyMuPDF import rapidfuzz.fuzz as fuzz from desktop_env.evaluators.metrics.utils import are_lists_equal, compare_urls logger = logging.getLogger("desktopenv.metrics.chrome") def is_expected_tabs(open_tabs: List[Dict[str, str]], rule: Dict[str, Any]) -> float: """ Checks if the expected tabs are open in Chrome. """ print(open_tabs, rule) match_type = rule['type'] if match_type == "url": expected_urls = rule['urls'] actual_urls = [tab['url'] for tab in open_tabs] return 1 if are_lists_equal(expected_urls, actual_urls, compare_urls) else 0 else: logger.error(f"Unknown type: {match_type}") return 0 def is_expected_bookmarks(bookmarks: List[str], rule: Dict[str, Any]) -> float: """ Checks if the expected bookmarks are in Chrome. """ if not bookmarks: return 0. elif rule['type'] == "bookmark_bar_folders_names": bookmark_bar_folders_names = [bookmark['name'] for bookmark in bookmarks['bookmark_bar']['children'] if bookmark['type'] == 'folder'] return 1. if set(bookmark_bar_folders_names) == set(rule['names']) else 0. elif rule['type'] == "bookmark_bar_websites_urls": bookmark_bar_websites_urls = [bookmark['url'] for bookmark in bookmarks['bookmark_bar']['children'] if bookmark['type'] == 'url'] return 1. if set(bookmark_bar_websites_urls) == set(rule['urls']) else 0. else: raise TypeError(f"{rule['type']} not support yet!") def compare_pdfs(pdf1_path, pdf2_path): """ Compare two PDF files. """ def extract_text_from_pdf(pdf_path): """Extract text from each page of the PDF.""" text = "" with fitz.open(pdf_path) as pdf: for page in pdf: text += page.get_text() return text.strip() text1 = extract_text_from_pdf(pdf1_path) text2 = extract_text_from_pdf(pdf2_path) return fuzz.ratio(text1, text2) / 100 def is_cookie_deleted(cookie_data, rule): """ Check if the cookie is deleted. """ if rule['type'] == 'domains': cookies_domains = [cookie[1] for cookie in cookie_data] for domain in rule['domains']: for cookies_domain in cookies_domains: if compare_urls(domain, cookies_domain): return 0. return 1. else: raise TypeError(f"{rule['type']} not support yet!") def is_shortcut_on_desktop(shortcuts: Dict[str, str], rule): """ Check if the shortcut is on the desktop. """ # fixme: if the name of the website changed in the future, this will not work; can be replaced with url if rule['type'] == 'name': for shortcut_path, shortcut_content in shortcuts.items(): if "Name=" + rule['name'] + "\n" in shortcut_content: return 1. return 0. elif rule['type'] == 'url': raise TypeError(f"{rule['type']} not support yet!") elif rule['type'] == 'id': raise TypeError(f"{rule['type']} not support yet!") else: raise TypeError(f"{rule['type']} not support yet!")