browser_engine 0.1.0

A modular, GPU-accelerated, security-first web browser engine built from scratch in Rust.
Documentation
#[derive(Debug, Clone)]
pub struct AddressBar {
    pub url_text: String,
    pub is_focused: bool,
}

impl AddressBar {
    pub fn new(initial_url: &str) -> Self {
        AddressBar {
            url_text: initial_url.to_string(),
            is_focused: false,
        }
    }

    pub fn insert_char(&mut self, c: char) {
        if !c.is_control() {
            self.url_text.push(c);
        }
    }

    pub fn backspace(&mut self) {
        self.url_text.pop();
    }

    pub fn set_text(&mut self, text: &str) {
        self.url_text = text.to_string();
    }

    pub fn resolve_query(&self) -> String {
        crate::net::format_url_or_search_query(&self.url_text)
    }

    pub fn generate_suggestions(&self) -> Vec<String> {
        let input = self.url_text.trim().to_ascii_lowercase();
        if input.is_empty() {
            return Vec::new();
        }

        let popular_sites = [
            ("google", "https://google.com"),
            ("youtube", "https://youtube.com"),
            ("github", "https://github.com"),
            ("wikipedia", "https://wikipedia.org"),
            ("rust", "https://rust-lang.org"),
            ("reddit", "https://reddit.com"),
            ("twitter", "https://twitter.com"),
            ("chatgpt", "https://chatgpt.com"),
        ];

        let mut suggestions = Vec::new();

        for (keyword, url) in &popular_sites {
            if keyword.starts_with(&input) || input.contains(keyword) {
                suggestions.push(format!("Visit: {}", url));
            }
        }

        suggestions.push(format!("Google Search: \"{}\"", self.url_text));

        if !input.contains('.') && !input.contains('/') {
            suggestions.push(format!("https://www.{}.com", input));
        }

        suggestions.truncate(4);
        suggestions
    }

    pub fn render_suggestions_html(&self) -> String {
        let input = self.url_text.trim();
        if input.is_empty() || input.starts_with("http://") || input.starts_with("https://") {
            return String::new();
        }

        let suggestions = self.generate_suggestions();
        if suggestions.is_empty() {
            return String::new();
        }

        let mut html = String::from(r#"<div class="suggestions" style="background-color: #111827; border: 1px solid #374151; border-radius: 8px; padding: 4px; margin-top: 4px; box-shadow: 0 8px 24px rgba(0,0,0,0.6);">"#);
        for item in &suggestions {
            html.push_str(&format!(
                r#"<div style="padding: 6px 12px; color: #cbd5e1; font-size: 13px; font-weight: bold; border-bottom: 1px solid #1f2937;">{}</div>"#,
                item
            ));
        }
        html.push_str("</div>");
        html
    }
}