2011-11-16 54 views
2

在Chrome扩展中,如何注入项目到第三方Flash对象的上下文菜单中?向第三方Flash对象注入上下文菜单项

是否可以使用JavaScript简单地注入项目?

是否有可能将玩家包装在一个容器.swf中,该容器添加了我们的上下文菜单项以及原始swf中包含的项目?

非常感谢您的想法和灵感!

编辑:要明确,我想要做的扩展是添加一个上下文菜单项到任何第三方Flash程序。举例来说,如果用户访问YouTube,我想添加自己的菜单项以及YouTube的自定义项目。

+0

因此,基本上你是在一个html上下文中,你的应用程序包装用户的web浏览器(类似谷歌翻译翻译网页)?您想要捕捉网页中的所有Flash电影,并用更改后的ContextMenu替换您的电影? – felipemaia

+0

@felipemaia没错。我将使用jQuery抓取所有'',获取它们的源代码并将其传递给我。我的对象将有一个自定义的上下文菜单项,它也将带来原始的所有自定义菜单项。 – bloudermilk

+0

我认为这根本就行不通...只要加载的swf试图加载任何外部的东西或者在其上下文之外的任何东西上执行,就会遇到无穷无尽的问题和可能无法解决的问题。 – Cay

回答

3

最简单的解决方案就是完成你和@felipemaia的建议 - 使用加载器SWF来添加(或修改)其加载的SWF的上下文菜单。

原(加载)SWF:

import flash.ui.ContextMenu; 
import flash.ui.ContextMenuItem; 

var customContextMenu:ContextMenu = new ContextMenu(); 
// Comment in if you want to hide the default context menu items. 
// customContextMenu.hideBuiltInItems(); 
var sampleItem:ContextMenuItem = new ContextMenuItem('Cheerio!'); 
customContextMenu.customItems.push(sampleItem, new ContextMenuItem('What it do?')); 
this.contextMenu = customContextMenu; 

和Loader SWF:

import flash.ui.ContextMenu; 
import flash.ui.ContextMenuItem; 
import flash.display.Sprite; 
import flash.display.Loader; 
import flash.net.URLRequest; 
import flash.events.Event; 

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, modify_context_menu); 
loader.load(new URLRequest('LoadedSWF.swf')); 

function modify_context_menu(event:Event):void 
{ 
    var loadedSWF:Sprite = (event.target as LoaderInfo).content as Sprite; 
    var loadedContextMenu:ContextMenu = loadedSWF.contextMenu; 
    loadedContextMenu.customItems.push(new ContextMenuItem('Parent Menu Item'), new ContextMenuItem('Parent what it be?')); 

    this.contextMenu = loadedContextMenu; 
} 

请注意,如果你需要更细粒度的控制,你也可以修改个人InteractiveObject子类的上下文菜单:

var sprite:Sprite = new Sprite(); 
var spriteContextMenu:ContextMenu = new ContextMenu(); 
spriteContextMenu.customItems.push(new ContextMenuItem('Instance specific menu item!')); 
sprite.contextMenu = spriteContextMenu; 
+0

不幸的是我不能在星期一之前测试它。但是,赏金是你的真诚,这个代码实际上起作用;) – bloudermilk

0

我不认为你可以编辑这些上下文菜单,说实话。但是我的闪存知识已经过时了,所以事情可能已经发生了变化。但是,为什么不解析页面,抓取要共享的视频并直接共享?取决于网站,许多提供您可以使用的信息。

+0

感谢您的回复。oEmbed支持是我们很快添加的,但我们希望注入上下文菜单项以简化UX。我们的竞争对手喜欢覆盖式界面,我们不是粉丝。 – bloudermilk

0

我能想到的唯一解决方案是有一个加载器swf,它将加载所需的swf,这样你可以包装所需的应用程序并且可以完全访问上下文菜单。

+0

这是我们认为可行的解决方案。你能提供一个有效的例子吗?如果可以的话,赏金是你的! – bloudermilk

+0

这看起来像文档中的相关页面。我没有设置Flash开发环境,否则我会自己尝试。 http://kb2.adobe.com/cps/141/tn_14190.html – bloudermilk

+0

事实上,你发现的链接有你需要写一个swf加载器并包装你的目标swf。如果没有你的项目的确切细节,我不能给你提供比你能找到的更多的信息,如果你能更好地解释你需要什么,我可能可以进一步帮助你。 – felipemaia

0

我不认为这是不可能的,除非Flash文件有一些代码,将使用flashvars加载某些方面的项目,如:

function loadContext():void 
{ 
    // Vars 
    var cmi:Object = root.loaderInfo.parameters; 

    contextMenu = new ContextMenu(); 
    contextMenu.hideBuiltInItems(); 

    for(var i:String in cmi) 
    { 
     var item:ContextMenuItem = new ContextMenuItem(i); 

     item.addEventListener(
      ContextMenuEvent.MENU_ITEM_SELECT, 
      function(e:ContextMenuEvent):void 
      { 
       navigateToURL(
        new URLRequest(cmi[i]) 
       ); 
      } 
     ); 
    } 

    contextMenu.customItems.push(item); 
} 

loadContext(); 

不希望我的Flash游戏出现在一些网站那是在我的上下文菜单中注入广告或某种亵渎。这不会让我看起来很好。

+0

不幸的是,我不能控制原始的Flash文件。尽管感谢您的意见! – bloudermilk