Как написать движок для браузера

Обновлено: 03.07.2024

Задумывались ли вы когда-нибудь о создании собственного браузера? На самом деле попробовать себя в разработке программного обеспечения довольно легко, и для этого даже не потребуется больших знаний в программировании. Сегодня мы попробуем сделать первый шаг на пути к становлению гуру разработки. Возможно вас заинтересует этот процесс, и вы захотите углубиться сильнее.

Установка и обновления

Для начала вам необходимо скачать и установить Visual Studio Community Edition от Microsoft, который к слову абсолютно бесплатен. Эта среда разработки может показаться вам довольно громоздкой, но она содержит множество готовых шаблонов, в том числе и веб браузер, который нам так необходим.

Создаем собственный веб браузер

После развертывания всех необходимых компонентов, Visual Studio запустится автоматически. Первым делом вам предложат подключиться к различным службам для разработчиков, но в нашем случае такой необходимости нет. Выбираем пункт Не сейчас! Возможно, позже , выбираем понравившуюся тему оформления и наконец запускаем Visual Studio.

После того как Visual Studio будет запущен вы увидите рабочую область, которая разделена на две части. В левой части отображается пустая форма нашего проекта, а в правой части находится панель свойств, где мы сможем изменять размер и отступы элементов. Сейчас в левой части необходимо открыть меню Панель элементов , в разделе Стандартные элементы управления выбираем WebBrowser и щелкаем на пустое окно в нашей форме.

Создание элементов меню

Для создания элементов управления нам нужно снова воспользоваться Панелью элементов . Найдите там элемент Button и перетащите в верхнюю часть окна. Всего нам понадобиться 5 кнопок. Их цвет и форму можно будет изменить позже, в разделе свойства. Также нам нужна строка адреса – перетащите их из панели элементов TextBox в нашу форму.

Расставьте кнопки и текстовое поле так, как вам будет удобно. Visual Studio позволяет с лёгкостью сделать это симметрично и на одинаковом расстоянии. Сейчас нам необходимо немного изменить размеры содержимого, чтобы элементы управления не перекрывали веб страницу.

Для этого щелкните левой клавишей мыши на пустом поле нашей формы, а затем нажмите на небольшой треугольник в правом верхнем углу и выберете пункт Открепить в родительском контейнере . Теперь просто потяните за верхний белый квадрат вниз так, чтобы содержимое нашего браузера находилось под элементами управления.

Стоит разобраться, что мы только что написали. Первым делом мы обращаемся к нашему веб браузеру – как только мы перетащили элемент WebBrowser из панели в форму, мы создали элемент с именем webBrowser1. В программе может использоваться множество различных элементов и каждому из них задается имя по умолчанию и порядковый номер.

Теперь давайте разберемся со строкой поиска. Для нее значение будет следующим:

Начало здесь ровно такое же, как и раньше – мы просто обращаемся к нашему браузеру. Затем идет функция перейти ( Navigate ) на определенный адрес, у которой в скобках указаны параметры. В качестве параметров у нас опять же элемент тестовая строка с номером 1 ( textBox1 ) и текст из нее ( Text ) от которого мы передаем функции Navigate. Эту же функцию следует задать нашей пятой кнопке. Так мы пусть и повторим действие, зато будем уверены, если что-то пойдет не так, то сможем повторить процесс.

Запускаем наш браузер

Настало время запустить наш браузер. Для этого достаточно нажать кнопку Пуск в меню сверху. Спустя некоторое время вы увидите наш скромный веб обозреватель и сможете открыть в нем любую веб страницу. Если у вас что-то не получилось, то в первую очередь проверьте знак ; в конце строки. Сохраните свой браузер нажав иконку в виде дискеты, в левом верхнем углу и при следующем запуске окружения разработки у вас уже будут все инструменты под рукой.

Заключение

Сегодня мы рассмотрели один из самых простых вариантов применения Microsoft Visual Studio. Если, вам понравилось исследовать разработку программного обеспечения, то попробуйте изучить пособие Microsoft.

Создаете вы свой проект или только готовитесь к этому – просто поделитесь с нами в комментариях. Возможно именно наш скромный браузер вдохновит вас на нечто большее.

image

Сегодня я вам расскажу о моей попытке создать собственный современный веб-браузерный движок с нуля.

Мой движок называется Newtoo.

Что за Newtoo

Итак, Newtoo. Зачем я его создал?

Так уж получилось, что в мире есть всего 4 популярных браузерных движка, которые настолько сложны, что сами разработчики не знают и половины их кодовой базы, и настолько продвинутые по технологиям, что начать их догонять — пустая трата времени.

А так ли это на самом деле? Мой проект создан, чтобы повторить подвиги современных браузерных движков и проверить, насколько ли реально создать достойную альтернативу крупным проектам, история которых начинается с девяностых годов. Мой новый движок создается с нуля, а значит его история начинается — сегодня.

Идеология Newtoo — показать страницу быстрее, чем остальные.


Как я говорил ранее, основные браузерные движки развиваются не первый год. Те ошибки, которые были допущены на начальных стадиях разработки остаются в проекте до конца. Самый яркий пример этому — умные указатели в C++ — это еще более сложный синтаксис, большой оверхед при работе, создании и удалении умных указателей. Кроме того, есть очень много типов умных указателей и нужно знать, какой когда использовать, ведь у каждого есть свои сюрпризы ньюансы. Посмотрите на этот файл из WebKit. Когда видишь такой код, синтаксис умных указателей, пытаешься успокоится и дышать ровно, но такого рода код — это весь вебкит с ног до головы. В моем движке нет таких недостатков.

Давайте посмотрим из чего состоит Newtoo

На данный момент реализованы следующие части проекта:

  • Парсер HTML
  • Сериализатор HTML
  • Парсер CSS (селекторы, правила и свойства)
  • Сериализатор CSS
  • Основное DOM API 1
  • Каскадинг CSS (вычисление css стилей)
  • Компоновщик
  • Рендер
  • Виртуальная машина JS и события
  • Обработчик событий и интерактивное выделение страницы

Парсер HTML

Мой парсер HTML вполне можно назвать современным. Начнем с того, что он построен по стандарту HTML5. Он учитывает любую вашу ошибку.

Например, вы забыли поставить кавычки, набирая атрибут


Движок вас поймет, есть значение атрибута написано без пробелов

Вы можете не закрывать тег, когда это не обязательно


Парсер поддерживает префиксы


Для того, чтобы обратно превратить элементы страницы в код, я написал сериализатор HTML. Я думаю, вы догадались, что он делает.

Как работает парсер HTML

Для начала наш парсер режет наш html код на кусочки и определяет их тип.

К примеру вот это:


Превращается в это:


Эти кусочки называются токены.

Токены делятся на 6 типов:

  • Тег
  • Закрывающийся тег
  • Текст
  • Комментарий
  • Тип документа (doctype)
  • Javascript или css код

Когда парсер читает содержимое тега, сам тег регистрируется в иерархии (иерархия от ребенка до родителя вниз), а когда парсер закончил читать содержимое тега, он удаляет его из иерархии.

Если это открывающийся тег, он парсит его название тега, атрибуты, а затем, если это параграф и в иерархии тоже есть параграф, удаляет существующий в иерархии тег параграфа и добавляет туда новый, если это не одиночный тег (тег без закрывающегося тега). Если это закрывающийся тег, парсер удаляет из иерархии последний тег и если последний тег был параграфом, то удаляет сразу два последних. А если это код, в нем разрешены спецсимволы.

Используя такой метод парсинга токенов, можно писать <p> без закрывающегося тега.

Парсер CSS

На данный момент движок умеет парсить только стилевые css правила, например:


Поддерживая только одни стилевые правила, можно уже нормально отобразить настольную версию какого-нибудь сайта.

В отличии от других движков, Newtoo поддерживает одиночные комментарии '//' в css коде и не удаляет их при взаимодействии с css через javascript.

Парсер CSS селекторов

Чтобы узнать, какие именно html элементы страницы нужно форматировать стилями css, был придуман язык селекторов. Вы наверное его уже знаете.

Парсер селекторов поддерживает все комбинаторы, два вида кавычек, селекторы тегов, классов, атрибутов, множественные селекторы и классы.

Вот полный список всех поддерживаемых селекторов:


Да, селекторы четвертого уровня движок пока не поддерживает, но я работаю на этим.

DOM API

Когда мой парсер HTML читает наш код, он создает объектную модель документа (DOM). DOM выглядит как дерево из узлов, где корень — окно браузера, от него ответвляется документ, а от документа уже элементы страницы. Cо всеми узлами DOM можно взаимодействовать через JavaScript c помощью DOM API.

Мой движок поддерживает любые изменения изменения DOM. Например, можно переделать html код любого элемента:


Сейчас не буду перечислять все функции работы с элементами, документом, текстом, выделением, поверьте, их много!

Виртуальную машину JavaScript пока не написал, но API уже есть и хорошо работает.

Будущее проекта

Про перспективы проекта ничего не могу сказать, вам решать.
Если вам понравился мой движок, значит я хорошо постарался.

Из чего он состоит. какие основные операции/функции в нём должны быть.
Это просто загрузчик страниц, с парсером. или я что-то не втыкаю.


Опрос движок браузера
На каком движке (компоненте) сейчас будет перспективнее всего писать браузер ? знаю.

Выбрать движок браузера
помимо хромиума есть другие движки браузера ? cdef слишком много весит. Возможно что нибудь в нем.

Собственный движок браузера
Подскажите,как написать собственный движок для браузера? т.е. в стандартных средствах vs,можно.

Движок для веб браузера
Недавно создавал тему по веб браузеру услышал там про движок для веб браузера Пожалуйста.

Ну если брать отца эксплорера.
если какой то элемент берем и добавляем в программу, которая написанна на C++ то движок будет использоваться "для доступа к заранее заданной веб-странице, для чтения или изменения находящейся на ней информации".
Редактирование, сохранение, добавление, удаление, отображение веб-страниц, думаю это и есть операции и функции которые нужны в брадвижках

а как он работает. (на пальцах)

Берём адрес - загружаем код(пока смотрим пример с хтмл без скриптов)
- отображаем на каком-то элементе интерфейса, вроде всё?

Я представляю себе это так.
1. Заносим в базу данных все html теги.
2. Получаем html код.
3. Обнаруживаем теги и информацию заключенную в тег обрабатываем должным образом (для каждого тега своя функция или метод)
4. Затем отображаем переработанную информацию на форме. (Элементы придется создавать динамически в коде)
Это будет самый простейший движок.
Затем надо будет добавить методы для обработки javascript.

а как он работает. (на пальцах)

Берём адрес - загружаем код(пока смотрим пример с хтмл без скриптов)
- отображаем на каком-то элементе интерфейса, вроде всё?

В теории всё. Только за этими двумя предложениями прячется огромное количество работы. Хотя если ты упомянул слово "движок", то с технической стороны это дополнительно означает написание всего этого дела в виде компоненты, библиотеки или чего-то ещё подобного, ПОВЕРХ которого уже можно сконструировать браузер, добавив к нему gui. Т.е. отдаёшь ты компоненту 10 людям и каждый из них рисует свою клиентскую часть, как им нравится Т.е. отдаёшь ты компоненту 10 людям и каждый из них рисует свою клиентскую часть, как им нравится почему. пока я говорил чисто про движок. гуи это другое. ну в плане проекта. почему. пока я говорил чисто про движок. гуи это другое. ну в плане проекта. Движок - это та часть, которая формирует страницу. Когда ты эту часть отдаёшь кому-то, кто к ней прилепить gui, то получится браузер. Т.е. когда мы гвоорим "движок", то подразумеваем некоторую компоненту, котору можно будет использовать в нескольких разных программах. Условно говря, движок - это gui-независимая часть браузера Спасибо. понял, но причем тут зависимость/независимость от гуи. Спасибо. понял, но причем тут зависимость/независимость от гуи.

Движок НЕ должен быть привязан к какой-то конкретной реализации браузера. Он должен быть "асбтрактным". Возьми игрушки. Team Fortress и Counter Strike Source реализованы на одном и том же движке, хотя внешне у них нет ничего общего. Потому что движок реализован абстрагированно от конкретной игры. Движок - это набор интерфейсов для создания картинки, но все модели и текстуры задаются "снаружи". То же самое и для движка браузера. Движок скачивает страницу, парсит её, в каком-то промежуточном виде формирует образ страницы. Далее этот промежуточный образ подхватывает конкретная реализация браузера и преобразует его в визуальную картинку страницы. Промежуточный образ должен обладать тем свойством, что он предельно прост для дальнейшей программной обработки теми компонентами, которые будут его преобразовывать в визуальный образ.

Как ваирант можно сделать многоуровневую систему. Построить компоненту второго уровня, которая формирует визуальный образ страницы на какой-то вполне конкретной программной компоненте типа TMemo. TMemo взял условно, ибо не знаю, на чём правильно это рисовать. Может это TCanvas, а может ещё что-то. Тогда браузер, использующий твою компоненту второго уровня получится ещё проще - в его задачу входит только отработка нажатий кнопок (понятно, что я рассматриваю простейший случай). А рисунок страницы будет делать твоя компонента

А то чего-то какое-то сплошное шитхаппенд настает, нужна здоровая альтернатива.

Можно влоб подсчитать сумму и сказать, что это нереально сейчас осилить с нуля, но во первых, не обязательно с нуля. Например, взять links/lynx или w3m и нормально туда добавить жабоскрипта. Уже что-то такое получится.


Парсил телепрограмму одного спортивного холдинга, так у них только div’ов 1399 на странице, всего 2500+ элементов.

И как такую DOM без шитхаппенда отобразить?

vvn_black ★★★★★ ( 13.08.20 11:17:13 )
Последнее исправление: vvn_black 13.08.20 11:18:35 (всего исправлений: 1)



Под шитхаппендом имел ввиду не только монструозность, но и монополизацию хромом.

И как такую DOM без шитхаппенда отобразить?

Чисто программистки тут не то, чтобы чего-то особенное по нынешним временам. Вот миллион дивов было бы труднее отобразить.


Прежде всего: зачем? Грядет WеbAssembly, гре браузер лишь с боку-припеку.

Он уже пять лет все грядет и грядет и даже как бы уже есть, но чего-то не похоже, чтобы из него серебрянная пуля получилась. Скорее еще + один наворот.

А то чего-то какое-то сплошное шитхаппенд настает, нужна здоровая альтернатива.

Тогда при чём тут, извините, браузер и вебчик?

Ну и чем тебе WebAssembly поможет? Сейчас он всё равно через DOM выводит страницу. Рисовать каждый сайт самостоятельно на канвасе? Будут глюки, ШГ, жор памяти (на каждый сайт свой процесс рендеринга всего с нуля), невырезаемая реклама.


Написать - херня, а вот поддерживать - это будет очень недёшево. Подобное ПО не имеет смысла начинать писать пока не сообразишь за счёт чего оно будет поддерживаться.


Gecko, KHTML, Webkit, Blink опенсурсные. Можешь не тратить 20 лет на доведение велосипеда до их уровня, бери и клепай «здоровую альтернативу».


Браузеры уже давно стали надстройками. Берёшь blink и v8, делаешь поверх них гуй со свистоперделками. Но если там обнаружится закладка, она будет сразу везде. Если надо избавится от телеметрии, проще её вырезать - уже пробовали делать разгугленный хромиум, но кончился энтузиазм.


С текущей ситуацией легче забить на веб. «Здоровая» часть интернета сейчас в других местах. Ренессанс в Gemini, например.


Инвесторам такое нравится.

«Здоровая» часть интернета сейчас в других местах. Ренессанс в Gemini, например.

Gopher на стероидах, ясно-понятно


Скорее, это починенный Gopher без легаси и плохих решений.


Сейчас выгоднее запилить свой гуй для блинка.


Например, взять links/lynx или w3m и нормально туда добавить жабоскрипта.

Подозреваю, сделать легковесный веб движок невозможно без отказа от части HTML/CSS функциональности и поломки многих сайтов. Придётся вводить легковесное подмножество HTML/CSS.

X512 ★★ ( 13.08.20 15:27:17 )
Последнее исправление: X512 13.08.20 15:31:37 (всего исправлений: 1)

Лучше помоги людям допилить NetSurf до HTML5 и полноценного DOM c JS. Будет открытый независимый движок, может не лучший и не самый быстрый (хотя если туда QuickJS великого Фабриса засунуть, то…), зато без блоатвари, многочасовых компиляций и с адблоком искаропки. И в нём хотя бы можно разобраться.

Теоретически можно на QtWebKit что-то соорудить, но он сложнее и допиливать его тяжелее.


В составе проекта SerenityOS есть браузер. После мозилло- и линуксокапца будет самое то для перехода.


И поисковики пролетят мимо со свистом.

Кроме того, рисовал я как-то собственный layout-менеджер на flash 8. Крошечный но могучий: координаты объекта задавались как eval-формулы от координат других объектов и размеров окна; отсутствие циклических ссылок проверялось. И всё было прекрасно ровно до тех пор, пока не требовалось вывести многострочный стилизованный текст (т.е. html со стилями), не говоря уже про подгонку размеров объектов пропорционально размеру текста (аналогично столбцам html-таблиц). С WebAssembly будет ровно та же петрушка: если кто-нибудь нарисует для него халявный рендерер html, то хорошо; иначе – DOM безальтернативен. Да и между нами девочками, хрен его переплюнешь по фичастости и выразительности; а вышесказанное – лишь частный пример такой фичастости.


Qupzilla студент делал как курсовую или дипломную работу. Но это не точно.

Falcon (бывшая Qupzilla) использует QtWebEngine на основе Blink. Раньше был QtWebKit. Так что это те же самые яйца.


И как такую DOM без шитхаппенда отобразить?

Чисто программистки тут не то, чтобы чего-то особенное по нынешним временам. Вот миллион дивов было бы труднее отобразить

Проблема не в том, чтобы отобразить миллион дивов. Ты когда-нибудь писал фронтенды современные? Ты думаешь почему фронтендщики имеют в среднем выше ЗП, чем бэкэндщики? Там просто мозги в трубочку сворачиваютя от десятков слоев совместимости, и даже сами создетали браузеров до конца не понимают, как их браузер работает.


Прежде всего: зачем? Грядет WеbAssembly, гре браузер лишь с боку-припеку.

Он уже пять лет все грядет и грядет и даже как бы уже есть, но чего-то не похоже, чтобы из него серебрянная пуля получилась. Скорее еще + один наворот

Массовое программирование отстает от bleeding-edge примерно на 10 лет. Посмотри на ситуацию с React и React Native — индустрия только привыкла к React, а на React Native смотрит круглыми глазами — тоже 2015 год, между прочим. Так что моя приблизительная оценка освоения WebAssembly — 2025 год.


Ну и чем тебе WebAssembly поможет? Сейчас он всё равно через DOM выводит страницу. Рисовать каждый сайт самостоятельно на канвасе? Будут глюки, ШГ, жор памяти (на каждый сайт свой процесс рендеринга всего с нуля), невырезаемая реклама

WebGL в значительной степени решает эти проблемы, поскольку позволяет коду отрисовки исполняться на уровне маш кодов (если на секунду забыть про довольно ресурсоемкую компиляцию этих самых кодов).


И поисковики пролетят мимо со свистом.

Точнее сайт пролетит со свистом мимо выдачи поисковиков


Точнее сайт пролетит со свистом мимо выдачи поисковиков

SSR никто не отменял, и он вполне активно используется на серьезных проектах SPA.

WebGL не избавит ни от глюков (вдобавок в зоопарк браузеров добавится зоопарк видеокарт, да и игры все такие стабильные, ага), ни от ШГ (их рисовать всё равно самим придётся), ни от потребления памяти, ни от рекламы.

SSR используется в проектах с интерфейсом на основе HTML DOM. Если у нас канвас, то и текстового представления информации нет.


взять links/lynx или w3m и нормально туда добавить жабоскрипта

Тут сначала надо НИО(К)Р провести надо — а получится ли впихнуть жаваскрипт.

Нет — это всё очень и очень долго (а значит и дорого). А одному так вообще.


Запилить браузер стоит не очень дорого. За год команда из двух-трёх профи тебе выкатят браузер с поддержкой основных стандартов. Если денег чуть больше, то можешь выписать пачку индусов, но это уже путь мелкомягких. Правда такой браузер потом выкинешь - собственно см. историю разработки браузеров от мелкомягких, но вернёмся к нашим профи.

Браузер создан, но останется несовместимость с веб-сайтами из «хвоста». И тут потребуется большой-большой баг трекер для добавления костылей в код профи, чтобы все сайты веб-макак отображались более-менее правильно.

Но можно пойти вторым путём - забить на сайты веб-макак из хвоста. И поддерживать только популярные веб-сайты. Если твой браузер будет крут (чем тебя хром не устраивает?), то у тебя появятся фанаты. И там уже можно начать потихоньку дорабатывать сайты из хвоста.

P.S. Если бы я взялся за разработку браузера, то просто бы забил на WWW, W3C и WHATWG, придумал свой ЯП и p2p интернет с вайтджетоми, конечно не без помощи сообщества. Впрочем, это уже другая история.

foror ★★★★ ( 14.08.20 14:28:10 )
Последнее исправление: foror 14.08.20 14:29:21 (всего исправлений: 1)

Не сложно, а скорее невозможно.

Трудно ли запилить свой браузерный движок с вайтджеком

Ну есть несколько вроде как запиленных с нуля движков рендеринга+скриптинга (HTML+CSS+JS), причём значительно обгоняющих Хромог по FPS, которые используют для рисования гуя десктопных программ или игр. Не думаю, что на их создание ушли триллионы долларов.


WebGL не избавит ни от глюков (вдобавок в зоопарк браузеров добавится зоопарк видеокарт, да и игры все такие стабильные, ага)

Не могу всапомнить игры, которая бы на консервативном OpenGL имела проблемы. Порой, OpenGL используется в качестве fallback-механизма.

ни от ШГ (их рисовать всё равно самим придётся)

Ну это еще вполне решаемый вопрос, как и интерфейсы доступа как DOM из WASM.

Читайте также: