2016-08-04 8 views
2

Ich arbeite an einer Chrome-Erweiterung, die die iframe.ly-API verwendet, um das responsive iframe-Markup von einem Video auf der Seite zu erfassen, auf der sich der Benutzer gerade befindet. Ich verwende Angular JS (v1.5.8), um mit der API zu kommunizieren und eine Vorschau des iFrame-Markups zu generieren. Alles funktioniert prächtig, wenn die Erweiterung auf einer YouTube-Seite verwendet wird. Hier ist der grundlegende Ablauf:

Content-Skript < - greift aktuelle URL

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

Hintergrund Skript < - setzt aktuelle URL in url für den API-Aufruf gemacht:

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**>"; 

stuff.js < - nicht sehr benannt, aber das Winkelstück, das th macht e Aufruf:

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 < - wieder, nicht stark genannt (Überbleibsel aus, als ich für diese Erweiterung einen anderen Ansatz versuchen), aber der Standard-Popup, wenn Browser-Symbol geklickt wird:

<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> 

Jetzt! Auf einer YouTube-Seite (zum Beispiel), ist es das, was passiert, wenn das Browser-Symbol geklickt wird:

enter image description here

Wonderful! ABER! Die Dinge werden ein bisschen, ähm, überhaupt nicht funktionieren, wenn ich versuche, denselben Anruf auf einer Vimeo-Seite zu machen. Hier ist das Problem: Die Quell-URL des iframe.ly-API-Aufrufs an eine YouTube-Seite gibt eine URL zurück, die an ein https-Protokoll angehängt ist. Ein Vimeo-Aufruf gibt jedoch eine URL mit einem nicht relativen "//" - Protokoll zurück, das an die Quelle angehängt wird. Also, dies geschieht, weil offensichtlich wird dies nicht funktionieren, wenn Sie es auf einer HTML-Datei tun, die auf einem Server von einer Art ausgeführt wird, weil es sonst eine lokale Datei zuzugreifen versucht:

enter image description here

Nun möchte ich das beheben, indem ich die Quell-URL anrufe (indem ich die iframe.links.player[0].html durch iframe.links.player[0].href ersetze) und diese dann in einen Iframe innerhalb eines hartkodierten responsiven div-Elements setze. Auf diese Weise würde mein Anruf zurückkehren, sagen //player.vimeo.com/video/177375994?byline=0&amp;badge=0&amp;portrait=0&amp;title=0.

Also, wie könnte ich alle Protokolle von den URLs von den API-Aufrufen entfernen? Das wäre großartig, denn player.vimeo.com/video/177375994?byline=0&amp;badge=0&amp;portrait=0&amp;title=0 routet den Browser automatisch, um das richtige Protokoll anzuhängen, anstatt zu denken, dass ich versuche, eine lokale Datei zu laden, und es macht dasselbe, wenn es kein Protokoll auf einer YouTube-URL gibt. Ich nehme auch eine andere URL für ein Video an.

Die Funktionalität der Erweiterung ist es, einem Entwickler zu ermöglichen, iFrame-Markup schnell zu kopieren/einzufügen, anstatt es eingeben zu müssen, nur um die Dinge ein wenig einfacher zu machen. Das "//" -Protokoll wäre also auf lange Sicht in Ordnung, wenn eine Site erstellt wird, weil sie dann auf einem Server läuft, und das spielt keine Rolle. Aber um nicht hässlich auszusehen, wäre es schön, wenn die Vorschau für alle Videos mit der Erweiterung funktioniert.

Vielen Dank!

+0

ich den zusätzlichen Code zu dem Modul hinzugefügt: 'iframeApp.controller (‚linkCtrl‘ , Funktion ($ scope, $ http) { $ http.get (url) .success (Funktion (Daten)) { $ scope.iframe = Daten; var newurl = $ scope.iframe.links.player [0]. href; $ scope.iframe2 = newurl.replace (/^https?\:\/\//ich, ""); }); }); ' In sandboxed.html'

{{iframe2}}
'gibt immer noch' //player.vimeo.com/video/136089400? Byline = 0 & badge = 0 & portrait = 0 & title = 0'. Aber wenn ich aus dem Bereich ---> Variable ----> neuen Bereich gehen kann, muss einige Regex Arbeit möglich sein (obwohl es hier aus irgendeinem Grund nicht funktioniert). – sparkholiday

+0

Mit anderen Worten, ich frage mich, ob die beste Möglichkeit sein könnte, $ scope.iframe.links.player [0] .href als Variable zu speichern, dann entferne das Protokoll bei diesem Schritt und deklariere dann einen neuen Bereich für die Variable, nachdem das Protokoll entfernt wurde. Aber ich vermisse etwas, weil ich denken würde, dass der obige Code funktionieren würde, wenn diese Avenue Potenzial hätte. – sparkholiday

Antwort

0

Wenn Sie mit Angular an einer Erweiterung oder App arbeiten und mit der öffentlichen API kommunizieren, die Sie nicht kontrollieren können, und diese API Ihnen einige unerwünschte Zeichen mit ihren unerwünschten Antworten gibt, dann lautet die Antwort: Hab niemals Angst!

Ich habe das Protokoll erfolgreich aus der Rückgabe-URL der Get-Anforderung gezogen, aber nachdem ich erkannt habe, dass eine URL ohne Protokoll wie eine lokale Datei behandelt wird, fügte ich der URL nach dem Entfernen ein "http: //" -Protokoll hinzu . Auf diese Weise würde jede Vimeo-Quelle in der iframe.ly-API, die ein Protokoll von "//" hatte, durch ein "http: //" ersetzt, was letztendlich dazu führt, dass sie auf ein "https: //" -Protokoll umgeleitet wird scheint sicher zu sein, "http: //" auf irgendwas zu setzen und deine Grundlagen abzudecken, denn zumindest in Chrome wird es ausreichen, auch alles, was SSL-geschützt ist, zu routen).

Also, im Grunde war das Problem, dass die iframe.ly API spektakulär für das Finden der Quell-URLs für Videos war, aber die Protokolle wurden nicht normalisiert, was Probleme bei der Verwendung dieser URLs innerhalb der Chrome-Erweiterung verursacht. Hier ist der Code, den ich derzeit verwende, um die URLs aus der API zu ziehen, und dann ihre Protokolle auf alle zu "http: //":

In der schlecht benannten stuff.js, wo der Angular-Code für die Erweiterung lebt:

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); 
    }; 
}]); 

Und in dem auch-schlecht-Namen sandboxed.html, die die Standard-Popup-Nebenstelle ist:

<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> 

Und nun wird auf einem Vimeo Video Seite des Browsers Aktion Symbol klicken nicht zurück mit der Sad Face-Grafik, die ich so verabscheue, so sehr in den letzten paar Wochen:

enter image description here

Und wenn ich Kopieren/Einfügen, dass die Quell-URL in den Browser, können wir sehen, dass es automatisch Routen des „http: //“ Protokoll an ihren rechtmäßigen "https: //" Protokoll:

enter image description here

Und nur zum Spaß, eine hTML-Seite, die mit Sachen kopieren/Einfügen aus dem Responsive iFrame-Code Abschnitt des Standard-Popup bevölkert ist:

enter image description here

gibt uns diese, wenn die Datei lokal geöffnet wird:

enter image description here

Ich habe das Gefühl

, dass jede AngularJS puristisch an diesem Code sucht und „NEIN NEIN NEIN NEIN NEIN“ auf ihrem Bildschirm schrei weil ich selbst als n00b ziemlich sicher bin, dass dieser Winkelcode hässlich ist und in verschiedene Teile aufgeteilt werden sollte. ABER! Es ist arbeiten, und ich würde gerne Vorschläge hören, auf das in einem richtigen, „Angular Way“ erreichen :)

+0

Wenn es jemand zusätzliche Hilfe ist: Ich legte den [aktuellen Code auf GitHub] (https://github.com/sparkholiday/iFramed-d-It-Chrome-Extension) und Sie können es mit dem [gepackt vergleichen Version im Chrome Webstore] (https://chrome.google.com/webstore/detail/iframed-it/fajooocnppkgfcogkldkjgamdikhbohk). – sparkholiday