title: HTML5 drag and drop, "drop" event not firing in Firefox
body: <p>Despite reading the Mozilla Developer Network docs carefully, and any answers I could find on Stack Overflow, still I cannot get HTML5 drag and drop working in Firefox. I am using this in an AngularJS app. Everything works fine in Chrome and Internet Explorer, but not in Firefox (v33.1). I would rather not have to resort to using jQueryUI.</p>
  
  <p>Hopefully someone can spot something here that I am missing. As you can see in the code below, I have added some console.log() calls to each event handler to check to make sure each event is firing as expected. In Firefox, all of the events fire except for the "drop" event.</p>
  
  <p>Here is a simplified version of my code: </p>
  
  <pre><code>var assignEvents = function() {
    var rows = angular.element('.row');
    if (self.rows.length &gt; 0) {
      // event handlers for rows
      angular.forEach(self.rows, function(row, key) {
        angular.element(row)
        // clear any existing bindings
        .off('dragstart')
        .off('dragenter')
        .off('dragover')
        .off('dragleave')
        .off('drop')
        .off('dragend')
        // add bindings
        .on('dragstart', handleDragStart)
        .on('dragenter', handleDragEnter)
        .on('dragover', handleDragOver)
        .on('dragleave', handleDragLeave)
        .on('drop', handleDrop)
        .on('dragend', handleDragEnd);
      });
    }
  };
  
  // event handlers
  
  var handleDragStart = function(e) {
    console.log("dragStart");
    e.stopPropagation();
    this.style.opacity = 0.4;
    e.originalEvent.dataTransfer.setData('text/plain', this.id);
    e.originalEvent.dataTransfer.effectAllowed = 'link';
    e.originalEvent.dataTransfer.dropEffect = 'link';
  };
  
  var handleDragEnter = function(e) {
    e.preventDefault();
    e.stopPropagation();
    console.log("dragEnter");
    return false;
  };
  
  var handleDragOver = function(e) {
    e.preventDefault();
    e.stopPropagation();
    console.log("dragOver");
    return false;
  };
  
  var handleDragLeave = function(e) {
   e.preventDefault();
   e.stopPropagation();
   console.log("dragLeave");
   return false;
  };
  
  var handleDrop = function(e) {
    console.log("drop");
  };
  
  var handleDragEnd = function(e) {
    console.log("dragEnd");
    e.stopPropagation();
    e.preventDefault();
    this.style.opacity = 1;
  };
  
  assignEvents();
  </code></pre>