1. 程式人生 > >chromium - ERR_CONTENT_DECODING_FAILED

chromium - ERR_CONTENT_DECODING_FAILED

前言

對一個內建web-ui,加了點功能,除錯都正常了。
嘗試將這個web-ui實現,挪到我自己的web-ui中,執行時,網頁出來後是白頁,顯示報錯資訊為"ERR_CONTENT_DECODING_FAILED"

嘗試解決這個錯誤

實驗

出現這個錯誤時,我有2個好的web-ui實現。

  • 我改好的內建web-ui
  • 我自己搞的web-ui
    錯誤僅僅發生在將改好的web-ui挪到我自己的web-ui時。
    其實這種場景(有正確的case, 有錯誤的case, bug能重現),出現bug, 心裡是有底的,一點不慌。

剛玩chromium, 排bug的方法採用對比和逐步加程式碼+測試驗證的方法。
發現呼叫了html_source->UseGzip(); 就會出現"ERR_CONTENT_DECODING_FAILED"
這時看看這句程式碼,再看看錯誤資訊,已經能明白,是資源的編碼方式引起的。

去Z:\chromium\src\chrome\browser\browser_resources.grd,去看資源(*.html, *.css, *.js)
chromium的資源條目,每一個都可以指定type=“xx” compress=“xx”, 其中compress="gzip"就是資源採用gzip壓縮.

      <include name="IDR_HELLO_WORLD_HTML" file="resources\my_page\my_hello_world.html" type="chrome_html" compress="gzip" />
      <include name="IDR_HELLO_WORLD_CSS" file="resources\my_page\my_hello_world.css" type="BINDATA" compress="gzip" />
      <include name="IDR_HELLO_WORLD_JS" file="resources\my_page\my_hello_world.js" type="BINDATA" compress="gzip" />
      <include name="IDR_HELLO_WORLD_BROWSER_PROXY_JS" file="resources\my_page\my_hello_world_browser_proxy.js" type="BINDATA" compress="gzip" />
      <include name="IDR_HELLO_WORLD_VISUALS_JS" file="resources\my_page\my_hello_world_visuals.js" type="BINDATA" compress="gzip" />

如果指定了compress=“gzip”,c++程式碼中就要呼叫html_source->UseGzip(); 否則出現ERR_CONTENT_DECODING_FAILED或亂碼

最簡單方法,就是看看其他資源條目怎麼寫的,試試就行。
改了資原始檔browser_resources.grd,需要重新生成工程,編譯工程,再跑起來看效果。

# cd /d Z:\chromium\src\
# gn --ide=vs args out\my_x86_d
# autoninja -C out\my_x86_d chrome