ðãã©ãŠã¶ã®ä»çµã¿ãåŠã¶
Photo by Remotar Jobs on Unsplash
Webããã³ããšã³ãžãã¢ãããã®ããã©ãŠã¶ã®ä»çµã¿ã«èå³ãæã€ã®ã¯èªç¶ã®æçã§ããæ¬èšäºã§ã¯ãç§ããã©ãŠã¶ã®ä»çµã¿ãåŠãã§ããéçšãåå¿é²ãšããŠæ®ããŸãã
ã¿ããªå€§å¥œãChrome
Webããã³ããšã³ãžãã¢ã«æãããŠãããã©ãŠã¶ãšããã°ãIEChromeã§ãããã
ãã©ãŠã¶ã§HTML,CSS,JSã®åäœç¢ºèªããã®ã¯ãæ¥åžžè¶é£¯äºã§ãã
ãã©ãŠã¶ã«ãã£ãŠåäœãç°ãªãããšã¯ãWebããã³ããšã³ãžãã¢ãªãåšç¥ã®äºå®ã§ãã
ãããããªãã§åäœãéãã®ããšãããšã
- ãã¬ã³ããªã³ã°ãšã³ãžã³ãéããããã
- ãJavascriptãšã³ãžã³ãéããããã
ãããã¯ç¥ã£ãŠããããããªãããªãšæããŸãã
ãããããã®ã¬ã³ããªã³ã°ãšã³ãžã³ã£ãŠã©ãããä»çµã¿ã§åããŠããã®ã§ããããã
æ°ã«ãªããŸãããã
Chromiumã«ã€ããŠ
Chromiumãããã¶ããåãã®æ¹å€ãã®ããªãšæããŸãã®ã§ãç°¡åã«èª¬æããŸãã
Chromiumã¯ããªãŒãã³ãœãŒã¹ã®ãããžã§ã¯ãåã§ããããã©ãŠã¶åã§ããããŸãã
Chromeã¯ãChromiumãå
ã«éçºãããŠããŸãã
詳ãã説æã¯Chromium - WikiãèŠãŠãã ããã
ãªãŒãã³ãœãŒã¹ã£ãŠããšã¯ããœãŒã¹ã³ãŒãã誰ã§ãèªãã¡ããã£ãŠããšã§ãããã
ã ã£ããããã©ãŠã¶ã®åäœãç¥ãããšãã§ãã¡ãããããªãã§ããïŒ
ããŒãïŒð
Chromiumã®ãªããŒã¹ãšã³ãžãã¢ãªã³ã°
ã§ã¯ãã£ãããChromiumã®ãœãŒã¹ã³ãŒããèŠãŠãããŸãããã
ããã§ãã
chromium/src - source.chromium.org
Chromium - Wikiã«ããã°ãChromiumã®ãœãŒã¹ã³ãŒãã¯çŽ3,500äžè¡ããããã§ãã
ããããèšèªã¯C++ãç§ã¯ããŸãããã詳ãããªãã®ã§ãðã
å®éã«ãœãŒã¹ã³ãŒããããŒã«ã«ãã·ã³(Macbook Air)ãžãã§ãã¯ã¢ãŠããããã«ããããŠã¿ãŸããã
ãã·ã³ã貧匱ã ãšããã®ããããã§ããããã«ãã«åæ¥ãããããã£ãŠããŸããŸãããããããã§ãã
ããããããããã«ãæ軜ã«ãã©ãŠã¶ã®åäœç¢ºèªã¯ã§ãããã«ãªãã§ãã
ãã©ãŠã¶ã®ä»çµã¿è³æãèªã
ã¡ãã£ãšè¶£åãå€ããŠã次ã®ãããªè³æãèªãããšã«ããŸããã
-
ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é
- èšäºã®å ¬éæ¥ã2011幎8æ5æ¥ãªã®ã§ãè²ã å€ããããããŸããã
ã§ã¯ããã£ããèŠãŠãããŸãã
æåã«ç®ã«ã€ãã®ãããã©ãŠã¶ã®äž»ãªæ§æèŠçŽ ã§ãã
ãã©ãŠã¶ã®äž»ãªæ§æèŠçŽ - www.html5rocks.com
æ§æèŠçŽ ã®å
ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ããã©ãŠã¶ãšã³ãžã³ãã¬ã³ããªã³ã°ãšã³ãžã³ã«çç®ããŸãã
ããããã次ã®åœ¹å²ããããŸãã
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹
- ã¢ãã¬ã¹ããŒãæ»ã/é²ããã¿ã³ã®ãããªUIãæ åœ
- ãã©ãŠã¶ãšã³ãžã³
- UIãšã¬ã³ããªã³ã°ãšã³ãžã³ã®éã®åŠçãæŽç
- ã¬ã³ããªã³ã°ãšã³ãžã³
- èŠæ±ãããã³ã³ãã³ã(HTMLãªã©)ã®è¡šç€ºãæ åœ
ã¡ãªã¿ã«ãChromiumã®ã¬ã³ããªã³ã°ãšã³ãžã³ã«ã¯ãwebkitã䜿ã£ãŠããŸããããblinkã«å€ãããŸããã
ãã©ãŠã¶ã®åºæ¬çãªãããŒã¯ã次ã®å³ã®éãã§ãã
ã¬ã³ããªã³ã°ã®åºæ¬çãªãã㌠- www.html5rocks.com
Webkitã®ã¡ã€ã³ãã㌠- www.html5rocks.com
- Parsing HTML to construct the DOM tree
- Render tree construction
- Layout of the render tree
- Painting the render tree
ããããèŠãŠãããŸãã
â Parsing HTML to construct the DOM tree
1ã¯ãHTMLãã¬ããµ(åå¥è§£æ. ex:flex)ã»ããŒãµ(æ§æ解æ. ex:bison)ã䜿ã£ãŠDOMããªãŒãæ§ç¯ããŸãã
ã¬ããµã§ã¯ãã¹ããŒããã·ã³ã«ãã£ãŠèªã¿èŸŒã¿ç¶æ ã管çãã€ã€ããŒã¯ã³ãèå¥ããŸãã空çœãšãã³ã¡ã³ããªã©ã¯åé€ãããŸãã
ã¬ããµããèå¥ãããããŒã¯ã³ãããŒãµã«æž¡ããæ§æ解æããŠãããŸãã
HTMLã¯DTDïŒDocument Type DefinitionïŒã§æèèªç±ææ³ãªãããæ©æ¢°çã«è§£æã§ããŸãã
ãã ãHTMLã¯å¯å€§ãªä»æ§ã§ã次ã®ãããªãã¿ãŒã³ã蚱容ããããã«ãªã£ãŠããŸãã
- <br>ã®ä»£ããã®</br>
- è¿·åã®ããŒãã«
- å ¥ãåã®ãã©ãŒã èŠçŽ
- æ·±ãããã¿ã°éå±€
- é 眮ã«èª€ãã®ãã html ãŸã㯠body çµäºã¿ã°
ããŒãµããDOMïŒDocument Object ModelïŒãæ§ç¯ããŸãã
DOMã¯ããããŸã§ã®åãªãããã¹ããããAPIãæããããªããžã§ã¯ãã¢ãã«ãäœãããšã§ã
以éã¯DOMã䜿ã£ãŠåŠçãããããªããŸãã
ãµã³ãã« ããŒã¯ã¢ããã®DOMããªãŒ - www.html5rocks.com
ãããŸã§ã¯HTMLã®è©±ãããŠããŸããããHTMLãšäžŠè¡ããŠCSSãåæ§ã«åŠçããŠããã¬ã³ããŒãªããžã§ã¯ããšãããªããžã§ã¯ããäœã£ãŠãããŸããããã¯ãã¹ã¿ã€ã«æ
å ±ãä»äžãããªããžã§ã¯ãã«ãªããŸãã
åºæ¬çã«ãCSSãšHTMLã¯äºãã«ç¬ç«ããŠããã®ã§ã䞊ååŠçãå¯èœã§ããäŸãã°ãCSSãåŠçããããšã§ãHTMLãå€åããããšã¯ãªãã¯ãã§ãã
CSSã®è§£æ - www.html5rocks.com
ãã ãJavascriptã¯è©±ãéãã®ã§ãJavascriptãèªã¿èŸŒãŸããæç¹ã§HTMLã®ããŒã¹ãäžæããŠJavascriptã®ããŒã¹ãéå§ãããŸãã
ãŸããJavascriptãããŸã èªã¿èŸŒãŸããŠããªãã¹ã¿ã€ã«ã·ãŒãã®åœ±é¿ãåããããªç¹å®ã®ã¹ã¿ã€ã«ããããã£ã«ã¢ã¯ã»ã¹ããå ŽåãJavascriptã¯ãããã¯ãããŸãã
â¡ Render tree construction
â ã®DOMãšã¬ã³ããŒãªããžã§ã¯ããããã¬ã³ããŒããªãŒãæ§ç¯ããŸãã
DOMãšã¬ã³ããŒãªããžã§ã¯ãã¯ã1察1ãšããèš³ã§ã¯ãªããäŸãã°headèŠçŽ ããdisplay:none;
ã®èŠçŽ ãã¬ã³ããŒããªãŒã«å«ãŸããŸããã
ã¬ã³ããŒããªãŒã®æŽæ°ã¯ãDOMããªãŒãæŽæ°ããã床ã«è¡ãããŸãã
ã¬ã³ããŒããªãŒãšå¯Ÿå¿ããDOMããªãŒ - www.html5rocks.com
ã¬ã³ããŒãªããžã§ã¯ãããã¹ã¿ã€ã«ãèšç®ããã®ã§ãããã¡ãã£ãšè€éã§ãã
詳ããã¯ãã¹ã¿ã€ã«ã®èšç®ãèŠãŠãã ããã
⢠Layout of the render tree
ã¬ã³ããŒããªãŒãããã¬ã€ã¢ãŠãæ
å ±ãèšç®ããŠãããŸãã
ã¬ã€ã¢ãŠãæ
å ±ãšã¯ãäœçœ®(x,y)ãšãµã€ãº(width,height)ã§ãã
ã¬ã³ããŒããªãŒã®ã«ãŒãããååž°çã«ã¬ã€ã¢ãŠãæ å ±ãèšç®(layoutã¡ãœãã)ããŠãããŸãã
- 芪ã¬ã³ãã©ãŒãèªèº«ã®å¹ ã決å®ããŸãã
- 芪ãåã確èªããŠã
- åã¬ã³ãã©ãŒãé 眮ããŸãïŒxãšyãèšå®ããŸãïŒã
- å¿ èŠãªå Žåã¯åã®layoutã¡ãœãããåŒã³åºããŸããããã«ãããåã®é«ããèšç®ããŸãã
- 芪ã¯åã®é«ãã®çŽ¯ç©ãããŒãžã³ã®é«ããããã£ã³ã°ã䜿çšããŠãèªèº«ã®é«ããèšå®ããŸãããã®é«ãã¯èŠªã¬ã³ãã©ãŒã®ããã«èŠªã«ãã£ãŠäœ¿çšãããŸãã
â» ã¬ã€ã¢ãŠãåŠç åè
CSSããã¯ã¹ã¢ãã«ã®å³ãåèãŸã§ã«å ±æããŠãããŸãã
CSS åºæ¬ããã¯ã¹ã¢ãã« - developer.mozilla.org
⣠Painting the render tree
ããããæç»ããŸãã
ã©ãã«æç»ããããšããé
眮æ¹æ³ã«ã€ããŠèããããšã«ãªããŸãã
倧ããåããŠã3ã€ã«åãããŸãã
- éåžž
- ãªããžã§ã¯ãã¯ããã¥ã¡ã³ãå
ã®å Žæã«åŸã£ãŠé
眮ãããŸããã€ãŸããã¬ã³ããŒããªãŒå
ã®å Žæã¯DOMããªãŒå
ã®å Žæãšåæ§ã«ãªããããã¯ã¹ã®çš®é¡ã寞æ³ã«åŸã£ãŠã¬ã€ã¢ãŠããããŸãã
- position:static,relative
- ãªããžã§ã¯ãã¯ããã¥ã¡ã³ãå
ã®å Žæã«åŸã£ãŠé
眮ãããŸããã€ãŸããã¬ã³ããŒããªãŒå
ã®å Žæã¯DOMããªãŒå
ã®å Žæãšåæ§ã«ãªããããã¯ã¹ã®çš®é¡ã寞æ³ã«åŸã£ãŠã¬ã€ã¢ãŠããããŸãã
- ãããŒã
- ãªããžã§ã¯ãã¯æåã«éåžžã®ãããŒã®ããã«ã¬ã€ã¢ãŠããããŠãããå·Šå³ã®ã§ããã ãé ãã«ç§»åãããŸãã
- float:right,left
- ãªããžã§ã¯ãã¯æåã«éåžžã®ãããŒã®ããã«ã¬ã€ã¢ãŠããããŠãããå·Šå³ã®ã§ããã ãé ãã«ç§»åãããŸãã
- 絶察
- ãªããžã§ã¯ãã¯ã¬ã³ããŒããªãŒå
ã§DOMããªãŒãšã¯ç°ãªãå Žæã«é
眮ãããŸãã
- position:absolute,fixed
- ãªããžã§ã¯ãã¯ã¬ã³ããŒããªãŒå
ã§DOMããªãŒãšã¯ç°ãªãå Žæã«é
眮ãããŸãã
â» é 眮æ¹æ³
é 眮æ¹æ³ãåããã°ãä»åºŠã¯æç»ãã圢ã«ã€ããŠèããŸãããããã¯ããã¯ã¹ãšã€ã³ã©ã€ã³ããã¯ã¹ã§ãã
ãããã¯ãšã€ã³ã©ã€ã³ã®é
å - www.html5rocks.com
ãããã¯ããã¯ã¹ã¯ãç圢ã®åœ¢ã§ããåçŽã«äžŠã³ãŸãã
ã€ã³ã©ã€ã³ããã¯ã¹ã¯ãç¬èªã®åœ¢ãæããæ°Žå¹³ã«äžŠã³ãŸãã
z-indexã®ãããªããããã£ã§ã¯ãã¹ã¿ããã³ã°ã³ã³ããã¹ããšããæŠå¿µãç¥ãå¿
èŠããããŸãã
詳ããã¯ãéãåããã³ã³ããã¹ã - developer.mozilla.org ãã確èªãã ããã
ãã©ãŠã¶ãèªäœããŠã¿ã
åç« ã§ã¯ãè³æãéããŠãã©ãŠã¶ã®åäœãç解ã§ããŸããã
èªãã ããããªããåãããŠç解ããŠã¿ãããšã¯æããŸãããïŒ
ããã§ããèªäœããŠã¿ãŸãããã
Rust補ã®Servoãšãããã©ãŠã¶ãšã³ãžã³ãéçºããŠãã人ãæžããã次ã®ãã©ãŠã¶èªäœã«é¢ããèšäºããšãŠãåãããããã§ãã
-
Let's build a browser engine! Part 1: Getting started
-
mbrubeck/robinson
- Toyãã©ãŠã¶ãšã³ãžã³(mbrubeck)
- Rust補
-
mbrubeck/robinson
Toyãã©ãŠã¶ãšã³ãžã³(mbrubeck)ã®ã¡ã€ã³ãããŒãããããŸã§ã®è©±ãšãšãŠã䌌ãŠããŸãã
Toyãã©ãŠã¶ãšã³ãžã³(mbrubeck)ã®ã¡ã€ã³ãã㌠- limpet.net
Style treeã¯ããããŸã§ã®è©±ã§ãããšRender treeã ãšæããŸãã
Toyãã©ãŠã¶ãšã³ãžã³(mbrubeck)ã«ã次ã®HTMLãšCSSãèªã¿èŸŒãŸãããšãäžèšã®ç»åã®ãããªã¢ãŠããããã«ãªããŸãã
<!-- https://github.com/mbrubeck/robinson/blob/master/examples/test.html -->
<html>
<head>
<title>Test</title>
</head>
<div class="outer">
<p class="inner">
Hello, <span id="name">world!</span>
</p>
<p class="inner" id="bye">
Goodbye!
</p>
</div>
</html>
/* https://github.com/mbrubeck/robinson/blob/master/examples/test.css */
* {
display: block;
}
span {
display: inline;
}
html {
width: 600px;
padding: 10px;
border-width: 1px;
margin: auto;
background: #ffffff;
}
head {
display: none;
}
.outer {
background: #00ccff;
border-color: #666666;
border-width: 2px;
margin: 50px;
padding: 50px;
}
.inner {
border-color: #cc0000;
border-width: 4px;
height: 100px;
margin-bottom: 20px;
width: 500px;
}
.inner#bye {
background: #ffff00;
}
span#name {
background: red;
color: white;
}
Toyãã©ãŠã¶ãšã³ãžã³(mbrubeck)ã®ã¢ãŠãããã - github.com/mbrubeck/robinson
次ã®ãªã³ã¯ã«ããèªäœãã©ãŠã¶ãšã³ãžã³ã¯ãmbrubeck/robinsonãåèã«ããŠäœããããã®ã ããã§ãã
-
askerry/toy-browser
- Toyãã©ãŠã¶ãšã³ãžã³(askerry)
- C++補
Toyãã©ãŠã¶ãšã³ãžã³(askerry)ã«ã次ã®HTMLãšCSSãèªã¿èŸŒãŸãããšãäžèšã®ç»åã®ãããªã¢ãŠããããã«ãªããŸãã
èŠããåãããšæããŸããããšãŠãé«æ©èœã§ãã
<!-- https://github.com/askerry/toy-browser/blob/master/examples/demo.html -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Browser Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="demo.css"/>
</head>
<body>
<div id="page">
<header class="header">
<h1>Toy Browser Engine</h1>
</header>
<div id="main">
<div id="navbar">
<a href="#" class="navitem">
Home
</a>
<a href="#" class="navitem">
About
</a>
<a href="#" class="navitem">
Some random stuff
</a>
<a href="#" class="navitem">
Conclusion
</a>
<img class="img" src="images/otters.jpg"/>
</div>
<div id="content">
<h2>What is this?</h2>
This is a <b>toy</b> browser engine, implemented for
<span>fun </span> <img class="icon" src="images/fun.png"/>
and <span>glory <img class="icon" src="images/glory.png"/></span>.
<h2>Why would anyone do this?</h2>
This seems pretty pointless! But I had a few goals:
<ul>
<li>Something to build to learn C++</li>
<li>Learn more about how browsers work</li>
<li>Make something I've never made before</li>
</ul>
<h2>What can it do?</h2>
<p>
Currently, the engine can parse a subset of HTML
and build a DOM tree. It can also parse a small subset of
CSS (sometimes incorrectly) and use simple selector matching
to apply styles to elements.
</p>
<p>
It supports <em>very basic</em> rendering of boxes, images, and
text with simple block and inline layouts.
</p>
</div>
</div>
</div>
</body>
</html>
/* https://github.com/askerry/toy-browser/blob/master/examples/demo.css */
body {
font-family: Arial, sans-serif;
background-color: #BFC0C0;
color: #253237;
font-size: 16px;
}
#page {
padding: 20;
/* width: 800px; */
margin: auto;
}
header {
padding: 10px;
padding-left: 20px;
background-color: #434371;
color: #4acebd;
}
span {
color: #4acebd;
}
#main {
background-color: white;
display: flex;
}
#navbar {
width: 180px;
padding: 30px;
background-color: #4acebd;
height: 500px;
}
.navitem {
display: block;
text-align: center;
background-color: #434371;
color: #4acebd;
margin-top: 5px;
margin-bottom: 5px;
padding: 10px;
border-radius: 4px;
border-style: solid;
border-width: 2px;
border-color: #253237;
}
#content {
padding: 20px;
width: 500;
}
.img {
width: 180px;
}
.icon {
width: 2em;
}
h2 {
color: #434371;
}
li {
margin-bottom: 5px;
}
Toyãã©ãŠã¶ãšã³ãžã³(askerry)ã®ã¢ãŠãããã - github.com/askerry/toy-browser
ç§ãšããŠã¯ããã¡ãã®æ¹ãèå³ãããã®ã§ããŸããã¡ããç¥ãããããRustçã§äœãçŽããããªãšæããŸãã
C++ ãåŠã¶
ããŠãC++ãåŠã¶ããã«ã次ã®ãµã€ãããã£ãšçºããŠã¿ãŸãã
èªäœãã©ãŠã¶ã®ãœãŒã¹ã³ãŒã
askerry/toy-browserã®ã¡ã€ã³ã³ãŒã(main.cc)ãèŒããŸãã
/* https://github.com/askerry/toy-browser/blob/master/src/main.cc */
namespace {
void renderWindow(int width, int height, const style::StyledNode &sn,
sf::RenderWindow *window) {
layout::Dimensions viewport;
viewport.content.width = width;
viewport.content.height = height;
// Create layout tree for the specified viewport dimensions.
std::unique_ptr<layout::LayoutElement> layout_root =
layout::layout_tree(sn, viewport);
// Paint to window.
paint(*layout_root, viewport.content, window);
}
int windowLoop(const style::StyledNode &sn) {
// Create browser window.
std::unique_ptr<sf::RenderWindow> window(new sf::RenderWindow());
window->create(sf::VideoMode(FLAGS_window_width, FLAGS_window_height),
"Toy Browser", sf::Style::Close | sf::Style::Resize);
window->setPosition(sf::Vector2i(0, 0));
window->clear(sf::Color::Black);
// Render initial window contents.
renderWindow(FLAGS_window_width, FLAGS_window_height, sn, window.get());
// Run the main event loop as long as the window is open.
while (window->isOpen()) {
sf::Event event;
while (window->pollEvent(event)) {
switch (event.type) {
case sf::Event::Closed:
window->close();
break;
case sf::Event::KeyPressed:
logger::debug("keypress: " + std::to_string(event.key.code));
break;
case sf::Event::Resized:
logger::debug("new width: " + std::to_string(event.size.width));
logger::debug("new height: " + std::to_string(event.size.height));
window->clear(sf::Color::Black);
renderWindow(event.size.width, event.size.height, sn, window.get());
break;
case sf::Event::TextEntered:
if (event.text.unicode < 128) {
logger::debug(
"ASCII character typed: " +
std::to_string(static_cast<char>(event.text.unicode)));
}
break;
default:
break;
}
}
}
return 0;
}
} // namespace
int main(int argc, char **argv) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
// Parse HTML and CSS files.
const std::string source = io::readFile(FLAGS_html_file);
std::unique_ptr<dom::Node> root = html_parser::parseHtml(source);
const std::string css = io::readFile(FLAGS_css_file);
const std::unique_ptr<css::StyleSheet const> stylesheet = css::parseCss(css);
// Initialize font registry singleton.
text_render::FontRegistry *registry =
text_render::FontRegistry::getInstance();
// Align styles with DOM nodes.
std::unique_ptr<style::StyledNode> styled_node =
style::styleTree(*root, stylesheet, style::PropertyMap());
// Run main browser window loop.
windowLoop(*styled_node);
// Delete styled node and clear font registry.
styled_node.reset();
registry->clear();
return 0;
}
次ã®ãšããããããŸã§åŠãã§ããã¡ã€ã³ãããŒãšãC++ããšãŠã䌌ãŠããããšãåãããŸãã
- HTMLãšCSSãããŒã¹
// Parse HTML and CSS files.
const std::string source = io::readFile(FLAGS_html_file);
std::unique_ptr<dom::Node> root = html_parser::parseHtml(source);
const std::string css = io::readFile(FLAGS_css_file);
const std::unique_ptr<css::StyleSheet const> stylesheet = css::parseCss(css);
- 1ã®çµæããStyle tree(Render tree)ãæ§ç¯
// Align styles with DOM nodes.
std::unique_ptr<style::StyledNode> styled_node =
style::styleTree(*root, stylesheet, style::PropertyMap());
- 2ã®çµæããLayout treeãæ§ç¯
// Create layout tree for the specified viewport dimensions.
std::unique_ptr<layout::LayoutElement> layout_root =
layout::layout_tree(sn, viewport);
- 3ãpaintãšããæç»
// Paint to window.
paint(*layout_root, viewport.content, window);
Re: ãã©ãŠã¶ã®ä»çµã¿è³æãèªã
ããäžåºŠããã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å éšæ§é ãèªããšãåããŠèªãã ãšãã«æ¯ã¹ãŠãæ·±ãç解ã§ããããããªãããªãšæããŸãã
æåŸã«
ãã©ãŠã¶ã®åäœã«ã€ããŠè³æãèªäœãéããŠç解ãæ·±ããŸããã
ãã©ãŠã¶ã®åäœãåããã°ããã©ãŠã¶ã«åªããWebããã³ããšã³ãéçºãã§ãããšæããŸãã
(ä»åºŠããChromiumã®ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ãã§ãããããããŸããã)
ãã®ä»
Chromiumã®ã¢ããã³ãã«ã¬ã³ããŒããããŸãããåèãŸã§ã«ãã£ãšèŠãŠã¿ããšè¯ãã§ãããã
Chromium Browser Advent Calendar 2017
Discussion
ããã©ãŠã¶ã®ä»çµã¿ãåŠã¶ãã®èšäºãèŠãŠãaskerry/toy-browserãããŠã³ããŒããã
ãã«ãããŠèŠãããšæããŸããã
ãšã³ãžãã¢ã§ããªããèå³ã®ããããšãç¬åŠã§å匷ããŠãããã®ã§ãã
askerry/toy-browserããŒãžã®Instructionsã«bazelãšsfmlãã€ã³ã¹ããŒã«ããWORKSPACEãã¡ã€ã«ã®new_local_repository
ãæŽæ°ããŠsfmlãã€ã³ã¹ããŒã«ãããŠããå Žæãæãããã«å€æŽãã
ãšæžãããŠããããããŸãbazelãã€ã³ã¹ããŒã«ãhelloworldã®ãããªç°¡åãªãã®ããã«ãããããšãã§ããŸããã
ãããããããããµã€ãçèŠãŠãŸããããtoy-browserããã«ãããããšãã§ããŸããã
åå¿è ã®ãããsfmlãã€ã³ã¹ããŒã«ãããšããããšèªäœãããããã£ãŠããªãã®ãããããŸããã»ã»ã»
å ·äœçã«äœãããã°ãã«ãããããšãã§ããã®ã§ããããïŒ
ã¡ãªã¿ã«ãã®èšäºã¯åèã«ãªããŸããïŒ
ç°å¢ã¯macOS Monterey ver12.4ã§ã
ãªãã»ã©ã§ãã
https://github.com/askerry/toy-browser/issues 㧠質åããŠã¿ãã®ãäžçªã§ãïŒ
ããã§ãããGithubèªäœãã£ãããšããªããããã£ããã§ããã
ã¡ãã£ãšãã£ãŠã¿ãŸãã
ãŸãè¡ãè©°ãŸã£ãã質åããããã§ãã