Chromium embedded framework что это
Перейти к содержимому

Chromium embedded framework что это

Первые шаги с Chromium Embedded Framework и .NET

Chromium Embedded Framework (CEF) — это проект с открытыми исходными кодами, созданный в 2008 году как элемент управления Web browser, работающий на базе Chromium от Google.
На данный момент это довольно мощный инструмент для разработки настольных приложений, со списком решений, использующих этот контрол можно ознакомиться здесь. Но достаточно сказать, что его используют такие широко известные продукты, как Evernote и Steam.

  • CEF позволяет создать свои обработчики протоколов, таким образом, реализовать свой «закрытый» алгоритм шифрования (да-
    да, несчастные пользователи старого Internet Explorer и корпоративных web-решений, долой ActiveX). Этим же можно воспользоваться, чтобы подгружать данные из статических ресурсов программы
  • CEF позволяет делать обертку над нативными функциями в пространстве объектов виртуальной машины Javascript. Ресурсоемкие операции по обработке больших массивов данных можно переложить на более строгие и быстрые языки программирования
  • CEF позволяет обрабатывать события навигации, скачивания файлов и так далее
А теперь о грустном

Библиотека chromiumembedded, ссылка на которую давалась в начале статьи, реализована на C++. Но что делать, если Ваше решение уже работает на другом, управляемом языке программирования? Специально для нас существуют обертки для Java, Delphi, Python и .NET. Об использовании библиотеки CefSharp для .NET и пойдет речь.

Знакомьтесь, CefSharp
  1. Создание неограниченного числа компонентов класса WebView
  2. Обработка событий по загрузке страницы, события навигации
  3. Собственные обработчики протоколов.
  4. Внедрение js-кода во время выполнения страницы
  5. Создание глобальных [native code] объектов со статическими методами
Первое знакомство

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

Локальный обработчик протокола

Реализуется пара классов: фабрика (реализует интерфейс CefSharp.ISchemeHandlerFactory) и, собственно, сам обработчик (реализующий интерфейс CefSharp.ISchemeHandler).
С первым все понятно:

Второй не будет сложнее:

Для того, чтобы подключить js-файл приложения, можно воспользоваться методом GetStream или GetString класса ResourceManager. Из плюсов — исходный код вашего приложения будет находиться внутри .exe или .dll файла. Из минусов — при изменении js-кода придется каждый раз заново компилировать приложение.

Объект-мост между .NET и JS

С ним еще проще — это обычный объект, содержащий методы и поля. Один минус — на весь проект у Вас будет по одному экземпляру каждого такого класса.

Инициализация CEF

Я решил сделать класс наследником ApplicationContext. Для оконного отображения WinForms запускается быстрее, и нет необходимости тянуть за собой WPF

На этом, собственно и все. Можно создавать форму, добавлять в нее компонент WebView и работать как душе угодно.
Если Вы дочитали до этого места, то Вы — терпеливый человек и я благодарен Вам.

Но нам этого мало

Как я уже отмечал ранее, в CefSharp есть некоторые недостатки. Например, нельзя связать компонент WebView с формой, его содержащую. Для этого родился некоторого рода жестокий костыль, который я представлю на обозрение публики.
Дабы не захламлять статью лоскутами кода, я приведу некоторые выдержки из листинга.

1 Новый класс Window, наследуемый от Form
  • Он содержит подкласс FormEnumerator, который присваивает каждому окну свой уникальный строковый идентификатор и хранит ссылки на все объекты Window. По методу getWindowById можно получить форму.
  • Статический метод JSInvoke, который получает вызов из среды браузера и вызывает функцию формы
  • Метод CSInvoke, который вызывает метод среды JS из .NET
  • Закрытый метод getFormRefrection, который создает «оболочку» для CLR методов формы. Строка формируется StringBuilder’ом на основании данных рефлексии. Выглядит это примерно так:
2 Объект-мост общих вызовов

Он выполняет операцию по вызову из JS в C#:

Внимательный читатель заметит неладное: вместо нормальных объектов CefSharp позволяет обмениваться только простыми типами, такими как int, double, bool, string. Но в реальной жизни обычно, как раз, наоборот. Поэтому данный костыль использует упаковку/распаковку данных в JSON. Решение неидеальное, затрачивается множество времени зря, но таковы данные ограничения библиотеки.
Поскольку DataContractJsonSerializer работает только с определенными типами, его использовать проблематично. Поэтому в проекте был использован 100% managed парсер. Тоже костыль.

chromiumembedded/cef

The Chromium Embedded Framework (CEF) is a simple framework for embedding Chromium-based browsers in other applications.

  • Project Page — https://bitbucket.org/chromiumembedded/cef
  • Tutorial — https://bitbucket.org/chromiumembedded/cef/wiki/Tutorial
  • General Usage — https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage
  • Master Build Quick-Start — https://bitbucket.org/chromiumembedded/cef/wiki/MasterBuildQuickStart
  • Branches and Building — https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding
  • Announcements — https://groups.google.com/forum/#!forum/cef-announce
  • Support Forum — http://www.magpcss.org/ceforum/
  • CEF1 C++ API Docs — http://magpcss.org/ceforum/apidocs/
  • CEF3 C++ API Docs — http://magpcss.org/ceforum/apidocs3/
  • Downloads — https://cef-builds.spotifycdn.com/index.html
  • Donations — http://www.magpcss.org/ceforum/donate.php

CEF is a BSD-licensed open source project founded by Marshall Greenblatt in 2008 and based on the Google Chromium project. Unlike the Chromium project itself, which focuses mainly on Google Chrome application development, CEF focuses on facilitating embedded browser use cases in third-party applications. CEF insulates the user from the underlying Chromium and Blink code complexity by offering production-quality stable APIs, release branches tracking specific Chromium releases, and binary distributions. Most features in CEF have default implementations that provide rich functionality while requiring little or no integration work from the user. There are currently over 100 million installed instances of CEF around the world embedded in products from a wide range of companies and industries. A partial list of companies and products using CEF is available on the CEF Wikipedia page. Some use cases for CEF include:

  • Embedding an HTML5-compliant Web browser control in an existing native application.
  • Creating a light-weight native “shell” application that hosts a user interface developed primarily using Web technologies.
  • Rendering Web content “off-screen” in applications that have their own custom drawing frameworks.
  • Acting as a host for automated testing of existing Web properties and applications.

CEF supports a wide range of programming languages and operating systems and can be easily integrated into both new and existing applications. It was designed from the ground up with both performance and ease of use in mind. The base framework includes C and C++ programming interfaces exposed via native libraries that insulate the host application from Chromium and Blink implementation details. It provides close integration between the browser and the host application including support for custom plugins, protocols, JavaScript objects and JavaScript extensions. The host application can optionally control resource loading, navigation, context menus, printing and more, while taking advantage of the same performance and HTML5 technologies available in the Google Chrome Web browser.

Numerous individuals and organizations contribute time and resources to support CEF development, but more involvement from the community is always welcome. This includes support for both the core CEF project and external projects that integrate CEF with additional programming languages and frameworks (see the «External Projects» section below). If you are interested in donating time to help with CEF development please see the «Helping Out» section below. If you are interested in donating money to support general CEF development and infrastructure efforts please visit the CEF Donations page.

Users new to CEF development should start by reading the Tutorial Wiki page for an overview of CEF usage and then proceed to the GeneralUsage Wiki page for a more in-depth discussion or architectural and usage issues. Complete API documentation is available here. CEF support and related discussion is available on the CEF Forum.

Binary distributions, which include all files necessary to build a CEF-based application, are available on the Downloads page. Binary distributions are stand-alone and do not require the download of CEF or Chromium source code. Symbol files for debugging binary distributions of libcef can also be downloaded from the above links.

The CEF project is an extension of the Chromium project. CEF maintains development and release branches that track Chromium branches. CEF source code can be downloaded, built and packaged manually or with automated tools. Visit the BranchesAndBuilding Wiki page for more information.

The base CEF framework includes support for the C and C++ programming languages. Thanks to the hard work of external maintainers CEF can integrate with a number of other programming languages and frameworks. These external projects are not maintained by CEF so please contact the respective project maintainer if you have any questions or issues.

  • .Net (CEF3) — https://github.com/cefsharp/CefSharp
  • .Net (CEF1) — https://bitbucket.org/fddima/cefglue
  • .Net/Mono (CEF3) — https://gitlab.com/xiliumhq/chromiumembedded/cefglue
  • Delphi — https://github.com/hgourvest/dcef3
  • Delphi — https://github.com/salvadordf/CEF4Delphi
  • Go — https://github.com/CzarekTomczak/cef2go
  • Java — https://bitbucket.org/chromiumembedded/java-cef
  • Python — http://code.google.com/p/cefpython/

If you’re the maintainer of a project not listed above and would like your project listed here please either post to the CEF Forum or contact Marshall directly.

CEF is still very much a work in progress. Some ways that you can help out:

— Vote for issues in the CEF issue tracker that are important to you. This helps with development prioritization.

— Report any bugs that you find or feature requests that are important to you. Make sure to first search for existing issues before creating new ones. Please use the CEF Forum and not the issue tracker for usage questions. Each CEF issue should:

  • Include the CEF revision or binary distribution version.
  • Include information about your OS and compiler version.
  • If the issue is a bug please provide detailed reproduction information.
  • If the issue is a feature please describe why the feature is beneficial.

— Write unit tests for new or existing functionality.

— Pull requests and patches are welcome. View open issues in the CEF issue tracker or search for TODO(cef) in the source code for ideas.

If you would like to contribute source code changes to CEF please follow the below guidelines:

— Create or find an appropriate issue for each distinct bug, feature or change.

— Submit a pull request or create a patch with your changes and attach it to the CEF issue. Changes should:

  • Be submitted against the current CEF master branch unless explicitly fixing a bug in a CEF release branch.
  • Follow the style of existing CEF source files. In general CEF uses the Chromium C++ style guide.
  • Include new or modified unit tests as appropriate to the functionality.
  • Not include unnecessary or unrelated changes.

About

Chromium Embedded Framework (CEF) official mirror. A simple framework for embedding Chromium-based browsers in other applications.

Как собрать Chromium Embedded Framework для продуктов Google

В этой статье описано, как создать собственную версию Chromium Embedded Framework (CEF) для использования с программными продуктами Google на основе проекта CEF с открытым исходным кодом.

Такие продукты Google собраны на разных версиях CEF. При каждом обновлении продукта эти версии могут меняться. Перед созданием сборки рекомендуем проверить, какая версия CEF используется в продукте Google, в разделе с описанием этого продукта. Если версии CEF различаются, могут возникнуть проблемы с совместимостью.

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

Инструкции для сотрудников Google

Если вы сотрудник Google, вместо этого перейдите по ссылке go/cef.

Как создать сборку, используя официальный репозиторий CEF

Фреймворк CEF размещен на сайте Bitbucket по адресу https://bitbucket.org/chromiumembedded/cef. На этом ресурсе есть вики-страница с информацией о создании сборок CEF. Все продукты Google, в которых используется CEF, построены на ветвях выпусков CEF. На этой странице можно найти инструкции по созданию сборки из ветви выпуска. Сборки CEF в значительной степени основаны на проекте Chromium с открытым исходным кодом. По этой причине системные требования для создания сборок CEF могут быть очень высокими.

При создании сборок CEF Google использует модифицированную версию скрипта на языке Python для автоматизированной сборки, который применяет дополнительные исправления исходного кода. Для сборки версии CEF, совместимой с продуктами Google на основе CEF, использовать эти исправления необязательно, но при желании их можно найти на сайте https://third-party-mirror.googlesource.com/cef. Там продублированы в общем доступе все файлы, использованные Google для сборки CEF.

Как использовать метод CEF для автоматизированной сборки

Чтобы создать сборку, используя автоматизированный процесс CEF, следуйте инструкциям на этой странице. Не забудьте указать нужную ветвь выпуска для совместимости с версией CEF в продукте Google, под который создается сборка.

Как использовать исправления Google

Чтобы создать сборку, применив исправления, используемые Google, выполните следующие действия:

  1. Следуйте обычному процессу автоматизированной сборки CEF. Запустите синхронизацию с правильным источником ветви выпуска.
  2. Скачайте отзеркалированные файлы исправлений и добавьте их в уже существующую папку по адресу cef/patches . Следуйте инструкциям из файла README.txt , где описано, как добавить исправления и как добавить их упоминания в файл конфигурации исправлений.
  3. Запустите процесс сборки CEF с помощью скрипта automated_git.py .

Как включить в сборку проприетарные кодеки Chrome

Сборка CEF по умолчанию не включает проприетарные аудио- и видеокодеки. Чтобы создать сборку CEF с включенными в нее кодеками Chrome, необходимо добавить код ffmpeg_branding=Chrome proprietary_codecs=true в переменную среды GN_DEFINES .

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *