Webextension для входа на определенную страницу и перехода на подстраницу одним щелчком мыши

я имею дело с комбинацией всплывающего окна, сценария контента и фонового сценария. К сожалению, любое общение, которое я выбрал среди них, не дало желаемого результата.

Мне нужно разработать веб-расширение со значком/всплывающим окном в меню браузера. После нажатия открывается специальное меню с элементами во всплывающем окне. Когда я нажимаю на всплывающее окно, должна открываться вкладка определенного элемента, и она должна переходить по определенному URL-адресу для входа в систему (через URL-адрес с параметрами или POST) и переходить на подстраницу (конкретно для текста всплывающего элемента).

Я пробовал много комбинаций обмена сообщениями между всплывающим окном и сценарием bg, между сценарием bg и сценарием контента и т. д. ... но это никогда не работало со мной. У меня также были проблемы с синхронизацией запросов, потому что, хотя я вошел в систему (через windows.open), я мог выполнить дальнейшую загрузку подстраницы.

У вас есть идеи, ребята, как это может работать? лучший с каким-нибудь коротким примером? Я использовал только стандартный javascript.

Моя ПЕРВАЯ попытка:

manifest.json

{
  "description": "test",
  "manifest_version": 2,
  "name": "extensiontest",
  "version": "1.0",
  "homepage_url": "https://xxxx.com",
  "icons": {
    "32": "beasts-32.png"
  },


  "applications": {
    "gecko": {
      "id": "[email protected]",
      "strict_min_version": "45.0"
    }
  },

  "content_scripts": 
  [
    {
      "matches": ["<all_urls>"],
      "run_at": "document_end",
      "js": ["content.js"]
    }
  ],

"browser_action": 
  {
  "default_icon": "popup.png",
  "default_popup":"popup.html"
  },

"background": 
  {
  "scripts": ["background.js"]
  },

"permissions": 
  [
    "tabs","storage"
  ]
}

всплывающее окно.html

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="links.css"/>
</head>
<script src="popup.js"></script>
<body>
    <ul>
    <li><a id="bQuote" href="#">Quote</a></li>
    <li><a id="bSend" href="#">Send</a></li>
    </ul>
</body></html>

popup.js

function goQuote() {

    chrome.tabs.query({currentWindow: true, active: true}, function (tabs){
    var activeTab = tabs[0];
    chrome.tabs.sendMessage(activeTab.id, {"message": "Quote"});
   });

  // Generic Log In link
  window.open("Login-link","targetname");

}

function goSend() {

    chrome.tabs.query({currentWindow: true, active: true}, function (tabs){
    var activeTab = tabs[0];
    chrome.tabs.sendMessage(activeTab.id, {"message": "Send"});
   });

  // Generic Log In link
  window.open("Login-link","targetname");

}


document.addEventListener("DOMContentLoaded", function() {
  document.getElementById("bQuote").addEventListener("click", goQuote);
  document.getElementById("bSend").addEventListener("click", goSend);
});

content.js

chrome.runtime.onMessage.addListener(
      function(request, sender, sendResponse) {
        if( request.message === "Quote" ) {

          // Subpage link with same target name
          window.open("supbpage-link1","targetname");
             }
        if( request.message === "Send" ) {
          // Subpage link with same target name
          window.open("supbpage-link2","targetname");
             }
      }
    );

person Bramo    schedule 20.07.2016    source источник
comment
Было бы полезно, если бы вы описали свои попытки более подробно, выделив то, что не сработало.   -  person Xan    schedule 20.07.2016
comment
я не могу попасть на определенную подстраницу, основываясь на нажатом всплывающем элементе.. я всегда попадаю на первую страницу после входа в систему....   -  person Bramo    schedule 20.07.2016
comment
Я ищу концепцию ... как и какие файлы можно использовать, чтобы щелкнуть элемент всплывающего окна, открыть вкладку, войти в логотип, а затем перейти к определенной подстранице.   -  person Bramo    schedule 20.07.2016
comment
Похоже, у вас уже есть концепция. Если вы покажете соответствующие части своей лучшей попытки, будет легче указать, что пошло не так, и предложить, как это исправить. Это также освобождает нас от предположений о том, как много вы уже понимаете. Написание всего короткого примера не совсем короткое и было бы слишком широким по стандартам Stack Overflow.   -  person Xan    schedule 20.07.2016
comment
@Xan ... хорошо, я обновляю исходный вопрос с первой попытки, которую я сделал ... все они имеют одинаковый результат, не попадая на подстраницу ... поэтому не уверен, какой из них ближе всего к душе ...   -  person Bramo    schedule 20.07.2016
comment
Итак, вам нужно следующее: откройте страницу входа и ПОСЛЕ перехода на страницу входа перенаправьте вкладку на место назначения в зависимости от выбора? Я правильно понимаю?   -  person Xan    schedule 20.07.2016
comment
@Xan, откройте URL-адрес страницы входа, который перенаправляет на карту сайта и ПОСЛЕ перехода на определенную подстраницу на основе первоначального выбора / элемента из всплывающего меню.   -  person Bramo    schedule 20.07.2016


Ответы (1)


Вам нужен фоновый скрипт, чтобы все организовать.

В popup.js используйте chrome.runtime.sendMessage() для отправки сообщения background.js при событии клика.

In background.js:

  1. chrome.runtime.onMessage() чтобы перехватить сообщение от popup.js
  2. chrome.tabs.create() чтобы открыть страницу входа и запомнить идентификатор вкладки;
  3. chrome.webNavigation.onCompleted.addEventListener() для обнаружения загрузки вкладки (вам нужно событие с tabId, которое вы запомнили и frameId === 0);
  4. chrome.tabs.executeScript() на этой вкладке, чтобы ввести content.js, который заполнит форму и отправит ее;
  5. chrome.webNavigation.onCompleted.addEventListener() еще раз, чтобы обнаружить, что вкладка загружена;
  6. chrome.tabs.update() для перехода к нужной подстранице;
  7. уборка.

И имейте в виду, что в любой момент что-то может пойти не так: пользователь может прервать загрузку страницы, могут быть неправильные учетные данные, может пропасть сетевое соединение и т. д. :)

person glukki    schedule 20.07.2016
comment
Это кажется многообещающим!. Потребуется некоторое время, чтобы создать его, чтобы узнать окончательный результат. Большое спасибо! - person Bramo; 21.07.2016