質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

Chrome extension

Chrome拡張機能

Q&A

解決済

1回答

2998閲覧

chrome拡張機能でPixi.jsを動かしたい

chiudesu

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

Chrome extension

Chrome拡張機能

0グッド

2クリップ

投稿2016/05/20 02:59

chrome拡張機能でwebページに動的にアニメーションを追加しようとしています。
拡張機能として読み込まれるbackground.jsからwebページにpixi.jsとcontent.jsを流し込みました。
しかし、content.jsのPIXI.autoDetectRendererのあたりで画像のようにpixi.jsのバージョンを表示したあとchromeのタブが「問題が発生しました」と止まってしまいます。

どうかよろしくお願いします。

###エラーメッセージ
content側のコンソール

######background.js

JavaScript

1//アクティブなタブが変わったら呼び出し 2function updateTab() { 3 console.log("updateTab"); 4 //アイコンを表示する 5 6 chrome.tabs.query( //現在選択中のtab.idが必要 7 { 8 active: true, 9 currentWindow: true 10 }, 11 function(tabs) { 12 if(tabs[0].id !== undefined)chrome.pageAction.show(tabs[0].id); 13 }); 14} 15 16//アイコンクリックで呼び出し 17function runPixi(tab) { 18 console.log("run PixiTest"); 19 20 chrome.tabs.query( //現在選択中のtab.idが必要 21 { 22 active: true, 23 currentWindow: true 24 }, 25 function(tabs) { 26 var id = tabs[0].id; 27 chrome.tabs.executeScript(id, {//pixi.min.jsはver3.0.9 28 file: "pixi.min.js" 29 }, function() { 30 chrome.tabs.executeScript(id, { 31 file: "content.js" 32 },function(){ 33 console.log("completed"); 34 }); 35 }); 36 }); 37} 38 39 40//実行ここから-------------------------------------------------------------------- 41chrome.pageAction.onClicked.addListener(runPixi); 42 43chrome.tabs.onActivated.addListener(updateTab); 44chrome.tabs.onUpdated.addListener(function(tabId, info, tab) { 45 if (info.status == "complete") updateTab(); 46}); 47chrome.windows.onFocusChanged.addListener(updateTab);

######content.js

JavaScript

1console.log("pixitest"); 2 3var stage = new PIXI.Container(); 4 5console.log("debug1"); 6var renderer = PIXI.autoDetectRenderer(100, 100,{background:0x000000}); 7console.log("debug2"); 8 9document.body.appendChild(renderer.view); 10 11var g = new PIXI.Graphics(); 12g.lineStyle(2, 0xffff00).moveTo(0, 0).lineTo(100, 100); 13 14stage.addChild(g); 15renderer.render(stage);

###補足
上の状況の時、background.js側のコンソールは下のようになっていました。このエラーはcontent.js側でタブが止まってしまったことが原因だと思います。
background側のコンソール
また、pixi.jsのバージョンを3.0.11や2.2.9に代えてみましたが、状況は全く変わりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

pixi は詳しくないですが、たぶん拡張機能側のエリアでは実行できない機能を使ってるのだと思います

script タグで埋め込むことで拡張機能ではなく通常の JavaScript と同じように扱うようにすればエラーは出なくなりました

[manifest]

json

1{ 2 "manifest_version": 2, 3 "name": "test", 4 "version": "0.1", 5 "background": { 6 "scripts": ["background.js"] 7 }, 8 "page_action": { 9 "default_title": "test" 10 }, 11 "permissions": [ "<all_urls>", "tabs"], 12 "web_accessible_resources": [ 13 "pixi.min.js", 14 "content2.js" 15 ] 16}

[background.js]
変更した runPixi だけ

javascript

1function runPixi(tab) { 2 console.log("run PixiTest"); 3 4 chrome.tabs.query( //現在選択中のtab.idが必要 5 { 6 active: true, 7 currentWindow: true 8 }, 9 function(tabs) { 10 var id = tabs[0].id; 11 chrome.tabs.executeScript(id, {//pixi.min.jsはver3.0.9 12 file: "content.js" 13 }, function() { 14 console.log("complete") 15 }); 16 }); 17}

読み込みは content.js だけにします

[content.js]
script タグで pixi.min.js をロードしたあとに script タグで content2.js をロードします

javascript

1insertScript("/pixi.min.js").then(_ => { 2 insertScript("/content2.js") 3}) 4 5function insertScript(ext_path){ 6 return new Promise((resolve, reject) => { 7 var script = document.createElement("script") 8 script.src = chrome.extension.getURL(ext_path) 9 script.onload = resolve 10 document.head.appendChild(script) 11 }) 12}

[content2.js]

質問の content.js そのままです


追記

何が原因で ChromeExtension で使えないのか気になったので調べてみました
原因は gl.bindRenderbuffer メソッドみたいです
このメソッドを実行したらページがクラッシュしてしまいました

pixi じゃなくて以下のコードを content script で実行するだけで同じ状況になります

javascript

1var canvas = document.createElement("canvas") 2var gl = canvas.getContext('webgl') 3var renderBuffer = gl.createRenderbuffer() 4gl.bindRenderbuffer(gl.RENDERBUFFER, renderBuffer)

投稿2016/08/07 06:22

編集2016/08/07 07:14
ryls-nmm

総合スコア633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chiudesu

2016/08/07 12:49

動くようになりました! 原因追及までしていただき、ご丁寧な回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問