Browse Source

Merge pull request #3060 from blink1073/activate-mimedocument

Fix Mime Document Activation Handling
Afshin Darian 7 years ago
parent
commit
7aa24b2f91
1 changed files with 22 additions and 9 deletions
  1. 22 9
      packages/docregistry/src/default.ts

+ 22 - 9
packages/docregistry/src/default.ts

@@ -14,7 +14,7 @@ import {
 } from '@phosphor/coreutils';
 
 import {
-  Message
+  Message, MessageLoop
 } from '@phosphor/messaging';
 
 import {
@@ -413,6 +413,7 @@ class MimeDocument extends Widget implements DocumentRegistry.IReadyWidget {
   constructor(options: MimeDocument.IOptions) {
     super();
     this.addClass('jp-MimeDocument');
+    this.node.tabIndex = -1;
     let layout = this.layout = new BoxLayout();
     let toolbar = new Widget();
     toolbar.addClass('jp-Toolbar');
@@ -426,6 +427,10 @@ class MimeDocument extends Widget implements DocumentRegistry.IReadyWidget {
     this._mimeType = options.mimeType;
     this._dataType = options.dataType || 'string';
 
+    this._renderer = this.rendermime.createRenderer(this._mimeType);
+    layout.addWidget(this._renderer);
+    BoxLayout.setStretch(this._renderer, 1);
+
     context.pathChanged.connect(this._onPathChanged, this);
 
     this._context.ready.then(() => {
@@ -482,8 +487,14 @@ class MimeDocument extends Widget implements DocumentRegistry.IReadyWidget {
    * Handle `'activate-request'` messages.
    */
   protected onActivateRequest(msg: Message): void {
-    this.node.tabIndex = -1;
-    this.node.focus();
+    if (!this._hasRendered) {
+      this.node.focus();
+      return;
+    }
+    MessageLoop.sendMessage(this._renderer, Widget.Msg.ActivateRequest);
+    if (!this.node.contains(document.activeElement)) {
+      this.node.focus();
+    }
   }
 
   /**
@@ -508,12 +519,13 @@ class MimeDocument extends Widget implements DocumentRegistry.IReadyWidget {
       data[this._mimeType] = model.toJSON();
     }
     let mimeModel = new MimeModel({ data });
-    if (!this._renderer) {
-      this._renderer = this.rendermime.createRenderer(this._mimeType);
-      (this.layout as BoxLayout).addWidget(this._renderer);
-      BoxLayout.setStretch(this._renderer, 1);
-    }
-    return this._renderer.renderModel(mimeModel);
+    return this._renderer.renderModel(mimeModel).then(() => {
+      // Handle the first render after an activation.
+      if (!this._hasRendered && this.node === document.activeElement) {
+        MessageLoop.sendMessage(this._renderer, Widget.Msg.ActivateRequest);
+      }
+      this._hasRendered = true;
+    });
   }
 
   /**
@@ -529,6 +541,7 @@ class MimeDocument extends Widget implements DocumentRegistry.IReadyWidget {
   private _mimeType: string;
   private _ready = new PromiseDelegate<void>();
   private _dataType: 'string' | 'json';
+  private _hasRendered = false;
 }