前提・実現したいこと
下記の「該当のソースコード」内にあるcontent_script.jsからchrome.runtime.sendMessageを実行。background.jsのchrome.runtime.onMessage.addListenerからの返り値によって以降の処理を分岐するスクリプトを書いています。
(蛇足ですが、人の顔を配置してクリックしたら笑う、笑っているときはisSmilingの値をtrueに、笑ってないときはisSmilingの値をfalseに設定して、クリックするごとに笑う→普通の顔→笑う→普通の顔を繰り返すことが期待している挙動です)
発生している問題・エラーメッセージ
content_scriptから吐き出されるconsole.logを確認してみると、
script.js:70 result after chrome.runtime.sendMessage undefined script.js:48 response in move undefined script.js:70 result after chrome.runtime.sendMessage undefined script.js:66 response in chrome.runtime.sendMessage false script.js:66 response in chrome.runtime.sendMessage true
という順番で吐き出されてしまい、chrome.runtime.sendMessageの実行結果を待たずに次の処理に行ってしまっています。
該当のソースコード
content_script.js
javascript
1// chromeの拡張機能用APIを使用しないと取得できない 2const nomalFaceImgUrl = chrome.runtime.getURL('images/human_icon_48.png'); 3const smileFaceImgUrl = chrome.runtime.getURL('images/human_icon_48_smile.png'); 4 5// APIへのリクエスト準備 6let smileActionGetPayLoad = { 7 method: 'get', 8 query: 'smileAction', 9 params: null, 10}; 11let smileActionPostPayLoad = { 12 method: 'patch', 13 query: 'smileAction', 14 params: true, 15}; 16 17/** 18 * 画像を配置する 19 * @param {integer} wx - 右からの位置 20 * @param {integer} wy - 下からの位置 21 */ 22function deploy(wx, wy) { 23 // 配置準備 24 const human = document.createElement('img'); 25 human.src = nomalFaceImgUrl; 26 27 // スタイル定義 28 human.id = 'human'; 29 human.style.position = 'fixed'; 30 human.style.right = wx; 31 human.style.bottom = wy; 32 human.style.zIndex = 9999; // 一番上に表示するために適当な値 33 34 // onclickした時に実行するもの 35 human.onclick = move; 36 37 // 配置する 38 const objBody = document.getElementsByTagName('body').item(0); 39 objBody.appendChild(human) 40}; 41 42/** 43 * 画像を変化させる 44 */ 45function move() { 46 const response = coreAPI(smileActionGetPayLoad); 47 console.log('response in move', response); 48 49 if (response == true) { 50 document.getElementById('human').src = nomalFaceImgUrl; 51 smileActionPostPayLoad.params = false; 52 coreAPI(smileActionPostPayLoad); 53 } 54 55 document.getElementById('human').src = smileFaceImgUrl; 56 coreAPI(smileActionPostPayLoad); 57}; 58 59/** 60 * 画像を配置する 61 * @param {Object} payLoad - リクエストするための引数 62 */ 63function coreAPI(payLoad) { 64 const result = chrome.runtime.sendMessage(payLoad, function(response) { 65 console.log('response in chrome.runtime.sendMessage', response); 66 return response 67 }); 68 69 console.log('result after chrome.runtime.sendMessage', result); 70 71 return result; 72}; 73 74 75// 実行 76deploy(0, 0); 77
background.js
javascript
1// 変数をまとめておく 2let store = { 3 isSmiling: false, 4} 5 6/** 7 * フロントに当たるcontent_scripts.jsからのリクエストを処理する 8 * @param {Object} msg - フロントでpayLoad={{method: String}, {query: String}, {params: String}}のような形で設定した引数が入る 9 * @param {integer} sender - 送り元の情報。この拡張機能のIDや、リクエスト元のURL、tabの情報などが取れる 10 * @param {function} sendResponse - これを実行して引数にフロントに返したい内容を入れる。 11 */ 12chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { 13 if (msg.query == 'smileAction') { 14 smileAction(msg); 15 }; 16 sendResponse(store.isSmiling); 17 18 return true; 19}); 20 21/** 22 * 笑顔アクションに関する挙動 23 * @param {Object} msg - フロントでpayLoad={{method: String}, {query: String}, {params: String}}のような形で設定した引数が入る 24 */ 25function smileAction(msg) { 26 if (msg.method == 'get') { 27 return store.isSmiling; 28 } else if (msg.method == 'patch') { 29 store.isSmiling = msg.params 30 return store.isSmiling 31 }; 32}; 33
試したこと
https://qiita.com/Tachibana446/items/ab15021099d54d1209c2
この記事で指摘されている内容(chrome.runtime.onMessage.addListenerの中身にreturn trueを入れる)を試しましたが、結果、上記の状態のままです。
補足情報(FW/ツールのバージョンなど)
不要かもしれませんが、manifest.jsonの内容も記します。
json
1{ 2 "manifest_version": 2, 3 "name": "test", 4 "version": "0.1", 5 "content_scripts": [ { 6 "matches": [ "http://*/*", "https://*/*" ], 7 "js": ["script.js"] 8 } ], 9 "background": { 10 "scripts": ["background.js"] 11 }, 12 "page_action": { 13 "default_icon": { 14 "16": "images/grandma_icon_16.png", 15 "48": "images/grandma_icon_48.png", 16 "128": "images/grandma_icon_128.png" 17 } 18 }, 19 "icons": { 20 "16": "images/grandma_icon_16.png", 21 "48": "images/grandma_icon_48.png", 22 "128": "images/grandma_icon_128.png" 23 }, 24 "web_accessible_resources": [ 25 "images/*" 26 ] 27}
何卒、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/26 10:36
2019/09/26 10:49
2019/09/26 14:42