{"id":293,"date":"2018-06-26T00:55:33","date_gmt":"2018-06-26T00:55:33","guid":{"rendered":"http:\/\/blogs.igalia.com\/gyuyoung\/?p=293"},"modified":"2019-10-24T07:10:55","modified_gmt":"2019-10-24T07:10:55","slug":"how-to-develop-chromium-with-visual-studio-code","status":"publish","type":"post","link":"https:\/\/blogs.igalia.com\/gyuyoung\/2018\/06\/26\/how-to-develop-chromium-with-visual-studio-code\/","title":{"rendered":"How to develop Chromium with Visual Studio Code on Linux?"},"content":{"rendered":"<p>How have you been developing Chromium? I have often been asked what is the best tool to develop Chromium. I guess Chromium developers have been usually using vim, emacs,\u00a0cscope, sublime text, eclipse, etc. And they have used GDB or console logs for debugging. But, in case of Windows, developers have used Visual Studio. Although Visual Studio supports powerful features to develop C\/C++ programs, unfortunately, it couldn&#8217;t be used by other platform developers. However, recently I notice that Visual Studio Code also can support to develop Chromium with the nice editor, powerful debugging tools, and a lot of extensions. And, even it can work on Linux and Mac because it is based on <a href=\"https:\/\/electronjs.org\/\">Electron<\/a>. Nowadays I&#8217;m developing Chromium with <em>VS Code<\/em>. I feel that <em>VS Code<\/em> is one of the very nice tools to develop Chromium. So I&#8217;d like to share my experience how to develop Chromium by using the Visual Studio Code on Ubuntu.<\/p>\n<h1>Default settings for Chromium<\/h1>\n<p><span class=\"author-a-z90zz67zsj53jz90zz71zz74zz72zz88ztz87z9z69z\">T<\/span><span class=\"author-a-z89zu0z82zz65zz70zqej64hniwt\">here<\/span><span class=\"author-a-z90zz67zsj53jz90zz71zz74zz72zz88ztz87z9z69z\">\u00a0is already<\/span><span class=\"author-a-z89zu0z82zz65zz70zqej64hniwt\">\u00a0an article about how to set up the environment to build Chromium in\u00a0<\/span><span class=\"author-a-z89zu0z82zz65zz70zqej64hniwt i\"><i>VS code<\/i><\/span><span class=\"author-a-z89zu0z82zz65zz70zqej64hniwt\">.\u00a0<\/span><span class=\"author-a-z90zz67zsj53jz90zz71zz74zz72zz88ztz87z9z69z\">So to start,\u00a0<\/span><span class=\"author-a-z89zu0z82zz65zz70zqej64hniwt\">you need to\u00a0<\/span><span class=\"author-a-z90zz67zsj53jz90zz71zz74zz72zz88ztz87z9z69z\">prepare<\/span><span class=\"author-a-z89zu0z82zz65zz70zqej64hniwt\">\u00a0the environment setting<\/span><span class=\"author-a-z90zz67zsj53jz90zz71zz74zz72zz88ztz87z9z69z\">s.\u00a0<\/span><span class=\"author-a-z89zu0z82zz65zz70zqej64hniwt\">This section just\u00a0<\/span><span class=\"author-a-z90zz67zsj53jz90zz71zz74zz72zz88ztz87z9z69z\">lists<\/span><span class=\"author-a-z89zu0z82zz65zz70zqej64hniwt\">\u00a0key points in the instruction<\/span><span class=\"author-a-z90zz67zsj53jz90zz71zz74zz72zz88ztz87z9z69z\">s<\/span><span class=\"author-a-z89zu0z82zz65zz70zqej64hniwt\">.<br \/>\n<\/span>* <a href=\"https:\/\/chromium.googlesource.com\/chromium\/src\/+\/lkcr\/docs\/vscode.md\">https:\/\/chromium.googlesource.com\/chromium\/src\/+\/lkcr\/docs\/vscode.md<\/a><\/p>\n<ol>\n<li>Download <em>VS Code<\/em>\n<pre><a href=\"https:\/\/code.visualstudio.com\/docs\/setup\/setup-overview\">https:\/\/code.visualstudio.com\/docs\/setup\/setup-overview<\/a><\/pre>\n<\/li>\n<li>Launch <em>VS Code<\/em> in chromium\/src\n<pre>$ code .<code><\/code><\/pre>\n<\/li>\n<li>Install useful extensions\n<ol>\n<li><strong>c\/c++ for visual studio code <\/strong>&#8211; Code formatting, debugging, Intellisense.<strong><br \/>\n<\/strong><\/li>\n<li>\u00a0<em><strong>Toggle Header\/Source <\/strong>&#8211; <\/em>Toggles between .cc and .h with <code>F4<\/code>. The C\/C++ extension supports this as well through <code>Alt+O<\/code> but sometimes chooses the wrong file when there are multiple files in the workspace that have the same name.<\/li>\n<li><em><strong>you-complete-me <\/strong>&#8211;<\/em> YouCompleteMe code completion for VS Code. It works fairly well in Chromium. To install You-Complete-Me, enter these commands in a terminal:\n<pre>$ git clone https:\/\/github.com\/Valloric\/ycmd.git ~\/.ycmd \n$ cd ~\/.ycmd \n$ git submodule update --init --recursive \n$ .\/build.py --clang-completer<\/pre>\n<\/li>\n<li><em><em><em><strong>Rewrap <\/strong>&#8211; Wrap lines at 80 characters with <code>Alt+Q<\/code>.<\/em><\/em><\/em><\/li>\n<li><strong>Highlighter Line<\/strong> &#8211; Highlights the current line in the editor. Find your location in your editor easily.<\/li>\n<\/ol>\n<\/li>\n<li>Setup for Chromium\n<ol>\n<li>\u00a0Chromium added the default settings files for vscode. We can move them to \/\/src\/.vscode folder.\n<ol>\n<li>Workspace setting<br \/>\n&#8211; <a href=\"https:\/\/cs.chromium.org\/chromium\/src\/tools\/vscode\/settings.json5\">https:\/\/cs.chromium.org\/chromium\/src\/tools\/vscode\/settings.json5<\/a><\/li>\n<li>Task setting<br \/>\n&#8211; <a href=\"https:\/\/cs.chromium.org\/chromium\/src\/tools\/vscode\/tasks.json5\">https:\/\/cs.chromium.org\/chromium\/src\/tools\/vscode\/tasks.json5<\/a><\/li>\n<li>Launch setting<br \/>\n&#8211;\u00a0<a href=\"https:\/\/cs.chromium.org\/chromium\/src\/tools\/vscode\/launch.json5\">https:\/\/cs.chromium.org\/chromium\/src\/tools\/vscode\/launch.json5<\/a><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Key mapping\n<pre>* <strong>Ctrl+P<\/strong>:\u00a0opens a search box to find and open a file.\n* <strong>F1\u00a0or\u00a0Ctrl+Shift+P<\/strong>:\u00a0opens a search box to find a command\n  (e.g. Tasks: Run Task).\n* <strong>Ctrl+K, Ctrl+S<\/strong>:\u00a0opens the key bindings editor.\n* <strong>Ctrl+`<\/strong>:\u00a0toggles the built-in terminal.\n* <strong>Ctrl+Shift+M<\/strong>:\u00a0toggles the problems view (linter warnings, \n  compile errors and warnings). You'll swicth a lot between\n  terminal and problem view during compilation.\n* <strong>Alt+O<\/strong>:\u00a0switches between the source\/header file.\n* <strong>Ctrl+G<\/strong>:\u00a0jumps to a line.\n* <strong>F12<\/strong>:\u00a0jumps to the definition of the symbol at the cursor\n  (also available on right-click context menu).\n* <strong>Shift+F12\u00a0or\u00a0F1<\/strong>: CodeSearchReferences, Return\u00a0shows all\n  references of the symbol at the cursor.\n* <strong>F1<\/strong>: CodeSearchOpen, Return\u00a0opens the current file in\n  Code Search.\n* <strong>Ctrl+D<\/strong>:\u00a0selects the word at the cursor. Pressing it multiple\n  times multi-selects the next occurrences, so typing in one\n  types in all of them, and\u00a0Ctrl+U\u00a0deselects the last occurrence.\n* <strong>Ctrl+K+Z<\/strong>:\u00a0enters Zen Mode, a fullscreen editing mode with\n  nothing but the current editor visible.\n* <strong>Ctrl+X<\/strong>:\u00a0without anything selected cuts the current line.\n  Ctrl+V pastes the line.<\/pre>\n<\/li>\n<li>(Optional) Color setting\n<ul>\n<li>Press\u00a0<code>Ctrl+Shift+P, color, Enter<\/code>\u00a0to pick a color scheme for the editor<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h1>Additional settings after the default settings.<\/h1>\n<ol>\n<li>Set workspaceRoot to .bashrc. (Because it will be needed for some extensions.)\n<pre>export workspaceRoot=$HOME\/chromium\/src<\/pre>\n<\/li>\n<li>Copy 3 settings files from \/\/src\/tools\/vscode to \/\/src\/.vscode\n<ul>\n<li>\n<pre class=\"code\">$ mkdir .vscode\/\n$ cp tools\/vscode\/settings.json5 .vscode\/settings.json\n$ cp tools\/vscode\/tasks.json5 .vscode\/tasks.json\n$ cp tools\/vscode\/launch.json5 .vscode\/launch.json<\/pre>\n<\/li>\n<li>You can find my configuration files based on the default files\n<ol>\n<li><a href=\"https:\/\/github.com\/Gyuyoung\/vscode\">https:\/\/github.com\/Gyuyoung\/vscode<\/a><\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<\/li>\n<li>Set ycmd path to .vscode\/settings.json\n<ul>\n<li>\n<div>\n<pre>\/\/ YouCompleteMe\n\"ycmd.path\": \"&lt;path&gt;\/.ycmd\", \/\/ Please replace this path<\/pre>\n<\/div>\n<\/li>\n<\/ul>\n<\/li>\n<li>Add new tasks to <strong>tasks.json<\/strong> in order to build Chromium by using ICECC.\n<ul>\n<li>\u00a0I wrote a post about how to build Chromium by using ICECC in the previous post. Please setup it first.\n<ul>\n<li><strong><a href=\"https:\/\/blogs.igalia.com\/gyuyoung\/2018\/01\/11\/share-my-experience-to-build-chromium-with-icecc\/\">Share my experience to build Chromium with ICECC and Jumbo<\/a><\/strong><\/li>\n<\/ul>\n<\/li>\n<li>Add buildChromiumICECC.sh Debug to the tasks.json<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<div>\n<pre>{\n  \"taskName\": \"1-build_chrome_debug_icecc\",\n  \"command\": \"<strong>buildChromiumICECC.sh Debug<\/strong>\",\n  \"isShellCommand\": true,\n  \"isTestCommand\": true,\n  \"problemMatcher\": [\n    {\n      \"owner\": \"cpp\",\n      \"fileLocation\": [\n        \"relative\",\n        \"${workspaceRoot}\"\n      ],\n      \"pattern\": {\n        \"regexp\": \"^..\/..\/(.*):(\\\\d+):(\\\\d+):\\\\s+(warning|\\\\w*\\\\s?error):\\\\s+(.*)$\",\n        \"file\": 1,\n        \"line\": 2,\n        \"column\": 3,\n        \"severity\": 4,\n        \"message\": 5\n      }\n    },\n    {\n      \"owner\": \"cpp\",\n      \"fileLocation\": [\n        \"relative\",\n        \"${workspaceRoot}\"\n      ],\n      \"pattern\": {\n        \"regexp\": \"^..\/..\/(.*?):(.*):\\\\s+(warning|\\\\w*\\\\s?error):\\\\s+(.*)$\",\n        \"file\": 1,\n        \"severity\": 3,\n        \"message\": 4\n      }\n    }\n  ]\n},<\/pre>\n<\/div>\n<ol>\n<li>Update &#8220;Chrome Debug&#8221; configuration in <strong>launch.json<\/strong><\/li>\n<\/ol>\n<div>\n<div>\n<pre>{\n  \"name\": \"Chrome Debug\",\n  \"type\": \"cppdbg\",\n  \"request\": \"launch\",\n  \"targetArchitecture\": \"x64\",\n  \"environment\": [\n    {\"name\":\"workspaceRoot\", \"value\":\"${HOME}\/chromium\/src\"}\n  ],\n  \"program\": \"${workspaceRoot}\/out\/Debug\/chrome\",\n  \"args\": [\"<strong>--single-process<\/strong>\"],  <strong><em>\/\/ The debugger only can work with the single process mode for now.<\/em><\/strong>\n  \"preLaunchTask\": \"1-build_chrome_debug_icecc\",\n  \"stopAtEntry\": false,\n  \"cwd\": \"<strong>${workspaceRoot}\/out\/Debug<\/strong>\",\n  \"externalConsole\": true,\n},<\/pre>\n<\/div>\n<\/div>\n<h1>Screenshot after the settings<\/h1>\n<p>you will see this window after finishing all settings.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-324\" src=\"http:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-1024x562.png\" alt=\"\" width=\"640\" height=\"351\" srcset=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-1024x562.png 1024w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-300x165.png 300w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-768x421.png 768w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode.png 1920w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<h1>Build Chromium with ICECC in VS Code<\/h1>\n<ol>\n<li>Run Task (Menu -&gt; Terminal -&gt; Run Tasks&#8230;)<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-363\" src=\"http:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/run-task.png\" alt=\"\" width=\"710\" height=\"327\" srcset=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/run-task.png 710w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/run-task-300x138.png 300w\" sizes=\"auto, (max-width: 710px) 100vw, 710px\" \/><\/li>\n<li>Select <strong><strong>1-build_chrome_debug_icecc. <\/strong><\/strong><em>VS Code<\/em> will show an integrated terminal when building Chromium as below,<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-362\" src=\"http:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-icecc.png\" alt=\"\" width=\"912\" height=\"580\" srcset=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-icecc.png 912w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-icecc-300x191.png 300w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-icecc-768x488.png 768w\" sizes=\"auto, (max-width: 912px) 100vw, 912px\" \/>\u00a0On the ICECC monitor, you can see that <em>VS Code<\/em> builds Chromium by using ICECC.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-364\" src=\"http:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/icecc-vs-code.png\" alt=\"\" width=\"924\" height=\"820\" srcset=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/icecc-vs-code.png 924w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/icecc-vs-code-300x266.png 300w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/icecc-vs-code-768x682.png 768w\" sizes=\"auto, (max-width: 924px) 100vw, 924px\" \/><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h1>Start debugging in VS Code<\/h1>\n<p>After completing the build, now is time to start debugging Chromium.<\/p>\n<ol>\n<li>Set a breakpoint\n<ol>\n<li>F9 button or just click the left side of line number<\/li>\n<\/ol>\n<\/li>\n<li>Launch debug\n<ol>\n<li>Press F5 button<\/li>\n<\/ol>\n<\/li>\n<li>Screen captures when debugger stopped at a breakpoint\n<ol>\n<li>Overview<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-326 aligncenter\" src=\"http:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-debug-1-1024x562.png\" alt=\"\" width=\"640\" height=\"351\" srcset=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-debug-1-1024x562.png 1024w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-debug-1-300x165.png 300w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-debug-1-768x421.png 768w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-debug-1.png 1920w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/li>\n<li>Editor<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-337\" src=\"http:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-debug-3.png\" alt=\"\" width=\"755\" height=\"286\" srcset=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-debug-3.png 755w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-debug-3-300x114.png 300w\" sizes=\"auto, (max-width: 755px) 100vw, 755px\" \/><\/li>\n<li>Call stack<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-336\" src=\"http:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-callstack.png\" alt=\"\" width=\"640\" height=\"310\" srcset=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-callstack.png 640w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-callstack-300x145.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/li>\n<li>Variables<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-385\" src=\"http:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-variable-1.png\" alt=\"\" width=\"772\" height=\"302\" srcset=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-variable-1.png 772w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-variable-1-300x117.png 300w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-variable-1-768x300.png 768w\" sizes=\"auto, (max-width: 772px) 100vw, 772px\" \/><\/li>\n<li>Watch<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-386\" src=\"http:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-watch-1.png\" alt=\"\" width=\"622\" height=\"144\" srcset=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-watch-1.png 622w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vscode-watch-1-300x69.png 300w\" sizes=\"auto, (max-width: 622px) 100vw, 622px\" \/><\/li>\n<li>Breakpoints<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-399\" src=\"http:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vs-code-breakpoints.png\" alt=\"\" width=\"469\" height=\"149\" srcset=\"https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vs-code-breakpoints.png 469w, https:\/\/blogs.igalia.com\/gyuyoung\/files\/2018\/06\/vs-code-breakpoints-300x95.png 300w\" sizes=\"auto, (max-width: 469px) 100vw, 469px\" \/><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h2>Todo<\/h2>\n<p>In multiple processes model, <em>VS Code<\/em> can&#8217;t debug child processes yet (i.e. renderer process). According to C\/C++ extension project site, they suggested us to add the below command to launch.json though, it didn&#8217;t work for Chromium when I tried.<\/p>\n<div>\n<pre>\"setupCommands\": [\n\u00a0\u00a0\u00a0 { \"text\": \"-gdb-set follow-fork-mode child\" }\n],<\/pre>\n<div><\/div>\n<\/div>\n<h2>Reference<\/h2>\n<ol>\n<li>Chromium <em>VS Code<\/em> setup: <a href=\"https:\/\/chromium.googlesource.com\/chromium\/src\/+\/lkcr\/docs\/vscode.md\">https:\/\/chromium.googlesource.com\/chromium\/src\/+\/lkcr\/docs\/vscode.md<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Microsoft\/vscode-cpptools\/blob\/master\/launch.md\">https:\/\/github.com\/Microsoft\/vscode-cpptools\/blob\/master\/launch.md<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>How have you been developing Chromium? I have often been asked what is the best tool to develop Chromium. I guess Chromium developers have been usually using vim, emacs,\u00a0cscope, sublime text, eclipse, etc. And they have used GDB or console logs for debugging. But, in case of Windows, developers have used Visual Studio. Although Visual [&hellip;]<\/p>\n","protected":false},"author":52,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[4,13],"class_list":["post-293","post","type-post","status-publish","format-standard","hentry","category-igalia-chromium","tag-chromium","tag-vscode"],"_links":{"self":[{"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/posts\/293","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/comments?post=293"}],"version-history":[{"count":109,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/posts\/293\/revisions"}],"predecessor-version":[{"id":628,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/posts\/293\/revisions\/628"}],"wp:attachment":[{"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/media?parent=293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/categories?post=293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.igalia.com\/gyuyoung\/wp-json\/wp\/v2\/tags?post=293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}