2016-08-04 8 views
2

iframe.ly APIを使用して、ユーザーが現在いるページの動画からレスポンシブなiframeマークアップを取得するChrome拡張機能を開発中です。私はAngular JS(v1.5.8)を使用してAPIと通信し、iframeマークアップのプレビューを生成しています。拡張機能がYouTubeページで使用されている場合、すべてがうまく機能しています。

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse){ 
     localStorage["theurl"] = request.theurl; 
    } 
); 

var url = "http://iframe.ly/api/iframely?url=" 
+ localStorage["theurl"] + "&api_key=**my api key, to be removed in production**>"; 
: - -

chrome.runtime.sendMessage({ 
    theurl: window.location.href 
}); 

現在のURLをつかむ背景スクリプト <は、API呼び出しのために作られたURLに現在のURLを入れ

コンテンツスクリプト <:ここでは基本的な流れです

stuff.js < - それほど大きくはありませんが、 Eコール:

var iframeApp = angular.module('iframeApp', ['ngSanitize']); 

iframeApp.controller('linkCtrl', function($scope, $http) { 
    $http.get(url).success(function(data) { 
    $scope.iframe = data; 

     }); 
    }); 

iframeApp.filter('trusted', ['$sce', function ($sce) { 
    return function(url) { 
     return $sce.trustAsResourceUrl(url); 
    }; 
}]); 

    iframeApp.filter('rawHtml', ['$sce', function($sce){ 
    return function(val) { 
    return $sce.trustAsHtml(val); 
    }; 
}]); 

sandboxed.html < - 再び、大幅に(残り私はこの拡張のために異なるアプローチをしようとしていたときから)、ブラウザのアイコンがクリックされた場合、デフォルトのポップアップ名前が付けられていない。

<html class="ng-scope" ng-csp ng-app="iframeApp"> 
    <head> 
    <meta charset="utf-8"> 
    <title>Angular.js JSON Fetching Example</title> 
    <link rel="stylesheet" href="bootstrap.min.css"> 
    <script src="angular.min.js"></script> 
    <script src="angular-sanitize.min.js"></script> 
    <script src="backgroundscript.js"></script> 
    <script src="stuff.js"></script> 
    </head> 

<body ng-controller="linkCtrl"> 
    <h4>Responsive iFrame code is <pre>{{iframe.links.player[0].html}}</pre></h4> 

<div ng-bind-html="iframe.links.player[0].html | rawHtml"></div> 
    </body> 

</body> 

</html> 

今すぐ! (例えば)YouTubeのページでは、これは、ブラウザのアイコンがクリックされたときに何が起こるかです:

enter image description here

ワンダフル!しかし! Vimeoのページで同じ呼び出しをしようとすると、少しでもうまくいきます。ここに問題があります:YouTubeページへのiframe.ly API呼び出しのソースURLは、httpsプロトコルが追加されたURLを返します。しかし、Vimeo呼び出しは、非相対的な "//"プロトコルをソースに付加したURLを返します。

enter image description here

:あなたはいくつかの種類のサーバーで実行されているHTMLファイルでそれをやっている場合を除き、それはそうでない場合は、ローカルファイルにアクセスしようとするため、明らかに、これは、動作しませんので、だから、これは、起こりますさて、私はソースURL(iframe.links.player[0].htmliframe.links.player[0].hrefに置き換えて)を呼び出し、それをハードコードされた応答可能なdiv要素の内側のiframeの中に入れて、この問題を解決したいと思います。そうすれば、私の電話が返されます。たとえば//player.vimeo.com/video/177375994?byline=0&amp;badge=0&amp;portrait=0&amp;title=0です。

API呼び出しのURLからすべてのプロトコルを削除するにはどうすればよいですか? player.vimeo.com/video/177375994?byline=0&amp;badge=0&amp;portrait=0&amp;title=0はローカルファイルを読み込もうとしていると思うのではなく、適切なプロトコルを追加するために自動的にブラウザをルーティングし、YouTube URLにプロトコルがない場合でも同じことをするので、これは素晴らしいことです。他のURLも同様に仮定しています。

拡張機能は、開発者がiframeマークアップをすばやく簡単にコピーできるようにするためです。したがって、サイトが構築されている場合、「//」プロトコルは長期的にはうまくいくでしょう。なぜなら、それはサーバー上で実行されているからで、問題ではないからです。しかし、醜く見えないようにするためには、プレビューが拡張子の付いたすべての動画に適用された方がいいでしょう。

ありがとうございました!

+0

、function($ scope、$ http){ $ http.get(url).success(function(data){ $ scope.iframe = data; var newurl = $ scope.iframe.links.player [0]。 href; $ scope.iframe2 = newurl.replace(/^https?\:\/\//私、 ""); }); }); sandboxed.htmlの「

{{iframe2}}
」では、 '//player.vimeo.com/video/136089400?byline = 0&badge = 0&portrait = 0&title = 0'となります。 しかし、スコープ--->変数---->新しいスコープから行くことができれば、何らかの正規表現の作業が可能でなければなりません(何らかの理由でここでは動作しません)。 – sparkholiday

+0

言い換えれば、$ scope.iframe.links.player [0] .hrefを変数として保存してから、そのステップでプロトコルを削除して新しいスコープを宣言するのが最善の方法かもしれないと思いますプロトコルが削除された後の変数。しかし、私は何かが欠けている。なぜなら、もしこの道が潜在的であれば、上記のコードがうまくいくと思うからだ。 – sparkholiday

答えて

0

Angularの拡張機能やアプリケーションで作業していて、制御できない公開APIと通信していて、そのAPIがあなたにいくつかの不要な文字を含む応答を与えている場合、決して恐れるな!

getリクエストの戻りURLからプロトコルを正常に取得しましたが、プロトコルのないURLもローカルファイルのように扱われた後、URLに「http://」プロトコルを追加しました。このようにして、 "//"のプロトコルを持つiframe.ly APIのVimeoソースは "http://"に置き換えられ、 "https://"プロトコルにリダイレクトされます少なくともChromeでは、SSLで保護されたものにルーティングするだけで十分なので、何かに "http://"を入れてベースをカバーするのは安全です。

基本的には、iframe.ly APIが動画のソースURLを見つけるのに魅力的でしたが、プロトコルが正規化されていなかったため、chrome拡張子内でURLを使用しようとすると問題が発生しました。私は現在、APIからURLを取得し、プロトコルをすべて「http://」に正規化するためにコードを使用しています:

stuff.jsの拡張子のAngularコードは、

var iframeApp = angular.module('iframeApp', ['ngSanitize']); 

iframeApp.controller('linkCtrl', function($scope, $http, $sce) { 
    $http.get(url).success(function(data) { 
    $scope.iframe = data; 

    var newurl = $scope.iframe.links.player[0].href; 
    var secondurl = newurl.split('/').slice(2).join('/'); 
    $scope.iframe2 = $sce.trustAsResourceUrl((secondurl.indexOf('://') == -1) ? 'http://' + secondurl : secondurl) ; 

    var testurl = $scope.iframe.links.player[0].href; 
    $scope.iframe3 = testurl; 

    $scope.iframe3 = $sce.trustAsResourceUrl(testurl); 

     }); 

    }); 

iframeApp.filter('trusted', ['$sce', function ($sce) { 
    return function(url) { 
     return $sce.trustAsResourceUrl(url); 
    }; 
}]); 

    iframeApp.filter('rawHtml', ['$sce', function($sce){ 
    return function(val) { 
    return $sce.trustAsHtml(val); 
    }; 
}]); 

そして、拡張機能のデフォルトのポップアップでも、悪い名前のsandboxed.html、中:

<html class="ng-scope" ng-csp ng-app="iframeApp"> 
    <head> 
    <meta charset="utf-8"> 
    <title>Angular.js JSON Fetching Example</title> 
    <link rel="stylesheet" href="bootstrap.min.css"> 
    <script src="angular.min.js"></script> 
    <script src="angular-sanitize.min.js"></script> 
    <script src="backgroundscript.js"></script> 
    <script src="stuff.js"></script> 
    </head> 

<body ng-controller="linkCtrl"> 
    <h4>Responsive iFrame: <pre><code>&lt;div style=&quot;left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 56.2493%;&quot;&gt;&lt;iframe src=&quot;{{iframe2}}&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; style=&quot;top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;</code></pre> 


<div>Source URL is: <code>{{iframe2}}</code></div> 


<div style="left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 56.2493%;"><iframe ng-src="{{iframe2}}" frameborder="0" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true" style="top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;"></iframe></div> 
    </body> 


</html> 

そして今、Vimeoのビデオのページ上のブラウザアクションのアイコンをクリックすると、戻りません悲しい顔のグラフィックが私が嫌になるようになったので、とても多くの過去数週間にわたる:

enter image description here

そして、私は/ブラウザにそのソースURLを貼り付けコピーした場合、我々はそれが自動的にルーティング「のhttp://」ことを見ることができ、その正当にプロトコルを"https://で" プロトコル:

enter image description here

そして、ちょうど楽しみのために、デフォルトのポップアップの応答のiFrameコードのセクションから貼り付けたものをコピー/移入のHTMLページ:

enter image description here

は、ファイルがローカルに開かれたとき、私たちはこれを与える:

enter image description here

私はどんなAngularJSの純粋主義者は、このコードを見て、その画面で「NO NO NO NO NO」を叫んでいることを感じていますなぜなら、n00bであっても、このAngularコードは醜いので、別の部分に分ける必要があるからです。しかし! `iframeApp.controller(「linkCtrl」:私はモジュールに追加のコードを追加したこと働いている、と私はより適切な、「アンギュラウェイ」でこれを達成する上の任意の提案を聞いてみたい:)

+0

誰かに何か助けがあれば [現在のコードはGitHub](https://github.com/sparkholiday/iFramed-d-It-Chrome-Extension)に入れて、[packed Chromeウェブストアのバージョン](https://chrome.google.com/webstore/detail/iframed-it/fajooocnppkgfcogkldkjgamdikhbohk)をクリックします。 – sparkholiday

関連する問題