2011-11-16 53 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