Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I access ALL window objects from a Chrome extension?

I am developing a Chrome extension for work, and one of the things it needs to do is to read (only read, not modify) an object that we send back to the website after it makes an asynchronous request to our servers. Basically I need to read the window.<our object name> object and get what's in there.

Now, I know this is possible, because I did this in a Tampermonkey script that I wrote. I was able to console.log(window.<our object name>) and it came in.

Tampermonkey is a Chrome extension, so there's no intrinsic reason why it can access something and another extension can't.

But when I try to access this object, both from content scripts and from injected code, I get nothing. When I get the window object only, it comes up only partially, as if the extension were blind to certain parts of it. But if I'm in the console on the page, and I call window, I get a full window object back. Infuriating.

So if content scripts don't work, and injected scripts don't work, and there's no reason why popup scripts would be any good here, how does one do this?

Many thanks!

UPDATE: As requested, here is the manifest.json (I took the page_redder example and worked off that to make sure I wasn't making any weird mistakes):

{
  "name": "Page Redder",
  "description": "Make the current page red",
  "version": "2.0",
  "permissions": [
    "activeTab"
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_title": "get my object"
  },
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["content.js"]
    }
  ],
  "manifest_version": 2
}

And here is content.js:

var getWindow = window.setTimeout(function() { console.log("From content script: " + window.<OBJECT NAME>); }, 5000);

And here is background.js:

// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.    

// Called when the user clicks on the browser action.
chrome.browserAction.onClicked.addListener(function(tab) {
  // No tabs or host permissions needed!
  chrome.tabs.executeScript({
    code: 'console.log("From injected script:" + window.<OBJECT NAME>);'
  });
});

When run, I get:

From content script: undefined From injected script: undefined

But if I do window. from the console, I get it. I even added a timeout to make sure that the content script wasn't trying to get something that hadn't loaded in yet. But I can retrieve the object manually before the script runs, and it still gives me undefined.

like image 590
StormShadow Avatar asked Apr 17 '16 05:04

StormShadow


People also ask

Can the window object be modified a Chrome extension?

You can't, not directly. From the content scripts documentation: However, content scripts have some limitations.

How do I see all extensions in Chrome?

To open up your extensions page, click the menu icon (three dots) at the top right of Chrome, point to “More Tools,” then click on “Extensions.” You can also type chrome://extensions/ into Chrome's Omnibox and press Enter.

Can a Chrome extension access local files?

For security reasons, by default the Chrome browser does not allow extensions to access local files. If you want the accelerator to access local files (locations of "file:///...", instead of "http://" or "https://"), you must configure Chrome to allow the access.


1 Answers

Soo, this is kind of hacky, but I was able to do it and it worked.

To gain access to everything available to the host window, I had to create a script element, put all the code I wanted in there, and add document.body.appendChild(script) for it to work.

Not the sexiest way of doing things, but it will get the job done for small tasks.

like image 177
Pytth Avatar answered Oct 27 '22 00:10

Pytth